// Copyright (c) 1998-1999 Microsoft Corporation. All Rights Reserved. // CV3.h : Declaration of the CCV3 #ifndef __CV3_H_ #define __CV3_H_ #include "resource.h" // main symbols #include #include #ifndef RETVAL #define RETVAL #endif class ATL_NO_VTABLE CCV3 : public CComObjectRootEx, public CComCoClass, public IDispatchImpl, public IObjectSafety, public IObjectWithSiteImpl, public IWUpdateCatalog, public IAutoUpdate { public: CCV3() : m_dwSafety(0), m_bValidInstance(FALSE), m_bLaunchServChecked(FALSE) { } void FinalRelease(); HRESULT FinalConstruct(); static TCHAR s_szControlVer[20]; DECLARE_REGISTRY_RESOURCEID(IDR_CV3) BEGIN_COM_MAP(CCV3) COM_INTERFACE_ENTRY(ICV3) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(IObjectSafety) COM_INTERFACE_ENTRY_IMPL(IObjectWithSite) COM_INTERFACE_ENTRY_IID(__uuidof(IWUpdateCatalog), IWUpdateCatalog) COM_INTERFACE_ENTRY_IID(__uuidof(IAutoUpdate), IAutoUpdate) END_COM_MAP() // ICV3 public: /* The get catalog method retrieves a catalog array from the server. The get catalog method only * accesses the server if the catalog is not already resident on the clients computer system. * This allows the VB script page call this method to quickly obtain filtered catalog record information. * * HRESULT GetCatalog * ( * IN long puid Name of catalog to be read from the server. * IN BSTR bstrServerUrl The http://servername/share location for the catalog to be retrieved. * IN long platformId The platform id to be used to purne the catalog list. * This parameter matches the server side OS directory. If this parameter * is a blank string then the control will determine the OS directory based * on the detected OS version. * IN BSTR bstrBrowserLangauge A String in 0x409 format that specifies the browser locale. * IN long lFilters Filters that are to be applied to the retrieved catalog array. This may * be any of the following: * WU_ALL_ITEMS This filter is a sumation of all filters. It will cause * all items in the catalog to be retrieved, however the * normal pruning logic will still apply. * WU_HIDDEN_ITEMS This filter retrieves only items marked as hidden. * WU_SELECTED_ITEMS This filter retrieves selected items. * WU_NOT_SELECTED_ITEMS This filter retrieves items that are not currently selected. * WU_NEW_ITEMS This filter retrieves items that are marked as new * WU_POWER_ITEMS This filter retrieves items that are marked as power user items * WU_REGISTER_ITEMS This filter retrieves items that are marked as needing registration before installation. * WU_COOL_ITEMS This filter retrieves items that are marked as cool * WU_EUAL_ITEMS This filter retrieves items that are marked as having a End user license agreement. * WU_PATCH_ITEMS This filter retrieves items that are marked as a patch. * WU_NO_DEVICE_DRIVERS This filter will cause CDM device driver records if present * to not be included in the returned catalog array. * IN long lFlags * WU_NO_SPECIAL_FLAGS This flag is only valid if used by itself. It is used to * indicate that no special record processing other than the * default pruning is to be applied. * WU_NO_PRUNING This flag is mainly used for corporate catalog as well as * internal debugging and testing, it will cause the pruning * logic to not be applied to the retrieved catalog. * OUT RETVAL VARIANT *pCatalogArray A Multi-dimensional VB script array. This array is filled with the * catalog information upon return. The first dimension is the * returned index record. The second index is the specific data. See * the comments section for the layout of this array. * * This method returns S_OK if the catalog is retrieved or an error code that indicates the reason that * the catalog could not be obtained. * * Comments: * * The first time a catalog is requested from the server it is downloaded to the client machine and * processed into the global catalog structure. This means that if this method is called to download * "Catalog one", "Catalog two", "Catalog three" then the returned array will contain all of the entries * for catalogs one, two and three. * * The VBScript syntax for accessing this method is different than accessing this method from with a C++ * application. In VB Script the catalog array is returned though the return value and the error return * can be trapped with an ON ERROR statement. For example, to get retrieve the catalog named Catalog One * for the Win98 OS, from the server someserver and use browser language English the following script * syntax would be used: * * CatalogOne = GetCatalog(1, "http://someserver//V3", 1, "0x409", WU_ALL_ITEMS) * or * CatalogOne = GetCatalog(1, "http://someserver//V3", 1, "0x409", WU_ALL_ITEMS) * * The layout of the returned catalog array is illustrated below: * * 'Inventory Record 1 * array(0, 0) = NUMBER puid * array(0, 1) = STRING Display Text * array(0, 2) = STRING Description * array(0, 3) = NUMBER Item Status one or more of GETCATALOG_STATUS_xxxx * array(0,4) = NUMBER Download Size in Bytes * array(0,5) = NUMBER Download Time in minutes * array(0,6) = STRING Uninstall Key * 'Inventory record 2 * array(1,0) = Number puid */ STDMETHOD(GetCatalog) ( IN long puidCatalog, IN BSTR bstrServerUrl, IN long platformId, IN BSTR bstrBrowserLangauge, IN long lFilters, IN long lFlags, OUT RETVAL VARIANT *pCatalogArray ); STDMETHOD(GetCatalogHTML) ( IN long puidCatalog, IN BSTR bstrServerUrl, IN long platformId, IN BSTR bstrBrowserLangauge, IN long lFilters, IN long lFlags, OUT RETVAL VARIANT *pCatalogHTML ); /* The ChangeItemState method returns S_OK if the catalog item's state is successfully changed or * an error code that indicates the reason that the catalog item's state could not be changed. * The catalog item must have been previously read with the GetCatalog method. This method only * changes the item state on the local client it does not change the item on the server. * * HRESULT ChangeItemState * ( * IN long puid Catalog item identifier that uniquely identifies the catalog * item to be changed. Note: puid's are unique across catalogs. * IN long lNewItemState The item's new state. This parameter can be one or more * of the following: * ITEM_STATE_HIDE_ITEM * ITEM_STATE_SHOW_ITEM * ITEM_STATE_SELECT_ITEM * ITEM_STATE_UNSELECT_ITEM * */ STDMETHOD(ChangeItemState) ( IN long puid, IN long lNewItemState ); /* * The install selected items method installs all of the inventory items that * have been marked for installation. * * HRESULT InstallSelectedItems * ( * IN BSTR bstrServer, Server Directory if blank then the server * used with the catalog was retrieved is used. * IN long lFlags May be one of the following: * WU_NOSPECIAL_FLAGS This flag is only valid if used by itself. It is used to indicate * that the default installer should be used. * * WU_COPYONLY_NO_INSTALL This flag is used to indicate that the selected packages should * be copied to the client machine but not installed. * IN BSTR bstrTempDir The name of a temporary directory where the install cabs are to * be copied on the local machine. If this parameter is a NULL string * then the system uses the local system temporary directory. * This option is only valid if WU_COPYONLY_NO_INSTALL is specified. * ) * * This method returns S_OK if all of the selected items were successfully installed. A non 0 return * indicates that one or more package was not installed successfully. The GetInstallStatus() method * is used to find out which packages were not installed as well as the reason the install failed. * */ STDMETHOD(InstallSelectedItems) ( IN BSTR bstrServer, IN long lFlags, IN BSTR bstrTempDir, OUT RETVAL VARIANT *pResultsArray ); /* * HRESULT GetInstallMetrics * ( * OUT RETVAL VARIANT *pMetricsArray A Multi-dimensional VB script array. The first dimension * is the returned index record. The second index is the specific * data. See the comments section for this array layout. * ) * * Comments: * * 'Record 1 * array(0, 0) = NUMBER puid The identifier for this catalog item. * array(0,1) = NUMBER DownloadSize Total download size of all selected items in bytes. * array(0,2) = NUMBER Downloadtime Total download time for all currently selected items at 28.8 this * will need to change in the future to take the connection speed into * account. * * 'Record 2 * * This method returns information about what would happen if the InstallSelectedItems method is called. * * The VBScript syntax for accessing this method is different than accessing this method from with a C++ * application. In VB Script the results array is returned though the return value and the error return * can be trapped with an ON ERROR statement. For example, to retrieve the installation metric information * for the items that will be installed if the InstallSelectedItems method is called the syntax is: * installMetrics = GetInstallMetrics * */ STDMETHOD(GetInstallMetrics) ( OUT RETVAL VARIANT *pMetricsArray ); /* * The GetFirstEula method returns a list of puid identifiers and Urls that the EULA page is stored at. * The caller is responsible for retrieving and displaying the EULA. * * HRESULT GetEula * ( * OUT RETVAL VARIANT *pEulaArray A Multi-dimensional VB script array. The first dimension is * the returned index record. The second index is the specific * data. See the comments section for this array layout: * ) * * This method returns S_OK if the Eulas array is successfully retrieved. Note: The returned array * information is the same order as the array returned from the GetInstallMetrics method. * * Comments: * 'Record 1 * array(0,0) = NUMBER eurla number Number of eurla. This number changes when the eurla * url changes. This makes it possible for the caller * to construct a list of items that this eurla applies * to simply be checking when this field changes value. * array(0,1) = NUMBER puid The identifier for this catalog item. * array(0,2) = STRING url Url of eurl page to display for this item. Note: If three * items have the same url then this field is filled in for * the first item and blank for the remaining two items. * 'Record 2 * * The VBScript syntax for accessing this method is different than accessing this method from with a * C++ application. In VB Script the results array is returned though the return value and the error * return can be trapped with an ON ERROR statement. For example, to retrieve the first applicable * eurla Installation metric information for the items that will be installed if the InstallSelectedItems * method is called the syntax is: installMetrics = GetEula */ STDMETHOD(GetEula) ( OUT RETVAL VARIANT *pEulaArray ); /* * HRESULT GetInstallHistory * ( * OUT RETVAL VARIANT *pszHistoryArray A Multi-dimensional VB script array. This array is filled * with the catalog information upon return. The first dimension * is the returned index record. The second index is the specific * data. See the comments section for the layout of this array. * ) * This returns S_OK if the catalog is retrieved or an error code that indicates the reason that the catalog * could not be obtained. * * Comments: * * The layout of the returned catalog item array is illustrated below: * * 'Inventory Record 1 * array(0, 0) = NUMBER puid * array(0, 1) = STRING Display Text * array(0, 2) = STRING Description * array(0, 3) = NUMBER Item Status one or more of: * GETCATALOG_STATUS_HIDDEN * GETCATALOG_STATUS_SELECTED * GETCATALOG_STATUS_NEW * GETCATALOG_STATUS_POWER * GETCATALOG_STATUS_REGISTRATION * GETCATALOG_STATUS_COOL * GETCATALOG_STATUS_PATCH * GETCATALOG_STATUS_SECTION * GETCATALOG_STATUS_SUBSECTION * array(0,4) = NUMBER Download Size in Bytes * array(0,5) = NUMBER Download Time in seconds * array(0,6) = STRING Uninstall Key * 'Inventory record 2 * array(1,0) = Number puid * * The Install & Uninstall History is handled differently between NT and Win 98 & 95. In the Win 98 OS * history logging will be to a hidden file on the disk. In the NT OS logging will be to an event log. * The current History log can be retrieved and formatted into a DHTL template with the GetHistory method * shown below. * * For either OS this method will return the install & uninstall history. */ STDMETHOD(GetInstallHistory) ( OUT RETVAL VARIANT *pHistoryArray ); /* * HRESULT GetDependencyList * ( * IN long puid Catalog item identifier that uniquely identifies the catalog item for which * dependencies are to be retrieved. * OUT RETVAL VARIANT *pDependentItemsArray A Single-dimensional VB script array. This array * contains a list of puids that are dependent on * this item. * ) * * This method returns a list of items that must be installed before the provided item can be installed. * The item is identified by the puid parameter. */ STDMETHOD(GetDependencyList) ( IN long puid, OUT RETVAL VARIANT *pDependentItemsArray ); /* * HRESULT GetCatalogItem * ( * IN long puid, Catalog item identifier that uniquely identifies the catalog * item to be retrieved. * OUT RETVAL VARIANT *pCatalogItem A Single-dimensional VB script array. This array is filled with * the requested catalog item's information upon return. * ) * * This method returns S_OK if the catalog item is successfully retrieved or an error code that * indicates the reason that the catalog item could not be obtained. * * Comments: * A Catalog must have been retrieved with the GetCatalog method before this method will work. * * The layout of the returned catalog item array is illustrated below: * * array(0) = NUMBER puid * array(1) = STRING Display Text * array(2) = STRING Description * array(3) = NUMBER Item Status one or more of: * GETCATALOG_STATUS_HIDDEN * GETCATALOG_STATUS_SELECTED * GETCATALOG_STATUS_NEW * GETCATALOG_STATUS_POWER * GETCATALOG_STATUS_REGISTRATION * GETCATALOG_STATUS_COOL * GETCATALOG_STATUS_PATCH * GETCATALOG_STATUS_SECTION * GETCATALOG_STATUS_SUBSECTION * array(4) = NUMBER Download Size in Bytes * array(5) = NUMBER Download Time in seconds * array(6) = STRING Uninstall Key * array(7) = STRING catalog name containing this item. * array(8) = NUMBER index of catalog item in array returned from GetCatalog method. */ STDMETHOD(GetCatalogItem) ( IN long puid, OUT RETVAL VARIANT *pCatalogItem ); STDMETHOD(RemoveSelectedItems) ( void ); //Returns S_TRUE | S_OK if catalog is available, S_FALSE if catalog is not available //or E_FAIL if an error occurs STDMETHOD(IsCatalogAvailable) ( IN long puidCatalog, //Name of catalog to be read from the server. IN BSTR bstrServerUrl //The http://servername/share location for the catalog to be retrieved. ); STDMETHOD(FinalizeInstall) (IN long lFlags); //-------------------------------------------------------------------- // SetString metods sets strings based on the type // // lType: LOC_STRINGS=0, TEMPLATE_STRINGS=1 // // Following is VBScript sample to call this function // // Dim Strs // // Strs = Array( _ // "Download*progress:", _ // "Download*time*remaining:", _ // "Install*progress:", _ // "Cancel*", _ // "%d KB/%d KB*", _ // "%d sec*", _ // "%d min*", _ // "%d hr %d min*", _ // "Microsoft*Windows*Update", _ // "You*must*restart Windows so that installation can finish.", _ // "Do*you want*to restart now?") // // WUV3IS.SetStrings Strs, 0 //-------------------------------------------------------------------- STDMETHOD(SetStrings)(IN VARIANT* vStringsArr, IN long lType); /* * HRESULT FixCompatRollbackKey(VARIANT_BOOL *pbRegModified) * * for IE4 machines, detects and removes the "compat" value from the following registry key: * HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\User Agent\Post Platform * This key is added by IE5 when running in IE4 compatibility mode, but is not removed when * IE5 is uninstalled. * For IE5 machines, this function runs the UpdateToolsURL function. * * ARGUMENTS: None * OUT PARAMS: A boolean value indicating whether the registry was changed by the function. Script will * use this to determine whether restarting the browser is necessary to pick up the change * and display the correct catalog. * RETURNS: Always returns S_OK * */ STDMETHOD(FixCompatRollbackKey)(OUT RETVAL VARIANT_BOOL *pbRegModified); /* * void UpdateToolsURL() * Updates the "Tools\Windows Update" menu item in IE to pass a parameter which allows us to determine * how the user linked to WU. * The Whistler version also updates the Start Menu -->Windows Update link in the registry to pass a parameter there as well. * * * ARGUMENTS: None * OUT PARAMS: None * RETURNS: None * */ void UpdateToolsURL(); // //IObjectSafety // STDMETHOD(GetInterfaceSafetyOptions)(REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions); STDMETHOD(SetInterfaceSafetyOptions)(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions); // //IWUpdateCatalog // STDMETHOD(WUIsCatalogAvailable)(long puidCatalog,BSTR bstrServerUrl); STDMETHOD(WUGetCatalog)(long puidCatalog, BSTR bstrServerUrl, long platformId, BSTR bstrBrowserLangauge, CCatalog** ppCatalogArray); STDMETHOD(WUDownloadItems)(CSelections* pSelections, BSTR bstrServer, BSTR bstrTempDir); STDMETHOD(WUInstallItems)(CSelections* pSelections, BSTR bstrServer, BSTR bstrTempDir); STDMETHOD(WURemoveItems)(CSelections* pSelections); STDMETHOD(WUCopyInstallHistory)(HISTORYARRAY** ppHistoryArray); STDMETHOD(WUCopyDependencyList)(long puidItem, long** ppDepPuid); STDMETHOD(WUProgressDlg)(BOOL bOn); STDMETHOD(IsWinUpdDisabled)(OUT RETVAL VARIANT_BOOL *pfDisabled); STDMETHOD(IsReady)(OUT RETVAL VARIANT_BOOL* pbYes); STDMETHOD(GetContentURL)(OUT RETVAL VARIANT* pURL); STDMETHOD(GetReadThisPage)(IN long puid); STDMETHOD(GetPrintAllPage)(OUT RETVAL VARIANT* pURL); // // IAutoUpdate interface // IAUTOUPDATE_METHODS(IMPLEMENTED) private: //Construct and return a catalog in the internal control format. CCatalog* ProcessCatalog( IN PUID puidCatalog, IN BSTR bstrServerUrl, IN long platformId, IN BSTR bstrBrowserLangauge, IN long lFilters, IN long lFlags ); //This method processes a change in a catalog item's state HRESULT ProcessChangeItemState( IN long puid, IN long lNewItemState ); //Return a two dimensional VARIANT safe array of VARIANTS which holds //the returned VBScript catalog representation. HRESULT MakeReturnCatalogArray( CCatalog *pCatalog, //Pointer to catalog structure to be converted. long lFilters, //Filters to apply, see GetCatalog for the actual descriptions. long lFlags, //Flags that control the amount of information returned in each array record. VARIANT *pvaVariant //pointer to returned safearray. ); HRESULT MakeReturnCatalogListArray( CCatalog *pCatalog, //Pointer to catalog structure to be converted. long lFilters, //Filters to apply, see GetCatalog for the actual descriptions. long lFlags, //Flags that control the amount of information returned in each array record. VARIANT *pvaVariant //pointer to returned safearray. ); //Return a CATALOG32 structure array of CATALOG32ITEM's which holds //the returned C++ catalog representation. PCATALOG32 MakeReturnCatalogArray( CCatalog *pCatalog, //Pointer to catalog structure to be converted. long lFilters, //Filters to apply, see GetCatalog for the actual descriptions. long lFlags //Flags that control the amount of information returned in each array record. ); void CheckLaunchServer(); DWORD m_dwSafety; BOOL m_bValidInstance; BOOL m_bLaunchServChecked; private: // for IAutoUpdate support void InstallItemAU(PINVENTORY_ITEM pItem, PSELECTITEMINFO pinfo); void ReadHiddenPuids(); bool IsPuidHidden(PUID puid); void HidePuidAndSave(PUID puid); CCatalog* m_pCatalogAU; safe_buffer m_apuids; byte_buffer m_abHiddenPuids; }; HRESULT DownloadReadThis(PINVENTORY_ITEM pItem); HRESULT DownloadCommonRTFFiles(BOOL bPrintAll, LPTSTR pszPrintAllFN); bool CleanupReadThis(); bool IsArabicOrHebrew(); bool DownloadToBuffer( IN LPCTSTR szPath, IN CWUDownload *pDownload, IN CDiamond *pDiamond, OUT byte_buffer& bufOut); #endif //__CV3_H_