230 lines
4.6 KiB
C++
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");
|
|
}
|
|
}
|