windows-nt/Source/XPSP1/NT/enduser/windows.com/wuv3/wuv3is/cv3.h
2020-09-26 16:20:57 +08:00

576 lines
21 KiB
C++

// 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 <wuv3ctl.h>
#include <cstate.h>
#ifndef RETVAL
#define RETVAL
#endif
class ATL_NO_VTABLE CCV3 :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CCV3, &CLSID_CV3>,
public IDispatchImpl<ICV3, &IID_ICV3, &LIBID_WUV3ISLib>,
public IObjectSafety,
public IObjectWithSiteImpl<CCV3>,
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<PUID> 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_