WindowsXP-SP1/enduser/windows.com/iuengine/iuengine.h

312 lines
8.4 KiB
C++

//=======================================================================
//
// Copyright (c) 2000 Microsoft Corporation. All Rights Reserved.
//
// File: iuengine.h
//
// Description:
//
// Common include file for IUEngine DLL
//
//=======================================================================
#ifndef __IUENGINE_H_
#define __IUENGINE_H_
#include <windows.h>
#include <tchar.h>
#include <ole2.h>
#include "..\inc\iu.h"
#include <logging.h>
#include <shlwapi.h>
#include <iucommon.h>
#include <osdet.h>
#include <UrlAgent.h>
// #define __IUENGINE_USES_ATL_
#if defined(__IUENGINE_USES_ATL_)
#include <atlbase.h>
#define USES_IU_CONVERSION USES_CONVERSION
#else
#include <MemUtil.h>
#endif
#include "schemakeys.h"
#include <mistsafe.h>
#include <wusafefn.h>
//***********************************************************************
//
// The following constants are defined in engmain.cpp
//
//***********************************************************************
/**
* the following two groups of constants can be used to construct
* lMode parameter of the following APIs:
* Download()
* DownloadAsync()
* Install()
* InstallAsync()
*
* Obviousely, you can only pick one from each group to make up
* lMode parameter.
*
*/
extern const LONG UPDATE_NOTIFICATION_DEFAULT;
extern const LONG UPDATE_NOTIFICATION_ANYPROGRESS;
extern const LONG UPDATE_NOTIFICATION_COMPLETEONLY;
extern const LONG UPDATE_NOTIFICATION_1PCT;
extern const LONG UPDATE_NOTIFICATION_5PCT;
extern const LONG UPDATE_NOTIFICATION_10PCT;
/**
* constant can also be used for SetOperationMode() and GetOperationMode()
*/
extern const LONG UPDATE_MODE_THROTTLE;
/**
* constant can be used by Download() and DownloadAsync(), which will
* tell these API's to use Corporate directory structure for destination folder.
*/
extern const LONG UPDATE_CORPORATE_MODE;
/**
* constant can be used by Install() and InstallAsync(). Will disable all
* internet related features
*/
extern const LONG UPDATE_OFFLINE_MODE;
/**
* constants for SetOperationMode() API
*/
extern const LONG UPDATE_COMMAND_PAUSE;
extern const LONG UPDATE_COMMAND_RESUME;
extern const LONG UPDATE_COMMAND_CANCEL;
/**
* constants for GetOperationMode() API
*/
extern const LONG UPDATE_MODE_PAUSED;
extern const LONG UPDATE_MODE_RUNNING;
extern const LONG UPDATE_MODE_NOTEXISTS;
/**
* constants for SetProperty() and GetProperty() API
*/
extern const LONG UPDATE_PROP_USECOMPRESSION;
extern const LONG UPDATE_PROP_OFFLINEMODE;
/**
* constants for BrowseForFolder() API
*
* IUBROWSE_WRITE_ACCESS - validate write access on selected folder
* IUBROWSE_AFFECT_UI - write-access validation affect OK button enable/disable
* IUBROWSE_NOBROWSE - do not show browse folder dialog box. validate path passed-in only
*
* default:
* pop up browse folder dialog box, not doing any write-access validation
*
*/
extern const LONG IUBROWSE_WRITE_ACCESS;
extern const LONG IUBROWSE_AFFECT_UI;
extern const LONG IUBROWSE_NOBROWSE;
// constants for historical speed registry
const TCHAR REGKEY_IUCTL[] = _T("Software\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\IUControl");
const TCHAR REGVAL_HISTORICALSPEED[] = _T("HistoricalSpeed"); // in bytes/sec
const TCHAR REGVAL_TIMEELAPSED[] = _T("TimeElapsed"); // in seconds
// constant for default downloads folder name
const TCHAR IU_WUTEMP[] = _T("WUTemp");
//
// Globals for the IUEngine
extern LONG g_lThreadCounter;
extern HANDLE g_evtNeedToQuit;
extern CUrlAgent *g_pUrlAgent;
typedef struct IUOPERATIONINFO
{
TCHAR szOperationUUID[64];
LONG lUpdateMask;
BSTR bstrOperationResult;
IUOPERATIONINFO *pNext;
} IUOPERATIONINFO, *PIUOPERATIONINFO;
class COperationMgr
{
public:
COperationMgr();
~COperationMgr();
BOOL AddOperation(LPCTSTR pszOperationID, LONG lUpdateMask);
BOOL RemoveOperation(LPCTSTR pszOperationID);
BOOL FindOperation(LPCTSTR pszOperationID, PLONG plUpdateMask, BSTR *pbstrOperationResult);
BOOL UpdateOperation(LPCTSTR pszOperationID, LONG lUpdateMask, BSTR bstrOperationResult);
private:
PIUOPERATIONINFO m_pOperationInfoList;
};
//
// CEngUpdate class used to export apartment safe instances of the update class to WU clients (iuctl, AU, DU, CDM)
//
class CEngUpdate
{
public:
CEngUpdate();
~CEngUpdate();
public:
HRESULT WINAPI GetSystemSpec(BSTR bstrXmlClasses, DWORD dwFlags, BSTR *pbstrXmlDetectionResult);
HRESULT WINAPI GetManifest(BSTR bstrXmlClientInfo, BSTR bstrXmlSystemSpec, BSTR bstrXmlQuery, DWORD dwFlags, BSTR *pbstrXmlCatalog);
HRESULT WINAPI Detect(BSTR bstrXmlCatalog, DWORD dwFlags, BSTR *pbstrXmlItems);
HRESULT WINAPI Download(BSTR bstrXmlClientInfo, BSTR bstrXmlCatalog, BSTR bstrDestinationFolder, LONG lMode,
IUnknown *punkProgressListener, HWND hWnd, BSTR *pbstrXmlItems);
HRESULT WINAPI DownloadAsync(BSTR bstrXmlClientInfo, BSTR bstrXmlCatalog, BSTR bstrDestinationFolder, LONG lMode,
IUnknown *punkProgressListener, HWND hWnd, BSTR bstrUuidOperation, BSTR *pbstrUuidOperation);
HRESULT WINAPI Install(BSTR bstrXmlClientInfo,
BSTR bstrXmlCatalog,
BSTR bstrXmlDownloadedItems,
LONG lMode,
IUnknown *punkProgressListener,
HWND hWnd,
BSTR *pbstrXmlItems);
HRESULT WINAPI InstallAsync(BSTR bstrXmlClientInfo,
BSTR bstrXmlCatalog,
BSTR bstrXmlDownloadedItems,
LONG lMode,
IUnknown *punkProgressListener,
HWND hWnd,
BSTR bstrUuidOperation,
BSTR *pbstrUuidOperation);
HRESULT WINAPI SetOperationMode(BSTR bstrUuidOperation, LONG lMode);
HRESULT WINAPI GetOperationMode(BSTR bstrUuidOperation, LONG* plMode);
HRESULT WINAPI GetHistory(
BSTR bstrDateTimeFrom,
BSTR bstrDateTimeTo,
BSTR bstrClient,
BSTR bstrPath,
BSTR* pbstrLog);
HRESULT WINAPI BrowseForFolder(BSTR bstrStartFolder,
LONG flag,
BSTR* pbstrFolder);
HRESULT WINAPI RebootMachine();
private:
void WINAPI ShutdownInstanceThreads(); // called in dtor to shut down any outstanding threads
public:
LONG m_lThreadCounter;
HANDLE m_evtNeedToQuit;
BOOL m_fOfflineMode;
COperationMgr m_OperationMgr;
};
//
// CDM Internal Exports (called by IUCDM stub cdm.dll)
//
//
// We use a separate Real(tm) global for CDM to hold an instance of the CEngUpdate class,
// since it is never multiple instanced.
//
extern CEngUpdate* g_pCDMEngUpdate;
VOID WINAPI InternalDetFilesDownloaded(
IN HANDLE hConnection
);
BOOL InternalDownloadGetUpdatedFiles(
IN PDOWNLOADINFOWIN98 pDownloadInfoWin98,
IN OUT LPTSTR lpDownloadPath,
IN UINT uSize
);
BOOL WINAPI InternalDownloadUpdatedFiles(
IN HANDLE hConnection,
IN HWND hwnd,
IN PDOWNLOADINFO pDownloadInfo,
OUT LPWSTR lpDownloadPath,
IN UINT uSize,
OUT PUINT puRequiredSize
);
BOOL WINAPI InternalFindMatchingDriver(
IN HANDLE hConnection,
IN PDOWNLOADINFO pDownloadInfo,
OUT PWUDRIVERINFO pWuDriverInfo
);
VOID WINAPI InternalLogDriverNotFound(
IN HANDLE hConnection,
IN LPCWSTR lpDeviceInstanceID,
IN DWORD dwFlags
);
int WINAPI InternalQueryDetectionFiles(
IN HANDLE hConnection,
IN void* pCallbackParam,
IN PFN_QueryDetectionFilesCallback pCallback
);
void InternalSetGlobalOfflineFlag(
IN BOOL fOfflineMode
);
//
// GetSystemSpec functionality exported for use by CDM
//
class CXmlSystemSpec;
HRESULT AddComputerSystemClass(CXmlSystemSpec& xmlSpec);
HRESULT AddRegKeyClass(CXmlSystemSpec& xmlSpec);
HRESULT AddPlatformClass(CXmlSystemSpec& xmlSpec, IU_PLATFORM_INFO iuPlatformInfo);
HRESULT AddLocaleClass(CXmlSystemSpec& xmlSpec, BOOL fIsUser);
HRESULT AddDevicesClass(CXmlSystemSpec& xmlSpec, IU_PLATFORM_INFO iuPlatformInfo, BOOL fIsSysSpecCall);
//
// Misc. functionality
//
extern LONG g_lDoOnceOnLoadGuard;
void WINAPI DeleteExpiredDownloadFolders();
HRESULT WINAPI CreateGlobalCDMEngUpdateInstance();
HRESULT WINAPI DeleteGlobalCDMEngUpdateInstance();
void WINAPI ShutdownThreads(); // called by UnlockEnginge -- maintains backwards CDM compatibility
void WINAPI ShutdownGlobalThreads(); // called to shut down any outstanding global threads
#endif // __IUENGINE_H_