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.

535 lines
14 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1999-2000 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // ClusterResDepRes.cpp
  7. //
  8. // Description:
  9. // Implementation of CClusterResDepRes class
  10. //
  11. // Author:
  12. // Henry Wang (HenryWa) 24-AUG-1999
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. #include "Pch.h"
  16. #include "ClusterResDepRes.h"
  17. //****************************************************************************
  18. //
  19. // CClusterResDepRes
  20. //
  21. //****************************************************************************
  22. //////////////////////////////////////////////////////////////////////////////
  23. //++
  24. //
  25. // CClusterResDepRes::CClusterResDepRes(
  26. // LPCWSTR pwszNameIn,
  27. // CWbemServices * pNamespaceIn,
  28. // DWORD dwEnumTypeIn
  29. // )
  30. //
  31. // Description:
  32. // Create a cluster node object
  33. //
  34. // Arguments:
  35. // pwszNameIn -- Class name
  36. // pNamespaceIn -- Namespace
  37. // dwEnumTypeIn -- Type id
  38. //
  39. // Return Values:
  40. // pointer to the CProvBase
  41. //
  42. //--
  43. //////////////////////////////////////////////////////////////////////////////
  44. CClusterResDepRes::CClusterResDepRes(
  45. LPCWSTR pwszNameIn,
  46. CWbemServices * pNamespaceIn,
  47. DWORD dwEnumTypeIn
  48. )
  49. : CClusterObjDep( pwszNameIn, pNamespaceIn, dwEnumTypeIn )
  50. {
  51. } //*** CClusterResDepRes::CClusterResDepRes()
  52. //////////////////////////////////////////////////////////////////////////////
  53. //++
  54. //
  55. // static
  56. // CProvBase *
  57. // CClusterResDepRes::S_CreateThis(
  58. // LPCWSTR pwszNameIn,
  59. // CWbemServices * pNamespaceIn,
  60. // DWORD dwEnumTypeIn
  61. // )
  62. //
  63. // Description:
  64. // Create a cluster node object
  65. //
  66. // Arguments:
  67. // pwszNameIn -- Class name
  68. // pNamespaceIn -- Namespace
  69. // dwEnumTypeIn -- Type id
  70. //
  71. // Return Values:
  72. // pointer to the CProvBase
  73. //
  74. //--
  75. //////////////////////////////////////////////////////////////////////////////
  76. CProvBase *
  77. CClusterResDepRes::S_CreateThis(
  78. LPCWSTR pwszNameIn,
  79. CWbemServices * pNamespaceIn,
  80. DWORD dwEnumTypeIn
  81. )
  82. {
  83. return new CClusterResDepRes(
  84. pwszNameIn,
  85. pNamespaceIn,
  86. dwEnumTypeIn
  87. );
  88. } //*** CClusterResDepRes::S_CreateThis()
  89. //////////////////////////////////////////////////////////////////////////////
  90. //++
  91. //
  92. // SCODE
  93. // CClusterResDepRes::EnumInstance(
  94. // long lFlagsIn,
  95. // IWbemContext * pCtxIn,
  96. // IWbemObjectSink * pHandlerIn
  97. // )
  98. //
  99. // Description:
  100. // Enumerate dependencies of a resource.
  101. //
  102. // Arguments:
  103. // lFlagsIn -- WMI flag
  104. // pCtxIn -- WMI context
  105. // pHandlerIn -- WMI sink pointer
  106. //
  107. // Return Values:
  108. // WBEM_S_NO_ERROR
  109. //
  110. //--
  111. //////////////////////////////////////////////////////////////////////////////
  112. SCODE
  113. CClusterResDepRes::EnumInstance(
  114. long lFlagsIn,
  115. IWbemContext * pCtxIn,
  116. IWbemObjectSink * pHandlerIn
  117. )
  118. {
  119. SAFECLUSTER shCluster;
  120. LPCWSTR pwszName = NULL;
  121. CError er;
  122. DWORD dwError;
  123. CWbemClassObject wco;
  124. CWbemClassObject wcoAntecedent;
  125. CWbemClassObject wcoDependent;
  126. _bstr_t bstrGroup;
  127. _bstr_t bstrPart;
  128. DWORD cchDepResName = MAX_PATH;
  129. CWstrBuf wsbDepResName;
  130. shCluster = OpenCluster( NULL );
  131. CClusterEnum clusEnum( shCluster, m_dwEnumType );
  132. m_wcoAntecedent.SpawnInstance( 0, & wcoAntecedent );
  133. m_wcoDependent.SpawnInstance( 0, & wcoDependent );
  134. wsbDepResName.SetSize( cchDepResName );
  135. while ( pwszName = clusEnum.GetNext() )
  136. {
  137. DWORD dwIndex = 0;
  138. DWORD dwType;
  139. SAFERESOURCE shResource;
  140. SAFERESENUM shResEnum;
  141. shResource = OpenClusterResource( shCluster, pwszName );
  142. shResEnum = ClusterResourceOpenEnum( shResource, CLUSTER_RESOURCE_ENUM_DEPENDS );
  143. for ( ; ; )
  144. {
  145. DWORD cch = cchDepResName;
  146. dwError = ClusterResourceEnum(
  147. shResEnum,
  148. dwIndex++,
  149. & dwType,
  150. wsbDepResName,
  151. & cch
  152. );
  153. if ( dwError == ERROR_MORE_DATA )
  154. {
  155. cchDepResName = ++ cch ;
  156. wsbDepResName.SetSize( cch );
  157. dwError = ClusterResourceEnum(
  158. shResEnum,
  159. dwIndex++,
  160. & dwType,
  161. wsbDepResName,
  162. & cch
  163. );
  164. } // if: buffer was too small
  165. if ( dwError == ERROR_SUCCESS )
  166. {
  167. wcoAntecedent.SetProperty( pwszName, CLUSREG_NAME_RESTYPE_NAME );
  168. wcoAntecedent.GetProperty( bstrGroup, PVD_WBEM_RELPATH );
  169. wcoDependent.SetProperty( wsbDepResName, CLUSREG_NAME_RESTYPE_NAME );
  170. wcoDependent.GetProperty( bstrPart, PVD_WBEM_RELPATH );
  171. m_pClass->SpawnInstance( 0, & wco );
  172. wco.SetProperty( (LPWSTR) bstrGroup, PVD_WBEM_PROP_ANTECEDENT );
  173. wco.SetProperty( (LPWSTR) bstrPart, PVD_WBEM_PROP_DEPENDENT );
  174. pHandlerIn->Indicate( 1, & wco );
  175. }
  176. else if ( dwError == ERROR_NO_MORE_ITEMS )
  177. {
  178. break;
  179. }
  180. else
  181. {
  182. er = dwError;
  183. }
  184. } // forever
  185. } // while: more dependencies
  186. return WBEM_S_NO_ERROR;
  187. } //*** CClusterResDepRes::EnumInstance()
  188. //****************************************************************************
  189. //
  190. // CClusterToNode
  191. //
  192. //****************************************************************************
  193. //////////////////////////////////////////////////////////////////////////////
  194. //++
  195. //
  196. // CClusterToNode::CClusterToNode(
  197. // LPCWSTR pwszNameIn,
  198. // CWbemServices * pNamespaceIn,
  199. // DWORD dwEnumTypeIn
  200. // )
  201. //
  202. // Description:
  203. // Constructor
  204. //
  205. // Arguments:
  206. // pwszNameIn -- Class name
  207. // pNamespaceIn -- Namespace
  208. // dwEnumTypeIn -- Type id
  209. //
  210. // Return Values:
  211. // None.
  212. //
  213. //--
  214. //////////////////////////////////////////////////////////////////////////////
  215. CClusterToNode::CClusterToNode(
  216. LPCWSTR pwszNameIn,
  217. CWbemServices * pNamespaceIn,
  218. DWORD dwEnumTypeIn
  219. )
  220. : CClusterObjDep( pwszNameIn, pNamespaceIn, dwEnumTypeIn )
  221. {
  222. } //*** CClusterToNode::CClusterToNode()
  223. //////////////////////////////////////////////////////////////////////////////
  224. //++
  225. //
  226. // static
  227. // CProvBase *
  228. // CClusterToNode::S_CreateThis(
  229. // LPCWSTR pwszNameIn,
  230. // CWbemServices * pNamespaceIn,
  231. // DWORD dwEnumTypeIn
  232. // )
  233. //
  234. // Description:
  235. // Create a cluster node object.
  236. //
  237. // Arguments:
  238. // pwszNameIn -- Class name
  239. // pNamespaceIn -- Namespace
  240. // dwEnumTypeIn -- Type id
  241. //
  242. // Return Values:
  243. // Pointer to the CProvBase
  244. //
  245. //--
  246. //////////////////////////////////////////////////////////////////////////////
  247. CProvBase *
  248. CClusterToNode::S_CreateThis(
  249. LPCWSTR pwszNameIn,
  250. CWbemServices * pNamespaceIn,
  251. DWORD dwEnumTypeIn
  252. )
  253. {
  254. return new CClusterToNode(
  255. pwszNameIn,
  256. pNamespaceIn,
  257. dwEnumTypeIn
  258. );
  259. } //*** CClusterToNode::S_CreateThis()
  260. //////////////////////////////////////////////////////////////////////////////
  261. //++
  262. //
  263. // SCODE
  264. // CClusterToNode::EnumInstance(
  265. // long lFlagsIn,
  266. // IWbemContext * pCtxIn,
  267. // IWbemObjectSink * pHandlerIn
  268. // )
  269. //
  270. // Description:
  271. // Enumerate
  272. //
  273. // Arguments:
  274. // lFlagsIn -- WMI flag
  275. // pCtxIn -- WMI context
  276. // pHandlerIn -- WMI sink pointer
  277. //
  278. // Return Values:
  279. // WBEM_S_NO_ERROR
  280. //
  281. //--
  282. //////////////////////////////////////////////////////////////////////////////
  283. SCODE
  284. CClusterToNode::EnumInstance(
  285. long lFlagsIn,
  286. IWbemContext * pCtxIn,
  287. IWbemObjectSink * pHandlerIn
  288. )
  289. {
  290. SAFECLUSTER shCluster;
  291. LPCWSTR pwszName = NULL;
  292. DWORD cchClusterName = MAX_PATH;
  293. CWstrBuf wsbClusterName;
  294. CError er;
  295. DWORD dwError;
  296. CWbemClassObject wcoAntecedent;
  297. CWbemClassObject wcoDependent;
  298. _bstr_t bstrAntecedent;
  299. _bstr_t bstrDependent;
  300. wsbClusterName.SetSize( cchClusterName );
  301. shCluster = OpenCluster( NULL );
  302. CClusterEnum clusEnum( shCluster, m_dwEnumType );
  303. dwError = GetClusterInformation(
  304. shCluster,
  305. wsbClusterName,
  306. & cchClusterName,
  307. NULL
  308. );
  309. if ( dwError == ERROR_MORE_DATA )
  310. {
  311. wsbClusterName.SetSize( ++ cchClusterName );
  312. er = GetClusterInformation(
  313. shCluster,
  314. wsbClusterName,
  315. & cchClusterName,
  316. NULL
  317. );
  318. }
  319. m_wcoAntecedent.SpawnInstance( 0, & wcoAntecedent );
  320. m_wcoDependent.SpawnInstance( 0, & wcoDependent );
  321. wcoAntecedent.SetProperty( wsbClusterName, PVD_PROP_NAME );
  322. wcoAntecedent.GetProperty( bstrAntecedent, PVD_WBEM_RELPATH );
  323. while ( pwszName = clusEnum.GetNext() )
  324. {
  325. CWbemClassObject wco;
  326. wcoDependent.SetProperty( pwszName, PVD_PROP_NAME );
  327. wcoDependent.GetProperty( bstrDependent, PVD_WBEM_RELPATH );
  328. m_pClass->SpawnInstance( 0, & wco );
  329. wco.SetProperty( (LPWSTR) bstrAntecedent, PVD_WBEM_PROP_ANTECEDENT );
  330. wco.SetProperty( (LPWSTR) bstrDependent, PVD_WBEM_PROP_DEPENDENT );
  331. pHandlerIn->Indicate( 1, & wco );
  332. } // while: more properties
  333. return WBEM_S_NO_ERROR;
  334. } //*** CClusterToNode::EnumInstance()
  335. //****************************************************************************
  336. //
  337. // CClusterHostedService
  338. //
  339. //****************************************************************************
  340. //////////////////////////////////////////////////////////////////////////////
  341. //++
  342. //
  343. // CClusterHostedService::CClusterHostedService(
  344. // LPCWSTR pwszNameIn,
  345. // CWbemServices * pNamespaceIn,
  346. // DWORD dwEnumType
  347. // )
  348. //
  349. // Description:
  350. // Constructor.
  351. //
  352. // Arguments:
  353. // pwszNameIn -- Class name
  354. // pNamespaceIn -- Namespace
  355. // dwEnumTypeIn -- Type id
  356. //
  357. // Return Values:
  358. // None.
  359. //
  360. //--
  361. //////////////////////////////////////////////////////////////////////////////
  362. CClusterHostedService::CClusterHostedService(
  363. LPCWSTR pwszNameIn,
  364. CWbemServices * pNamespaceIn,
  365. DWORD dwEnumTypeIn
  366. )
  367. : CClusterObjDep( pwszNameIn, pNamespaceIn, dwEnumTypeIn )
  368. {
  369. } //*** CClusterHostedService::CClusterHostedService()
  370. //////////////////////////////////////////////////////////////////////////////
  371. //++
  372. //
  373. // static
  374. // CProvBase *
  375. // CClusterHostedService::S_CreateThis(
  376. // LPCWSTR pwszNameIn,
  377. // CWbemServices * pNamespaceIn,
  378. // DWORD dwEnumTypeIn
  379. // )
  380. //
  381. // Description:
  382. // Create a hostedservice.
  383. //
  384. // Arguments:
  385. // pwszNameIn -- Class name
  386. // pNamespaceIn -- Namespace
  387. // dwEnumTypeIn -- Type id
  388. //
  389. // Return Values:
  390. // Pointer to the CProvBase
  391. //
  392. //--
  393. //////////////////////////////////////////////////////////////////////////////
  394. CProvBase *
  395. CClusterHostedService::S_CreateThis(
  396. LPCWSTR pwszNameIn,
  397. CWbemServices * pNamespaceIn,
  398. DWORD dwEnumTypeIn
  399. )
  400. {
  401. return new CClusterHostedService(
  402. pwszNameIn,
  403. pNamespaceIn,
  404. dwEnumTypeIn
  405. );
  406. } //*** CClusterHostedService::S_CreateThis()
  407. //////////////////////////////////////////////////////////////////////////////
  408. //++
  409. //
  410. // SCODE
  411. // CClusterHostedService::EnumInstance(
  412. // long lFlagsIn,
  413. // IWbemContext * pCtxIn,
  414. // IWbemObjectSink * pHandlerIn
  415. // )
  416. //
  417. // Description:
  418. // Enum instance of hostedservice
  419. //
  420. // Arguments:
  421. // lFlagsIn -- WMI flag
  422. // pCtxIn -- WMI context
  423. // pHandlerIn -- WMI sink pointer
  424. //
  425. // Return Values:
  426. // WBEM_S_NO_ERROR
  427. //--
  428. //////////////////////////////////////////////////////////////////////////////
  429. SCODE
  430. CClusterHostedService::EnumInstance(
  431. long lFlagsIn,
  432. IWbemContext * pCtxIn,
  433. IWbemObjectSink * pHandlerIn
  434. )
  435. {
  436. // SAFECLUSTER shCluster;
  437. CError er;
  438. CWbemClassObject wcoAntecedent;
  439. _bstr_t bstrAntecedent;
  440. _bstr_t bstrDependent;
  441. CComPtr< IEnumWbemClassObject > pEnum;
  442. // shCluster = OpenCluster( NULL ); // DAVIDP: Why is this needed? 19-Jul-2000
  443. m_wcoAntecedent.SpawnInstance( 0, &wcoAntecedent );
  444. //
  445. // network interface objects
  446. //
  447. er = m_pNamespace->CreateInstanceEnum(
  448. _bstr_t( PVD_CLASS_SERVICES ),
  449. 0,
  450. NULL,
  451. &pEnum
  452. );
  453. for( ; ; )
  454. {
  455. CWbemClassObject wcoService;
  456. DWORD cWco;
  457. HRESULT hr;
  458. hr = pEnum->Next(
  459. 5000,
  460. 1,
  461. &wcoService,
  462. &cWco
  463. );
  464. if ( hr == WBEM_S_NO_ERROR )
  465. {
  466. CWbemClassObject wco;
  467. wcoService.GetProperty( bstrAntecedent, PVD_PROP_SERVICE_SYSTEMNAME );
  468. wcoAntecedent.SetProperty( ( LPWSTR ) bstrAntecedent, PVD_PROP_NODE_NAME );
  469. wcoAntecedent.GetProperty( bstrAntecedent, PVD_WBEM_RELPATH );
  470. wcoService.GetProperty( bstrDependent, PVD_WBEM_RELPATH );
  471. m_pClass->SpawnInstance( 0, &wco );
  472. wco.SetProperty( ( LPWSTR ) bstrAntecedent, PVD_WBEM_PROP_ANTECEDENT );
  473. wco.SetProperty( ( LPWSTR ) bstrDependent, PVD_WBEM_PROP_DEPENDENT );
  474. pHandlerIn->Indicate( 1, &wco );
  475. }
  476. else
  477. {
  478. break;
  479. }
  480. } // forever
  481. return WBEM_S_NO_ERROR;
  482. } //*** CClusterHostedService::EnumInstance()