Windows2003-3790/inetcore/setup/active/inseng/cifcomp.h
2020-09-30 16:53:55 +02:00

273 lines
12 KiB
C++

// Keys in cif file
#include "download.h"
#define URL_KEY "URL"
#define GUID_KEY "GUID"
#define ARGS_KEY "Switches"
#define CMD_KEY "Command"
#define SIZE_KEY "Size"
#define INSTALLSIZE_KEY "InstalledSize"
#define DISPLAYNAME_KEY "DisplayName"
#define VERSION_KEY "Version"
#define QFE_VERSION_KEY "QFEVersion"
#define TYPE_KEY "Type"
#define UNINSTALL_KEY "Uninstall"
#define DEPENDENCY_KEY "Dependencies"
#define UNINSTALLSTRING_KEY "UninstallKey"
#define SUCCESS_KEY "SuccessKey"
#define REBOOT_KEY "Reboot"
#define ADMIN_KEY "AdminCheck"
#define LOCALE_KEY "Locale"
#define MUTEX_KEY "CancelMutex"
#define ISINSTALLED_KEY "IsInstalled"
#define ACTSETUPAWARE_KEY "ActiveSetupAware"
#define PRIORITY "Priority"
#define PROGRESS_KEY "ProgressKey"
#define COMPID_KEY "ComponentID"
#define STUBPATH_KEY "StubPath"
#define PARENTID_KEY "ParentID"
#define PATCHID_KEY "PatchID"
#define APPLIESTO_KEY "AppliesTo"
#define MINFILESIZE_KEY "MinFileSize"
#define URLSIZE_KEY "Size"
#define DETAILS_KEY "Details"
#define MODES_KEY "Modes"
#define UIVISIBLE_KEY "UIVisible"
#define PLATFORM_KEY "Platform"
#define GROUP_KEY "Group"
#define ENTRYTYPE_KEY "SectionType"
#define DETVERSION_KEY "DetectVersion"
#define TREATAS_KEY "TreatAsOne"
#define BUDDY_KEY "Buddies"
#define DETDLLS_KEY "DetectDlls"
#define ENTRYTYPE_COMP "Component"
#define ENTRYTYPE_GROUP "Group"
#define ENTRYTYPE_MODE "Mode"
#define REGSTR_PROGRESS_KEY "Software\\Microsoft\\Active Setup\\Component Progress\\"
#define COMPONENT_KEY "Software\\Microsoft\\Active Setup\\Installed Components"
#define ACTIVESETUP_KEY "Software\\Microsoft\\Active Setup"
#define COMPONENTBLOCK_KEY "Software\\Microsoft\\Active Setup\\Component Block"
#define CANCEL_VALUENAME "Cancel"
#define SAFE_VALUENAME "Safe"
#define PROGRESS_DISPLAY "DisplayString"
#define DEP_NEVER_INSTALL 'N'
#define DEP_INSTALL 'I'
#define DEP_BUDDY 'B'
#define DEFAULT_LOCALE "en"
#define ISINSTALLED_YES 1
#define ISINSTALLED_NO 0
// Default command type
#define CMDF_DEFAULT 0
#define STR_WIN95 "win95"
#define STR_WIN98 "win98"
#define STR_NT4 "nt4"
#define STR_NT5 "nt5"
#define STR_NT4ALPHA "nt4alpha"
#define STR_NT5ALPHA "nt5alpha"
#define STR_MILLEN "millen"
#define SETACTION_DEPENDENCYINSTALL 0x00010000
#define SETACTION_DEPENDENCYNONE 0x00020000
#define BUFFERSIZE 4096
class CCifFile;
class CCifEntry
{
public:
BOOL IsID(LPCSTR pszID) { return (lstrcmpi(_szID, pszID) == 0); }
virtual void ClearCachedInfo() { _uPriority = 0xffffffff; }
protected:
CCifEntry(LPCSTR pszID, CCifFile *pCif) { lstrcpyn(_szID, pszID, sizeof(_szID)); _pCif = pCif; _uPriority = 0xffffffff; }
~CCifEntry() {}
CCifFile *_pCif;
char _szID[MAX_ID_LENGTH];
UINT _uPriority;
};
class CCifComponent : public ICifComponent, public CCifEntry, public IMyDownloadCallback
{
public:
CCifComponent(LPCSTR pszID, CCifFile *pCif);
~CCifComponent();
HRESULT Download();
HRESULT Install();
void ClearQueueState() { _uInstallCount = 0; }
void ClearCachedInfo() { CCifEntry::ClearCachedInfo(); _dwPlatform = 0xffffffff; _uInstallStatus = 0xffffffff; }
// IMyDownloadCallback
HRESULT OnProgress(ULONG progress, LPCSTR pszStatus);
// ICifComponent interface
STDMETHOD(GetID)(LPSTR pszID, DWORD dwSize);
STDMETHOD(GetGUID)(LPSTR pszGUID, DWORD dwSize);
STDMETHOD(GetDescription)(LPSTR pszDesc, DWORD dwSize);
STDMETHOD(GetDetails)(LPSTR pszDetails, DWORD dwSize);
STDMETHOD(GetUrl)(UINT uUrlNum, LPSTR pszUrl, DWORD dwSize, LPDWORD pdwUrlFlags);
STDMETHOD(GetFileExtractList)(UINT uUrlNum, LPSTR pszExtract, DWORD dwSize);
STDMETHOD(GetUrlCheckRange)(UINT uUrlNum, LPDWORD pdwMin, LPDWORD pdwMax);
STDMETHOD(GetCommand)(UINT uCmdNum, LPSTR pszCmd, DWORD dwCmdSize, LPSTR pszSwitches,
DWORD dwSwitchSize, LPDWORD pdwType);
STDMETHOD(GetVersion)(LPDWORD pdwVersion, LPDWORD pdwBuild);
STDMETHOD(GetLocale)(LPSTR pszLocale, DWORD dwSize);
STDMETHOD(GetUninstallKey)(LPSTR pszKey, DWORD dwSize);
STDMETHOD(GetInstalledSize)(LPDWORD pdwWin, LPDWORD pdwApp);
STDMETHOD_(DWORD, GetDownloadSize)();
STDMETHOD_(DWORD, GetExtractSize)();
STDMETHOD(GetSuccessKey)(LPSTR pszKey, DWORD dwSize);
STDMETHOD(GetProgressKeys)(LPSTR pszProgress, DWORD dwProgSize,
LPSTR pszCancel, DWORD dwCancelSize);
STDMETHOD(IsActiveSetupAware)();
STDMETHOD(IsRebootRequired)();
STDMETHOD(RequiresAdminRights)();
STDMETHOD_(DWORD, GetPriority)();
STDMETHOD(GetDependency)(UINT uDepNum, LPSTR pszID, DWORD dwBuf, char *pchType, LPDWORD pdwVer, LPDWORD pdwBuild);
STDMETHOD_(DWORD, GetPlatform)();
STDMETHODIMP_(BOOL) DisableComponent();
STDMETHOD(GetMode)(UINT uModeNum, LPSTR pszModes, DWORD dwSize);
STDMETHOD(GetGroup)(LPSTR pszID, DWORD dwSize);
STDMETHOD(IsUIVisible)();
STDMETHOD(GetPatchID)(LPSTR pszID, DWORD dwSize);
STDMETHOD(GetDetVersion)(LPSTR pszDLL, DWORD dwdllSize, LPSTR pszEntry, DWORD dwentSize);
STDMETHOD(GetTreatAsOneComponents)(UINT uNum, LPSTR pszID, DWORD dwBuf);
STDMETHOD(GetCustomData)(LPSTR pszKey, LPSTR pszData, DWORD dwSize);
// access to state
STDMETHOD_(DWORD, IsComponentInstalled)();
STDMETHOD(IsComponentDownloaded)();
STDMETHOD_(DWORD, IsThisVersionInstalled)(DWORD dwAskVer, DWORD dwAskBld, LPDWORD pdwVersion, LPDWORD pdwBuild);
STDMETHOD_(DWORD, GetInstallQueueState)();
STDMETHOD(SetInstallQueueState)(DWORD dwState);
STDMETHOD_(DWORD, GetActualDownloadSize)();
STDMETHOD_(DWORD, GetCurrentPriority)();
STDMETHOD(SetCurrentPriority)(DWORD dwPriority);
protected:
static char _szDetDllName[MAX_PATH];
static HINSTANCE _hDetLib;
char _szDesc[MAX_DISPLAYNAME_LENGTH];
char _szDLDir[MAX_PATH];
UINT _dwPlatform;
UINT _uInstallStatus;
UINT _uInstallCount; // refcount of dependendant installs, 0x80000000 if directly installed
UINT _uTotalProgress;
UINT _uIndivProgress;
UINT _uTotalGoal;
UINT _uPhase;
BOOL _fDependenciesQueued:1;
BOOL _fUseSRLite:1;
BOOL _fBeforeInstall:1;
HRESULT _DownloadUrl(UINT uUrlNum, LPCSTR pszUrl, UINT dwType);
BOOL _FileIsDownloaded(LPCSTR pszFile, UINT i, DWORD *pdwSize);
BOOL _CompareDownloadInfo();
void _MarkAsInstalled();
void _MarkDownloadStarted();
void _MarkFileDownloadStarted(UINT i);
void _MarkFileDownloadFinished(LPCSTR pszFilePath, UINT i, LPCSTR pszFilename);
HRESULT _CheckForTrust(LPCSTR pszURL, LPCSTR pszFilename);
HRESULT _CopyAllUrls(LPCSTR pszTemp);
void _MarkComponentInstallStarted();
HRESULT _RunAllCommands(LPCSTR psDir, DWORD *pdwStatus);
HRESULT _ExtractFiles(UINT i, LPCSTR pszFile, DWORD dwType);
HRESULT _CheckForDependencies();
HRESULT _GetDetVerResult(LPCSTR pszDll, LPCSTR pszEntry, DETECTION_STRUCT *pDet, UINT *uStatus);
HRESULT _SRLiteDownloadFiles();
LPCSTR GetDownloadDir() { return _szDLDir; }
void SetDownloadDir(LPCSTR pszDownloadDir);
};
class CCifRWComponent : public ICifRWComponent, public CCifComponent
{
public:
// ICifComponent interface
STDMETHOD(GetID)(LPSTR pszID, DWORD dwSize);
STDMETHOD(GetGUID)(LPSTR pszGUID, DWORD dwSize);
STDMETHOD(GetDescription)(LPSTR pszDesc, DWORD dwSize);
STDMETHOD(GetDetails)(LPSTR pszDetails, DWORD dwSize);
STDMETHOD(GetUrl)(UINT uUrlNum, LPSTR pszUrl, DWORD dwSize, LPDWORD pdwUrlFlags);
STDMETHOD(GetFileExtractList)(UINT uUrlNum, LPSTR pszExtract, DWORD dwSize);
STDMETHOD(GetUrlCheckRange)(UINT uUrlNum, LPDWORD pdwMin, LPDWORD pdwMax);
STDMETHOD(GetCommand)(UINT uCmdNum, LPSTR pszCmd, DWORD dwCmdSize, LPSTR pszSwitches,
DWORD dwSwitchSize, LPDWORD pdwType);
STDMETHOD(GetVersion)(LPDWORD pdwVersion, LPDWORD pdwBuild);
STDMETHOD(GetLocale)(LPSTR pszLocale, DWORD dwSize);
STDMETHOD(GetUninstallKey)(LPSTR pszKey, DWORD dwSize);
STDMETHOD(GetInstalledSize)(LPDWORD pdwWin, LPDWORD pdwApp);
STDMETHOD_(DWORD, GetDownloadSize)();
STDMETHOD_(DWORD, GetExtractSize)();
STDMETHOD(GetSuccessKey)(LPSTR pszKey, DWORD dwSize);
STDMETHOD(GetProgressKeys)(LPSTR pszProgress, DWORD dwProgSize,
LPSTR pszCancel, DWORD dwCancelSize);
STDMETHOD(IsActiveSetupAware)();
STDMETHOD(IsRebootRequired)();
STDMETHOD(RequiresAdminRights)();
STDMETHOD_(DWORD, GetPriority)();
STDMETHOD(GetDependency)(UINT uDepNum, LPSTR pszID, DWORD dwBuf, char *pchType, LPDWORD pdwVer, LPDWORD pdwBuild);
STDMETHOD_(DWORD, GetPlatform)();
STDMETHOD(GetMode)(UINT uModeNum, LPSTR pszModes, DWORD dwSize);
STDMETHOD(GetGroup)(LPSTR pszID, DWORD dwSize);
STDMETHOD(IsUIVisible)();
STDMETHOD(GetPatchID)(LPSTR pszID, DWORD dwSize);
STDMETHOD(GetDetVersion)(LPSTR pszDLL, DWORD dwdllSize, LPSTR pszEntry, DWORD dwentSize);
STDMETHOD(GetTreatAsOneComponents)(UINT uNum, LPSTR pszID, DWORD dwBuf);
STDMETHOD(GetCustomData)(LPSTR pszKey, LPSTR pszData, DWORD dwSize);
// access to state
STDMETHOD_(DWORD, IsComponentInstalled)();
STDMETHOD(IsComponentDownloaded)();
STDMETHOD_(DWORD, IsThisVersionInstalled)(DWORD dwAskVer, DWORD dwAskBld, LPDWORD pdwVersion, LPDWORD pdwBuild);
STDMETHOD_(DWORD, GetInstallQueueState)();
STDMETHOD(SetInstallQueueState)(DWORD dwState);
STDMETHOD_(DWORD, GetActualDownloadSize)();
STDMETHOD_(DWORD, GetCurrentPriority)();
STDMETHOD(SetCurrentPriority)(DWORD dwPriority);
// ICifRWComponent interface
CCifRWComponent(LPCSTR pszID, CCifFile *pCif);
~CCifRWComponent();
STDMETHOD(SetGUID)(THIS_ LPCSTR pszGUID);
STDMETHOD(SetDescription)(THIS_ LPCSTR pszDesc);
STDMETHOD(SetCommand)(THIS_ UINT uCmdNum, LPCSTR pszCmd, LPCSTR pszSwitches, DWORD dwType);
STDMETHOD(SetVersion)(THIS_ LPCSTR pszVersion);
STDMETHOD(SetUninstallKey)(THIS_ LPCSTR pszKey);
STDMETHOD(SetInstalledSize)(THIS_ DWORD dwWin, DWORD dwApp);
STDMETHOD(SetDownloadSize)(THIS_ DWORD);
STDMETHOD(SetExtractSize)(THIS_ DWORD);
STDMETHOD(DeleteDependency)(THIS_ LPCSTR pszID, char chType);
STDMETHOD(AddDependency)(THIS_ LPCSTR pszID, char chType);
STDMETHOD(SetUIVisible)(THIS_ BOOL);
STDMETHOD(SetGroup)(THIS_ LPCSTR pszID);
STDMETHOD(SetPlatform)(THIS_ DWORD);
STDMETHOD(SetPriority)(THIS_ DWORD);
STDMETHOD(SetReboot)(THIS_ BOOL);
STDMETHOD(SetUrl)(THIS_ UINT uUrlNum, LPCSTR pszUrl, DWORD dwUrlFlags);
STDMETHOD(DeleteFromModes)(THIS_ LPCSTR pszMode);
STDMETHOD(AddToMode)(THIS_ LPCSTR pszMode);
STDMETHOD(SetModes)(THIS_ LPCSTR pszMode);
STDMETHOD(CopyComponent)(THIS_ LPCSTR pszCifFile);
STDMETHOD(AddToTreatAsOne)(THIS_ LPCSTR pszCompID);
STDMETHOD(SetDetails)(THIS_ LPCSTR pszDesc);
};