|
|
#ifndef _ASINSCTL_H
#define _ASINSCTL_H
#include "ipserver.h"
#include "ctrlobj.h"
#include "internet.h"
#include "iasctrls.h"
#include "inseng.h"
#include "progdlg.h"
#define RESID_TOOLBOX_BITMAP 1
#define FINALIZE_DOREBOOT 0x00000001
#define FINALIZE_NOREBOOTPROMPT 0x00000002
#define PROCESSCOMPONENT_DELAYREBOOT 0x00000001
#define PROCESSCOMPONENT_NOPROGRESSUI 0x00000002
#define PROCESSCOMPONENT_NOSUMMARYUI 0x00000004
#define PROCESSCOMPONENT_NOINSTALLUI 0x00000080
#define MAX_URLS 5
#define ERROR_STRING_SIZE 2048
#define ERROR_STRING_INCREMENT 2048
//---------------------------------------------
// AUTORUN SETTINGS FOR WIN
//---------------------------------------------
#define WINDOWS_DEFAULT_AUTOPLAY_VALUE 0x095
#define WINDOWS_AUTOPLAY_OFF 0x0FF
typedef struct { DWORD dwSize; DWORD dwStatus; DWORD dwSubstatus; DWORD dwPhase; DWORD dwResult; BSTR strID; BSTR strName; BSTR strString; BSTR chWin; BSTR chInstall; BSTR chDL; DWORD dwWin; DWORD dwInstall; DWORD dwDL; } CALLBACK_PARAMS;
// Global needed in CInstallEngine for suppressing CD Auto Splash.
extern UINT g_uCDAutorunMsg; extern unsigned long g_ulOldAutorunSetting; unsigned long SetAutorunSetting(unsigned long ulNewSettting);
//=--------------------------------------------------------------------------=
// CInstallEngine
//=--------------------------------------------------------------------------=
// our control.
//
class CInstallEngineCtl : public COleControl, public IInstallEngineCtl, public IInstallEngineCallback, public ISupportErrorInfo {
friend class CProgressDlg; friend INT_PTR CALLBACK ProgressDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); friend DWORD WINAPI DoInstall(LPVOID pv); friend INT_PTR CALLBACK LocationDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); friend INT_PTR CALLBACK DiskSpaceDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
public: // IUnknown methods
//
DECLARE_STANDARD_UNKNOWN();
// IDispatch methods
//
DECLARE_STANDARD_DISPATCH();
// ISupportErrorInfo methods
//
DECLARE_STANDARD_SUPPORTERRORINFO();
// IInstallEngine methods
//
STDMETHOD(get_ReadyState)(THIS_ long FAR* thestate); STDMETHOD(SetCifFile)(THIS_ BSTR strCabName, BSTR strCifName); STDMETHOD(put_BaseUrl)(THIS_ BSTR strBaseUrl); STDMETHOD(put_DownloadDir)(THIS_ BSTR strDownloadDir); STDMETHOD(SetAction)(THIS_ BSTR ComponentID, long action, long *lResult); STDMETHOD(IsComponentInstalled)(THIS_ BSTR ComponentID, long *lResult); STDMETHOD(ProcessComponents)(THIS_ long lFlag); STDMETHOD(get_Size)(THIS_ BSTR ComponentID, long FAR* thestate); STDMETHOD(get_DisplayName)(THIS_ BSTR ComponentID, BSTR *name); STDMETHOD(Abort)(THIS_ long lFlags); STDMETHOD(get_TotalDownloadSize)(THIS_ long FAR* totalsize); STDMETHOD(get_TotalDependencySize)(THIS_ long FAR* totaldepsize); STDMETHOD(FinalizeInstall)(THIS_ long lFlag); STDMETHOD(get_EngineStatus)(THIS_ long FAR* theenginestatus); STDMETHOD(HandleEngineProblem)(THIS_ long lFlag); STDMETHOD(CheckFreeSpace)(THIS_ long lPad, long FAR* lEnough); STDMETHOD(SetLocalCif)(THIS_ BSTR strCif, long FAR* lResult); STDMETHOD(SetSitesFile)(THIS_ BSTR strUrl, BSTR strRegion, BSTR strLocale, long FAR* lResult);
// Install engine callbacks
STDMETHOD(OnStartInstall)(DWORD dwDLSize, DWORD dwInstallSize); STDMETHOD(OnStartComponent)(LPCSTR pszID, DWORD dwDLSize, DWORD dwInstallSize, LPCSTR pszName); STDMETHOD(OnComponentProgress)(LPCSTR pszID, DWORD dwPhase, LPCSTR pszName, LPCSTR pszMsgString, ULONG progress, ULONG dwMax ); STDMETHOD(OnStopComponent)(LPCSTR pszID, HRESULT hrError, DWORD dwPhase, LPCSTR pszString, DWORD dwStatus); STDMETHOD(OnStopInstall)(HRESULT hrError, LPCSTR szError, DWORD dwStatus); STDMETHOD(OnEngineStatusChange)(DWORD dwStatus, DWORD substatus); STDMETHOD(OnEngineProblem)(DWORD dwProblem, LPDWORD pdwAction);
// OLE Control stuff follows:
//
CInstallEngineCtl(IUnknown *pUnkOuter, BOOL *pbSuccess); virtual ~CInstallEngineCtl(); // static creation function. all controls must have one of these!
//
static IUnknown *Create(IUnknown *);
// Helper functions to fire our events
void _FireOnStartInstallEvent(DWORD dwTotalSize); void _FireOnStartComponentEvent(LPCSTR pszID, DWORD dwTotalSize, LPCSTR pszName); void _FireOnStopComponentEvent(LPCSTR pszID, HRESULT hrError, DWORD dwPhase, LPCSTR pszString, DWORD dwStatus); void _FireOnStopInstallEvent(HRESULT hrError, LPCSTR szError, DWORD dwStatus); void _FireEngineStatusChange(DWORD dwEngineStatus, DWORD substatus); void _FireOnEngineProblem(DWORD dwProblem); void _FireOnComponentProgressEvent(LPCSTR pszID, DWORD dwPhase, LPCSTR pszString, LPCSTR pszMsgString, ULONG progress, ULONG themax); void _FireOnComponentProgress(DWORD lPhase, DWORD lSoFar, DWORD lTotal); void _FireOnStartInstallExEvent(DWORD dwDLSize, DWORD dwInsSize);
private: // overridables that the control must implement.
//
STDMETHOD(LoadBinaryState)(IStream *pStream); STDMETHOD(SaveBinaryState)(IStream *pStream); STDMETHOD(LoadTextState)(IPropertyBag *pPropertyBag, IErrorLog *pErrorLog); STDMETHOD(SaveTextState)(IPropertyBag *pPropertyBag, BOOL fWriteDefault); STDMETHOD(OnDraw)(DWORD dvAspect, HDC hdcDraw, LPCRECTL prcBounds, LPCRECTL prcWBounds, HDC hicTargetDev, BOOL fOptimize);
STDMETHOD(FreezeEvents)(BOOL bFreeze);
// Window stuff
virtual LRESULT WindowProc(UINT msg, WPARAM wParam, LPARAM lParam); virtual BOOL RegisterClassData(void);
// internal QI
virtual HRESULT InternalQueryInterface(REFIID, void **);
// before and after window is created
virtual void BeforeCreateWindow(void); virtual BOOL AfterCreateWindow(void);
void _InitProgressDialog(); void _DoInstall(); HRESULT _CheckInstallPath(BOOL *pfNeedDownload); BOOL _PathIsIEInstallPoint(LPCSTR pszPath); HRESULT _PickWebSites(LPCSTR pszSites, LPCSTR pszLocale, LPCSTR pszRegion, BOOL bKeepExisting); BOOL _IsEnoughSpace(LPSTR szSpace1, DWORD dwSize1, LPSTR szSpace2, DWORD dwSize2, LPSTR szSpace3, DWORD dwSize3); HRESULT _CheckForDiskSpace(); HRESULT _ShowDiskSpaceDialog(); void _FireCancel(DWORD dwCancel); LONG _OpenJITKey(HKEY *hKey, REGSAM samAttr); void _DeleteURLList(); void _WriteURLList(); void _WriteRegionToReg(LPSTR szRegion); void _PickRegionAndFirstSite(IDownloadSite **ppISite, UINT uNumSites, LPSTR pszRegion, UINT *puFirstSite); void _PickRandomSites(IDownloadSite **ppISite, BYTE *pPicks, UINT uNumSites, UINT uNumToPick, LPSTR pszRegion); void MarkJITInstall();
BOOL _fInOnEngineProblem:1; BOOL _fEventToFire:1; BOOL _fNeedReboot:1; BOOL _fLocalCifSet:1; BOOL _fReconcileCif:1; BOOL _fDoingIEInstall:1; BOOL _fInstalling:1; BOOL _fJITInstall:1;
DWORD _dwOldStatus; DWORD _dwAction; DWORD _dwInstallStatus; UINT _uInstallMode; UINT _uInstallPad;
HRESULT _hResult;
DWORD _dwSavedEngineStatus; DWORD _dwSavedSubStatus; DWORD _dwFreezeEvents; DWORD _uAllowGrovel;
BSTR _strCurrentID; BSTR _strCurrentName; BSTR _strCurrentString; DWORD m_readyState; LPSTR _pszErrorString; int _iErrorStringSize; DWORD _dwProcessComponentsFlags; HICON _hIcon; DWORD _dwLastPhase; CProgressDlg *_pProgDlg; IInstallEngine2 *_pinseng; DWORD _dwMSTrustKey; HANDLE _hDone; UINT _uCurrentUrl; LPSTR _rpszUrlList[MAX_URLS]; char _szCifCab[MAX_PATH]; char _szCifFile[MAX_PATH]; char _szDownloadDir[MAX_PATH]; BOOL _bCancelPending; BOOL _bDeleteURLList; BOOL _bNewWebSites; };
DWORD WINAPI DoInstall(LPVOID pv);
DEFINE_CONTROLOBJECT(InstallEngineCtl, // Name of object
&CLSID_InstallEngineCtl, // CLSID of object
"InstallEngineCtl", // ProgID
CInstallEngineCtl::Create, // Static create function
1, // Version
&IID_IInstallEngineCtl, // Primary dispatch
NULL, // name of help file
&DIID_DInstallEngineCtlEvents, // event interface
OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_RECOMPOSEONRESIZE|OLEMISC_CANTLINKINSIDE|OLEMISC_INSIDEOUT, 0, // Activation policy
RESID_TOOLBOX_BITMAP, // toolbox id
"InstallEngineCtlWndClass", // Window class
0, // number of pages
NULL, // array of property pages
0, // Number of verbs
NULL); // Array of verbs
#define OBJECT_INSTALLENGINECTL 0
#endif
|