Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

575 lines
21 KiB

  1. // Copyright (c) 1998-1999 Microsoft Corporation. All Rights Reserved.
  2. // CV3.h : Declaration of the CCV3
  3. #ifndef __CV3_H_
  4. #define __CV3_H_
  5. #include "resource.h" // main symbols
  6. #include <wuv3ctl.h>
  7. #include <cstate.h>
  8. #ifndef RETVAL
  9. #define RETVAL
  10. #endif
  11. class ATL_NO_VTABLE CCV3 :
  12. public CComObjectRootEx<CComSingleThreadModel>,
  13. public CComCoClass<CCV3, &CLSID_CV3>,
  14. public IDispatchImpl<ICV3, &IID_ICV3, &LIBID_WUV3ISLib>,
  15. public IObjectSafety,
  16. public IObjectWithSiteImpl<CCV3>,
  17. public IWUpdateCatalog,
  18. public IAutoUpdate
  19. {
  20. public:
  21. CCV3()
  22. : m_dwSafety(0),
  23. m_bValidInstance(FALSE),
  24. m_bLaunchServChecked(FALSE)
  25. {
  26. }
  27. void FinalRelease();
  28. HRESULT FinalConstruct();
  29. static TCHAR s_szControlVer[20];
  30. DECLARE_REGISTRY_RESOURCEID(IDR_CV3)
  31. BEGIN_COM_MAP(CCV3)
  32. COM_INTERFACE_ENTRY(ICV3)
  33. COM_INTERFACE_ENTRY(IDispatch)
  34. COM_INTERFACE_ENTRY(IObjectSafety)
  35. COM_INTERFACE_ENTRY_IMPL(IObjectWithSite)
  36. COM_INTERFACE_ENTRY_IID(__uuidof(IWUpdateCatalog), IWUpdateCatalog)
  37. COM_INTERFACE_ENTRY_IID(__uuidof(IAutoUpdate), IAutoUpdate)
  38. END_COM_MAP()
  39. // ICV3
  40. public:
  41. /* The get catalog method retrieves a catalog array from the server. The get catalog method only
  42. * accesses the server if the catalog is not already resident on the clients computer system.
  43. * This allows the VB script page call this method to quickly obtain filtered catalog record information.
  44. *
  45. * HRESULT GetCatalog
  46. * (
  47. * IN long puid Name of catalog to be read from the server.
  48. * IN BSTR bstrServerUrl The http://servername/share location for the catalog to be retrieved.
  49. * IN long platformId The platform id to be used to purne the catalog list.
  50. * This parameter matches the server side OS directory. If this parameter
  51. * is a blank string then the control will determine the OS directory based
  52. * on the detected OS version.
  53. * IN BSTR bstrBrowserLangauge A String in 0x409 format that specifies the browser locale.
  54. * IN long lFilters Filters that are to be applied to the retrieved catalog array. This may
  55. * be any of the following:
  56. * WU_ALL_ITEMS This filter is a sumation of all filters. It will cause
  57. * all items in the catalog to be retrieved, however the
  58. * normal pruning logic will still apply.
  59. * WU_HIDDEN_ITEMS This filter retrieves only items marked as hidden.
  60. * WU_SELECTED_ITEMS This filter retrieves selected items.
  61. * WU_NOT_SELECTED_ITEMS This filter retrieves items that are not currently selected.
  62. * WU_NEW_ITEMS This filter retrieves items that are marked as new
  63. * WU_POWER_ITEMS This filter retrieves items that are marked as power user items
  64. * WU_REGISTER_ITEMS This filter retrieves items that are marked as needing registration before installation.
  65. * WU_COOL_ITEMS This filter retrieves items that are marked as cool
  66. * WU_EUAL_ITEMS This filter retrieves items that are marked as having a End user license agreement.
  67. * WU_PATCH_ITEMS This filter retrieves items that are marked as a patch.
  68. * WU_NO_DEVICE_DRIVERS This filter will cause CDM device driver records if present
  69. * to not be included in the returned catalog array.
  70. * IN long lFlags
  71. * WU_NO_SPECIAL_FLAGS This flag is only valid if used by itself. It is used to
  72. * indicate that no special record processing other than the
  73. * default pruning is to be applied.
  74. * WU_NO_PRUNING This flag is mainly used for corporate catalog as well as
  75. * internal debugging and testing, it will cause the pruning
  76. * logic to not be applied to the retrieved catalog.
  77. * OUT RETVAL VARIANT *pCatalogArray A Multi-dimensional VB script array. This array is filled with the
  78. * catalog information upon return. The first dimension is the
  79. * returned index record. The second index is the specific data. See
  80. * the comments section for the layout of this array.
  81. *
  82. * This method returns S_OK if the catalog is retrieved or an error code that indicates the reason that
  83. * the catalog could not be obtained.
  84. *
  85. * Comments:
  86. *
  87. * The first time a catalog is requested from the server it is downloaded to the client machine and
  88. * processed into the global catalog structure. This means that if this method is called to download
  89. * "Catalog one", "Catalog two", "Catalog three" then the returned array will contain all of the entries
  90. * for catalogs one, two and three.
  91. *
  92. * The VBScript syntax for accessing this method is different than accessing this method from with a C++
  93. * application. In VB Script the catalog array is returned though the return value and the error return
  94. * can be trapped with an ON ERROR statement. For example, to get retrieve the catalog named Catalog One
  95. * for the Win98 OS, from the server someserver and use browser language English the following script
  96. * syntax would be used:
  97. *
  98. * CatalogOne = GetCatalog(1, "http://someserver//V3", 1, "0x409", WU_ALL_ITEMS)
  99. * or
  100. * CatalogOne = GetCatalog(1, "http://someserver//V3", 1, "0x409", WU_ALL_ITEMS)
  101. *
  102. * The layout of the returned catalog array is illustrated below:
  103. *
  104. * 'Inventory Record 1
  105. * array(0, 0) = NUMBER puid
  106. * array(0, 1) = STRING Display Text
  107. * array(0, 2) = STRING Description
  108. * array(0, 3) = NUMBER Item Status one or more of GETCATALOG_STATUS_xxxx
  109. * array(0,4) = NUMBER Download Size in Bytes
  110. * array(0,5) = NUMBER Download Time in minutes
  111. * array(0,6) = STRING Uninstall Key
  112. * 'Inventory record 2
  113. * array(1,0) = Number puid
  114. */
  115. STDMETHOD(GetCatalog)
  116. (
  117. IN long puidCatalog,
  118. IN BSTR bstrServerUrl,
  119. IN long platformId,
  120. IN BSTR bstrBrowserLangauge,
  121. IN long lFilters,
  122. IN long lFlags,
  123. OUT RETVAL VARIANT *pCatalogArray
  124. );
  125. STDMETHOD(GetCatalogHTML)
  126. (
  127. IN long puidCatalog,
  128. IN BSTR bstrServerUrl,
  129. IN long platformId,
  130. IN BSTR bstrBrowserLangauge,
  131. IN long lFilters,
  132. IN long lFlags,
  133. OUT RETVAL VARIANT *pCatalogHTML
  134. );
  135. /* The ChangeItemState method returns S_OK if the catalog item's state is successfully changed or
  136. * an error code that indicates the reason that the catalog item's state could not be changed.
  137. * The catalog item must have been previously read with the GetCatalog method. This method only
  138. * changes the item state on the local client it does not change the item on the server.
  139. *
  140. * HRESULT ChangeItemState
  141. * (
  142. * IN long puid Catalog item identifier that uniquely identifies the catalog
  143. * item to be changed. Note: puid's are unique across catalogs.
  144. * IN long lNewItemState The item's new state. This parameter can be one or more
  145. * of the following:
  146. * ITEM_STATE_HIDE_ITEM
  147. * ITEM_STATE_SHOW_ITEM
  148. * ITEM_STATE_SELECT_ITEM
  149. * ITEM_STATE_UNSELECT_ITEM
  150. *
  151. */
  152. STDMETHOD(ChangeItemState)
  153. (
  154. IN long puid,
  155. IN long lNewItemState
  156. );
  157. /*
  158. * The install selected items method installs all of the inventory items that
  159. * have been marked for installation.
  160. *
  161. * HRESULT InstallSelectedItems
  162. * (
  163. * IN BSTR bstrServer, Server Directory if blank then the server
  164. * used with the catalog was retrieved is used.
  165. * IN long lFlags May be one of the following:
  166. * WU_NOSPECIAL_FLAGS This flag is only valid if used by itself. It is used to indicate
  167. * that the default installer should be used.
  168. *
  169. * WU_COPYONLY_NO_INSTALL This flag is used to indicate that the selected packages should
  170. * be copied to the client machine but not installed.
  171. * IN BSTR bstrTempDir The name of a temporary directory where the install cabs are to
  172. * be copied on the local machine. If this parameter is a NULL string
  173. * then the system uses the local system temporary directory.
  174. * This option is only valid if WU_COPYONLY_NO_INSTALL is specified.
  175. * )
  176. *
  177. * This method returns S_OK if all of the selected items were successfully installed. A non 0 return
  178. * indicates that one or more package was not installed successfully. The GetInstallStatus() method
  179. * is used to find out which packages were not installed as well as the reason the install failed.
  180. *
  181. */
  182. STDMETHOD(InstallSelectedItems)
  183. (
  184. IN BSTR bstrServer,
  185. IN long lFlags,
  186. IN BSTR bstrTempDir,
  187. OUT RETVAL VARIANT *pResultsArray
  188. );
  189. /*
  190. * HRESULT GetInstallMetrics
  191. * (
  192. * OUT RETVAL VARIANT *pMetricsArray A Multi-dimensional VB script array. The first dimension
  193. * is the returned index record. The second index is the specific
  194. * data. See the comments section for this array layout.
  195. * )
  196. *
  197. * Comments:
  198. *
  199. * 'Record 1
  200. * array(0, 0) = NUMBER puid The identifier for this catalog item.
  201. * array(0,1) = NUMBER DownloadSize Total download size of all selected items in bytes.
  202. * array(0,2) = NUMBER Downloadtime Total download time for all currently selected items at 28.8 this
  203. * will need to change in the future to take the connection speed into
  204. * account.
  205. *
  206. * 'Record 2
  207. *
  208. * This method returns information about what would happen if the InstallSelectedItems method is called.
  209. *
  210. * The VBScript syntax for accessing this method is different than accessing this method from with a C++
  211. * application. In VB Script the results array is returned though the return value and the error return
  212. * can be trapped with an ON ERROR statement. For example, to retrieve the installation metric information
  213. * for the items that will be installed if the InstallSelectedItems method is called the syntax is:
  214. * installMetrics = GetInstallMetrics
  215. *
  216. */
  217. STDMETHOD(GetInstallMetrics)
  218. (
  219. OUT RETVAL VARIANT *pMetricsArray
  220. );
  221. /*
  222. * The GetFirstEula method returns a list of puid identifiers and Urls that the EULA page is stored at.
  223. * The caller is responsible for retrieving and displaying the EULA.
  224. *
  225. * HRESULT GetEula
  226. * (
  227. * OUT RETVAL VARIANT *pEulaArray A Multi-dimensional VB script array. The first dimension is
  228. * the returned index record. The second index is the specific
  229. * data. See the comments section for this array layout:
  230. * )
  231. *
  232. * This method returns S_OK if the Eulas array is successfully retrieved. Note: The returned array
  233. * information is the same order as the array returned from the GetInstallMetrics method.
  234. *
  235. * Comments:
  236. * 'Record 1
  237. * array(0,0) = NUMBER eurla number Number of eurla. This number changes when the eurla
  238. * url changes. This makes it possible for the caller
  239. * to construct a list of items that this eurla applies
  240. * to simply be checking when this field changes value.
  241. * array(0,1) = NUMBER puid The identifier for this catalog item.
  242. * array(0,2) = STRING url Url of eurl page to display for this item. Note: If three
  243. * items have the same url then this field is filled in for
  244. * the first item and blank for the remaining two items.
  245. * 'Record 2
  246. *
  247. * The VBScript syntax for accessing this method is different than accessing this method from with a
  248. * C++ application. In VB Script the results array is returned though the return value and the error
  249. * return can be trapped with an ON ERROR statement. For example, to retrieve the first applicable
  250. * eurla Installation metric information for the items that will be installed if the InstallSelectedItems
  251. * method is called the syntax is: installMetrics = GetEula
  252. */
  253. STDMETHOD(GetEula)
  254. (
  255. OUT RETVAL VARIANT *pEulaArray
  256. );
  257. /*
  258. * HRESULT GetInstallHistory
  259. * (
  260. * OUT RETVAL VARIANT *pszHistoryArray A Multi-dimensional VB script array. This array is filled
  261. * with the catalog information upon return. The first dimension
  262. * is the returned index record. The second index is the specific
  263. * data. See the comments section for the layout of this array.
  264. * )
  265. * This returns S_OK if the catalog is retrieved or an error code that indicates the reason that the catalog
  266. * could not be obtained.
  267. *
  268. * Comments:
  269. *
  270. * The layout of the returned catalog item array is illustrated below:
  271. *
  272. * 'Inventory Record 1
  273. * array(0, 0) = NUMBER puid
  274. * array(0, 1) = STRING Display Text
  275. * array(0, 2) = STRING Description
  276. * array(0, 3) = NUMBER Item Status one or more of:
  277. * GETCATALOG_STATUS_HIDDEN
  278. * GETCATALOG_STATUS_SELECTED
  279. * GETCATALOG_STATUS_NEW
  280. * GETCATALOG_STATUS_POWER
  281. * GETCATALOG_STATUS_REGISTRATION
  282. * GETCATALOG_STATUS_COOL
  283. * GETCATALOG_STATUS_PATCH
  284. * GETCATALOG_STATUS_SECTION
  285. * GETCATALOG_STATUS_SUBSECTION
  286. * array(0,4) = NUMBER Download Size in Bytes
  287. * array(0,5) = NUMBER Download Time in seconds
  288. * array(0,6) = STRING Uninstall Key
  289. * 'Inventory record 2
  290. * array(1,0) = Number puid
  291. *
  292. * The Install & Uninstall History is handled differently between NT and Win 98 & 95. In the Win 98 OS
  293. * history logging will be to a hidden file on the disk. In the NT OS logging will be to an event log.
  294. * The current History log can be retrieved and formatted into a DHTL template with the GetHistory method
  295. * shown below.
  296. *
  297. * For either OS this method will return the install & uninstall history.
  298. */
  299. STDMETHOD(GetInstallHistory)
  300. (
  301. OUT RETVAL VARIANT *pHistoryArray
  302. );
  303. /*
  304. * HRESULT GetDependencyList
  305. * (
  306. * IN long puid Catalog item identifier that uniquely identifies the catalog item for which
  307. * dependencies are to be retrieved.
  308. * OUT RETVAL VARIANT *pDependentItemsArray A Single-dimensional VB script array. This array
  309. * contains a list of puids that are dependent on
  310. * this item.
  311. * )
  312. *
  313. * This method returns a list of items that must be installed before the provided item can be installed.
  314. * The item is identified by the puid parameter.
  315. */
  316. STDMETHOD(GetDependencyList)
  317. (
  318. IN long puid,
  319. OUT RETVAL VARIANT *pDependentItemsArray
  320. );
  321. /*
  322. * HRESULT GetCatalogItem
  323. * (
  324. * IN long puid, Catalog item identifier that uniquely identifies the catalog
  325. * item to be retrieved.
  326. * OUT RETVAL VARIANT *pCatalogItem A Single-dimensional VB script array. This array is filled with
  327. * the requested catalog item's information upon return.
  328. * )
  329. *
  330. * This method returns S_OK if the catalog item is successfully retrieved or an error code that
  331. * indicates the reason that the catalog item could not be obtained.
  332. *
  333. * Comments:
  334. * A Catalog must have been retrieved with the GetCatalog method before this method will work.
  335. *
  336. * The layout of the returned catalog item array is illustrated below:
  337. *
  338. * array(0) = NUMBER puid
  339. * array(1) = STRING Display Text
  340. * array(2) = STRING Description
  341. * array(3) = NUMBER Item Status one or more of:
  342. * GETCATALOG_STATUS_HIDDEN
  343. * GETCATALOG_STATUS_SELECTED
  344. * GETCATALOG_STATUS_NEW
  345. * GETCATALOG_STATUS_POWER
  346. * GETCATALOG_STATUS_REGISTRATION
  347. * GETCATALOG_STATUS_COOL
  348. * GETCATALOG_STATUS_PATCH
  349. * GETCATALOG_STATUS_SECTION
  350. * GETCATALOG_STATUS_SUBSECTION
  351. * array(4) = NUMBER Download Size in Bytes
  352. * array(5) = NUMBER Download Time in seconds
  353. * array(6) = STRING Uninstall Key
  354. * array(7) = STRING catalog name containing this item.
  355. * array(8) = NUMBER index of catalog item in array returned from GetCatalog method.
  356. */
  357. STDMETHOD(GetCatalogItem)
  358. (
  359. IN long puid,
  360. OUT RETVAL VARIANT *pCatalogItem
  361. );
  362. STDMETHOD(RemoveSelectedItems)
  363. (
  364. void
  365. );
  366. //Returns S_TRUE | S_OK if catalog is available, S_FALSE if catalog is not available
  367. //or E_FAIL if an error occurs
  368. STDMETHOD(IsCatalogAvailable)
  369. (
  370. IN long puidCatalog, //Name of catalog to be read from the server.
  371. IN BSTR bstrServerUrl //The http://servername/share location for the catalog to be retrieved.
  372. );
  373. STDMETHOD(FinalizeInstall) (IN long lFlags);
  374. //--------------------------------------------------------------------
  375. // SetString metods sets strings based on the type
  376. //
  377. // lType: LOC_STRINGS=0, TEMPLATE_STRINGS=1
  378. //
  379. // Following is VBScript sample to call this function
  380. //
  381. // Dim Strs
  382. //
  383. // Strs = Array( _
  384. // "Download*progress:", _
  385. // "Download*time*remaining:", _
  386. // "Install*progress:", _
  387. // "Cancel*", _
  388. // "%d KB/%d KB*", _
  389. // "%d sec*", _
  390. // "%d min*", _
  391. // "%d hr %d min*", _
  392. // "Microsoft*Windows*Update", _
  393. // "You*must*restart Windows so that installation can finish.", _
  394. // "Do*you want*to restart now?")
  395. //
  396. // WUV3IS.SetStrings Strs, 0
  397. //--------------------------------------------------------------------
  398. STDMETHOD(SetStrings)(IN VARIANT* vStringsArr, IN long lType);
  399. /*
  400. * HRESULT FixCompatRollbackKey(VARIANT_BOOL *pbRegModified)
  401. *
  402. * for IE4 machines, detects and removes the "compat" value from the following registry key:
  403. * HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\User Agent\Post Platform
  404. * This key is added by IE5 when running in IE4 compatibility mode, but is not removed when
  405. * IE5 is uninstalled.
  406. * For IE5 machines, this function runs the UpdateToolsURL function.
  407. *
  408. * ARGUMENTS: None
  409. * OUT PARAMS: A boolean value indicating whether the registry was changed by the function. Script will
  410. * use this to determine whether restarting the browser is necessary to pick up the change
  411. * and display the correct catalog.
  412. * RETURNS: Always returns S_OK
  413. *
  414. */
  415. STDMETHOD(FixCompatRollbackKey)(OUT RETVAL VARIANT_BOOL *pbRegModified);
  416. /*
  417. * void UpdateToolsURL()
  418. * Updates the "Tools\Windows Update" menu item in IE to pass a parameter which allows us to determine
  419. * how the user linked to WU.
  420. * The Whistler version also updates the Start Menu -->Windows Update link in the registry to pass a parameter there as well.
  421. *
  422. *
  423. * ARGUMENTS: None
  424. * OUT PARAMS: None
  425. * RETURNS: None
  426. *
  427. */
  428. void UpdateToolsURL();
  429. //
  430. //IObjectSafety
  431. //
  432. STDMETHOD(GetInterfaceSafetyOptions)(REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions);
  433. STDMETHOD(SetInterfaceSafetyOptions)(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions);
  434. //
  435. //IWUpdateCatalog
  436. //
  437. STDMETHOD(WUIsCatalogAvailable)(long puidCatalog,BSTR bstrServerUrl);
  438. STDMETHOD(WUGetCatalog)(long puidCatalog, BSTR bstrServerUrl, long platformId, BSTR bstrBrowserLangauge, CCatalog** ppCatalogArray);
  439. STDMETHOD(WUDownloadItems)(CSelections* pSelections, BSTR bstrServer, BSTR bstrTempDir);
  440. STDMETHOD(WUInstallItems)(CSelections* pSelections, BSTR bstrServer, BSTR bstrTempDir);
  441. STDMETHOD(WURemoveItems)(CSelections* pSelections);
  442. STDMETHOD(WUCopyInstallHistory)(HISTORYARRAY** ppHistoryArray);
  443. STDMETHOD(WUCopyDependencyList)(long puidItem, long** ppDepPuid);
  444. STDMETHOD(WUProgressDlg)(BOOL bOn);
  445. STDMETHOD(IsWinUpdDisabled)(OUT RETVAL VARIANT_BOOL *pfDisabled);
  446. STDMETHOD(IsReady)(OUT RETVAL VARIANT_BOOL* pbYes);
  447. STDMETHOD(GetContentURL)(OUT RETVAL VARIANT* pURL);
  448. STDMETHOD(GetReadThisPage)(IN long puid);
  449. STDMETHOD(GetPrintAllPage)(OUT RETVAL VARIANT* pURL);
  450. //
  451. // IAutoUpdate interface
  452. //
  453. IAUTOUPDATE_METHODS(IMPLEMENTED)
  454. private:
  455. //Construct and return a catalog in the internal control format.
  456. CCatalog* ProcessCatalog(
  457. IN PUID puidCatalog,
  458. IN BSTR bstrServerUrl,
  459. IN long platformId,
  460. IN BSTR bstrBrowserLangauge,
  461. IN long lFilters,
  462. IN long lFlags
  463. );
  464. //This method processes a change in a catalog item's state
  465. HRESULT ProcessChangeItemState(
  466. IN long puid,
  467. IN long lNewItemState
  468. );
  469. //Return a two dimensional VARIANT safe array of VARIANTS which holds
  470. //the returned VBScript catalog representation.
  471. HRESULT MakeReturnCatalogArray(
  472. CCatalog *pCatalog, //Pointer to catalog structure to be converted.
  473. long lFilters, //Filters to apply, see GetCatalog for the actual descriptions.
  474. long lFlags, //Flags that control the amount of information returned in each array record.
  475. VARIANT *pvaVariant //pointer to returned safearray.
  476. );
  477. HRESULT MakeReturnCatalogListArray(
  478. CCatalog *pCatalog, //Pointer to catalog structure to be converted.
  479. long lFilters, //Filters to apply, see GetCatalog for the actual descriptions.
  480. long lFlags, //Flags that control the amount of information returned in each array record.
  481. VARIANT *pvaVariant //pointer to returned safearray.
  482. );
  483. //Return a CATALOG32 structure array of CATALOG32ITEM's which holds
  484. //the returned C++ catalog representation.
  485. PCATALOG32 MakeReturnCatalogArray(
  486. CCatalog *pCatalog, //Pointer to catalog structure to be converted.
  487. long lFilters, //Filters to apply, see GetCatalog for the actual descriptions.
  488. long lFlags //Flags that control the amount of information returned in each array record.
  489. );
  490. void CheckLaunchServer();
  491. DWORD m_dwSafety;
  492. BOOL m_bValidInstance;
  493. BOOL m_bLaunchServChecked;
  494. private:
  495. // for IAutoUpdate support
  496. void InstallItemAU(PINVENTORY_ITEM pItem, PSELECTITEMINFO pinfo);
  497. void ReadHiddenPuids();
  498. bool IsPuidHidden(PUID puid);
  499. void HidePuidAndSave(PUID puid);
  500. CCatalog* m_pCatalogAU;
  501. safe_buffer<PUID> m_apuids;
  502. byte_buffer m_abHiddenPuids;
  503. };
  504. HRESULT DownloadReadThis(PINVENTORY_ITEM pItem);
  505. HRESULT DownloadCommonRTFFiles(BOOL bPrintAll, LPTSTR pszPrintAllFN);
  506. bool CleanupReadThis();
  507. bool IsArabicOrHebrew();
  508. bool DownloadToBuffer( IN LPCTSTR szPath, IN CWUDownload *pDownload, IN CDiamond *pDiamond, OUT byte_buffer& bufOut);
  509. #endif //__CV3_H_