Leaked source code of windows server 2003
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.

1007 lines
44 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* pbstrHWID,
  422. BSTR* pbstrManufacturer,
  423. BSTR* pbstrProvider);
  424. /////////////////////////////////////////////////////////////////////////////
  425. // GetDriverInfoEx()
  426. //
  427. // Combines functionality of IsPrinterDriver, GetDriverInfo, and
  428. // GetPrinterDriverInfo plus retreives MfgName and DriverProvider.
  429. // Used by FindMatchingDriver()
  430. //
  431. // If SUCCEEDES pbstrHWID, pbstrDriverVer, and pbstrDisplayName
  432. // are always returned.
  433. // If SUCCEEDES && *pFIsPrinter == TRUE then pbstrDriverName,
  434. // pbstrDriverProvider, and pbstrMfgName are returned.
  435. //
  436. // Currently pbstrArchitecture is never returned.
  437. //
  438. /////////////////////////////////////////////////////////////////////////////
  439. HRESULT CXmlCatalog::GetDriverInfoEx(HANDLE_NODE hNode,
  440. BOOL* pfIsPrinter,
  441. BSTR* pbstrHWID,
  442. BSTR* pbstrDriverVer,
  443. BSTR* pbstrDisplayName,
  444. BSTR* pbstrDriverName,
  445. BSTR* pbstrDriverProvider,
  446. BSTR* pbstrMfgName,
  447. BSTR* pbstrArchitecture);
  448. /////////////////////////////////////////////////////////////////////////////
  449. // GetItemFirstPlatformStr()
  450. //
  451. // The input node pointer points to an item node has <platform> as its child.
  452. // This function will retrieve the first <platform> node from this item node and
  453. // convert the data inside <platform> into a string that can be used to
  454. // uniquely identify a platform.
  455. //
  456. /////////////////////////////////////////////////////////////////////////////
  457. HRESULT GetItemFirstPlatformStr(HANDLE_NODE hNodeItem,
  458. BSTR* pbstrPlatform);
  459. /////////////////////////////////////////////////////////////////////////////
  460. // GetItemAllPlatformStr()
  461. //
  462. // The input node pointer points to an item node that has <platform> node(s).
  463. // This function will retrieve every <platform> node from this item node and
  464. // convert the data inside <platform> into a string that can be used to
  465. // uniquely identify a platform.
  466. //
  467. /////////////////////////////////////////////////////////////////////////////
  468. HRESULT GetItemAllPlatformStr(HANDLE_NODE hNodeItem,
  469. BSTR** ppbPlatforms, UINT* pnPlatformCount);
  470. /////////////////////////////////////////////////////////////////////////////
  471. // GetItemFirstLanguageStr()
  472. //
  473. // The input node pointer points to a node has <identity> as its child.
  474. // This function will retrieve the first <language> node from <identity>
  475. // node
  476. //
  477. /////////////////////////////////////////////////////////////////////////////
  478. HRESULT GetItemFirstLanguageStr(HANDLE_NODE hNodeItem,
  479. BSTR* pbstrLanguage);
  480. /////////////////////////////////////////////////////////////////////////////
  481. // GetItemAllLanguageStr()
  482. //
  483. // The input node pointer points to a node has <identity> as its child.
  484. // This function will retrieve every <language> node from <identity> node and
  485. // convert the data into an BSTR array to return.
  486. //
  487. /////////////////////////////////////////////////////////////////////////////
  488. HRESULT GetItemAllLanguageStr(HANDLE_NODE hNodeItem,
  489. BSTR** ppbstrLanguage, UINT* pnLangCount);
  490. /////////////////////////////////////////////////////////////////////////////
  491. // GetItemFirstCodeBase()
  492. //
  493. // Find the first codebase (path) of the given item
  494. /////////////////////////////////////////////////////////////////////////////
  495. HANDLE_NODELIST GetItemFirstCodeBase(HANDLE_NODE hNodeItem,
  496. BSTR* pbstrCodeBase,
  497. BSTR* pbstrName,
  498. BSTR* pbstrCRC,
  499. BOOL* pfPatchAvailable,
  500. LONG* plSize);
  501. /////////////////////////////////////////////////////////////////////////////
  502. // GetItemNextCodeBase()
  503. //
  504. // Find the next codebase (path) of the given item
  505. /////////////////////////////////////////////////////////////////////////////
  506. HRESULT GetItemNextCodeBase(HANDLE_NODELIST hNodeListCodeBase,
  507. BSTR* pbstrCodeBase,
  508. BSTR* pbstrName,
  509. BSTR* pbstrCRC,
  510. BOOL* pfPatchAvailable,
  511. LONG* plSize);
  512. /////////////////////////////////////////////////////////////////////////////
  513. // GetItemInstallInfo()
  514. //
  515. // Retrieve the installation information of the given item
  516. /////////////////////////////////////////////////////////////////////////////
  517. HRESULT GetItemInstallInfo(HANDLE_NODE hNodeItem,
  518. BSTR* pbstrInstallerType,
  519. BOOL* pfExclusive,
  520. BOOL* pfReboot,
  521. LONG* plNumCommands);
  522. /////////////////////////////////////////////////////////////////////////////
  523. // GetItemInstallCommand()
  524. //
  525. // Find the installation command type, command and switches of the given item
  526. /////////////////////////////////////////////////////////////////////////////
  527. HRESULT GetItemInstallCommand(HANDLE_NODE hNodeItem,
  528. INT iOrder,
  529. BSTR* pbstrCommandType,
  530. BSTR* pbstrCommand,
  531. BSTR* pbstrSwitches,
  532. BSTR* pbstrInfSection);
  533. /////////////////////////////////////////////////////////////////////////////
  534. // CloseItem()
  535. //
  536. // Release the item node
  537. /////////////////////////////////////////////////////////////////////////////
  538. void CloseItem(HANDLE_NODE hNodeItem);
  539. /////////////////////////////////////////////////////////////////////////////
  540. // GetTotalEstimatedSize()
  541. //
  542. // Get the Total Estimated Download Size of all Items based on Codebase Size
  543. HRESULT GetTotalEstimatedSize(LONG *plTotalSize);
  544. /////////////////////////////////////////////////////////////////////////////
  545. // FindItemByIdentity()
  546. //
  547. // Finds an Item in the Catalog that Matches the Supplied Identity
  548. /////////////////////////////////////////////////////////////////////////////
  549. HRESULT FindItemByIdentity(IXMLDOMNode* pNodeIdentity, HANDLE_NODE* phNodeItem);
  550. /* /////////////////////////////////////////////////////////////////////////////
  551. // IfSameIdentity()
  552. //
  553. // Return TRUE if the two <identity> nodes are identical. Return FALSE otherwise.
  554. /////////////////////////////////////////////////////////////////////////////
  555. BOOL IfSameIdentity(IXMLDOMNode* pNodeIdentity1, IXMLDOMNode* pNodeIdentity2);
  556. */
  557. /////////////////////////////////////////////////////////////////////////////
  558. // GetItemLanguage()
  559. //
  560. // Get the Language Entity from the Item Identity
  561. /////////////////////////////////////////////////////////////////////////////
  562. HRESULT GetItemLanguage(HANDLE_NODE hNodeItem, BSTR* pbstrLanguage);
  563. /////////////////////////////////////////////////////////////////////////////
  564. // GetCorpItemPlatformStr()
  565. //
  566. // Get the Simplified Platform String for an Item (uses the first available platform element)
  567. /////////////////////////////////////////////////////////////////////////////
  568. HRESULT GetCorpItemPlatformStr(HANDLE_NODE hNodeItem, BSTR* pbstrPlatformStr);
  569. private:
  570. IXMLDOMDocument* m_pDocCatalog;
  571. //
  572. // helper functions
  573. //
  574. //
  575. // get data from a version node and convert them into a string with
  576. // format:
  577. // VersionStr = <Version>[,<SvcPackVer>[,<timeStamp>]]
  578. // <Version> = <Major>[.<Minor>[.<Build>]]
  579. // <SvcPackVer> = <Major>[.<minor>]
  580. //
  581. //
  582. // Assumption:
  583. // pszVersion points to a buffer LARGE ENOUGH to store
  584. // any legal version number.
  585. //
  586. HRESULT getVersionStr(IXMLDOMNode* pVersionNode, LPTSTR pszVersion);
  587. HRESULT getVersionStrWithoutSvcPack(IXMLDOMNode* pVersionNode, LPTSTR pszVersion);
  588. /////////////////////////////////////////////////////////////////////////////
  589. // GetItemPlatformStr()
  590. //
  591. // The input node pointer points to a <platform> node.
  592. // This function will retrieve the data from this <platform> node and
  593. // convert the data into a string that can be used to
  594. // uniquely identify a platform.
  595. //
  596. /////////////////////////////////////////////////////////////////////////////
  597. HRESULT GetPlatformStr(IXMLDOMNode* pNodePlatform, BSTR* pbstrPlatform);
  598. HRESULT GetPlatformStrForPing(IXMLDOMNode* pNodePlatform, BSTR* pbstrPlatform);
  599. private:
  600. };
  601. /////////////////////////////////////////////////////////////////////////////
  602. // CXmlItems
  603. class CXmlItems : public CIUXml
  604. {
  605. public:
  606. /////////////////////////////////////////////////////////////////////////////
  607. // Constructor
  608. //
  609. // Create IXMLDOMDocument* for Items; this is for write only
  610. /////////////////////////////////////////////////////////////////////////////
  611. CXmlItems();
  612. /////////////////////////////////////////////////////////////////////////////
  613. // Constructor
  614. //
  615. // Create IXMLDOMDocument* for Items; take TRUE for read, FALSE for write
  616. /////////////////////////////////////////////////////////////////////////////
  617. CXmlItems(BOOL fRead);
  618. /////////////////////////////////////////////////////////////////////////////
  619. // Destructor
  620. //
  621. // Release IXMLDOMDocument* for Items
  622. /////////////////////////////////////////////////////////////////////////////
  623. ~CXmlItems();
  624. /////////////////////////////////////////////////////////////////////////////
  625. // GetItemsDocumentPtr()
  626. //
  627. // Retrieve the items XML Document node
  628. /////////////////////////////////////////////////////////////////////////////
  629. inline IXMLDOMDocument* GetItemsDocumentPtr() { return m_pDocItems; };
  630. /////////////////////////////////////////////////////////////////////////////
  631. // Clear()
  632. //
  633. // Reset IXMLDOMDocument* for Items
  634. /////////////////////////////////////////////////////////////////////////////
  635. void Clear();
  636. /////////////////////////////////////////////////////////////////////////////
  637. // LoadXMLDocument()
  638. //
  639. // Load an XML Document from string
  640. /////////////////////////////////////////////////////////////////////////////
  641. HRESULT LoadXMLDocument(BSTR bstrXml);
  642. /////////////////////////////////////////////////////////////////////////////
  643. // LoadXMLDocumentFile()
  644. //
  645. // Load an XML Document from the specified file
  646. /////////////////////////////////////////////////////////////////////////////
  647. HRESULT LoadXMLDocumentFile(BSTR bstrFilePath);
  648. /////////////////////////////////////////////////////////////////////////////
  649. // SaveXMLDocument()
  650. //
  651. // Save an XML Document to the specified location
  652. /////////////////////////////////////////////////////////////////////////////
  653. HRESULT SaveXMLDocument(BSTR bstrFilePath);
  654. /////////////////////////////////////////////////////////////////////////////
  655. // AddGlobalErrorCodeIfNoItems()
  656. //
  657. // Add the errorCode attribute for <items> if there's no <itemStatus> child node
  658. /////////////////////////////////////////////////////////////////////////////
  659. HANDLE_NODELIST AddGlobalErrorCodeIfNoItems(DWORD dwErrorCode);
  660. /////////////////////////////////////////////////////////////////////////////
  661. // GetFirstItem()
  662. //
  663. // Find the first item in Items xml doc
  664. /////////////////////////////////////////////////////////////////////////////
  665. HANDLE_NODELIST GetFirstItem(HANDLE_NODE* phNodeItem);
  666. /////////////////////////////////////////////////////////////////////////////
  667. // GetNextItem()
  668. //
  669. // Find the next item in Items xml doc
  670. /////////////////////////////////////////////////////////////////////////////
  671. HRESULT GetNextItem(HANDLE_NODELIST hNodeListItem, HANDLE_NODE* phNodeItem);
  672. /////////////////////////////////////////////////////////////////////////////
  673. // CloseItemList()
  674. //
  675. // Release the item nodelist
  676. /////////////////////////////////////////////////////////////////////////////
  677. void CloseItemList(HANDLE_NODELIST hNodeListItem);
  678. /////////////////////////////////////////////////////////////////////////////
  679. // GetItemDownloadPath()
  680. //
  681. // Retrieve the download path of the given item
  682. /////////////////////////////////////////////////////////////////////////////
  683. HRESULT GetItemDownloadPath(HANDLE_NODE hNodeItem, BSTR* pbstrDownloadPath);
  684. /////////////////////////////////////////////////////////////////////////////
  685. // GetItemDownloadPath()
  686. //
  687. // Retrieve the download path of the given item in catalog
  688. /////////////////////////////////////////////////////////////////////////////
  689. HRESULT GetItemDownloadPath(CXmlCatalog* pCatalog, HANDLE_NODE hNodeItem, BSTR* pbstrDownloadPath);
  690. /////////////////////////////////////////////////////////////////////////////
  691. // CloseItem()
  692. //
  693. // Release the item node
  694. /////////////////////////////////////////////////////////////////////////////
  695. void CloseItem(HANDLE_NODE hNodeItem);
  696. /////////////////////////////////////////////////////////////////////////////
  697. // FindItem()
  698. //
  699. // Input:
  700. // pNodeItem - the <itemStatus> node of the install items xml; we need
  701. // to find the corresponding <itemStatus> node in the existing
  702. // items xml with the identical <identity>, <platform> and
  703. // <client> nodes.
  704. // Output:
  705. // phNodeItem - the handle we pass back to differentiate different
  706. // <itemStatus> node in the existing items xml
  707. /////////////////////////////////////////////////////////////////////////////
  708. HRESULT FindItem(IXMLDOMNode* pNodeItem, HANDLE_NODE* phNodeItem, BOOL fIdentityOnly = FALSE);
  709. /////////////////////////////////////////////////////////////////////////////
  710. // FindItem()
  711. //
  712. // Input:
  713. // pCatalog - the pointer to the CXmlCatalog object
  714. // hNodeItem - the handle of the <item> node of the catalog xml; we need
  715. // to find the corresponding <itemStatus> node in the existing
  716. // items xml with the identical <identity>, <platform> and
  717. // <client> nodes.
  718. // Output:
  719. // phNodeItem - the handle we pass back to differentiate different
  720. // <itemStatus> node in items xml
  721. /////////////////////////////////////////////////////////////////////////////
  722. HRESULT FindItem(CXmlCatalog* pCatalog, HANDLE_NODE hNodeItem, HANDLE_NODE* phNodeItem);
  723. /////////////////////////////////////////////////////////////////////////////
  724. // MergeItemDownloaded()
  725. //
  726. // Insert items with download history into existing history
  727. /////////////////////////////////////////////////////////////////////////////
  728. HRESULT MergeItemDownloaded(CXmlItems *pHistoryDownload);
  729. /////////////////////////////////////////////////////////////////////////////
  730. // UpdateItemInstalled()
  731. //
  732. // Update items with installation history in existing history
  733. /////////////////////////////////////////////////////////////////////////////
  734. HRESULT UpdateItemInstalled(CXmlItems *pHistoryInstall);
  735. /////////////////////////////////////////////////////////////////////////////
  736. // UpdateItemInstallStatus()
  737. //
  738. // Update the install status of the given item
  739. /////////////////////////////////////////////////////////////////////////////
  740. HRESULT UpdateItemInstallStatus(HANDLE_NODE hNodeItem,
  741. BSTR bstrValue,
  742. INT iNeedsReboot = -1,
  743. DWORD dwErrorCode = 0);
  744. /////////////////////////////////////////////////////////////////////////////
  745. // AddItem()
  746. //
  747. // Input:
  748. // pNodeItem - the <item> node of the catalog xml; we need to read
  749. // <identity> node, <description> node and <platform> nodes
  750. // from it and write to the items xml (insert in front).
  751. // Output:
  752. // phNodeItem - the handle we pass back to differentiate different
  753. // <itemStatus> node in items xml
  754. /////////////////////////////////////////////////////////////////////////////
  755. HRESULT AddItem(IXMLDOMNode* pNodeItem, HANDLE_NODE* phNodeItem);
  756. /////////////////////////////////////////////////////////////////////////////
  757. // AddItem()
  758. //
  759. // Input:
  760. // pCatalog - the pointer to the CXmlCatalog object
  761. // hNodeItem - the handle of the <item> node of the catalog xml; we need
  762. // to read <identity> node, <description> node and <platform>
  763. // nodes from it and write to the items xml (insert in front).
  764. // Output:
  765. // phNodeItem - the handle we pass back to differentiate different
  766. // <itemStatus> node in items xml
  767. /////////////////////////////////////////////////////////////////////////////
  768. HRESULT AddItem(CXmlCatalog* pCatalog, HANDLE_NODE hNodeItem, HANDLE_NODE* phNodeItem);
  769. /////////////////////////////////////////////////////////////////////////////
  770. // AddTimeStamp()
  771. /////////////////////////////////////////////////////////////////////////////
  772. HRESULT AddTimeStamp(HANDLE_NODE hNodeItem);
  773. /////////////////////////////////////////////////////////////////////////////
  774. // AddDetectResult()
  775. /////////////////////////////////////////////////////////////////////////////
  776. HRESULT AddDetectResult(HANDLE_NODE hNodeItem,
  777. INT iInstalled = -1,
  778. INT iUpToDate = -1,
  779. INT iNewerVersion = -1,
  780. INT iExcluded = -1,
  781. INT iForce = -1,
  782. INT iComputerSystem = -1);
  783. /////////////////////////////////////////////////////////////////////////////
  784. // AddDownloadStatus()
  785. /////////////////////////////////////////////////////////////////////////////
  786. HRESULT AddDownloadStatus(HANDLE_NODE hNodeItem, BSTR bstrValue, DWORD dwErrorCode = 0);
  787. /////////////////////////////////////////////////////////////////////////////
  788. // AddDownloadPath()
  789. /////////////////////////////////////////////////////////////////////////////
  790. HRESULT AddDownloadPath(HANDLE_NODE hNodeItem, BSTR bstrDownloadPath);
  791. /////////////////////////////////////////////////////////////////////////////
  792. // AddInstallStatus()
  793. /////////////////////////////////////////////////////////////////////////////
  794. HRESULT AddInstallStatus(HANDLE_NODE hNodeItem, BSTR bstrValue, BOOL fNeedsReboot, DWORD dwErrorCode = 0);
  795. /////////////////////////////////////////////////////////////////////////////
  796. // AddClientInfo()
  797. /////////////////////////////////////////////////////////////////////////////
  798. HRESULT AddClientInfo(HANDLE_NODE hNodeItem, BSTR bstrClient);
  799. /////////////////////////////////////////////////////////////////////////////
  800. // MigrateV3History()
  801. //
  802. // Migrate V3 History: Consumer history only.
  803. /////////////////////////////////////////////////////////////////////////////
  804. HRESULT MigrateV3History(LPCTSTR pszHistoryFilePath);
  805. /////////////////////////////////////////////////////////////////////////////
  806. // GetItemsBSTR()
  807. /////////////////////////////////////////////////////////////////////////////
  808. HRESULT GetItemsBSTR(BSTR *pbstrXmlItems);
  809. /////////////////////////////////////////////////////////////////////////////
  810. // GetFilteredHistoryBSTR()
  811. /////////////////////////////////////////////////////////////////////////////
  812. HRESULT GetFilteredHistoryBSTR(BSTR bstrBeginDateTime,
  813. BSTR bstrEndDateTime,
  814. BSTR bstrClient,
  815. BSTR *pbstrXmlHistory);
  816. private:
  817. /////////////////////////////////////////////////////////////////////////////
  818. //
  819. // Initialize XML DOC node pointers before writing
  820. /////////////////////////////////////////////////////////////////////////////
  821. void Init();
  822. /* /////////////////////////////////////////////////////////////////////////////
  823. // IfSameClientInfo()
  824. //
  825. // Return TRUE if the two <client> nodes are identical. Return FALSE otherwise.
  826. /////////////////////////////////////////////////////////////////////////////
  827. BOOL IfSameClientInfo(IXMLDOMNode* pNodeClient1, IXMLDOMNode* pNodeClient2);
  828. /////////////////////////////////////////////////////////////////////////////
  829. // IfSameIdentity()
  830. //
  831. // Return TRUE if the two <identity> nodes are identical. Return FALSE otherwise.
  832. /////////////////////////////////////////////////////////////////////////////
  833. BOOL IfSameIdentity(IXMLDOMNode* pNodeIdentity1, IXMLDOMNode* pNodeIdentity2);
  834. /////////////////////////////////////////////////////////////////////////////
  835. // IfSamePlatform()
  836. //
  837. // Return TRUE if the two <platform> nodes are identical. Return FALSE otherwise.
  838. /////////////////////////////////////////////////////////////////////////////
  839. BOOL IfSamePlatform(IXMLDOMNode* pNodePlatform1, IXMLDOMNode* pNodePlatform2);
  840. */
  841. IXMLDOMDocument* m_pDocItems;
  842. IXMLDOMNode* m_pNodeItems;
  843. };
  844. /////////////////////////////////////////////////////////////////////////////
  845. // CXmlClientInfo
  846. class CXmlClientInfo
  847. {
  848. public:
  849. CXmlClientInfo();
  850. ~CXmlClientInfo();
  851. //
  852. // load and parse and validate an XML document from string
  853. //
  854. HRESULT LoadXMLDocument(BSTR bstrXml, BOOL fOfflineMode);
  855. //
  856. // retrieve client name attribute
  857. //
  858. HRESULT GetClientName(BSTR* pbstrClientName);
  859. inline IXMLDOMDocument* GetDocument() { return m_pDocClientInfo; }
  860. private:
  861. IXMLDOMDocument* m_pDocClientInfo;
  862. };
  863. #endif //__IUXML_H_