|
|
#include "inseng.h"
#include <wininet.h>
#include "util2.h"
#include "ciffile.h"
#define CMDLINE "\"%s%s\" %s"
#define COMPONENT_KEY "Software\\Microsoft\\Active Setup\\Installed Components"
#define ACTIVESETUP_KEY "Software\\Microsoft\\Active Setup"
#define STEPPING_VALUE "SteppingMode"
#define COMMAND_VALUE "CommandMode"
#define CHECKTRUST_VALUE "DisableCheckTrust"
#define VERSION_KEY "Version"
#define STR_FAILED "Failed"
#define STR_OK "OK"
#define COMPONENTSIZES_SIZE_V1 32
#define COMPONENTSIZES_SIZE_V2 35
#define COMPONENTSIZES_SIZE_V3 39
class CInstallEngine : public IInstallEngine2, public IInstallEngineTiming, public IInstallEngineCallback { friend DWORD WINAPI InitInstaller(LPVOID pv); friend DWORD WINAPI InitDownloader(LPVOID pv);
public: CInstallEngine(IUnknown **punk); ~CInstallEngine();
// the usual IUnknown members
STDMETHOD_(ULONG, AddRef)(void); STDMETHOD_(ULONG, Release)(void); STDMETHOD(QueryInterface)(REFIID, void **); // IInstallEngine methods
//
STDMETHOD(GetEngineStatus)(THIS_ DWORD *theenginestatus); STDMETHOD(GetSizes)(THIS_ LPCSTR pszID, COMPONENT_SIZES *p); STDMETHOD(SetAction)(THIS_ LPCSTR pszID,DWORD dwAction,DWORD dwPriority); STDMETHOD(EnumInstallIDs)(THIS_ UINT uIndex, LPSTR *ppszID); STDMETHOD(EnumDownloadIDs)(THIS_ UINT uIndex, LPSTR *ppszID); STDMETHOD(IsComponentInstalled)(THIS_ LPCSTR pszID, DWORD *pdwStatus); STDMETHOD(DownloadComponents)(THIS_ DWORD dwFlags); STDMETHOD(InstallComponents)(THIS_ DWORD dwFlags); STDMETHOD(LaunchExtraCommand)(THIS_ LPCSTR pszInfName, LPCSTR pszSection); STDMETHOD(RegisterInstallEngineCallback)(THIS_ IInstallEngineCallback *pcb); STDMETHOD(UnregisterInstallEngineCallback)(THIS); STDMETHOD(GetDisplayName)(THIS_ LPCSTR pszComponentID, LPSTR *ppszName);
// Intall info stuff
STDMETHOD(SetCifFile)(THIS_ LPCSTR pszCabName, LPCSTR pszCifName); STDMETHOD(SetBaseUrl)(THIS_ LPCSTR pszBaseName); STDMETHOD(SetDownloadDir)(THIS_ LPCSTR pszDownloadDir); STDMETHOD(SetInstallDrive)(THIS_ char chDrive); STDMETHOD(SetInstallOptions)(THIS_ DWORD dwInsFlag); STDMETHOD(GetInstallOptions)(THIS_ DWORD *pdwInsFlag);
STDMETHOD(SetHWND)(THIS_ HWND hForUI); STDMETHOD(SetIStream)(THIS_ IStream *pstm);
// Engine Control
STDMETHOD(Abort)(THIS_ DWORD dwFlags); STDMETHOD(Suspend)(THIS); STDMETHOD(Resume)(THIS);
// IInstallEngineTiming
STDMETHOD(GetRates)(THIS_ DWORD *pdwDownload, DWORD *pdwInstall); STDMETHOD(GetInstallProgress)(THIS_ INSTALLPROGRESS *pinsprog);
// IInstallEngine2
STDMETHOD(SetLocalCif)(THIS_ LPCSTR pszLocalCif); STDMETHOD(GetICifFile)(THIS_ ICifFile **pcif);
// IInstallEngineCallback
STDMETHOD(OnEngineStatusChange)(THIS_ DWORD dwEngStatus, DWORD substatus); STDMETHOD(OnStartInstall)(THIS_ DWORD dwDLSize, DWORD dwInstallSize); STDMETHOD(OnStartComponent)(THIS_ LPCSTR pszID, DWORD dwDLSize, DWORD dwInstallSize, LPCSTR pszString); STDMETHOD(OnComponentProgress)(THIS_ LPCSTR pszID, DWORD dwPhase, LPCSTR pszString, LPCSTR pszMsgString, ULONG progress, ULONG themax); STDMETHOD(OnStopComponent)(THIS_ LPCSTR pszID, HRESULT hError, DWORD dwPhase, LPCSTR pszString, DWORD dwStatus); STDMETHOD(OnStopInstall)(THIS_ HRESULT hrError, LPCSTR szError, DWORD dwStatus); STDMETHOD(OnEngineProblem)(THIS_ DWORD dwProblem, LPDWORD dwAction);
void WriteToLog(char *sz, BOOL pause); CDownloader *GetDownloader() { return _pDL; } CInstaller *GetInstaller() { return _pIns; } CPatchDownloader *GetPatchDownloader() { return _pPDL; } LPCSTR GetBaseUrl() { return _szBaseUrl; } void SetStatus(DWORD dwStatus) { _dwStatus |= dwStatus; } UINT GetStatus() { return _dwStatus; } UINT GetCommandMode() { return _uCommandMode; } HWND GetHWND() { return _hwndForUI; } BOOL IgnoreTrustCheck() { return _fIgnoreTrust; } BOOL IgnoreDownloadError() { return _fIgnoreDownloadError; } char GetInstallDrive() { return _chInsDrive; } HRESULT CheckForContinue(); BOOL UseCache() { return _fUseCache; } BOOL AllowCrossPlatform() { return !(_dwInstallOptions & INSTALLOPTIONS_DONTALLOWXPLATFORM); } BOOL ForceDependencies() { return (_dwInstallOptions & INSTALLOPTIONS_FORCEDEPENDENCIES); } BOOL IsAdvpackExtAvailable() { return _fSRLiteAvailable; }
private: char _szBaseUrl[INTERNET_MAX_URL_LENGTH]; HWND _hwndForUI; IStream *_pStmLog; UINT _uCommandMode; char _chInsDrive; DWORD _dwDLRemaining; DWORD _dwInstallRemaining; DWORD _dwDLOld; DWORD _dwInstallOptions; DWORD _dwInstallOld; DWORD _enginestatus; DWORD _dwStatus; ULONG _cRef; HANDLE _hAbort; HANDLE _hContinue; IInstallEngineCallback *_pcb; CDownloader *_pDL; CInstaller *_pIns; CPatchDownloader *_pPDL;
BOOL _fUseCache:1; BOOL _fSteppingMode:1; BOOL _fIgnoreTrust:1; BOOL _fIgnoreDownloadError:1; BOOL _fResetTrust:1; BOOL _fCleanUpDir:1; BOOL _fSRLiteAvailable:1; CCifFile *_pCif; void _GetTotalSizes(COMPONENT_SIZES *p); DWORD _GetTotalDownloadSize(); DWORD _GetActualDownloadSize(BOOL bLogMissing); DWORD _GetTotalDependencySize(); DWORD _GetTotalInstallSize(); BOOL _IsValidBaseUrl(LPCSTR pszUrl); };
DWORD WINAPI InitInstaller(LPVOID); DWORD WINAPI InitDownloader(LPVOID);
extern CRITICAL_SECTION g_cs;
|