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.

1005 lines
42 KiB

  1. //=======================================================================
  2. //
  3. // Copyright (c) 1998-2000 Microsoft Corporation. All Rights Reserved.
  4. //
  5. // File: iuxml.h
  6. //
  7. // Description:
  8. //
  9. // Declaration of the CIUXml class
  10. //
  11. //=======================================================================
  12. #ifndef __IUXML_H_
  13. #define __IUXML_H_
  14. #include <msxml.h>
  15. #define HANDLE_NODE_INVALID -1
  16. #define HANDLE_NODELIST_INVALID -1
  17. typedef DWORD HANDLE_NODE;
  18. typedef DWORD HANDLE_NODELIST;
  19. // Bitmap of existence of all possible system info classes
  20. extern const DWORD COMPUTERSYSTEM;
  21. extern const DWORD REGKEYS;
  22. extern const DWORD PLATFORM;
  23. extern const DWORD LOCALE;
  24. extern const DWORD DEVICES;
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CIUXml
  27. class CIUXml
  28. {
  29. public:
  30. CIUXml();
  31. virtual ~CIUXml();
  32. /////////////////////////////////////////////////////////////////////////////
  33. // SafeCloseHandleNode()
  34. //
  35. // User can explicitly can this function to release a node for reuse when
  36. // writing a xml doc.
  37. /////////////////////////////////////////////////////////////////////////////
  38. void SafeCloseHandleNode(HANDLE_NODE& hNode);
  39. /////////////////////////////////////////////////////////////////////////////
  40. // SafeFindCloseHandle()
  41. //
  42. // User can explicitly can this function to release a nodelist for reuse when
  43. // reading a xml doc.
  44. /////////////////////////////////////////////////////////////////////////////
  45. void SafeFindCloseHandle(HANDLE_NODELIST& hNodeList);
  46. /////////////////////////////////////////////////////////////////////////////
  47. // GetDOMNodebyHandle()
  48. //
  49. // Retrieve the xml node with the given index of m_ppNodeArray
  50. /////////////////////////////////////////////////////////////////////////////
  51. IXMLDOMNode* GetDOMNodebyHandle(HANDLE_NODE hNode);
  52. private:
  53. /////////////////////////////////////////////////////////////////////////////
  54. // Handle to the heap of the calling process, used for HeapAlloc()
  55. /////////////////////////////////////////////////////////////////////////////
  56. HANDLE m_hHeap;
  57. /////////////////////////////////////////////////////////////////////////////
  58. // Length of the node array "m_ppNodeArray"
  59. /////////////////////////////////////////////////////////////////////////////
  60. DWORD m_dwSizeNodeArray;
  61. /////////////////////////////////////////////////////////////////////////////
  62. // Length of the nodelist array "m_ppNodeListArray"
  63. /////////////////////////////////////////////////////////////////////////////
  64. DWORD m_dwSizeNodeListArray;
  65. /////////////////////////////////////////////////////////////////////////////
  66. // InitNodeArray()
  67. //
  68. // Allocate or re-allocate memory for the node array "m_ppNodeArray"
  69. /////////////////////////////////////////////////////////////////////////////
  70. HRESULT InitNodeArray(BOOL fRealloc = FALSE);
  71. /////////////////////////////////////////////////////////////////////////////
  72. // InitNodeListArray()
  73. //
  74. // Allocate or re-allocate memory for the nodelist array "m_ppNodeListArray"
  75. /////////////////////////////////////////////////////////////////////////////
  76. HRESULT InitNodeListArray(BOOL fRealloc = FALSE);
  77. /////////////////////////////////////////////////////////////////////////////
  78. // GetNodeHandle()
  79. //
  80. // Look for the first un-used node from the "m_ppNodeArray" array,
  81. // including the memory allocation, if needed.
  82. /////////////////////////////////////////////////////////////////////////////
  83. HANDLE_NODE GetNodeHandle();
  84. /////////////////////////////////////////////////////////////////////////////
  85. // GetNodeListHandle()
  86. //
  87. // Look for the first un-used nodelist from the "m_ppNodeListArray" array,
  88. // including the memory allocation, if needed.
  89. /////////////////////////////////////////////////////////////////////////////
  90. HANDLE_NODELIST GetNodeListHandle();
  91. protected:
  92. /////////////////////////////////////////////////////////////////////////////
  93. // This array is used to keep track of different nodes that can remain
  94. // opened at the same time to write into; the index of the array will be
  95. // returned to caller as a HANDLE_NODE to perform writing against.
  96. /////////////////////////////////////////////////////////////////////////////
  97. IXMLDOMNode** m_ppNodeArray;
  98. /////////////////////////////////////////////////////////////////////////////
  99. // This array is used to keep track of different nodelists that can remain
  100. // opened at the same time to read from; the index of the array will be
  101. // returned to caller as a HANDLE_NODELIST to perform reading against.
  102. /////////////////////////////////////////////////////////////////////////////
  103. IXMLDOMNodeList** m_ppNodeListArray;
  104. /////////////////////////////////////////////////////////////////////////////
  105. // FindFirstDOMNode()
  106. //
  107. // Retrieve the first xml node with the given tag name under the given parent node
  108. /////////////////////////////////////////////////////////////////////////////
  109. HANDLE_NODELIST FindFirstDOMNode(IXMLDOMNode* pParentNode, BSTR bstrName, IXMLDOMNode** ppNode);
  110. /////////////////////////////////////////////////////////////////////////////
  111. // FindFirstDOMNode()
  112. //
  113. // Retrieve the handle of first xml node with the given tag name under the given parent node
  114. /////////////////////////////////////////////////////////////////////////////
  115. HANDLE_NODELIST FindFirstDOMNode(IXMLDOMNode* pParentNode, BSTR bstrName, HANDLE_NODE* phNode);
  116. /////////////////////////////////////////////////////////////////////////////
  117. // FindFirstDOMNode()
  118. //
  119. // Retrieve the first xml node with the given tag name in the given xml doc
  120. /////////////////////////////////////////////////////////////////////////////
  121. HANDLE_NODELIST FindFirstDOMNode(IXMLDOMDocument* pDoc, BSTR bstrName, IXMLDOMNode** ppNode);
  122. /////////////////////////////////////////////////////////////////////////////
  123. // FindFirstDOMNode()
  124. //
  125. // Retrieve the handle of first xml node with the given tag name in the given xml doc
  126. /////////////////////////////////////////////////////////////////////////////
  127. HANDLE_NODELIST FindFirstDOMNode(IXMLDOMDocument* pDoc, BSTR bstrName, HANDLE_NODE* phNode);
  128. /////////////////////////////////////////////////////////////////////////////
  129. // FindNextDOMNode()
  130. //
  131. // Retrieve the next xml node with the given tag name under the given parent node
  132. /////////////////////////////////////////////////////////////////////////////
  133. HRESULT FindNextDOMNode(HANDLE_NODELIST hNodeList, IXMLDOMNode** ppNode);
  134. /////////////////////////////////////////////////////////////////////////////
  135. // FindNextDOMNode()
  136. //
  137. // Retrieve the handle of next xml node with the given tag name under the given parent node
  138. /////////////////////////////////////////////////////////////////////////////
  139. HRESULT FindNextDOMNode(HANDLE_NODELIST hNodeList, HANDLE_NODE* phNode);
  140. /////////////////////////////////////////////////////////////////////////////
  141. // CreateDOMNodeWithHandle()
  142. //
  143. // Create an xml node of the given type
  144. // Return: index of the node array "m_ppNodeArray"; or -1 if failure.
  145. /////////////////////////////////////////////////////////////////////////////
  146. HANDLE_NODE CreateDOMNodeWithHandle(IXMLDOMDocument* pDoc, SHORT nType, BSTR bstrName, BSTR bstrNamespaceURI = NULL);
  147. };
  148. /////////////////////////////////////////////////////////////////////////////
  149. // CXmlSystemSpec
  150. class CXmlSystemSpec : public CIUXml
  151. {
  152. public:
  153. /////////////////////////////////////////////////////////////////////////////
  154. // Constructor
  155. //
  156. // Create IXMLDOMDocument* for SystemSpec
  157. /////////////////////////////////////////////////////////////////////////////
  158. CXmlSystemSpec();
  159. /////////////////////////////////////////////////////////////////////////////
  160. // Destructor
  161. //
  162. // Release IXMLDOMDocument* for SystemSpec
  163. /////////////////////////////////////////////////////////////////////////////
  164. ~CXmlSystemSpec();
  165. /////////////////////////////////////////////////////////////////////////////
  166. // AddComputerSystem()
  167. /////////////////////////////////////////////////////////////////////////////
  168. HRESULT AddComputerSystem(BSTR bstrManufacturer,
  169. BSTR bstrModel,
  170. BSTR bstrSupportSite = NULL,
  171. INT iAdmin = -1,
  172. INT iWUDisabled = -1,
  173. INT iAUEnabled = -1,
  174. BSTR bstrPID=NULL);
  175. /////////////////////////////////////////////////////////////////////////////
  176. // AddDriveSpace()
  177. /////////////////////////////////////////////////////////////////////////////
  178. HRESULT AddDriveSpace(BSTR bstrDrive, INT iKBytes);
  179. /////////////////////////////////////////////////////////////////////////////
  180. // AddReg()
  181. /////////////////////////////////////////////////////////////////////////////
  182. HRESULT AddReg(BSTR bstrProvider);
  183. /////////////////////////////////////////////////////////////////////////////
  184. // AddPlatform()
  185. /////////////////////////////////////////////////////////////////////////////
  186. HRESULT AddPlatform(BSTR bstrName);
  187. /////////////////////////////////////////////////////////////////////////////
  188. // AddProcessor()
  189. /////////////////////////////////////////////////////////////////////////////
  190. HRESULT AddProcessor(BSTR bstrProcessor);
  191. /////////////////////////////////////////////////////////////////////////////
  192. // AddVersion()
  193. /////////////////////////////////////////////////////////////////////////////
  194. HRESULT AddVersion(INT iMajor = -1,
  195. INT iMinor = -1,
  196. INT iBuild = -1,
  197. INT iSPMajor = -1,
  198. INT iSPMinor = -1,
  199. BSTR bstrTimeStamp = NULL);
  200. /////////////////////////////////////////////////////////////////////////////
  201. // AddSuite()
  202. /////////////////////////////////////////////////////////////////////////////
  203. HRESULT AddSuite(BSTR bstrSuite);
  204. /////////////////////////////////////////////////////////////////////////////
  205. // AddProductType()
  206. /////////////////////////////////////////////////////////////////////////////
  207. HRESULT AddProductType(BSTR bstrProductType);
  208. /////////////////////////////////////////////////////////////////////////////
  209. // AddLocale()
  210. //
  211. // We need to pass back a handle to differentiate different <locale> node
  212. /////////////////////////////////////////////////////////////////////////////
  213. HRESULT AddLocale(BSTR bstrContext, HANDLE_NODE* phNodeLocale);
  214. /////////////////////////////////////////////////////////////////////////////
  215. // AddLanguage()
  216. /////////////////////////////////////////////////////////////////////////////
  217. HRESULT AddLanguage(HANDLE_NODE hNodeLocale, BSTR bstrLocale);
  218. /////////////////////////////////////////////////////////////////////////////
  219. // AddDevice()
  220. //
  221. // We need to pass back a handle to differentiate different <device> node
  222. /////////////////////////////////////////////////////////////////////////////
  223. HRESULT AddDevice(BSTR bstrDeviceInstance,
  224. INT iIsPrinter,
  225. BSTR bstrProvider,
  226. BSTR bstrMfgName,
  227. BSTR bstrDriverName,
  228. HANDLE_NODE* phNodeDevice);
  229. /////////////////////////////////////////////////////////////////////////////
  230. // AddHWID()
  231. /////////////////////////////////////////////////////////////////////////////
  232. HRESULT AddHWID(HANDLE_NODE hNodeDevice,
  233. BOOL fIsCompatible,
  234. UINT iRank,
  235. BSTR bstrHWID,
  236. BSTR bstrDriverVer = NULL);
  237. /////////////////////////////////////////////////////////////////////////////
  238. // GetSystemSpecBSTR()
  239. /////////////////////////////////////////////////////////////////////////////
  240. HRESULT GetSystemSpecBSTR(BSTR *pbstrXmlSystemSpec);
  241. private:
  242. IXMLDOMDocument* m_pDocSystemSpec;
  243. IXMLDOMNode* m_pNodeSystemInfo;
  244. IXMLDOMNode* m_pNodeComputerSystem;
  245. IXMLDOMNode* m_pNodeRegKeysSW;
  246. IXMLDOMNode* m_pNodePlatform;
  247. IXMLDOMNode* m_pNodeDevices;
  248. };
  249. /////////////////////////////////////////////////////////////////////////////
  250. // CXmlSystemClass
  251. class CXmlSystemClass : public CIUXml
  252. {
  253. public:
  254. /////////////////////////////////////////////////////////////////////////////
  255. // Constructor
  256. //
  257. // Create IXMLDOMDocument* for SystemInfoClasses
  258. /////////////////////////////////////////////////////////////////////////////
  259. CXmlSystemClass();
  260. /////////////////////////////////////////////////////////////////////////////
  261. // Destructor
  262. //
  263. // Release IXMLDOMDocument* for SystemInfoClasses
  264. /////////////////////////////////////////////////////////////////////////////
  265. ~CXmlSystemClass();
  266. /////////////////////////////////////////////////////////////////////////////
  267. // LoadXMLDocument()
  268. //
  269. // Load an XML Document from string
  270. /////////////////////////////////////////////////////////////////////////////
  271. HRESULT LoadXMLDocument(BSTR bstrXml, BOOL fOfflineMode);
  272. /////////////////////////////////////////////////////////////////////////////
  273. // GetClasses()
  274. //
  275. // Return the bitmap of existence of all possible system info classes
  276. /////////////////////////////////////////////////////////////////////////////
  277. DWORD GetClasses();
  278. private:
  279. IXMLDOMDocument* m_pDocSystemClass;
  280. };
  281. /////////////////////////////////////////////////////////////////////////////
  282. // CXmlCatalog
  283. class CXmlCatalog : public CIUXml
  284. {
  285. public:
  286. /////////////////////////////////////////////////////////////////////////////
  287. // Constructor
  288. //
  289. // Create IXMLDOMDocument* for Catalog
  290. /////////////////////////////////////////////////////////////////////////////
  291. CXmlCatalog();
  292. /////////////////////////////////////////////////////////////////////////////
  293. // Destructor
  294. //
  295. // Release IXMLDOMDocument* for Catalog
  296. /////////////////////////////////////////////////////////////////////////////
  297. ~CXmlCatalog();
  298. /////////////////////////////////////////////////////////////////////////////
  299. // LoadXMLDocument()
  300. //
  301. // Load an XML Document from string
  302. /////////////////////////////////////////////////////////////////////////////
  303. HRESULT LoadXMLDocument(BSTR bstrXml, BOOL fOfflineMode);
  304. /////////////////////////////////////////////////////////////////////////////
  305. // GetItemCount()
  306. //
  307. // Gets a Count of How Many Items are in this Catalog
  308. /////////////////////////////////////////////////////////////////////////////
  309. HRESULT GetItemCount(LONG *plItemCount);
  310. /////////////////////////////////////////////////////////////////////////////
  311. // GetProviders()
  312. //
  313. // Find a list of <provider> node in catalog xml
  314. /////////////////////////////////////////////////////////////////////////////
  315. IXMLDOMNodeList* GetProviders();
  316. /////////////////////////////////////////////////////////////////////////////
  317. // GetFirstProvider()
  318. //
  319. // Find the first provider in catalog xml doc
  320. /////////////////////////////////////////////////////////////////////////////
  321. HANDLE_NODELIST GetFirstProvider(HANDLE_NODE* phNodeProvider);
  322. /////////////////////////////////////////////////////////////////////////////
  323. // GetNextProvider()
  324. //
  325. // Find the next provider in catalog xml doc
  326. /////////////////////////////////////////////////////////////////////////////
  327. HRESULT GetNextProvider(HANDLE_NODELIST hNodeListProvider, HANDLE_NODE* phNodeProvider);
  328. /////////////////////////////////////////////////////////////////////////////
  329. // GetFirstItem()
  330. //
  331. // Find the first item in provider (parent) node
  332. /////////////////////////////////////////////////////////////////////////////
  333. HANDLE_NODELIST GetFirstItem(HANDLE_NODE hNodeProvider, HANDLE_NODE* phNodeItem);
  334. /////////////////////////////////////////////////////////////////////////////
  335. // GetNextItem()
  336. //
  337. // Find the next item in provider (parent) node
  338. /////////////////////////////////////////////////////////////////////////////
  339. HRESULT GetNextItem(HANDLE_NODELIST hNodeListItem, HANDLE_NODE* phNodeItem);
  340. /////////////////////////////////////////////////////////////////////////////
  341. // GetFirstItemDependency()
  342. //
  343. // Find the first dependency item in Item Dependencies node
  344. /////////////////////////////////////////////////////////////////////////////
  345. HANDLE_NODELIST GetFirstItemDependency(HANDLE_NODE hNodeItem, HANDLE_NODE* phNodeItem);
  346. /////////////////////////////////////////////////////////////////////////////
  347. // GetNextItem()
  348. //
  349. // Find the next dependency item in the Item Dependencies node
  350. /////////////////////////////////////////////////////////////////////////////
  351. HRESULT GetNextItemDependency(HANDLE_NODELIST hNodeListItem, HANDLE_NODE* phNodeItem);
  352. /////////////////////////////////////////////////////////////////////////////
  353. // CloseItemList()
  354. //
  355. // Release the item nodelist
  356. /////////////////////////////////////////////////////////////////////////////
  357. void CloseItemList(HANDLE_NODELIST hNodeListItem);
  358. /////////////////////////////////////////////////////////////////////////////
  359. // GetIdentity()
  360. //
  361. // Retrieve the unique name (identity) of the given provider or item
  362. /////////////////////////////////////////////////////////////////////////////
  363. HRESULT GetIdentity(HANDLE_NODE hNode,
  364. BSTR* pbstrName,
  365. BSTR* pbstrPublisherName,
  366. BSTR* pbstrGUID);
  367. /////////////////////////////////////////////////////////////////////////////
  368. // GetIdentityStr()
  369. //
  370. // Retrieve the string that can be used to uniquely identify an item.
  371. // This function defines the logic about what components can be used
  372. // to define the uniqueness of an item based on the 3 parts of data from
  373. // GetIdentity().
  374. //
  375. // The created string will be language neutral. That is, it can not
  376. // ensure the uniqueness for two items having the same <identity> node
  377. // except different only on <langauge> part inside <identity>
  378. //
  379. /////////////////////////////////////////////////////////////////////////////
  380. HRESULT GetIdentityStr(HANDLE_NODE hNode,
  381. BSTR* pbstrUniqIdentifierString);
  382. HRESULT GetIdentityStrForPing(HANDLE_NODE hNode,
  383. BSTR* pbstrUniqIdentifierString);
  384. /////////////////////////////////////////////////////////////////////////////
  385. // GetBSTRItemForCallback()
  386. //
  387. // Create an item node as the passed-in node, have child nodes identity and
  388. // platform (anything uniquely idenitify this item) then output this
  389. // item node data as string, then delete the crated node
  390. //
  391. /////////////////////////////////////////////////////////////////////////////
  392. HRESULT GetBSTRItemForCallback(HANDLE_NODE hItem, BSTR* pbstrXmlItemForCallback);
  393. /////////////////////////////////////////////////////////////////////////////
  394. // IsPrinterDriver()
  395. //
  396. // Retrieves from the Catalog whether this Item is a Printer Driver
  397. //
  398. /////////////////////////////////////////////////////////////////////////////
  399. BOOL IsPrinterDriver(HANDLE_NODE hNode);
  400. /////////////////////////////////////////////////////////////////////////////
  401. // GetDriverInfo()
  402. //
  403. // Retrieves the Driver Information from the Catalog for this Item. Returns
  404. // the Display Name and HWID for this driver - This is passed to the CDM
  405. // installer
  406. //
  407. /////////////////////////////////////////////////////////////////////////////
  408. HRESULT GetDriverInfo(HANDLE_NODE hNode,
  409. BSTR* pbstrHWID,
  410. BSTR* pbstrDisplayName);
  411. /////////////////////////////////////////////////////////////////////////////
  412. // GetPrinterDriverInfo()
  413. //
  414. // Retrieves the Printer Driver Information from the Catalog for this Item.
  415. // Returns the DriverName and the Architecture - This is passed to the CDM
  416. // installer
  417. //
  418. /////////////////////////////////////////////////////////////////////////////
  419. HRESULT GetPrinterDriverInfo(HANDLE_NODE hNode,
  420. BSTR* pbstrDriverName,
  421. BSTR* pbstrArchitecture);
  422. /////////////////////////////////////////////////////////////////////////////
  423. // GetDriverInfoEx()
  424. //
  425. // Combines functionality of IsPrinterDriver, GetDriverInfo, and
  426. // GetPrinterDriverInfo plus retreives MfgName and DriverProvider.
  427. // Used by FindMatchingDriver()
  428. //
  429. // If SUCCEEDES pbstrHWID, pbstrDriverVer, and pbstrDisplayName
  430. // are always returned.
  431. // If SUCCEEDES && *pFIsPrinter == TRUE then pbstrDriverName,
  432. // pbstrDriverProvider, and pbstrMfgName are returned.
  433. //
  434. // Currently pbstrArchitecture is never returned.
  435. //
  436. /////////////////////////////////////////////////////////////////////////////
  437. HRESULT CXmlCatalog::GetDriverInfoEx(HANDLE_NODE hNode,
  438. BOOL* pfIsPrinter,
  439. BSTR* pbstrHWID,
  440. BSTR* pbstrDriverVer,
  441. BSTR* pbstrDisplayName,
  442. BSTR* pbstrDriverName,
  443. BSTR* pbstrDriverProvider,
  444. BSTR* pbstrMfgName,
  445. BSTR* pbstrArchitecture);
  446. /////////////////////////////////////////////////////////////////////////////
  447. // GetItemFirstPlatformStr()
  448. //
  449. // The input node pointer points to an item node has <platform> as its child.
  450. // This function will retrieve the first <platform> node from this item node and
  451. // convert the data inside <platform> into a string that can be used to
  452. // uniquely identify a platform.
  453. //
  454. /////////////////////////////////////////////////////////////////////////////
  455. HRESULT GetItemFirstPlatformStr(HANDLE_NODE hNodeItem,
  456. BSTR* pbstrPlatform);
  457. /////////////////////////////////////////////////////////////////////////////
  458. // GetItemAllPlatformStr()
  459. //
  460. // The input node pointer points to an item node that has <platform> node(s).
  461. // This function will retrieve every <platform> node from this item node and
  462. // convert the data inside <platform> into a string that can be used to
  463. // uniquely identify a platform.
  464. //
  465. /////////////////////////////////////////////////////////////////////////////
  466. HRESULT GetItemAllPlatformStr(HANDLE_NODE hNodeItem,
  467. BSTR** ppbPlatforms, UINT* pnPlatformCount);
  468. /////////////////////////////////////////////////////////////////////////////
  469. // GetItemFirstLanguageStr()
  470. //
  471. // The input node pointer points to a node has <identity> as its child.
  472. // This function will retrieve the first <language> node from <identity>
  473. // node
  474. //
  475. /////////////////////////////////////////////////////////////////////////////
  476. HRESULT GetItemFirstLanguageStr(HANDLE_NODE hNodeItem,
  477. BSTR* pbstrLanguage);
  478. /////////////////////////////////////////////////////////////////////////////
  479. // GetItemAllLanguageStr()
  480. //
  481. // The input node pointer points to a node has <identity> as its child.
  482. // This function will retrieve every <language> node from <identity> node and
  483. // convert the data into an BSTR array to return.
  484. //
  485. /////////////////////////////////////////////////////////////////////////////
  486. HRESULT GetItemAllLanguageStr(HANDLE_NODE hNodeItem,
  487. BSTR** ppbstrLanguage, UINT* pnLangCount);
  488. /////////////////////////////////////////////////////////////////////////////
  489. // GetItemFirstCodeBase()
  490. //
  491. // Find the first codebase (path) of the given item
  492. /////////////////////////////////////////////////////////////////////////////
  493. HANDLE_NODELIST GetItemFirstCodeBase(HANDLE_NODE hNodeItem,
  494. BSTR* pbstrCodeBase,
  495. BSTR* pbstrName,
  496. BSTR* pbstrCRC,
  497. BOOL* pfPatchAvailable,
  498. LONG* plSize);
  499. /////////////////////////////////////////////////////////////////////////////
  500. // GetItemNextCodeBase()
  501. //
  502. // Find the next codebase (path) of the given item
  503. /////////////////////////////////////////////////////////////////////////////
  504. HRESULT GetItemNextCodeBase(HANDLE_NODELIST hNodeListCodeBase,
  505. BSTR* pbstrCodeBase,
  506. BSTR* pbstrName,
  507. BSTR* pbstrCRC,
  508. BOOL* pfPatchAvailable,
  509. LONG* plSize);
  510. /////////////////////////////////////////////////////////////////////////////
  511. // GetItemInstallInfo()
  512. //
  513. // Retrieve the installation information of the given item
  514. /////////////////////////////////////////////////////////////////////////////
  515. HRESULT GetItemInstallInfo(HANDLE_NODE hNodeItem,
  516. BSTR* pbstrInstallerType,
  517. BOOL* pfExclusive,
  518. BOOL* pfReboot,
  519. LONG* plNumCommands);
  520. /////////////////////////////////////////////////////////////////////////////
  521. // GetItemInstallCommand()
  522. //
  523. // Find the installation command type, command and switches of the given item
  524. /////////////////////////////////////////////////////////////////////////////
  525. HRESULT GetItemInstallCommand(HANDLE_NODE hNodeItem,
  526. INT iOrder,
  527. BSTR* pbstrCommandType,
  528. BSTR* pbstrCommand,
  529. BSTR* pbstrSwitches,
  530. BSTR* pbstrInfSection);
  531. /////////////////////////////////////////////////////////////////////////////
  532. // CloseItem()
  533. //
  534. // Release the item node
  535. /////////////////////////////////////////////////////////////////////////////
  536. void CloseItem(HANDLE_NODE hNodeItem);
  537. /////////////////////////////////////////////////////////////////////////////
  538. // GetTotalEstimatedSize()
  539. //
  540. // Get the Total Estimated Download Size of all Items based on Codebase Size
  541. HRESULT GetTotalEstimatedSize(LONG *plTotalSize);
  542. /////////////////////////////////////////////////////////////////////////////
  543. // FindItemByIdentity()
  544. //
  545. // Finds an Item in the Catalog that Matches the Supplied Identity
  546. /////////////////////////////////////////////////////////////////////////////
  547. HRESULT FindItemByIdentity(IXMLDOMNode* pNodeIdentity, HANDLE_NODE* phNodeItem);
  548. /* /////////////////////////////////////////////////////////////////////////////
  549. // IfSameIdentity()
  550. //
  551. // Return TRUE if the two <identity> nodes are identical. Return FALSE otherwise.
  552. /////////////////////////////////////////////////////////////////////////////
  553. BOOL IfSameIdentity(IXMLDOMNode* pNodeIdentity1, IXMLDOMNode* pNodeIdentity2);
  554. */
  555. /////////////////////////////////////////////////////////////////////////////
  556. // GetItemLanguage()
  557. //
  558. // Get the Language Entity from the Item Identity
  559. /////////////////////////////////////////////////////////////////////////////
  560. HRESULT GetItemLanguage(HANDLE_NODE hNodeItem, BSTR* pbstrLanguage);
  561. /////////////////////////////////////////////////////////////////////////////
  562. // GetCorpItemPlatformStr()
  563. //
  564. // Get the Simplified Platform String for an Item (uses the first available platform element)
  565. /////////////////////////////////////////////////////////////////////////////
  566. HRESULT GetCorpItemPlatformStr(HANDLE_NODE hNodeItem, BSTR* pbstrPlatformStr);
  567. private:
  568. IXMLDOMDocument* m_pDocCatalog;
  569. //
  570. // helper functions
  571. //
  572. //
  573. // get data from a version node and convert them into a string with
  574. // format:
  575. // VersionStr = <Version>[,<SvcPackVer>[,<timeStamp>]]
  576. // <Version> = <Major>[.<Minor>[.<Build>]]
  577. // <SvcPackVer> = <Major>[.<minor>]
  578. //
  579. //
  580. // Assumption:
  581. // pszVersion points to a buffer LARGE ENOUGH to store
  582. // any legal version number.
  583. //
  584. HRESULT getVersionStr(IXMLDOMNode* pVersionNode, LPTSTR pszVersion);
  585. HRESULT getVersionStrWithoutSvcPack(IXMLDOMNode* pVersionNode, LPTSTR pszVersion);
  586. /////////////////////////////////////////////////////////////////////////////
  587. // GetItemPlatformStr()
  588. //
  589. // The input node pointer points to a <platform> node.
  590. // This function will retrieve the data from this <platform> node and
  591. // convert the data into a string that can be used to
  592. // uniquely identify a platform.
  593. //
  594. /////////////////////////////////////////////////////////////////////////////
  595. HRESULT GetPlatformStr(IXMLDOMNode* pNodePlatform, BSTR* pbstrPlatform);
  596. HRESULT GetPlatformStrForPing(IXMLDOMNode* pNodePlatform, BSTR* pbstrPlatform);
  597. private:
  598. };
  599. /////////////////////////////////////////////////////////////////////////////
  600. // CXmlItems
  601. class CXmlItems : public CIUXml
  602. {
  603. public:
  604. /////////////////////////////////////////////////////////////////////////////
  605. // Constructor
  606. //
  607. // Create IXMLDOMDocument* for Items; this is for write only
  608. /////////////////////////////////////////////////////////////////////////////
  609. CXmlItems();
  610. /////////////////////////////////////////////////////////////////////////////
  611. // Constructor
  612. //
  613. // Create IXMLDOMDocument* for Items; take TRUE for read, FALSE for write
  614. /////////////////////////////////////////////////////////////////////////////
  615. CXmlItems(BOOL fRead);
  616. /////////////////////////////////////////////////////////////////////////////
  617. // Destructor
  618. //
  619. // Release IXMLDOMDocument* for Items
  620. /////////////////////////////////////////////////////////////////////////////
  621. ~CXmlItems();
  622. /////////////////////////////////////////////////////////////////////////////
  623. // GetItemsDocumentPtr()
  624. //
  625. // Retrieve the items XML Document node
  626. /////////////////////////////////////////////////////////////////////////////
  627. inline IXMLDOMDocument* GetItemsDocumentPtr() { return m_pDocItems; };
  628. /////////////////////////////////////////////////////////////////////////////
  629. // Clear()
  630. //
  631. // Reset IXMLDOMDocument* for Items
  632. /////////////////////////////////////////////////////////////////////////////
  633. void Clear();
  634. /////////////////////////////////////////////////////////////////////////////
  635. // LoadXMLDocument()
  636. //
  637. // Load an XML Document from string
  638. /////////////////////////////////////////////////////////////////////////////
  639. HRESULT LoadXMLDocument(BSTR bstrXml);
  640. /////////////////////////////////////////////////////////////////////////////
  641. // LoadXMLDocumentFile()
  642. //
  643. // Load an XML Document from the specified file
  644. /////////////////////////////////////////////////////////////////////////////
  645. HRESULT LoadXMLDocumentFile(BSTR bstrFilePath);
  646. /////////////////////////////////////////////////////////////////////////////
  647. // SaveXMLDocument()
  648. //
  649. // Save an XML Document to the specified location
  650. /////////////////////////////////////////////////////////////////////////////
  651. HRESULT SaveXMLDocument(BSTR bstrFilePath);
  652. /////////////////////////////////////////////////////////////////////////////
  653. // AddGlobalErrorCodeIfNoItems()
  654. //
  655. // Add the errorCode attribute for <items> if there's no <itemStatus> child node
  656. /////////////////////////////////////////////////////////////////////////////
  657. HANDLE_NODELIST AddGlobalErrorCodeIfNoItems(DWORD dwErrorCode);
  658. /////////////////////////////////////////////////////////////////////////////
  659. // GetFirstItem()
  660. //
  661. // Find the first item in Items xml doc
  662. /////////////////////////////////////////////////////////////////////////////
  663. HANDLE_NODELIST GetFirstItem(HANDLE_NODE* phNodeItem);
  664. /////////////////////////////////////////////////////////////////////////////
  665. // GetNextItem()
  666. //
  667. // Find the next item in Items xml doc
  668. /////////////////////////////////////////////////////////////////////////////
  669. HRESULT GetNextItem(HANDLE_NODELIST hNodeListItem, HANDLE_NODE* phNodeItem);
  670. /////////////////////////////////////////////////////////////////////////////
  671. // CloseItemList()
  672. //
  673. // Release the item nodelist
  674. /////////////////////////////////////////////////////////////////////////////
  675. void CloseItemList(HANDLE_NODELIST hNodeListItem);
  676. /////////////////////////////////////////////////////////////////////////////
  677. // GetItemDownloadPath()
  678. //
  679. // Retrieve the download path of the given item
  680. /////////////////////////////////////////////////////////////////////////////
  681. HRESULT GetItemDownloadPath(HANDLE_NODE hNodeItem, BSTR* pbstrDownloadPath);
  682. /////////////////////////////////////////////////////////////////////////////
  683. // GetItemDownloadPath()
  684. //
  685. // Retrieve the download path of the given item in catalog
  686. /////////////////////////////////////////////////////////////////////////////
  687. HRESULT GetItemDownloadPath(CXmlCatalog* pCatalog, HANDLE_NODE hNodeItem, BSTR* pbstrDownloadPath);
  688. /////////////////////////////////////////////////////////////////////////////
  689. // CloseItem()
  690. //
  691. // Release the item node
  692. /////////////////////////////////////////////////////////////////////////////
  693. void CloseItem(HANDLE_NODE hNodeItem);
  694. /////////////////////////////////////////////////////////////////////////////
  695. // FindItem()
  696. //
  697. // Input:
  698. // pNodeItem - the <itemStatus> node of the install items xml; we need
  699. // to find the corresponding <itemStatus> node in the existing
  700. // items xml with the identical <identity>, <platform> and
  701. // <client> nodes.
  702. // Output:
  703. // phNodeItem - the handle we pass back to differentiate different
  704. // <itemStatus> node in the existing items xml
  705. /////////////////////////////////////////////////////////////////////////////
  706. HRESULT FindItem(IXMLDOMNode* pNodeItem, HANDLE_NODE* phNodeItem, BOOL fIdentityOnly = FALSE);
  707. /////////////////////////////////////////////////////////////////////////////
  708. // FindItem()
  709. //
  710. // Input:
  711. // pCatalog - the pointer to the CXmlCatalog object
  712. // hNodeItem - the handle of the <item> node of the catalog xml; we need
  713. // to find the corresponding <itemStatus> node in the existing
  714. // items xml with the identical <identity>, <platform> and
  715. // <client> nodes.
  716. // Output:
  717. // phNodeItem - the handle we pass back to differentiate different
  718. // <itemStatus> node in items xml
  719. /////////////////////////////////////////////////////////////////////////////
  720. HRESULT FindItem(CXmlCatalog* pCatalog, HANDLE_NODE hNodeItem, HANDLE_NODE* phNodeItem);
  721. /////////////////////////////////////////////////////////////////////////////
  722. // MergeItemDownloaded()
  723. //
  724. // Insert items with download history into existing history
  725. /////////////////////////////////////////////////////////////////////////////
  726. HRESULT MergeItemDownloaded(CXmlItems *pHistoryDownload);
  727. /////////////////////////////////////////////////////////////////////////////
  728. // UpdateItemInstalled()
  729. //
  730. // Update items with installation history in existing history
  731. /////////////////////////////////////////////////////////////////////////////
  732. HRESULT UpdateItemInstalled(CXmlItems *pHistoryInstall);
  733. /////////////////////////////////////////////////////////////////////////////
  734. // UpdateItemInstallStatus()
  735. //
  736. // Update the install status of the given item
  737. /////////////////////////////////////////////////////////////////////////////
  738. HRESULT UpdateItemInstallStatus(HANDLE_NODE hNodeItem,
  739. BSTR bstrValue,
  740. INT iNeedsReboot = -1,
  741. DWORD dwErrorCode = 0);
  742. /////////////////////////////////////////////////////////////////////////////
  743. // AddItem()
  744. //
  745. // Input:
  746. // pNodeItem - the <item> node of the catalog xml; we need to read
  747. // <identity> node, <description> node and <platform> nodes
  748. // from it and write to the items xml (insert in front).
  749. // Output:
  750. // phNodeItem - the handle we pass back to differentiate different
  751. // <itemStatus> node in items xml
  752. /////////////////////////////////////////////////////////////////////////////
  753. HRESULT AddItem(IXMLDOMNode* pNodeItem, HANDLE_NODE* phNodeItem);
  754. /////////////////////////////////////////////////////////////////////////////
  755. // AddItem()
  756. //
  757. // Input:
  758. // pCatalog - the pointer to the CXmlCatalog object
  759. // hNodeItem - the handle of the <item> node of the catalog xml; we need
  760. // to read <identity> node, <description> node and <platform>
  761. // nodes from it and write to the items xml (insert in front).
  762. // Output:
  763. // phNodeItem - the handle we pass back to differentiate different
  764. // <itemStatus> node in items xml
  765. /////////////////////////////////////////////////////////////////////////////
  766. HRESULT AddItem(CXmlCatalog* pCatalog, HANDLE_NODE hNodeItem, HANDLE_NODE* phNodeItem);
  767. /////////////////////////////////////////////////////////////////////////////
  768. // AddTimeStamp()
  769. /////////////////////////////////////////////////////////////////////////////
  770. HRESULT AddTimeStamp(HANDLE_NODE hNodeItem);
  771. /////////////////////////////////////////////////////////////////////////////
  772. // AddDetectResult()
  773. /////////////////////////////////////////////////////////////////////////////
  774. HRESULT AddDetectResult(HANDLE_NODE hNodeItem,
  775. INT iInstalled = -1,
  776. INT iUpToDate = -1,
  777. INT iNewerVersion = -1,
  778. INT iExcluded = -1,
  779. INT iForce = -1,
  780. INT iComputerSystem = -1);
  781. /////////////////////////////////////////////////////////////////////////////
  782. // AddDownloadStatus()
  783. /////////////////////////////////////////////////////////////////////////////
  784. HRESULT AddDownloadStatus(HANDLE_NODE hNodeItem, BSTR bstrValue, DWORD dwErrorCode = 0);
  785. /////////////////////////////////////////////////////////////////////////////
  786. // AddDownloadPath()
  787. /////////////////////////////////////////////////////////////////////////////
  788. HRESULT AddDownloadPath(HANDLE_NODE hNodeItem, BSTR bstrDownloadPath);
  789. /////////////////////////////////////////////////////////////////////////////
  790. // AddInstallStatus()
  791. /////////////////////////////////////////////////////////////////////////////
  792. HRESULT AddInstallStatus(HANDLE_NODE hNodeItem, BSTR bstrValue, BOOL fNeedsReboot, DWORD dwErrorCode = 0);
  793. /////////////////////////////////////////////////////////////////////////////
  794. // AddClientInfo()
  795. /////////////////////////////////////////////////////////////////////////////
  796. HRESULT AddClientInfo(HANDLE_NODE hNodeItem, BSTR bstrClient);
  797. /////////////////////////////////////////////////////////////////////////////
  798. // MigrateV3History()
  799. //
  800. // Migrate V3 History: Consumer history only.
  801. /////////////////////////////////////////////////////////////////////////////
  802. HRESULT MigrateV3History(LPCTSTR pszHistoryFilePath);
  803. /////////////////////////////////////////////////////////////////////////////
  804. // GetItemsBSTR()
  805. /////////////////////////////////////////////////////////////////////////////
  806. HRESULT GetItemsBSTR(BSTR *pbstrXmlItems);
  807. /////////////////////////////////////////////////////////////////////////////
  808. // GetFilteredHistoryBSTR()
  809. /////////////////////////////////////////////////////////////////////////////
  810. HRESULT GetFilteredHistoryBSTR(BSTR bstrBeginDateTime,
  811. BSTR bstrEndDateTime,
  812. BSTR bstrClient,
  813. BSTR *pbstrXmlHistory);
  814. private:
  815. /////////////////////////////////////////////////////////////////////////////
  816. //
  817. // Initialize XML DOC node pointers before writing
  818. /////////////////////////////////////////////////////////////////////////////
  819. void Init();
  820. /* /////////////////////////////////////////////////////////////////////////////
  821. // IfSameClientInfo()
  822. //
  823. // Return TRUE if the two <client> nodes are identical. Return FALSE otherwise.
  824. /////////////////////////////////////////////////////////////////////////////
  825. BOOL IfSameClientInfo(IXMLDOMNode* pNodeClient1, IXMLDOMNode* pNodeClient2);
  826. /////////////////////////////////////////////////////////////////////////////
  827. // IfSameIdentity()
  828. //
  829. // Return TRUE if the two <identity> nodes are identical. Return FALSE otherwise.
  830. /////////////////////////////////////////////////////////////////////////////
  831. BOOL IfSameIdentity(IXMLDOMNode* pNodeIdentity1, IXMLDOMNode* pNodeIdentity2);
  832. /////////////////////////////////////////////////////////////////////////////
  833. // IfSamePlatform()
  834. //
  835. // Return TRUE if the two <platform> nodes are identical. Return FALSE otherwise.
  836. /////////////////////////////////////////////////////////////////////////////
  837. BOOL IfSamePlatform(IXMLDOMNode* pNodePlatform1, IXMLDOMNode* pNodePlatform2);
  838. */
  839. IXMLDOMDocument* m_pDocItems;
  840. IXMLDOMNode* m_pNodeItems;
  841. };
  842. /////////////////////////////////////////////////////////////////////////////
  843. // CXmlClientInfo
  844. class CXmlClientInfo
  845. {
  846. public:
  847. CXmlClientInfo();
  848. ~CXmlClientInfo();
  849. //
  850. // load and parse and validate an XML document from string
  851. //
  852. HRESULT LoadXMLDocument(BSTR bstrXml, BOOL fOfflineMode);
  853. //
  854. // retrieve client name attribute
  855. //
  856. HRESULT GetClientName(BSTR* pbstrClientName);
  857. inline IXMLDOMDocument* GetDocument() { return m_pDocClientInfo; }
  858. private:
  859. IXMLDOMDocument* m_pDocClientInfo;
  860. };
  861. #endif //__IUXML_H_