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.

505 lines
13 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1999-2000 Microsoft Corporation
  4. //
  5. // Module Name: CClusterNetInterface.cpp
  6. //
  7. // Description:
  8. // Implementation of CClusterNetInterface class
  9. //
  10. // Author:
  11. // Henry Wang (HenryWa) 24-AUG-1999
  12. //
  13. //////////////////////////////////////////////////////////////////////////////
  14. #include "Pch.h"
  15. #include "ClusterNetInterface.h"
  16. #include "ClusterNetInterface.tmh"
  17. //****************************************************************************
  18. //
  19. // CClusterNetInterface
  20. //
  21. //****************************************************************************
  22. //////////////////////////////////////////////////////////////////////////////
  23. //++
  24. //
  25. // CClusterNetInterface::CClusterNetInterface(
  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. CClusterNetInterface::CClusterNetInterface(
  43. LPCWSTR pwszNameIn,
  44. CWbemServices * pNamespaceIn
  45. )
  46. : CProvBase( pwszNameIn, pNamespaceIn )
  47. {
  48. } //*** CClusterNetInterface::CClusterNetInterface()
  49. //////////////////////////////////////////////////////////////////////////////
  50. //++
  51. //
  52. // static
  53. // CProvBase *
  54. // CClusterNetInterface::S_CreateThis(
  55. // LPCWSTR pwszNameIn,
  56. // CWbemServices * pNamespaceIn,
  57. // DWORD // dwEnumTypeIn
  58. // )
  59. //
  60. // Description:
  61. // Create a cluster network interface 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. CClusterNetInterface::S_CreateThis(
  75. LPCWSTR pwszNameIn,
  76. CWbemServices * pNamespaceIn,
  77. DWORD // dwEnumTypeIn
  78. )
  79. {
  80. return new CClusterNetInterface( pwszNameIn, pNamespaceIn );
  81. } // CClusterNetInterface::S_CreateThis
  82. //////////////////////////////////////////////////////////////////////////////
  83. //++
  84. //
  85. // const SPropMapEntryArray *
  86. // CClusterNetInterface::RgGetPropMap( void )
  87. //
  88. // Description:
  89. // Retrieve the property maping 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. CClusterNetInterface::RgGetPropMap( void )
  101. {
  102. static SPropMapEntry s_rgpm[] =
  103. {
  104. {
  105. PVD_PROP_NETINTERFACE_DEVICEID,
  106. CLUSREG_NAME_NETIFACE_NAME,
  107. SZ_TYPE,
  108. READONLY
  109. },
  110. {
  111. PVD_PROP_NETINTERFACE_SYSTEMNAME,
  112. CLUSREG_NAME_NETIFACE_NODE,
  113. DWORD_TYPE,
  114. READWRITE
  115. },
  116. {
  117. NULL,
  118. CLUSREG_NAME_NETIFACE_ADAPTER_ID,
  119. DWORD_TYPE,
  120. READWRITE
  121. },
  122. {
  123. NULL,
  124. CLUSREG_NAME_NETIFACE_ENDPOINT,
  125. DWORD_TYPE,
  126. READWRITE
  127. }
  128. };
  129. static SPropMapEntryArray s_pmea(
  130. sizeof( s_rgpm ) /sizeof( SPropMapEntry ),
  131. s_rgpm
  132. );
  133. return &s_pmea;
  134. } //*** CClusterNetInterface::RgGetPropMap()
  135. //////////////////////////////////////////////////////////////////////////////
  136. //++
  137. //
  138. // SCODE
  139. // CClusterNetInterface::EnumInstance(
  140. // long lFlagsIn,
  141. // IWbemContext * pCtxIn,
  142. // IWbemObjectSink * pHandlerIn
  143. // )
  144. //
  145. // Description:
  146. // Enum cluster instance
  147. //
  148. // Arguments:
  149. // lFlagsIn -- WMI flag
  150. // pCtxIn -- WMI context
  151. // pHandlerIn -- WMI sink pointer
  152. //
  153. // Return Values:
  154. // WBEM_S_NO_ERROR
  155. //
  156. //--
  157. //////////////////////////////////////////////////////////////////////////////
  158. SCODE
  159. CClusterNetInterface::EnumInstance(
  160. long lFlagsIn,
  161. IWbemContext * pCtxIn,
  162. IWbemObjectSink * pHandlerIn
  163. )
  164. {
  165. SAFECLUSTER shCluster;
  166. SAFENETINTERFACE shNetInterface;
  167. LPCWSTR pwszName;
  168. shCluster = OpenCluster( NULL );
  169. CClusterEnum cluEnum(
  170. shCluster,
  171. CLUSTER_ENUM_NETINTERFACE );
  172. while ( pwszName = cluEnum.GetNext() )
  173. {
  174. shNetInterface = OpenClusterNetInterface( shCluster, pwszName );
  175. ClusterToWMI( shNetInterface, pHandlerIn );
  176. }
  177. return WBEM_S_NO_ERROR;
  178. } //*** CClusterNetInterface::EnumInstance()
  179. //////////////////////////////////////////////////////////////////////////////
  180. //++
  181. //
  182. // void
  183. // CClusterResource::ClusterToWMI(
  184. // HNETINTERFACE hNetInterfaceIn,
  185. // IWbemObjectSink * pHandlerIn
  186. // )
  187. //
  188. // Description:
  189. // Translate a cluster network interface object to WMI object.
  190. //
  191. // Arguments:
  192. // hNetInterfaceIn -- handle to network interface
  193. // pHandlerIn -- Pointer to WMI sink
  194. //
  195. // Return Values:
  196. // WBEM_S_NO_ERROR
  197. // win32 error
  198. //
  199. //--
  200. //////////////////////////////////////////////////////////////////////////////
  201. void
  202. CClusterNetInterface::ClusterToWMI(
  203. HNETINTERFACE hNetInterfaceIn,
  204. IWbemObjectSink * pHandlerIn
  205. )
  206. {
  207. static SGetControl s_rgControl[] =
  208. {
  209. { CLUSCTL_NETINTERFACE_GET_RO_COMMON_PROPERTIES, FALSE },
  210. { CLUSCTL_NETINTERFACE_GET_COMMON_PROPERTIES, FALSE },
  211. { CLUSCTL_NETINTERFACE_GET_RO_PRIVATE_PROPERTIES, TRUE },
  212. { CLUSCTL_NETINTERFACE_GET_PRIVATE_PROPERTIES, TRUE }
  213. };
  214. static DWORD s_cControl = sizeof( s_rgControl ) / sizeof( SGetControl );
  215. CWbemClassObject wco;
  216. CError er;
  217. UINT idx;
  218. m_pClass->SpawnInstance( 0, & wco);
  219. for( idx = 0 ; idx < s_cControl ; idx++ )
  220. {
  221. CClusPropList pl;
  222. er = pl.ScGetNetInterfaceProperties(
  223. hNetInterfaceIn,
  224. s_rgControl[ idx ].dwControl,
  225. NULL,
  226. 0 );
  227. CClusterApi::GetObjectProperties(
  228. RgGetPropMap(),
  229. pl,
  230. wco,
  231. s_rgControl[ idx ].fPrivate
  232. );
  233. } // for: each control code
  234. wco.SetProperty(
  235. GetClusterNetInterfaceState( hNetInterfaceIn),
  236. PVD_PROP_NETINTERFACE_STATE
  237. );
  238. //
  239. // flags and characteristics
  240. //
  241. {
  242. DWORD cbReturned;
  243. DWORD dwOut;
  244. er = ClusterNetInterfaceControl(
  245. hNetInterfaceIn,
  246. NULL,
  247. CLUSCTL_NETINTERFACE_GET_CHARACTERISTICS, // this control code
  248. NULL, // input buffer (not used)
  249. 0, // input buffer size (not used)
  250. & dwOut,
  251. sizeof( DWORD ),
  252. & cbReturned
  253. );
  254. wco.SetProperty(
  255. dwOut,
  256. PVD_PROP_CHARACTERISTIC
  257. );
  258. }
  259. pHandlerIn->Indicate( 1, & wco );
  260. return;
  261. } //*** CClusterResource::ClusterToWMI()
  262. //////////////////////////////////////////////////////////////////////////////
  263. //++
  264. //
  265. // SCODE
  266. // CClusterNetInterface::GetObject(
  267. // CObjPath & rObjPathIn,
  268. // long lFlagsIn,
  269. // IWbemContext * pCtxIn,
  270. // IWbemObjectSink * pHandlerIn
  271. // )
  272. //
  273. // Description:
  274. // Retrieve cluster network interface object based given object path.
  275. //
  276. // Arguments:
  277. // rObjPathIn -- Object path to cluster object
  278. // lFlagsIn -- WMI flag
  279. // pCtxIn -- WMI context
  280. // pHandlerIn -- WMI sink pointer
  281. //
  282. // Return Values:
  283. // WBEM_S_NO_ERROR
  284. // Win32 error
  285. //
  286. //--
  287. //////////////////////////////////////////////////////////////////////////////
  288. SCODE
  289. CClusterNetInterface::GetObject(
  290. CObjPath & rObjPathIn,
  291. long lFlagsIn,
  292. IWbemContext * pCtxIn,
  293. IWbemObjectSink * pHandlerIn
  294. )
  295. {
  296. SAFECLUSTER shCluster;
  297. SAFENETINTERFACE shNetInterface;
  298. shCluster = OpenCluster( NULL ) ;
  299. shNetInterface = OpenClusterNetInterface(
  300. shCluster,
  301. rObjPathIn.GetStringValueForProperty( PVD_PROP_NAME )
  302. );
  303. ClusterToWMI( shNetInterface, pHandlerIn );
  304. return WBEM_S_NO_ERROR;
  305. } //*** CClusterNetInterface::GetObject()
  306. //////////////////////////////////////////////////////////////////////////////
  307. //++
  308. //
  309. // SCODE
  310. // CClusterNetInterface::ExecuteMethod(
  311. //
  312. // Description:
  313. // Execute methods defined in the mof for cluster network interface.
  314. //
  315. // Arguments:
  316. // rObjPathIn -- Object path to cluster object
  317. // pwszMethodNameIn -- Name of the method to be invoked
  318. // lFlagIn -- WMI flag
  319. // pParamsIn -- Input parameters for the method
  320. // pHandlerIn -- WMI sink pointer
  321. //
  322. // Return Values:
  323. // WBEM_E_NOT_SUPPORTED
  324. //
  325. //--
  326. //////////////////////////////////////////////////////////////////////////////
  327. SCODE
  328. CClusterNetInterface::ExecuteMethod(
  329. CObjPath & rObjPathIn,
  330. WCHAR * pwszMethodNameIn,
  331. long lFlagIn,
  332. IWbemClassObject * pParamsIn,
  333. IWbemObjectSink * pHandlerIn
  334. )
  335. {
  336. return WBEM_E_NOT_SUPPORTED;
  337. } //*** CClusterNetInterface::ExecuteMethod()
  338. //////////////////////////////////////////////////////////////////////////////
  339. //++
  340. //
  341. // SCODE
  342. // CClusterNetInterface::PutInstance(
  343. // CWbemClassObject & rInstToPutIn,
  344. // long lFlagIn,
  345. // IWbemContext * pCtxIn,
  346. // IWbemObjectSink * pHandlerIn
  347. // )
  348. //
  349. // Description:
  350. // Save this instance.
  351. //
  352. // Arguments:
  353. // rInstToPutIn -- WMI object to be saved
  354. // lFlagIn -- WMI flag
  355. // pCtxIn -- WMI context
  356. // pHandlerIn -- WMI sink pointer
  357. //
  358. // Return Values:
  359. // WBEM_E_NOT_SUPPORTED
  360. //
  361. //--
  362. //////////////////////////////////////////////////////////////////////////////
  363. SCODE
  364. CClusterNetInterface::PutInstance(
  365. CWbemClassObject & rInstToPutIn,
  366. long lFlagIn,
  367. IWbemContext * pCtxIn,
  368. IWbemObjectSink * pHandlerIn
  369. )
  370. {
  371. static SGetSetControl s_rgControl[] =
  372. {
  373. {
  374. CLUSCTL_NETINTERFACE_GET_COMMON_PROPERTIES,
  375. CLUSCTL_NETINTERFACE_SET_COMMON_PROPERTIES,
  376. FALSE
  377. },
  378. {
  379. CLUSCTL_NETINTERFACE_GET_PRIVATE_PROPERTIES,
  380. CLUSCTL_NETINTERFACE_SET_PRIVATE_PROPERTIES,
  381. TRUE
  382. }
  383. };
  384. static DWORD s_cControl = sizeof( s_rgControl ) / sizeof( SGetSetControl );
  385. _bstr_t bstrName;
  386. SAFECLUSTER shCluster;
  387. SAFENETINTERFACE shNetwork;
  388. CError er;
  389. UINT idx;
  390. rInstToPutIn.GetProperty( bstrName, L"DeviceID" );
  391. shCluster = OpenCluster( NULL );
  392. shNetwork = OpenClusterNetInterface( shCluster, bstrName );
  393. for ( idx = 0 ; idx < s_cControl; idx ++ )
  394. {
  395. CClusPropList plOld;
  396. CClusPropList plNew;
  397. er = plOld.ScGetNetInterfaceProperties(
  398. shNetwork,
  399. s_rgControl[ idx ].dwGetControl,
  400. NULL,
  401. NULL,
  402. 0
  403. );
  404. CClusterApi::SetObjectProperties(
  405. RgGetPropMap(),
  406. plNew,
  407. plOld,
  408. rInstToPutIn,
  409. s_rgControl[ idx ].fPrivate
  410. );
  411. if ( plNew.Cprops() > 0 )
  412. {
  413. er = ClusterNetInterfaceControl(
  414. shNetwork,
  415. NULL,
  416. s_rgControl[ idx ].dwSetControl,
  417. plNew.PbPropList(),
  418. plNew.CbPropList(),
  419. NULL,
  420. 0,
  421. NULL
  422. );
  423. }
  424. } // for: each control code
  425. return WBEM_S_NO_ERROR;
  426. } //*** CClusterNetInterface::PutInstance()
  427. //////////////////////////////////////////////////////////////////////////////
  428. //++
  429. //
  430. // SCODE
  431. // CClusterNetInterface::DeleteInstance(
  432. // CObjPath & rObjPathIn,
  433. // long lFlagIn,
  434. // IWbemContext * pCtxIn,
  435. // IWbemObjectSink * pHandlerIn
  436. // )
  437. //
  438. // Description:
  439. // Delete the object specified in rObjPathIn.
  440. //
  441. // Arguments:
  442. // rObjPathIn -- ObjPath for the instance to be deleted
  443. // lFlagIn -- WMI flag
  444. // pCtxIn -- WMI context
  445. // pHandlerIn -- WMI sink pointer
  446. //
  447. // Return Values:
  448. // WBEM_E_NOT_SUPPORTED
  449. //
  450. //--
  451. //////////////////////////////////////////////////////////////////////////////
  452. SCODE
  453. CClusterNetInterface::DeleteInstance(
  454. CObjPath & rObjPathIn,
  455. long lFlagIn,
  456. IWbemContext * pCtxIn,
  457. IWbemObjectSink * pHandlerIn
  458. )
  459. {
  460. return WBEM_E_NOT_SUPPORTED;
  461. } //*** CClusterNetInterface::DeleteInstance()