windows-nt/Source/XPSP1/NT/enduser/windows.com/wuau/wuaueng/statusping.cpp
2020-09-26 16:20:57 +08:00

230 lines
4.6 KiB
C++

//=======================================================================
//
// Copyright (c) 2001 Microsoft Corporation. All Rights Reserved.
//
// File: statusping.cpp
//
// Creator: PeterWi
//
// Purpose: status ping back functions
//
//=======================================================================
#include "pch.h"
#pragma hdrstop
PingStatus gPingStatus;
void PingStatus::ReadLiveServerUrlFromIdent(void)
{
LPTSTR ptszLiveServerUrl;
if (NULL != (ptszLiveServerUrl = (TCHAR*) malloc(sizeof(TCHAR) * INTERNET_MAX_URL_LENGTH)))
{
TCHAR tszIdentFile[MAX_PATH];
if (SUCCEEDED(GetDownloadPath(tszIdentFile, ARRAYSIZE(tszIdentFile))) &&
SUCCEEDED(PathCchAppend(tszIdentFile, ARRAYSIZE(tszIdentFile), IDENTTXT)))
{
DWORD dwStrLen = GetPrivateProfileString(
_T("IUPingServer"),
_T("ServerUrl"),
_T(""),
ptszLiveServerUrl,
INTERNET_MAX_URL_LENGTH,
tszIdentFile);
if (0 != dwStrLen &&
INTERNET_MAX_URL_LENGTH-1 != dwStrLen) // do this until there's a better way to check for errors
{
(void) SetLiveServerUrl(ptszLiveServerUrl);
}
else
{
DEBUGMSG("PingStatus::ReadLiveServerUrlFromIdent() failed to read server URL from ident");
}
}
free(ptszLiveServerUrl);
}
}
void PingStatus::PingDetectionSuccess(
BOOL fOnline,
UINT cItems)
{
TCHAR tszMessage[30];
(void) StringCchPrintfEx(tszMessage, ARRAYSIZE(tszMessage), NULL, NULL, MISTSAFE_STRING_FLAGS, _T("items=%u"), cItems);
_Ping(
fOnline,
URLLOGACTIVITY_Detection,
URLLOGSTATUS_Success,
0,
tszMessage,
NULL,
NULL);
}
void PingStatus::PingDetectionFailure(
BOOL fOnline,
DWORD dwError,
LPCTSTR ptszMessage)
{
_Ping(
fOnline,
URLLOGACTIVITY_Detection,
URLLOGSTATUS_Failed,
dwError,
ptszMessage,
NULL,
NULL);
}
void PingStatus::PingDownload(
BOOL fOnline,
URLLOGSTATUS status,
DWORD dwError,
LPCTSTR ptszItemID,
LPCTSTR ptszDeviceID,
LPCTSTR ptszMessage)
{
switch (status)
{
case URLLOGSTATUS_Success:
case URLLOGSTATUS_Failed:
case URLLOGSTATUS_Declined:
break;
default:
DEBUGMSG("ERROR: PingDownload() invalid parameter");
return;
}
_Ping(
fOnline,
URLLOGACTIVITY_Download,
status,
dwError,
ptszMessage,
ptszItemID,
ptszDeviceID);
}
void PingStatus::PingDeclinedItem(
BOOL fOnline,
URLLOGACTIVITY activity,
LPCTSTR ptszItemID)
{
switch (activity)
{
case URLLOGACTIVITY_Download:
case URLLOGACTIVITY_Installation:
break;
default:
DEBUGMSG("ERROR: PingDeclinedItem() invalid activity code");
return;
}
if (NULL == ptszItemID)
{
DEBUGMSG("ERROR: PingDeclinedItem() invalid item ID");
return;
}
_Ping(
fOnline,
activity,
URLLOGSTATUS_Declined,
0x0,
NULL,
ptszItemID,
NULL);
}
///////////////////////////////////////////////////////////////////////////////////
// status: IN ping status code
// dwError: IN error code
///////////////////////////////////////////////////////////////////////////////////
void PingStatus::PingSelfUpdate(
BOOL fOnline,
URLLOGSTATUS status,
DWORD dwError)
{
const TCHAR WUAUENGFILE[] = _T("wuaueng.dll");
TCHAR tszFileVer[30];
HRESULT hr;
size_t cchVerLen;
LPTSTR ptszFileVersion;
switch (status)
{
case URLLOGSTATUS_Success:
case URLLOGSTATUS_Failed:
case URLLOGSTATUS_Pending:
break;
default:
DEBUGMSG("ERROR: PingSelfUpdate() invalid parameter");
return;
}
if (FAILED(hr = StringCchCopyEx(
tszFileVer,
ARRAYSIZE(tszFileVer),
_T("ver="),
&ptszFileVersion,
&cchVerLen,
MISTSAFE_STRING_FLAGS)) ||
FAILED(hr = GetFileVersionStr(
WUAUENGFILE,
ptszFileVersion,
cchVerLen)))
{
DEBUGMSG("ERROR: PingSelfUpdate() GetFileVersionStr() failed.");
return;
}
_Ping(
fOnline,
URLLOGACTIVITY_SelfUpdate,
status,
dwError,
tszFileVer,
NULL, // no item
NULL); // no device
}
//----------------------------------------------------------------------
//
// private function to gather common info and perform ping
//
//----------------------------------------------------------------------
void PingStatus::_Ping(
BOOL fOnline,
URLLOGACTIVITY activity,
URLLOGSTATUS status,
DWORD dwError,
LPCTSTR ptszMessage,
LPCTSTR ptszItemID,
LPCTSTR ptszDeviceID)
{
HRESULT hr = CUrlLog::Ping(
fOnline,
URLLOGDESTINATION_DEFAULT,
&ghServiceFinished,
1,
activity,
status,
dwError,
ptszItemID,
ptszDeviceID,
ptszMessage); // use default base URL and client name
if (FAILED(hr))
{
DEBUGMSG("PingStatus::_Ping() failed to send/queue the request");
}
}