//======================================================================= // // Copyright (c) 2000 Microsoft Corporation. All Rights Reserved. // // File: Update.h // // Owner: JHou // // Description: // // Industry Update v1.0 client control stub - Declaration of the CUpdate // // // Revision History: // // Date Author Desc // ~~~~ ~~~~~~ ~~~~ // 9/15/2000 JHou created. // //======================================================================= #ifndef __UPDATE_H_ #define __UPDATE_H_ #include "resource.h" // main symbols #include "IUCtl.h" #include "IUCtlCP.h" #include "EvtMsgWnd.h" #include // for HIUENGINE // BOOL IsThisUpdate2(); class CMyComClassFactory : public CComClassFactory { public: // IClassFactory STDMETHOD(CreateInstance)(LPUNKNOWN pUnkOuter, REFIID riid, void** ppvObj) { HRESULT hr = CComClassFactory::CreateInstance(pUnkOuter, riid, ppvObj); if (SUCCEEDED(hr)) { // // allocate thread global variables, thread handle // } return hr; } }; ///////////////////////////////////////////////////////////////////////////// // CUpdate class ATL_NO_VTABLE CUpdate : public CComObjectRootEx, public CComCoClass, public IObjectWithSiteImpl, public IObjectSafety, public ISupportErrorInfo, public IConnectionPointContainerImpl, public IProvideClassInfo2Impl<&CLSID_Update, NULL, &LIBID_IUCTLLib>, public IDispatchImpl, public CProxyIUpdateEvents { public: CUpdate(); ~CUpdate(); // // impl of object safety for scripting // ULONG InternalRelease(); STDMETHOD(GetInterfaceSafetyOptions)(REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions); STDMETHOD(SetInterfaceSafetyOptions)(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions); DECLARE_REGISTRY_RESOURCEID(IDR_UPDATE) /* we decided to use the new Win32 API GetControlUpdateInfo() to expose these data and let a wrapper control to call it so we won't have reboot issue on OS prior to WinXP static HRESULT WINAPI UpdateRegistry(BOOL bRegister) { UINT nResID = IsThisUpdate2() ? IDR_UPDATE2 : IDR_UPDATE; return _Module.UpdateRegistryFromResource(nResID, bRegister); } */ DECLARE_NOT_AGGREGATABLE(CUpdate) DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MAP(CUpdate) COM_INTERFACE_ENTRY(IUpdate) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(IObjectSafety) COM_INTERFACE_ENTRY(ISupportErrorInfo) COM_INTERFACE_ENTRY(IProvideClassInfo) COM_INTERFACE_ENTRY(IProvideClassInfo2) COM_INTERFACE_ENTRY_IMPL(IObjectWithSite) COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) END_COM_MAP() BEGIN_CONNECTION_POINT_MAP(CUpdate) CONNECTION_POINT_ENTRY(DIID_IUpdateEvents) END_CONNECTION_POINT_MAP() // ISupportsErrorInfo STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid); // IUpdate public: DECLARE_CLASSFACTORY_EX(CMyComClassFactory); ///////////////////////////////////////////////////////////////////////////// // // Initialize() API must be called before any other API will function // // If any other API is called before the control is initialized, // that API will return OLE_E_BLANK, signalling this OLE control is an // uninitialized object (although in this case it's a bit different from // its original meaning) // // Parameters: // // lInitFlag - IU_INIT_CHECK, cause Initialize() download ident and check if any // of the components need updated. currently we support control version // check and engine version check. Return value is a bit mask // // - IU_INIT_UPDATE_SYNC, cause Initialize() kicks off update engine // process if already called by IU_INIT_CHECK and a new engine is available. // When API returns, the update process is finished. // // - IU_INIT_UPDATE_ASYNC, cause Initialize() kicks off update engine // process in Asynchronized mode if already called by IU_INIT_CHECK and // a new engine is available. This API will return right after the // update process starts. // // punkUpdateCompleteListener - this is a pointer to a user-implemented // COM callback feature. It contains only one function OnComplete() that // will be called when the engine update is done. // This value can be NULL. // ///////////////////////////////////////////////////////////////////////////// STDMETHOD(Initialize)( /*[in]*/ LONG lInitFlag, /*[in]*/ IUnknown* punkUpdateCompleteListener, /*[out, retval]*/ LONG* plRetVal); ///////////////////////////////////////////////////////////////////////////// // GetSystemSpec() // // Gets the basic system specs. // Input: // bstrXmlClasses - a list of requested classes in xml format, NULL if any. // For example: // // // // // Output: // pbstrXmlDetectionResult - the detection result in xml format. ///////////////////////////////////////////////////////////////////////////// STDMETHOD(GetSystemSpec)(BSTR bstrXmlClasses, BSTR* pbstrXmlDetectionResult); ///////////////////////////////////////////////////////////////////////////// // GetManifest() // // Gets a catalog base on the specified information. // Input: // bstrXmlClientInfo - the credentials of the client in xml format // bstrXmlSystemSpec - the detected system specifications in xml // bstrXmlQuery - the user query infomation in xml // Output: // pbstrXmlCatalog - the xml catalog retrieved ///////////////////////////////////////////////////////////////////////////// STDMETHOD(GetManifest)(BSTR bstrXmlClientInfo, BSTR bstrXmlSystemSpec, BSTR bstrXmlQuery, BSTR* pbstrXmlCatalog); ///////////////////////////////////////////////////////////////////////////// // Detect() // // Do detection. // Input: // bstrXmlCatalog - the xml catalog portion containing items to be detected // Output: // pbstrXmlItems - the detected items in xml format // e.g. // ///////////////////////////////////////////////////////////////////////////// STDMETHOD(Detect)(BSTR bstrXmlCatalog, BSTR* pbstrXmlItems); ///////////////////////////////////////////////////////////////////////////// // Download() // // Do synchronized downloading. // Input: // bstrXmlClientInfo - the credentials of the client in xml format // bstrXmlCatalog - the xml catalog portion containing items to be downloaded // bstrDestinationFolder - the destination folder. Null will use the default IU folder // lMode - indicates throttled or fore-ground downloading mode // punkProgressListener - the callback function pointer for reporting download progress // Output: // pbstrXmlItems - the items with download status in xml format // e.g. // ///////////////////////////////////////////////////////////////////////////// STDMETHOD(Download)(BSTR bstrXmlClientInfo, BSTR bstrXmlCatalog, BSTR bstrDestinationFolder, LONG lMode, IUnknown* punkProgressListener, BSTR* pbstrXmlItems); ///////////////////////////////////////////////////////////////////////////// // DownloadAsync() // // Download asynchronously - the method will return before completion. // Input: // bstrXmlClientInfo - the credentials of the client in xml format // bstrXmlCatalog - the xml catalog portion containing items to be downloaded // bstrDestinationFolder - the destination folder. Null will use the default IU folder // lMode - indicates throttled or fore-ground downloading mode // punkProgressListener - the callback function pointer for reporting download progress // bstrUuidOperation - an id provided by the client to provide further // identification to the operation as indexes may be reused. // Output: // pbstrUuidOperation - the operation ID. If it is not provided by the in bstrUuidOperation // parameter (an empty string is passed), it will generate a new UUID, // in which case, the caller will be responsible to free the memory of // the string buffer that holds the generated UUID using SysFreeString(). // Otherwise, it returns the value passed by bstrUuidOperation. ///////////////////////////////////////////////////////////////////////////// STDMETHOD(DownloadAsync)(BSTR bstrXmlClientInfo, BSTR bstrXmlCatalog, BSTR bstrDestinationFolder, LONG lMode, IUnknown* punkProgressListener, BSTR bstrUuidOperation, BSTR* pbstrUuidOperation); ///////////////////////////////////////////////////////////////////////////// // Install() // // Do synchronized installation. // Input: // bstrXmlCatalog - the xml catalog portion containing items to be installed // bstrXmlDownloadedItems - the xml of downloaded items and their respective download // result as described in the result schema. Install uses this // to know whether the items were downloaded and if so where they // were downloaded to so that it can install the items // lMode - indicates different installation mode // punkProgressListener - the callback function pointer for reporting install progress // Output: // pbstrXmlItems - the items with installation status in xml format // e.g. // ///////////////////////////////////////////////////////////////////////////// STDMETHOD(Install)(BSTR bstrXmlClientInfo, BSTR bstrXmlCatalog, BSTR bstrXmlDownloadedItems, LONG lMode, IUnknown* punkProgressListener, BSTR* pbstrXmlItems); ///////////////////////////////////////////////////////////////////////////// // InstallAsync() // // Install Asynchronously. // Input: // bstrXmlCatalog - the xml catalog portion containing items to be installed // bstrXmlDownloadedItems - the xml of downloaded items and their respective download // result as described in the result schema. Install uses this // to know whether the items were downloaded and if so where they // were downloaded to so that it can install the items // lMode - indicates different installation mode // punkProgressListener - the callback function pointer for reporting install progress // bstrUuidOperation - an id provided by the client to provide further // identification to the operation as indexes may be reused. // Output: // pbstrUuidOperation - the operation ID. If it is not provided by the in bstrUuidOperation // parameter (an empty string is passed), it will generate a new UUID, // in which case, the caller will be responsible to free the memory of // the string buffer that holds the generated UUID using SysFreeString(). // Otherwise, it returns the value passed by bstrUuidOperation. ///////////////////////////////////////////////////////////////////////////// STDMETHOD(InstallAsync)(BSTR bstrXmlClientInfo, BSTR bstrXmlCatalog, BSTR bstrXmlDownloadedItems, LONG lMode, IUnknown* punkProgressListener, BSTR bstrUuidOperation, BSTR* pbstrUuidOperation); ///////////////////////////////////////////////////////////////////////////// // SetOperationMode() // // Set the operation mode // Input: // bstrUuidOperation - an id provided by the client to provide further // identification to the operation as indexes may be reused. // lMode - a bitmask for the following mode: // UPDATE_COMMAND_PAUSE // UPDATE_COMMAND_RESUME // UPDATE_COMMAND_CANCEL // UPDATE_NOTIFICATION_COMPLETEONLY // UPDATE_NOTIFICATION_ANYPROGRESS // UPDATE_NOTIFICATION_1PCT // UPDATE_NOTIFICATION_5PCT // UPDATE_NOTIFICATION_10PCT // UPDATE_SHOWUI ///////////////////////////////////////////////////////////////////////////// STDMETHOD(SetOperationMode)(BSTR bstrUuidOperation, LONG lMode); /** * * Get the mode of a specified operation. * * @param bstrUuidOperation: same as in SetOperationMode() * @param plMode - the retval for the mode found in a bitmask for: * (value in brackets [] means default) * UPDATE_COMMAND_PAUSE (TRUE/[FALSE]) * UPDATE_COMMAND_RESUME (TRUE/[FALSE]) * UPDATE_NOTIFICATION_COMPLETEONLY (TRUE/[FALSE]) * UPDATE_NOTIFICATION_ANYPROGRESS ([TRUE]/FALSE) * UPDATE_NOTIFICATION_1PCT (TRUE/[FALSE]) * UPDATE_NOTIFICATION_5PCT (TRUE/[FALSE]) * UPDATE_NOTIFICATION_10PCT (TRUE/[FALSE]) * UPDATE_SHOWUI (TRUE/[FALSE]) * */ STDMETHOD(GetOperationMode)( /*[in]*/ BSTR bstrUuidOperation, /*[out,retval]*/ LONG* plMode ); /** * * Retrieve a property of this control * Calling this method will not cause the engine loaded * * @param lProperty - the identifier to flag which property need retrieved * UPDATE_PROP_OFFLINEMODE (TRUE/[FALSE]) * UPDATE_PROP_USECOMPRESSION ([TRUE]/FALSE) * * @param varValue - the value to retrieve * */ STDMETHOD(GetProperty)( /*[in]*/ LONG lProperty, /*[out,retval]*/ VARIANT* pvarValue ); /** * * Set a property of this control * Calling this method will not cause the engine loaded * * @param lProperty - the identifier to flag which property need changed * UPDATE_PROP_OFFLINEMODE (TRUE/[FALSE]) * UPDATE_PROP_USECOMPRESSION ([TRUE]/FALSE) * * @param varValue - the value to change * */ STDMETHOD(SetProperty)( /*[in]*/ LONG lProperty, /*[in]*/ VARIANT varValue ); ///////////////////////////////////////////////////////////////////////////// // GetHistory() // // Get the history log. // Input: // bstrDateTimeFrom - the start date and time for which a log is required. // This is a string in ANSI format (YYYY-MM-DDTHH-MM). // If the string is empty, there will be no date restriction // of the returned history log. // bstrDateTimeTo - the end date and time for which a log is required. // This is a string in ANSI format (YYYY-MM-DDTHH-MM). // If the string is empty, there will be no date restriction // of the returned history log. // bstrClient - the name of the client that initiated the action. If this parameter // is null or an empty string, then there will be no filtering based // on the client. // bstrPath - the path used for download or install. Used in the corporate version // by IT managers. If this parameter is null or an empty string, then // there will be no filtering based on the path. // Output: // pbstrLog - the history log in xml format ///////////////////////////////////////////////////////////////////////////// STDMETHOD(GetHistory)(BSTR bstrDateTimeFrom, BSTR bstrDateTimeTo, BSTR bstrClient, BSTR bstrPath, BSTR* pbstrLog); ///////////////////////////////////////////////////////////////////////////// // // Primarily expose shlwapi BrowseForFolder API, can also do checking // on R/W access if flagged so. // // @param bstrStartFolder - the folder from which to start. If NULL or empty str // is being passed in, then start from desktop // // @param flag - validating check // UI_WRITABLE for checking write access, OK button may disabled. // UI_READABLE for checking read access, OK button may disabled. // NO_UI_WRITABLE for checking write access, return error if no access // NO_UI_READABLE for checking read access, return error if no access // 0 (default) for no checking. // // @param pbstrFolder - returned folder if a valid folder selected // ///////////////////////////////////////////////////////////////////////////// STDMETHOD(BrowseForFolder)(BSTR bstrStartFolder, LONG flag, BSTR* pbstrFolder); ///////////////////////////////////////////////////////////////////////////// // // Allows the Caller to Request the Control to do a Reboot // ///////////////////////////////////////////////////////////////////////////// STDMETHOD(RebootMachine)(); ///////////////////////////////////////////////////////////////////////////// // // Make the other control can be unloaded from IE/OLE // ///////////////////////////////////////////////////////////////////////////// STDMETHOD(PrepareSelfUpdate)(/*[in]*/ LONG lStep); ///////////////////////////////////////////////////////////////////////////// // // Helper API to let the caller (script) knows the necessary information // when Initialize() returns control need updated. // // For the current implementation, bstrClientName is ignored, and // the returned bstr has format: // "|" // where: // is the expacted version number of the control // is the base url to get the control if this is a CorpWU policy controlled machine, // or empty if this is a consumer machine (in that case caller, i.e., script, knows // the default base url, which is the v4 live site) // // Script will need these two pieces of information in order to make a right tag // for control update. // ///////////////////////////////////////////////////////////////////////////// STDMETHOD(GetControlExtraInfo)(/*[in]*/ BSTR bstrClientName, /*[out,retval]*/ BSTR *pbstrExtraInfo); // // override IObjectWithSiteImpl function to get the site pointer // STDMETHOD(SetSite)(IUnknown* pSite); HRESULT ChangeControlInitState(LONG lNewState); inline CEventMsgWindow& GetEventWndClass() {return m_EvtWindow;}; private: HANDLE m_evtControlQuit; DWORD m_dwMode; DWORD m_dwSafety; HMODULE m_hEngineModule; HIUENGINE m_hIUEngine; // Life of this handle must be within scope of valid m_hEngineModule BOOL m_fUseCompression; BOOL m_fOfflineMode; HRESULT m_hValidated; // E_FAIL: initialized, // S_OK: validated, // INET_E_INVALID_URL: bad URL, don't continue LONG m_lInitState; // 0 - not initialized // 1 - need update // 2 - initialized, ready to work DWORD m_dwUpdateInfo; // result of first Initialize() call IUnknown* m_pClientSite; TCHAR m_szReqControlVer[64]; // // private function // ///////////////////////////////////////////////////////////////////////////// // // Security feature: make sure if the user of this control is // a web page then the URL can be found in iuident.txt // // This function should be called after iuident refreshed. // // Return: TRUE/FALSE, to tell if we can continue // ///////////////////////////////////////////////////////////////////////////// HRESULT ValidateControlContainer(void); ///////////////////////////////////////////////////////////////////////////// // UnlockEngine() // // release the engine dll if ref cnt of engine is down to zero ///////////////////////////////////////////////////////////////////////////// HRESULT UnlockEngine(); ///////////////////////////////////////////////////////////////////////////// // GetPropUpdateInfo() // // get the latest iuident.txt, find out the version requirement, then // compare with the current file version data to determine // if we will update anything if the engine get loaded. // ///////////////////////////////////////////////////////////////////////////// HRESULT DetectEngine(BOOL* pfUpdateAvail); ///////////////////////////////////////////////////////////////////////////// // event handling members ///////////////////////////////////////////////////////////////////////////// CEventMsgWindow m_EvtWindow; ///////////////////////////////////////////////////////////////////////////// // synchronization object to make sure we lock/unlock engine correctly // in multi-threaded cases ///////////////////////////////////////////////////////////////////////////// CRITICAL_SECTION m_lock; BOOL m_gfInit_csLock; // BOOL m_fIsThisUpdate2; }; #endif //__UPDATE_H_