You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
272 lines
12 KiB
272 lines
12 KiB
// 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);
|
|
};
|