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.

518 lines
13 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1999-2000 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // ClusterService.cpp
  7. //
  8. // Description:
  9. // Implementation of CClusterService class
  10. //
  11. // Author:
  12. // Henry Wang (HenryWa) 24-AUG-1999
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. #include "Pch.h"
  16. #include "ClusterService.h"
  17. //****************************************************************************
  18. //
  19. // CClusterService
  20. //
  21. //****************************************************************************
  22. //////////////////////////////////////////////////////////////////////////////
  23. //++
  24. //
  25. // CClusterService::CClusterService(
  26. // LPCWSTR pwszNameIn,
  27. // CWbemServices * pNamespaceIn
  28. // )
  29. //
  30. // Description:
  31. // Constructor.
  32. //
  33. // Arguments:
  34. // pwszNameIn -- Class name
  35. // pNamespaceIn -- Namespace
  36. //
  37. // Return Values:
  38. // None.
  39. //
  40. //--
  41. //////////////////////////////////////////////////////////////////////////////
  42. CClusterService::CClusterService(
  43. LPCWSTR pwszNameIn,
  44. CWbemServices * pNamespaceIn
  45. )
  46. : CProvBase( pwszNameIn, pNamespaceIn )
  47. {
  48. } //*** CClusterService::CClusterService()
  49. //////////////////////////////////////////////////////////////////////////////
  50. //++
  51. //
  52. // static
  53. // CProvBase *
  54. // CClusterService::S_CreateThis(
  55. // LPCWSTR pwszNameIn,
  56. // CWbemServices * pNamespaceIn,
  57. // DWORD dwEnumTypeIn
  58. // )
  59. //
  60. // Description:
  61. // Create a cluster node object
  62. //
  63. // Arguments:
  64. // pwszNameIn -- Class name
  65. // pNamespaceIn -- Namespace
  66. // dwEnumTypeIn -- Type id
  67. //
  68. // Return Values:
  69. // pointer to the CProvBase
  70. //
  71. //--
  72. //////////////////////////////////////////////////////////////////////////////
  73. CProvBase *
  74. CClusterService::S_CreateThis(
  75. LPCWSTR pwszNameIn,
  76. CWbemServices * pNamespaceIn,
  77. DWORD // dwEnumTypeIn
  78. )
  79. {
  80. return new CClusterService( pwszNameIn, pNamespaceIn );
  81. } //*** CClusterService::S_CreateThis()
  82. //////////////////////////////////////////////////////////////////////////////
  83. //++
  84. //
  85. // const SPropMapEntryArray
  86. // CClusterService::RgGetPropMap( void )
  87. //
  88. // Description:
  89. // Retrieve the property mapping table of the cluster node.
  90. //
  91. // Arguments:
  92. // None.
  93. //
  94. // Return Values:
  95. // Reference to the array of property maping table.
  96. //
  97. //--
  98. //////////////////////////////////////////////////////////////////////////////
  99. const SPropMapEntryArray *
  100. CClusterService::RgGetPropMap( void )
  101. {
  102. static SPropMapEntry s_rgpm[] =
  103. {
  104. {
  105. PVD_PROP_SERVICE_SYSTEMNAME,
  106. CLUSREG_NAME_NODE_NAME,
  107. SZ_TYPE,
  108. READONLY
  109. },
  110. {
  111. NULL,
  112. CLUSREG_NAME_NODE_DESC,
  113. SZ_TYPE,
  114. READWRITE
  115. },
  116. {
  117. NULL,
  118. CLUSREG_NAME_NODE_MAJOR_VERSION,
  119. DWORD_TYPE,
  120. READWRITE
  121. },
  122. {
  123. NULL,
  124. CLUSREG_NAME_NODE_MINOR_VERSION,
  125. DWORD_TYPE,
  126. READWRITE
  127. },
  128. {
  129. NULL,
  130. CLUSREG_NAME_NODE_BUILD_NUMBER,
  131. DWORD_TYPE,
  132. READWRITE
  133. },
  134. {
  135. NULL,
  136. CLUSREG_NAME_NODE_CSDVERSION,
  137. DWORD_TYPE,
  138. READWRITE
  139. }
  140. };
  141. static SPropMapEntryArray s_pmea(
  142. sizeof( s_rgpm ) / sizeof( SPropMapEntry ),
  143. s_rgpm
  144. );
  145. return &s_pmea;
  146. } //*** CClusterService::RgGetPropMap()
  147. //////////////////////////////////////////////////////////////////////////////
  148. //++
  149. //
  150. // SCODE
  151. // CClusterService::EnumInstance(
  152. // long lFlagsIn,
  153. // IWbemContext * pCtxIn,
  154. // IWbemObjectSink * pHandlerIn
  155. // )
  156. //
  157. // Description:
  158. // Enumerate cluster instance.
  159. //
  160. // Arguments:
  161. // lFlagsIn -- WMI flag
  162. // pCtxIn -- WMI context
  163. // pHandlerIn -- WMI sink pointer
  164. //
  165. // Return Values:
  166. // WBEM_S_NO_ERROR
  167. //
  168. //--
  169. //////////////////////////////////////////////////////////////////////////////
  170. SCODE
  171. CClusterService::EnumInstance(
  172. long lFlagsIn,
  173. IWbemContext * pCtxIn,
  174. IWbemObjectSink * pHandlerIn
  175. )
  176. {
  177. SAFECLUSTER shCluster;
  178. SAFENODE shNode;
  179. LPCWSTR pwszNode;
  180. shCluster = OpenCluster( NULL );
  181. CClusterEnum cluEnum( shCluster, CLUSTER_ENUM_NODE );
  182. while ( pwszNode = cluEnum.GetNext() )
  183. {
  184. shNode = OpenClusterNode( shCluster, pwszNode );
  185. ClusterToWMI( shNode, pHandlerIn );
  186. } // while: more nodes
  187. return WBEM_S_NO_ERROR;
  188. } //*** CClusterService::EnumInstance()
  189. //////////////////////////////////////////////////////////////////////////////
  190. //++
  191. //
  192. // void
  193. // CClusterService::ClusterToWMI(
  194. // HNODE hNodeIn,
  195. // IWbemObjectSink * pHandlerIn
  196. // )
  197. //
  198. // Description:
  199. // Translate a cluster node object to WMI object.
  200. //
  201. // Arguments:
  202. // hNodeIn -- Handle to node.
  203. // pHandlerIn -- WMI sink
  204. //
  205. // Return Values:
  206. // None.
  207. //
  208. //--
  209. //////////////////////////////////////////////////////////////////////////////
  210. void
  211. CClusterService::ClusterToWMI(
  212. HNODE hNodeIn,
  213. IWbemObjectSink * pHandlerIn
  214. )
  215. {
  216. static SGetControl s_rgControl[] =
  217. {
  218. { CLUSCTL_NODE_GET_RO_COMMON_PROPERTIES, FALSE },
  219. { CLUSCTL_NODE_GET_COMMON_PROPERTIES, FALSE },
  220. { CLUSCTL_NODE_GET_RO_PRIVATE_PROPERTIES, TRUE },
  221. { CLUSCTL_NODE_GET_PRIVATE_PROPERTIES, TRUE }
  222. };
  223. static DWORD s_cControl = sizeof( s_rgControl ) / sizeof( SGetControl );
  224. CWbemClassObject wco;
  225. UINT idx;
  226. CError er;
  227. m_pClass->SpawnInstance( 0, & wco );
  228. for ( idx = 0 ; idx < s_cControl ; idx ++ )
  229. {
  230. CClusPropList pl;
  231. er = pl.ScGetNodeProperties(
  232. hNodeIn,
  233. s_rgControl[ idx ].dwControl,
  234. NULL,
  235. 0
  236. );
  237. CClusterApi::GetObjectProperties(
  238. RgGetPropMap(),
  239. pl,
  240. wco,
  241. s_rgControl[ idx ].fPrivate
  242. );
  243. } // for: each control code
  244. wco.SetProperty( L"ClusterService", PVD_PROP_SERVICE_NAME );
  245. pHandlerIn->Indicate( 1, & wco );
  246. return;
  247. } //*** CClusterResource::ClusterToWMI()
  248. //////////////////////////////////////////////////////////////////////////////
  249. //++
  250. //
  251. // SCODE
  252. // CClusterService::GetObject(
  253. // CObjPath & rObjPathIn,
  254. // long lFlagsIn,
  255. // IWbemContext * pCtxIn,
  256. // IWbemObjectSink * pHandlerIn
  257. // )
  258. //
  259. // Description:
  260. // Retrieve cluster node object based given object path.
  261. //
  262. // Arguments:
  263. // rObjPathIn -- Object path to cluster object
  264. // lFlagsIn -- WMI flag
  265. // pCtxIn -- WMI context
  266. // pHandlerIn -- WMI sink pointer
  267. //
  268. // Return Values:
  269. // WBEM_S_NO_ERROR
  270. //
  271. //--
  272. //////////////////////////////////////////////////////////////////////////////
  273. SCODE
  274. CClusterService::GetObject(
  275. CObjPath & rObjPathIn,
  276. long lFlagsIn,
  277. IWbemContext * pCtxIn,
  278. IWbemObjectSink * pHandlerIn
  279. )
  280. {
  281. SAFECLUSTER shCluster;
  282. SAFENODE shNode;
  283. shCluster = OpenCluster( NULL );
  284. shNode = OpenClusterNode(
  285. shCluster,
  286. rObjPathIn.GetStringValueForProperty( PVD_PROP_SERVICE_SYSTEMNAME )
  287. );
  288. ClusterToWMI( shNode, pHandlerIn );
  289. return WBEM_S_NO_ERROR;
  290. } //*** CClusterService::GetObject()
  291. //////////////////////////////////////////////////////////////////////////////
  292. //++
  293. //
  294. // SCODE
  295. // CClusterService::ExecuteMethod(
  296. // CObjPath & rObjPathIn,
  297. // WCHAR * pwszMethodNameIn,
  298. // long lFlagIn,
  299. // IWbemClassObject * pParamsIn,
  300. // IWbemObjectSink * pHandlerIn
  301. // )
  302. //
  303. // Description:
  304. // Execute methods defined in the mof for cluster node.
  305. //
  306. // Arguments:
  307. // rObjPathIn -- Object path to cluster object
  308. // pwszMethodNameIn -- Name of the method to be invoked
  309. // lFlagIn -- WMI flag
  310. // pParamsIn -- Input parameters for the method
  311. // pHandlerIn -- WMI sink pointer
  312. //
  313. // Return Values:
  314. // WBEM_S_NO_ERROR
  315. //
  316. //--
  317. //////////////////////////////////////////////////////////////////////////////
  318. SCODE
  319. CClusterService::ExecuteMethod(
  320. CObjPath & rObjPathIn,
  321. WCHAR * pwszMethodNameIn,
  322. long lFlagIn,
  323. IWbemClassObject * pParamsIn,
  324. IWbemObjectSink * pHandlerIn
  325. )
  326. {
  327. SAFECLUSTER shCluster;
  328. SAFENODE shNode;
  329. CError er;
  330. shCluster = OpenCluster( NULL );
  331. shNode = OpenClusterNode(
  332. shCluster,
  333. rObjPathIn.GetStringValueForProperty( PVD_PROP_SERVICE_SYSTEMNAME )
  334. );
  335. if ( _wcsicmp( pwszMethodNameIn, PVD_MTH_SERVICE_PAUSE ) == 0 )
  336. {
  337. er = PauseClusterNode( shNode );
  338. } // if: PAUSE
  339. else if( _wcsicmp( pwszMethodNameIn, PVD_MTH_SERVICE_RESUME ) == 0 )
  340. {
  341. er = ResumeClusterNode( shNode );
  342. } // else if: RESUME
  343. else
  344. {
  345. er = static_cast< HRESULT >( WBEM_E_INVALID_PARAMETER );
  346. }
  347. return WBEM_S_NO_ERROR;
  348. } //*** CClusterService::ExecuteMethod()
  349. //////////////////////////////////////////////////////////////////////////////
  350. //++
  351. //
  352. // SCODE
  353. // CClusterService::PutInstance(
  354. // CWbemClassObject & rInstToPutIn,
  355. // long lFlagIn,
  356. // IWbemContext * pCtxIn,
  357. // IWbemObjectSink * pHandlerIn
  358. // )
  359. //
  360. // Description:
  361. // Save this instance.
  362. //
  363. // Arguments:
  364. // rInstToPutIn -- WMI object to be saved
  365. // lFlagIn -- WMI flag
  366. // pCtxIn -- WMI context
  367. // pHandlerIn -- WMI sink pointer
  368. //
  369. // Return Values:
  370. // WBEM_S_NO_ERROR
  371. //
  372. //--
  373. //////////////////////////////////////////////////////////////////////////////
  374. SCODE
  375. CClusterService::PutInstance(
  376. CWbemClassObject & rInstToPutIn,
  377. long lFlagIn,
  378. IWbemContext * pCtxIn,
  379. IWbemObjectSink * pHandlerIn
  380. )
  381. {
  382. static SGetSetControl s_rgControl[] =
  383. {
  384. {
  385. CLUSCTL_NODE_GET_COMMON_PROPERTIES,
  386. CLUSCTL_NODE_SET_COMMON_PROPERTIES,
  387. FALSE
  388. },
  389. {
  390. CLUSCTL_NODE_GET_PRIVATE_PROPERTIES,
  391. CLUSCTL_NODE_SET_PRIVATE_PROPERTIES,
  392. TRUE
  393. }
  394. };
  395. static DWORD s_cControl = sizeof( s_rgControl ) / sizeof( SGetSetControl );
  396. _bstr_t bstrName;
  397. SAFECLUSTER shCluster;
  398. SAFENODE shNode;
  399. CError er;
  400. UINT idx;
  401. rInstToPutIn.GetProperty( bstrName, PVD_PROP_SERVICE_SYSTEMNAME );
  402. shCluster = OpenCluster( NULL );
  403. shNode = OpenClusterNode( shCluster, bstrName );
  404. for ( idx = 0 ; idx < s_cControl ; idx ++ )
  405. {
  406. CClusPropList plOld;
  407. CClusPropList plNew;
  408. er = plOld.ScGetNodeProperties(
  409. shNode,
  410. s_rgControl[ idx ].dwGetControl,
  411. NULL,
  412. NULL,
  413. 0
  414. );
  415. CClusterApi::SetObjectProperties(
  416. RgGetPropMap(),
  417. plNew,
  418. plOld,
  419. rInstToPutIn,
  420. s_rgControl[ idx ].fPrivate
  421. );
  422. if ( plNew.Cprops() > 0 )
  423. {
  424. er = ClusterNodeControl(
  425. shNode,
  426. NULL,
  427. s_rgControl[ idx ].dwSetControl,
  428. plNew.PbPropList(),
  429. plNew.CbPropList(),
  430. NULL,
  431. 0,
  432. NULL
  433. );
  434. }
  435. } // for: each control code
  436. return WBEM_S_NO_ERROR;
  437. } //*** CClusterService::PutInstance()
  438. //////////////////////////////////////////////////////////////////////////////
  439. //++
  440. //
  441. // SCODE
  442. // CClusterService::DeleteInstance(
  443. // CObjPath & rObjPathIn,
  444. // long lFlagIn,
  445. // IWbemContext * pCtxIn,
  446. // IWbemObjectSink * pHandlerIn
  447. // )
  448. //
  449. // Description:
  450. // Delete the object specified in rObjPathIn.
  451. //
  452. // Arguments:
  453. // rObjPathIn -- ObjPath for the instance to be deleted
  454. // lFlagIn -- WMI flag
  455. // pCtxIn -- WMI context
  456. // pHandlerIn -- WMI sink pointer
  457. //
  458. // Return Values:
  459. // WBEM_E_NOT_SUPPORTED
  460. //
  461. //--
  462. //////////////////////////////////////////////////////////////////////////////
  463. SCODE
  464. CClusterService::DeleteInstance(
  465. CObjPath & rObjPathIn,
  466. long lFlagIn,
  467. IWbemContext * pCtxIn,
  468. IWbemObjectSink * pHandlerIn
  469. )
  470. {
  471. return WBEM_E_NOT_SUPPORTED;
  472. } //*** CClusterService::DeleteInstance()