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.

407 lines
11 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1999-2000 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // ClusterObjAssoc.cpp
  7. //
  8. // Description:
  9. // Implementation of CClusterObjAssoc class
  10. //
  11. // Author:
  12. // Henry Wang (HenryWa) 24-AUG-1999
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. #include "Pch.h"
  16. #include "ClusterObjAssoc.h"
  17. //****************************************************************************
  18. //
  19. // CClusterObjAssoc
  20. //
  21. //****************************************************************************
  22. //////////////////////////////////////////////////////////////////////////////
  23. //++
  24. //
  25. // CClusterObjAssoc::CClusterObjAssoc(
  26. // LPCWSTR pwszNameIn,
  27. // CWbemServices * pNamespaceIn,
  28. // DWORD dwEnumTypeIn
  29. // )
  30. //
  31. // Description:
  32. // Constructor.
  33. //
  34. // Arguments:
  35. // pwszNameIn -- Class name
  36. // pNamespaceIn -- Namespace
  37. // dwEnumTypeIn -- Type id
  38. //
  39. // Return Values:
  40. // None.
  41. //
  42. //////////////////////////////////////////////////////////////////////////////
  43. CClusterObjAssoc::CClusterObjAssoc(
  44. LPCWSTR pwszNameIn,
  45. CWbemServices * pNamespaceIn,
  46. DWORD dwEnumTypeIn
  47. )
  48. : CProvBaseAssociation( pwszNameIn, pNamespaceIn )
  49. , m_dwEnumType ( dwEnumTypeIn )
  50. {
  51. _bstr_t bstrClassName;
  52. GetTypeName( bstrClassName, PVD_PROP_PARTCOMPONENT );
  53. pNamespaceIn->GetObject(
  54. bstrClassName,
  55. 0,
  56. NULL,
  57. & m_wcoPart,
  58. NULL
  59. );
  60. GetTypeName( bstrClassName, PVD_PROP_GROUPCOMPONENT );
  61. pNamespaceIn->GetObject(
  62. bstrClassName,
  63. 0,
  64. NULL,
  65. & m_wcoGroup,
  66. NULL
  67. );
  68. } //*** CClusterObjAssoc::CClusterObjAssoc()
  69. //////////////////////////////////////////////////////////////////////////////
  70. //++
  71. //
  72. // static
  73. // CProvBase *
  74. // CClusterObjAssoc::S_CreateThis(
  75. // LPCWSTR pwszNameIn,
  76. // CWbemServices * pNamespaceIn,
  77. // DWORD dwEnumTypeIn
  78. // )
  79. //
  80. // Description:
  81. // Create an object.
  82. //
  83. // Arguments:
  84. // pwszNameIn -- Class name
  85. // pNamespaceIn -- Namespace
  86. // dwEnumTypeIn -- Type id
  87. //
  88. // Return Values:
  89. // Pointer to the CProvBase
  90. //
  91. //--
  92. //////////////////////////////////////////////////////////////////////////////
  93. CProvBase *
  94. CClusterObjAssoc::S_CreateThis(
  95. LPCWSTR pwszNameIn,
  96. CWbemServices * pNamespaceIn,
  97. DWORD dwEnumTypeIn
  98. )
  99. {
  100. return new CClusterObjAssoc(
  101. pwszNameIn,
  102. pNamespaceIn,
  103. dwEnumTypeIn
  104. );
  105. } //*** CClusterObjAssoc::S_CreateThis()
  106. //////////////////////////////////////////////////////////////////////////////
  107. //++
  108. //
  109. // SCODE
  110. // CClusterObjAssoc::GetObject(
  111. // CObjPath & rObjPathIn,
  112. // long lFlagsIn,
  113. // IWbemContext * pCtxIn,
  114. // IWbemObjectSink * pHandlerIn
  115. // )
  116. //
  117. // Description:
  118. // Retrieve cluster object based on given object path.
  119. //
  120. // Arguments:
  121. // rObjPathIn -- Object path to cluster object
  122. // lFlagsIn -- WMI flag
  123. // pCtxIn -- WMI context
  124. // pHandlerIn -- WMI sink pointer
  125. //
  126. // Return Values:
  127. // WBEM_S_NO_ERROR
  128. // Win32 error
  129. //
  130. //--
  131. //////////////////////////////////////////////////////////////////////////////
  132. SCODE
  133. CClusterObjAssoc::GetObject(
  134. CObjPath & rObjPathIn,
  135. long lFlagsIn,
  136. IWbemContext * pCtxIn,
  137. IWbemObjectSink * pHandlerIn
  138. )
  139. {
  140. SAFECLUSTER shCluster;
  141. SAFEGROUP shGroup;
  142. _bstr_t bstrPart;
  143. _bstr_t bstrGroup;
  144. CWbemClassObject wco;
  145. bstrGroup = rObjPathIn.GetStringValueForProperty( PVD_PROP_GROUPCOMPONENT );
  146. bstrPart = rObjPathIn.GetStringValueForProperty( PVD_PROP_PARTCOMPONENT );
  147. m_pClass->SpawnInstance( 0, &wco );
  148. wco.SetProperty( ( LPWSTR ) bstrGroup, PVD_PROP_GROUPCOMPONENT );
  149. wco.SetProperty( ( LPWSTR ) bstrPart, PVD_PROP_PARTCOMPONENT );
  150. pHandlerIn->Indicate( 1, &wco );
  151. return WBEM_S_NO_ERROR;
  152. } //*** CClusterObjAssoc::GetObject()
  153. //////////////////////////////////////////////////////////////////////////////
  154. //++
  155. //
  156. // SCODE
  157. // CClusterObjAssoc::EnumInstance
  158. // long lFlagsIn,
  159. // IWbemContext * pCtxIn,
  160. // IWbemObjectSink * pHandlerIn
  161. // )
  162. //
  163. // Description:
  164. // Enumerate instances.
  165. //
  166. // Arguments:
  167. // lFlagsIn -- WMI flag
  168. // pCtxIn -- WMI context
  169. // pHandlerIn -- WMI sink pointer
  170. //
  171. // Return Values:
  172. // Status code.
  173. //
  174. //--
  175. //////////////////////////////////////////////////////////////////////////////
  176. SCODE
  177. CClusterObjAssoc::EnumInstance(
  178. long lFlagsIn,
  179. IWbemContext * pCtxIn,
  180. IWbemObjectSink * pHandlerIn
  181. )
  182. {
  183. SAFECLUSTER shCluster;
  184. SAFERESOURCE shResource;
  185. LPCWSTR pwszName = NULL;
  186. DWORD cchClusterName = MAX_PATH;
  187. CWstrBuf wsbClusterName;
  188. CError er;
  189. DWORD dwError;
  190. CWbemClassObject wco;
  191. CObjPath opGroup;
  192. CWbemClassObject wcoGroup;
  193. _bstr_t bstrGroup;
  194. shCluster = OpenCluster( NULL );
  195. CClusterEnum clusEnum( shCluster, m_dwEnumType );
  196. wsbClusterName.SetSize( cchClusterName );
  197. dwError = GetClusterInformation(
  198. shCluster,
  199. wsbClusterName,
  200. & cchClusterName,
  201. NULL
  202. );
  203. if ( dwError == ERROR_MORE_DATA )
  204. {
  205. wsbClusterName.SetSize( ++ cchClusterName );
  206. er = GetClusterInformation(
  207. shCluster,
  208. wsbClusterName,
  209. & cchClusterName,
  210. NULL
  211. );
  212. } // if: buffer is too small
  213. m_wcoGroup.SpawnInstance( 0, &wcoGroup );
  214. wcoGroup.SetProperty( wsbClusterName, PVD_PROP_NAME );
  215. wcoGroup.GetProperty( bstrGroup, PVD_WBEM_RELPATH );
  216. while ( ( pwszName = clusEnum.GetNext() ) != NULL )
  217. {
  218. CWbemClassObject wcoPart;
  219. CWbemClassObject wco;
  220. _bstr_t bstrPart;
  221. m_wcoPart.SpawnInstance( 0, & wcoPart );
  222. if ( m_dwEnumType == CLUSTER_ENUM_NETINTERFACE )
  223. {
  224. SAFENETINTERFACE shNetInterface;
  225. CWstrBuf wsbNode;
  226. DWORD cbNode = MAX_PATH;
  227. DWORD cbReturn;
  228. wsbNode.SetSize( cbNode );
  229. shNetInterface = OpenClusterNetInterface( shCluster, pwszName );
  230. dwError = ClusterNetInterfaceControl(
  231. shNetInterface,
  232. NULL,
  233. CLUSCTL_NETINTERFACE_GET_NODE,
  234. NULL,
  235. 0,
  236. wsbNode,
  237. cbNode,
  238. & cbReturn
  239. );
  240. if ( dwError == ERROR_MORE_DATA )
  241. {
  242. wsbNode.SetSize( cbReturn );
  243. er = ClusterNetInterfaceControl(
  244. shNetInterface,
  245. NULL,
  246. CLUSCTL_NETINTERFACE_GET_NODE,
  247. NULL,
  248. 0,
  249. wsbNode,
  250. cbNode,
  251. & cbReturn
  252. );
  253. } // if: buffer too small
  254. wcoPart.SetProperty( pwszName, PVD_PROP_NETINTERFACE_DEVICEID );
  255. wcoPart.SetProperty( wsbNode, PVD_PROP_NETINTERFACE_SYSTEMNAME );
  256. } // if: found net interface
  257. else
  258. {
  259. wcoPart.SetProperty( pwszName, PVD_PROP_NAME );
  260. }
  261. wcoPart.GetProperty( bstrPart, PVD_WBEM_RELPATH );
  262. m_pClass->SpawnInstance( 0, & wco );
  263. wco.SetProperty( (LPWSTR) bstrGroup, PVD_PROP_GROUPCOMPONENT );
  264. wco.SetProperty( (LPWSTR ) bstrPart, PVD_PROP_PARTCOMPONENT );
  265. pHandlerIn->Indicate( 1, & wco );
  266. } // while: more net interfaces
  267. return WBEM_S_NO_ERROR;
  268. } //*** CClusterObjAssoc::EnumInstance()
  269. //****************************************************************************
  270. //
  271. // CClusterObjDep
  272. //
  273. //****************************************************************************
  274. //////////////////////////////////////////////////////////////////////
  275. //++
  276. //
  277. // CClusterObjDep::CClusterObjDep
  278. // LPCWSTR pwszNameIn,
  279. // CWbemServices * pNamespaceIn,
  280. // DWORD dwEnumTypeIn
  281. // )
  282. //
  283. // Description:
  284. // Constructor.
  285. //
  286. // Arguments:
  287. // pwszNameIn -- Class name
  288. // pNamespaceIn -- Namespace
  289. // dwEnumTypeIn -- Type id
  290. //
  291. // Return Values:
  292. // None.
  293. //
  294. //////////////////////////////////////////////////////////////////////
  295. CClusterObjDep::CClusterObjDep(
  296. LPCWSTR pwszNameIn,
  297. CWbemServices * pNamespaceIn,
  298. DWORD dwEnumTypeIn
  299. )
  300. : CProvBaseAssociation( pwszNameIn, pNamespaceIn )
  301. , m_dwEnumType ( dwEnumTypeIn )
  302. {
  303. _bstr_t bstrClassName;
  304. GetTypeName( bstrClassName, PVD_WBEM_PROP_ANTECEDENT );
  305. pNamespaceIn->GetObject(
  306. bstrClassName,
  307. 0,
  308. NULL,
  309. & m_wcoAntecedent,
  310. NULL
  311. );
  312. GetTypeName( bstrClassName, PVD_WBEM_PROP_DEPENDENT );
  313. pNamespaceIn->GetObject(
  314. bstrClassName,
  315. 0,
  316. NULL,
  317. & m_wcoDependent,
  318. NULL
  319. );
  320. } //*** CClusterObjDep::CClusterObjDep()
  321. //////////////////////////////////////////////////////////////////////////////
  322. //++
  323. //
  324. // SCODE
  325. // CClusterObjDep::GetObject(
  326. // CObjPath & rObjPathIn,
  327. // long lFlagsIn,
  328. // IWbemContext * pCtxIn,
  329. // IWbemObjectSink * pHandlerIn
  330. // )
  331. //
  332. // Description:
  333. // Retrieve cluster object based on given object path.
  334. //
  335. // Arguments:
  336. // rObjPathIn -- Object path to cluster object
  337. // lFlagsIn -- WMI flag
  338. // pCtxIn -- WMI context
  339. // pHandlerIn -- WMI sink pointer
  340. //
  341. // Return Values:
  342. // WBEM_S_NO_ERROR
  343. // Win32 error
  344. //
  345. //--
  346. //////////////////////////////////////////////////////////////////////////////
  347. SCODE
  348. CClusterObjDep::GetObject(
  349. CObjPath & rObjPathIn,
  350. long lFlagsIn,
  351. IWbemContext * pCtxIn,
  352. IWbemObjectSink * pHandlerIn
  353. )
  354. {
  355. SAFECLUSTER shCluster;
  356. SAFEGROUP shGroup;
  357. _bstr_t bstrAntecedent;
  358. _bstr_t bstrDependent;
  359. CWbemClassObject wco;
  360. bstrAntecedent = rObjPathIn.GetStringValueForProperty( PVD_WBEM_PROP_ANTECEDENT );
  361. bstrDependent = rObjPathIn.GetStringValueForProperty( PVD_WBEM_PROP_DEPENDENT );
  362. m_pClass->SpawnInstance( 0, & wco );
  363. wco.SetProperty( ( LPWSTR ) bstrAntecedent, PVD_WBEM_PROP_ANTECEDENT );
  364. wco.SetProperty( ( LPWSTR ) bstrDependent, PVD_WBEM_PROP_DEPENDENT );
  365. pHandlerIn->Indicate( 1, & wco );
  366. return WBEM_S_NO_ERROR;
  367. } //*** CClusterObjDep::GetObject()