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.

303 lines
8.1 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::EnumInstance
  111. // long lFlagsIn,
  112. // IWbemContext * pCtxIn,
  113. // IWbemObjectSink * pHandlerIn
  114. // )
  115. //
  116. // Description:
  117. // Enumerate instances.
  118. //
  119. // Arguments:
  120. // lFlagsIn -- WMI flag
  121. // pCtxIn -- WMI context
  122. // pHandlerIn -- WMI sink pointer
  123. //
  124. // Return Values:
  125. // Status code.
  126. //
  127. //--
  128. //////////////////////////////////////////////////////////////////////////////
  129. SCODE
  130. CClusterObjAssoc::EnumInstance(
  131. long lFlagsIn,
  132. IWbemContext * pCtxIn,
  133. IWbemObjectSink * pHandlerIn
  134. )
  135. {
  136. SAFECLUSTER shCluster;
  137. SAFERESOURCE shResource;
  138. LPCWSTR pwszName = NULL;
  139. DWORD cchClusterName = MAX_PATH;
  140. CWstrBuf wsbClusterName;
  141. CError er;
  142. DWORD dwError;
  143. CWbemClassObject wco;
  144. CObjPath opGroup;
  145. CWbemClassObject wcoGroup;
  146. _bstr_t bstrGroup;
  147. shCluster = OpenCluster( NULL );
  148. CClusterEnum clusEnum( shCluster, m_dwEnumType );
  149. wsbClusterName.SetSize( cchClusterName );
  150. dwError = GetClusterInformation(
  151. shCluster,
  152. wsbClusterName,
  153. & cchClusterName,
  154. NULL
  155. );
  156. if ( dwError == ERROR_MORE_DATA )
  157. {
  158. wsbClusterName.SetSize( ++ cchClusterName );
  159. er = GetClusterInformation(
  160. shCluster,
  161. wsbClusterName,
  162. & cchClusterName,
  163. NULL
  164. );
  165. } // if: buffer is too small
  166. m_wcoGroup.SpawnInstance( 0, &wcoGroup );
  167. wcoGroup.SetProperty( wsbClusterName, PVD_PROP_NAME );
  168. wcoGroup.GetProperty( bstrGroup, PVD_WBEM_RELPATH );
  169. while ( pwszName = clusEnum.GetNext() )
  170. {
  171. CWbemClassObject wcoPart;
  172. CWbemClassObject wco;
  173. _bstr_t bstrPart;
  174. m_wcoPart.SpawnInstance( 0, & wcoPart );
  175. if ( m_dwEnumType == CLUSTER_ENUM_NETINTERFACE )
  176. {
  177. SAFENETINTERFACE shNetInterface;
  178. CWstrBuf wsbNode;
  179. DWORD cbNode = MAX_PATH;
  180. DWORD cbReturn;
  181. wsbNode.SetSize( cbNode );
  182. shNetInterface = OpenClusterNetInterface( shCluster, pwszName );
  183. dwError = ClusterNetInterfaceControl(
  184. shNetInterface,
  185. NULL,
  186. CLUSCTL_NETINTERFACE_GET_NODE,
  187. NULL,
  188. 0,
  189. wsbNode,
  190. cbNode,
  191. & cbReturn
  192. );
  193. if ( dwError == ERROR_MORE_DATA )
  194. {
  195. wsbNode.SetSize( cbReturn );
  196. er = ClusterNetInterfaceControl(
  197. shNetInterface,
  198. NULL,
  199. CLUSCTL_NETINTERFACE_GET_NODE,
  200. NULL,
  201. 0,
  202. wsbNode,
  203. cbNode,
  204. & cbReturn
  205. );
  206. } // if: buffer too small
  207. wcoPart.SetProperty( pwszName, PVD_PROP_NETINTERFACE_DEVICEID );
  208. wcoPart.SetProperty( wsbNode, PVD_PROP_NETINTERFACE_SYSTEMNAME );
  209. } // if: found net interface
  210. else
  211. {
  212. wcoPart.SetProperty( pwszName, PVD_PROP_NAME );
  213. }
  214. wcoPart.GetProperty( bstrPart, PVD_WBEM_RELPATH );
  215. m_pClass->SpawnInstance( 0, & wco );
  216. wco.SetProperty( (LPWSTR) bstrGroup, PVD_PROP_GROUPCOMPONENT );
  217. wco.SetProperty( (LPWSTR ) bstrPart, PVD_PROP_PARTCOMPONENT );
  218. pHandlerIn->Indicate( 1, & wco );
  219. } // while: more net interfaces
  220. return WBEM_S_NO_ERROR;
  221. } //*** CClusterObjAssoc::EnumInstance()
  222. //****************************************************************************
  223. //
  224. // CClusterObjDep
  225. //
  226. //****************************************************************************
  227. //////////////////////////////////////////////////////////////////////
  228. //++
  229. //
  230. // CClusterObjDep::CClusterObjDep
  231. // LPCWSTR pwszNameIn,
  232. // CWbemServices * pNamespaceIn,
  233. // DWORD dwEnumTypeIn
  234. // )
  235. //
  236. // Description:
  237. // Constructor.
  238. //
  239. // Arguments:
  240. // pwszNameIn -- Class name
  241. // pNamespaceIn -- Namespace
  242. // dwEnumTypeIn -- Type id
  243. //
  244. // Return Values:
  245. // None.
  246. //
  247. //////////////////////////////////////////////////////////////////////
  248. CClusterObjDep::CClusterObjDep(
  249. LPCWSTR pwszNameIn,
  250. CWbemServices * pNamespaceIn,
  251. DWORD dwEnumTypeIn
  252. )
  253. : CProvBaseAssociation( pwszNameIn, pNamespaceIn )
  254. , m_dwEnumType ( dwEnumTypeIn )
  255. {
  256. _bstr_t bstrClassName;
  257. GetTypeName( bstrClassName, PVD_WBEM_PROP_ANTECEDENT );
  258. pNamespaceIn->GetObject(
  259. bstrClassName,
  260. 0,
  261. NULL,
  262. & m_wcoDependent,
  263. NULL
  264. );
  265. GetTypeName( bstrClassName, PVD_WBEM_PROP_DEPENDENT );
  266. pNamespaceIn->GetObject(
  267. bstrClassName,
  268. 0,
  269. NULL,
  270. & m_wcoAntecedent,
  271. NULL
  272. );
  273. } //*** CClusterObjDep::CClusterObjDep()