Windows2003-3790/inetcore/urlmon/download/softdist.hxx
2020-09-30 16:53:55 +02:00

215 lines
6.5 KiB
C++

#ifndef _SOFTDIST_H_
#define _SOFTDIST_H_
#ifdef __cplusplus
typedef struct tagDISTUNITINST {
DWORD dwInstalledVersionMS;
DWORD dwInstalledVersionLS;
} DISTUNITINST, *LPDISTUNITINST;
typedef struct tagDISTUNITADVT {
DWORD dwVersionMS;
DWORD dwVersionLS;
LPCSTR pszTitle;
LPCSTR pszAbstract;
LPCSTR pszHREF;
} DISTUNITADVT, *LPDISTUNITADVT;
/*
STDAPI
GetDistributionUnitAdvertisement(
LPCWSTR szDistUnit,
LPDISTUNITINST *ppdunitinst,
LPDISTUNITADVT *ppdunitadvt,
LPVOID pvReserved, // Must be NULL
DWORD flags);
*/
// SoftDist tag handler for CDF
#define CBH_FLAGS_DOWNLOADED 0x1
#define CBH_FLAGS_MAIN_CODEBASE 0x2
class CCodeBaseHold {
public:
CCodeBaseHold() {
wszCodeBase = NULL;
dwSize = 0;
bHREF = FALSE;
wszDLGroup = NULL;
dwFlags = 0;
}
~CCodeBaseHold() {
if (wszCodeBase) {
delete wszCodeBase;
}
if (wszDLGroup) {
delete wszDLGroup;
}
}
LPWSTR wszCodeBase;
DWORD dwSize;
BOOL bHREF;
LPWSTR wszDLGroup;
DWORD dwFlags;
};
// Helper prototypes
BOOL AreAllLanguagesPresent(LPCSTR lpszLang1, LPCSTR lpszLang2);
HRESULT GetStyleFromString(LPSTR szStyle, LPDWORD lpdwStyle);
HRESULT CheckLanguage(LCID localeID, LPTSTR szLanguages);
class CSoftDist : public ISoftDistExt {
public:
CSoftDist();
~CSoftDist();
// IUnknown methods
STDMETHODIMP QueryInterface(REFIID riid,void ** ppv);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// ISoftDistExt methods
STDMETHODIMP ProcessSoftDist(LPCWSTR szCDFURL, IXMLElement *pSoftDistElement, LPSOFTDISTINFO);
STDMETHODIMP GetFirstCodeBase(LPWSTR *szCodeBase, DWORD *dwMaxSize);
STDMETHODIMP GetNextCodeBase(LPWSTR *szCodeBase, DWORD *dwMaxSize);
STDMETHODIMP AsyncInstallDistributionUnit(IBindCtx *pbc, LPVOID pvReserved, DWORD flags, LPCODEBASEHOLD lpcbh);
// helper methods for GetSoftwareUpdateInfo
HRESULT GetSoftwareUpdateInfo( LPCWSTR szDistUnit, LPSOFTDISTINFO psdi );
HRESULT SetSoftwareUpdateAdvertisementState( LPCWSTR szDistUnit,
DWORD dwAdState,
DWORD dwAdvertisedVersionMS,
DWORD dwAdvertisedVersionLS );
// Other functions
STDMETHODIMP Logo3Download(LPWSTR szCodeBase);
STDMETHODIMP Logo3DownloadNext();
STDMETHODIMP Logo3DownloadRedundant();
private:
HRESULT IsLocallyInstalled(LPCWSTR szDistUnit, DWORD dwVersionMS, DWORD dwVersionLS, LPCSTR szLanguages, DWORD style);
HRESULT IsICDLocallyInstalled(LPCWSTR szDistUnit, DWORD dwVersionMS, DWORD dwVersionLS, LPCSTR szLanguages);
HRESULT IsActSetupLocallyInstalled(LPCWSTR szDistUnit, DWORD dwVersionMS, DWORD dwVersionLS, LPCSTR szLanguages);
HRESULT IsLogo3LocallyInstalled(LPCWSTR szDistUnit, DWORD dwVersionMS, DWORD dwVersionLS, LPCSTR szLanguages);
HRESULT IsLogo3Advertised(LPBOOL lpfIsPrecached, LPBOOL lpfIsAuthorizedCDF);
HRESULT IsICDAdvertised(LPBOOL lpfIsPrecached, LPBOOL lpfIsAuthorizedCDF);
HRESULT IsActSetupAdvertised(LPBOOL lpfIsPrecached, LPBOOL lpfIsAuthorizedCDF);
HRESULT IsAdvertised(LPBOOL lpfIsPrecached, LPBOOL lpfIsAuthorizedCDF);
HRESULT Advertise(BOOL bFullAdvt);
HRESULT ICDAdvertise(BOOL bFullAdvt);
HRESULT ActSetupAdvertise(BOOL bFullAdvt);
HRESULT Logo3Advertise(BOOL bFullAdvt);
HRESULT CheckDependency(IXMLElement *pSoftDist);
HRESULT CheckConfig(IXMLElement *pSoftDist);
BOOL IsCDFNewerVersion(DWORD dwCurMS, DWORD dwCurLS);
BOOL IsAuthorizedCDF(HKEY hkRootDU, BOOL bOptional=FALSE);
BOOL IsAnyInstalled() {
return (m_distunitinst.dwInstalledVersionMS | m_distunitinst.dwInstalledVersionLS);
}
LPCWSTR GetMainDistUnit() const { return m_szDistUnit;}
LPCSTR GetCDF() const { return m_szCDFURL;}
HRESULT PrepSoftwareUpdate( LPCWSTR szDistUnit, DWORD *pdwStyle );
#ifdef WX86
CMultiArch * GetMultiArch() { return &m_MultiArch; }
#endif
DWORD m_cRef;
LPWSTR m_szDistUnit;
DWORD m_dwVersionMS;
DWORD m_dwVersionLS;
DWORD m_dwVersionAdvertisedMS;
DWORD m_dwVersionAdvertisedLS;
DWORD m_dwAdState;
DWORD m_Style;
LPSTR m_szCDFURL;
LPSTR m_szTitle;
LPSTR m_szLanguages;
LPSTR m_szAbstract;
LPSTR m_szHREF;
CList<CCodeBaseHold*,CCodeBaseHold*> m_cbh;
POSITION m_curPos;
ISoftDistExt *m_sdMSInstall; // Darwin interface
DISTUNITINST m_distunitinst;
IBindStatusCallback *m_pClientBSC;
LPWSTR m_szBaseURL;
#ifdef WX86
CMultiArch m_MultiArch;
#endif
};
class CActiveSetupBinding : IBinding
{
friend DWORD StartActiveSetup(void *dwArg);
public:
CActiveSetupBinding(IBindCtx *pbc, IBindStatusCallback *pbsc, LPWSTR szCodeBase,
LPWSTR szDistUnit, HRESULT *hr);
~CActiveSetupBinding();
// IUnknown methods
STDMETHODIMP QueryInterface(REFIID riid,void ** ppv);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// IBinding methods
STDMETHOD(Abort)( void);
STDMETHOD(Suspend)( void);
STDMETHOD(Resume)( void);
STDMETHOD(SetPriority)(LONG nPriority);
STDMETHOD(GetPriority)(LONG *pnPriority);
STDMETHOD(GetBindResult)(CLSID *pclsidProtocol, DWORD *pdwResult, LPWSTR *pszResult,DWORD *pdwReserved);
private:
void StartActiveSetup(void);
void DoCleanUp(DWORD dwExitCode);
BSTR GetErrorMessage(HRESULT hr);
HRESULT SaveHresult(HRESULT hr);
HRESULT SetDefaultDownloadSite(LPSTR szSite);
IBindStatusCallback *m_pbsc;
IBindCtx *m_pbc;
LPSTR m_szCodeBase;
CHAR m_szActSetupPath[MAX_PATH+1];
LPSTR m_szDistUnit;
HANDLE m_hWaitThread;
PROCESS_INFORMATION m_piChild;
DWORD dwThreadID;
DWORD m_dwRef;
BOOL fSilent;
};
#endif
#endif // _SOFTDIST_H_