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.

732 lines
16 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2001 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // EnumManageableResources.cpp
  7. //
  8. // Description:
  9. // CEnumManageableResources implementation.
  10. //
  11. // Maintained By:
  12. // Galen Barbee (GalenB) 02-FEB-2000
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. #include "Pch.h"
  16. #include "ManagedResource.h"
  17. #include "EnumManageableResources.h"
  18. DEFINE_THISCLASS("CEnumManageableResources")
  19. // ************************************************************************
  20. //
  21. // Constructor / Destructor
  22. //
  23. // ************************************************************************
  24. //////////////////////////////////////////////////////////////////////////////
  25. //
  26. // HRESULT
  27. // CEnumManageableResources::S_HrCreateInstance(
  28. // IUnknown ** ppunkOut
  29. // )
  30. //
  31. //////////////////////////////////////////////////////////////////////////////
  32. HRESULT
  33. CEnumManageableResources::S_HrCreateInstance(
  34. IUnknown ** ppunkOut
  35. )
  36. {
  37. TraceFunc( "" );
  38. HRESULT hr = S_OK;
  39. CEnumManageableResources * pemr = NULL;
  40. Assert( ppunkOut != NULL );
  41. if ( ppunkOut == NULL )
  42. {
  43. hr = THR( E_POINTER );
  44. goto Cleanup;
  45. }
  46. pemr = new CEnumManageableResources;
  47. if ( pemr == NULL )
  48. {
  49. hr = THR( E_OUTOFMEMORY );
  50. goto Cleanup;
  51. }
  52. hr = THR( pemr->HrInit() );
  53. if ( FAILED( hr ) )
  54. {
  55. goto Cleanup;
  56. }
  57. hr = THR( pemr->TypeSafeQI( IUnknown, ppunkOut ) );
  58. if ( FAILED( hr ) )
  59. {
  60. goto Cleanup;
  61. }
  62. Cleanup:
  63. if ( pemr != NULL )
  64. {
  65. pemr->Release();
  66. }
  67. HRETURN( hr );
  68. } //*** CEnumManageableResources::S_HrCreateInstance
  69. //////////////////////////////////////////////////////////////////////////////
  70. //
  71. // CEnumManageableResources::CEnumManageableResources
  72. //
  73. //////////////////////////////////////////////////////////////////////////////
  74. CEnumManageableResources::CEnumManageableResources( void )
  75. : m_cRef( 1 )
  76. {
  77. TraceFunc( "" );
  78. InterlockedIncrement( &g_cObjects );
  79. TraceFuncExit();
  80. } //*** CEnumManageableResources::CEnumManageableResources
  81. //////////////////////////////////////////////////////////////////////////////
  82. //
  83. // STDMETHODIMP
  84. // CEnumManageableResources::HrInit
  85. //
  86. //////////////////////////////////////////////////////////////////////////////
  87. STDMETHODIMP
  88. CEnumManageableResources::HrInit( void )
  89. {
  90. TraceFunc( "" );
  91. HRESULT hr = S_OK;
  92. // IUnknown stuff
  93. Assert( m_cRef == 1 );
  94. // IEnumClusCfgManagedResources
  95. Assert( m_cAlloced == 0 );
  96. Assert( m_cIter == 0 );
  97. Assert( m_pList == NULL );
  98. HRETURN( hr );
  99. } //*** CEnumManageableResources::HrInit
  100. //////////////////////////////////////////////////////////////////////////////
  101. //
  102. // CEnumManageableResources::~CEnumManageableResources
  103. //
  104. //////////////////////////////////////////////////////////////////////////////
  105. CEnumManageableResources::~CEnumManageableResources( void )
  106. {
  107. TraceFunc( "" );
  108. if ( m_pList != NULL )
  109. {
  110. while ( m_cAlloced != 0 )
  111. {
  112. m_cAlloced --;
  113. AssertMsg( m_pList[ m_cAlloced ], "This shouldn't happen" );
  114. if ( m_pList[ m_cAlloced ] != NULL )
  115. {
  116. (m_pList[ m_cAlloced ])->Release();
  117. }
  118. }
  119. TraceFree( m_pList );
  120. }
  121. InterlockedDecrement( &g_cObjects );
  122. TraceFuncExit();
  123. } //*** CEnumManageableResources::~CEnumManageableResources
  124. // ************************************************************************
  125. //
  126. // IUnknown
  127. //
  128. // ************************************************************************
  129. //////////////////////////////////////////////////////////////////////////////
  130. //++
  131. //
  132. // CEnumManageableResources::QueryInterface
  133. //
  134. // Description:
  135. // Query this object for the passed in interface.
  136. //
  137. // Arguments:
  138. // riidIn
  139. // Id of interface requested.
  140. //
  141. // ppvOut
  142. // Pointer to the requested interface.
  143. //
  144. // Return Value:
  145. // S_OK
  146. // If the interface is available on this object.
  147. //
  148. // E_NOINTERFACE
  149. // If the interface is not available.
  150. //
  151. // E_POINTER
  152. // ppvOut was NULL.
  153. //
  154. // Remarks:
  155. // None.
  156. //
  157. //--
  158. //////////////////////////////////////////////////////////////////////////////
  159. STDMETHODIMP
  160. CEnumManageableResources::QueryInterface(
  161. REFIID riidIn
  162. , LPVOID * ppvOut
  163. )
  164. {
  165. TraceQIFunc( riidIn, ppvOut );
  166. HRESULT hr = S_OK;
  167. //
  168. // Validate arguments.
  169. //
  170. Assert( ppvOut != NULL );
  171. if ( ppvOut == NULL )
  172. {
  173. hr = THR( E_POINTER );
  174. goto Cleanup;
  175. }
  176. //
  177. // Handle known interfaces.
  178. //
  179. if ( IsEqualIID( riidIn, IID_IUnknown ) )
  180. {
  181. *ppvOut = static_cast< IEnumClusCfgManagedResources * >( this );
  182. } // if: IUnknown
  183. else if ( IsEqualIID( riidIn, IID_IEnumClusCfgManagedResources ) )
  184. {
  185. *ppvOut = TraceInterface( __THISCLASS__, IEnumClusCfgManagedResources, this, 0 );
  186. } // else if: IEnumClusCfgManagedResources
  187. else if ( IsEqualIID( riidIn, IID_IExtendObjectManager ) )
  188. {
  189. *ppvOut = TraceInterface( __THISCLASS__, IExtendObjectManager, this, 0 );
  190. } // else if: IExtendObjectManager
  191. else
  192. {
  193. *ppvOut = NULL;
  194. hr = E_NOINTERFACE;
  195. } // else
  196. //
  197. // Add a reference to the interface if successful.
  198. //
  199. if ( SUCCEEDED( hr ) )
  200. {
  201. ((IUnknown *) *ppvOut)->AddRef();
  202. } // if: success
  203. Cleanup:
  204. QIRETURN_IGNORESTDMARSHALLING( hr, riidIn );
  205. } //*** CEnumManageableResources::QueryInterface
  206. //////////////////////////////////////////////////////////////////////////////
  207. //
  208. // STDMETHODIMP_(ULONG)
  209. // CEnumManageableResources::AddRef
  210. //
  211. //////////////////////////////////////////////////////////////////////////////
  212. STDMETHODIMP_(ULONG)
  213. CEnumManageableResources::AddRef( void )
  214. {
  215. TraceFunc( "[IUnknown]" );
  216. InterlockedIncrement( &m_cRef );
  217. CRETURN( m_cRef );
  218. } //*** CEnumManageableResources::AddRef
  219. //////////////////////////////////////////////////////////////////////////////
  220. //
  221. // STDMETHODIMP_(ULONG)
  222. // CEnumManageableResources::Release
  223. //
  224. //////////////////////////////////////////////////////////////////////////////
  225. STDMETHODIMP_(ULONG)
  226. CEnumManageableResources::Release( void )
  227. {
  228. TraceFunc( "[IUnknown]" );
  229. LONG cRef;
  230. cRef = InterlockedDecrement( &m_cRef );
  231. if ( cRef == 0 )
  232. {
  233. TraceDo( delete this );
  234. }
  235. CRETURN( cRef );
  236. } //*** CEnumManageableResources::Release
  237. // ************************************************************************
  238. //
  239. // IExtendObjectManager
  240. //
  241. // ************************************************************************
  242. //////////////////////////////////////////////////////////////////////////////
  243. //
  244. // STDMETHODIMP
  245. // CEnumManageableResources::FindObject(
  246. // OBJECTCOOKIE cookieIn
  247. // , REFCLSID rclsidTypeIn
  248. // , LPCWSTR pcszNameIn
  249. // , LPUNKNOWN * punkOut
  250. // )
  251. //
  252. //////////////////////////////////////////////////////////////////////////////
  253. STDMETHODIMP
  254. CEnumManageableResources::FindObject(
  255. OBJECTCOOKIE cookieIn
  256. , REFCLSID rclsidTypeIn
  257. , LPCWSTR pcszNameIn
  258. , LPUNKNOWN * ppunkOut
  259. )
  260. {
  261. TraceFunc( "[IExtendObjectManager]" );
  262. OBJECTCOOKIE cookie;
  263. OBJECTCOOKIE cookieParent;
  264. IServiceProvider * psp;
  265. HRESULT hr = S_FALSE;
  266. IObjectManager * pom = NULL;
  267. IStandardInfo * psi = NULL;
  268. IEnumCookies * pec = NULL;
  269. DWORD objectCount = 0;
  270. //
  271. // Check arguments
  272. //
  273. if ( cookieIn == 0 )
  274. {
  275. hr = THR( E_INVALIDARG );
  276. goto Cleanup;
  277. }
  278. if ( rclsidTypeIn != CLSID_ManagedResourceType )
  279. {
  280. hr = THR( E_INVALIDARG );
  281. goto Cleanup;
  282. }
  283. if ( ppunkOut == NULL )
  284. {
  285. hr = THR( E_POINTER );
  286. goto Cleanup;
  287. }
  288. AssertMsg( pcszNameIn == NULL, "Enums shouldn't have names." );
  289. //
  290. // Grab the object manager.
  291. //
  292. hr = THR( CoCreateInstance( CLSID_ServiceManager,
  293. NULL,
  294. CLSCTX_INPROC_SERVER,
  295. TypeSafeParams( IServiceProvider, &psp )
  296. ) );
  297. if ( FAILED( hr ) )
  298. {
  299. goto Cleanup;
  300. }
  301. hr = THR( psp->TypeSafeQS( CLSID_ObjectManager,
  302. IObjectManager,
  303. &pom
  304. ) );
  305. psp->Release(); // release promptly
  306. if ( FAILED( hr ) )
  307. {
  308. goto Cleanup;
  309. }
  310. //
  311. // Ask the Object Manager for information about our cookie so we can
  312. // get to the "parent" cookie.
  313. //
  314. hr = THR( pom->GetObject( DFGUID_StandardInfo,
  315. cookieIn,
  316. reinterpret_cast< IUnknown ** >( &psi )
  317. ) );
  318. if ( FAILED( hr ) )
  319. {
  320. goto Cleanup;
  321. }
  322. hr = STHR( psi->GetParent( &cookieParent ) );
  323. if ( FAILED( hr ) )
  324. {
  325. goto Cleanup;
  326. }
  327. //
  328. // Now ask the Object Manager for a cookie enumerator.
  329. //
  330. hr = THR( pom->FindObject( CLSID_ManagedResourceType,
  331. cookieParent,
  332. NULL,
  333. DFGUID_EnumCookies,
  334. NULL,
  335. reinterpret_cast< IUnknown ** >( &pec )
  336. ) );
  337. if ( FAILED( hr ) )
  338. {
  339. goto Cleanup;
  340. }
  341. pec = TraceInterface( L"CEnumClusCfgManagedResources!IEnumCookies", IEnumCookies, pec, 1 );
  342. hr = pec->Count( &objectCount );
  343. if ( FAILED( hr ) )
  344. {
  345. goto Cleanup;
  346. }
  347. m_cAlloced = objectCount;
  348. if ( m_cAlloced == 0 )
  349. {
  350. // The error text is better than the coding value.
  351. hr = HRESULT_FROM_WIN32( TW32( ERROR_NOT_FOUND ) );
  352. goto Cleanup;
  353. }
  354. //
  355. // Allocate a buffer to store the punks.
  356. //
  357. m_pList = (IClusCfgManagedResourceInfo **) TraceAlloc( HEAP_ZERO_MEMORY, m_cAlloced * sizeof(IClusCfgManagedResourceInfo *) );
  358. if ( m_pList == NULL )
  359. {
  360. hr = THR( E_OUTOFMEMORY );
  361. goto Cleanup;
  362. }
  363. //
  364. // Reset the enumerator.
  365. //
  366. hr = THR( pec->Reset() );
  367. if ( FAILED( hr ) )
  368. {
  369. goto Cleanup;
  370. }
  371. //
  372. // Now loop thru to collect the interfaces.
  373. //
  374. m_cIter = 0;
  375. while ( hr == S_OK && m_cIter < m_cAlloced )
  376. {
  377. hr = STHR( pec->Next( 1, &cookie, NULL ) );
  378. if ( FAILED( hr ) )
  379. {
  380. goto Cleanup;
  381. }
  382. if ( hr == S_FALSE )
  383. {
  384. break; // exit condition
  385. }
  386. hr = THR( pom->GetObject( DFGUID_ManagedResource,
  387. cookie,
  388. reinterpret_cast< IUnknown ** >( &m_pList[ m_cIter ] )
  389. ) );
  390. if ( FAILED( hr ) )
  391. {
  392. goto Cleanup;
  393. }
  394. m_cIter++;
  395. } // while: S_OK
  396. //
  397. // Reset the iter.
  398. //
  399. m_cIter = 0;
  400. //
  401. // Grab the interface.
  402. //
  403. hr = THR( QueryInterface( DFGUID_EnumManageableResources,
  404. reinterpret_cast< void ** >( ppunkOut )
  405. ) );
  406. if ( FAILED( hr ) )
  407. {
  408. goto Cleanup;
  409. }
  410. Cleanup:
  411. if ( pom != NULL )
  412. {
  413. pom->Release();
  414. }
  415. if ( psi != NULL )
  416. {
  417. psi->Release();
  418. }
  419. if ( pec != NULL )
  420. {
  421. pec->Release();
  422. }
  423. HRETURN( hr );
  424. } //*** CEnumManageableResources::FindObject
  425. //****************************************************************************
  426. //
  427. // IEnumClusCfgManagedResources
  428. //
  429. //****************************************************************************
  430. //////////////////////////////////////////////////////////////////////////////
  431. //
  432. // STDMETHODIMP
  433. // CEnumManageableResources::Next(
  434. // ULONG celt,
  435. // IClusCfgNetworkInfo ** rgOut,
  436. // ULONG * pceltFetchedOut
  437. // )
  438. //
  439. //////////////////////////////////////////////////////////////////////////////
  440. STDMETHODIMP
  441. CEnumManageableResources::Next(
  442. ULONG celt,
  443. IClusCfgManagedResourceInfo * rgOut[],
  444. ULONG * pceltFetchedOut
  445. )
  446. {
  447. TraceFunc( "[IEnumClusCfgManagedResources]" );
  448. ULONG celtFetched;
  449. HRESULT hr = S_FALSE;
  450. //
  451. // Check parameters
  452. //
  453. if ( rgOut == NULL || celt == 0 )
  454. {
  455. hr = THR( E_POINTER );
  456. goto Cleanup;
  457. }
  458. //
  459. // Zero the return count.
  460. //
  461. if ( pceltFetchedOut != NULL )
  462. {
  463. *pceltFetchedOut = 0;
  464. }
  465. //
  466. // Clear the buffer
  467. //
  468. ZeroMemory( rgOut, celt * sizeof(rgOut[0]) );
  469. //
  470. // Loop thru copying the interfaces.
  471. //
  472. for( celtFetched = 0
  473. ; celtFetched + m_cIter < m_cAlloced && celtFetched < celt
  474. ; celtFetched ++
  475. )
  476. {
  477. hr = THR( m_pList[ m_cIter + celtFetched ]->TypeSafeQI( IClusCfgManagedResourceInfo, &rgOut[ celtFetched ] ) );
  478. if ( FAILED( hr ) )
  479. {
  480. goto CleanupList;
  481. }
  482. rgOut[ celtFetched ] = TraceInterface( L"CEnumManageableResources!IClusCfgManagedResourceInfo", IClusCfgManagedResourceInfo, rgOut[ celtFetched ], 1 );
  483. } // for: celtFetched
  484. if ( pceltFetchedOut != NULL )
  485. {
  486. *pceltFetchedOut = celtFetched;
  487. }
  488. m_cIter += celtFetched;
  489. if ( celtFetched != celt )
  490. {
  491. hr = S_FALSE;
  492. }
  493. else
  494. {
  495. hr = S_OK;
  496. }
  497. Cleanup:
  498. HRETURN( hr );
  499. CleanupList:
  500. for ( ; celtFetched != 0 ; )
  501. {
  502. celtFetched --;
  503. rgOut[ celtFetched ]->Release();
  504. rgOut[ celtFetched ] = NULL;
  505. }
  506. goto Cleanup;
  507. } //*** CEnumManageableResources::Next
  508. //////////////////////////////////////////////////////////////////////////////
  509. //
  510. // STDMETHODIMP
  511. // CEnumManageableResources::Skip(
  512. // ULONG celt
  513. // )
  514. //
  515. //////////////////////////////////////////////////////////////////////////////
  516. STDMETHODIMP
  517. CEnumManageableResources::Skip(
  518. ULONG celt
  519. )
  520. {
  521. TraceFunc( "[IEnumClusCfgManagedResources]" );
  522. HRESULT hr = S_OK;
  523. m_cIter += celt;
  524. if ( m_cIter > m_cAlloced )
  525. {
  526. m_cIter = m_cAlloced;
  527. hr = S_FALSE;
  528. }
  529. HRETURN( hr );
  530. } //*** CEnumManageableResources::Skip
  531. //////////////////////////////////////////////////////////////////////////////
  532. //
  533. // STDMETHODIMP
  534. // CEnumManageableResources::Reset( void )
  535. //
  536. //////////////////////////////////////////////////////////////////////////////
  537. STDMETHODIMP
  538. CEnumManageableResources::Reset( void )
  539. {
  540. TraceFunc( "[IEnumClusCfgManagedResources]" );
  541. HRESULT hr = S_OK;
  542. m_cIter = 0;
  543. HRETURN( hr );
  544. } //*** CEnumManageableResources::Reset
  545. //////////////////////////////////////////////////////////////////////////////
  546. //
  547. // STDMETHODIMP
  548. // CEnumManageableResources::Clone(
  549. // IEnumClusCfgManagedResources ** ppenumOut
  550. // )
  551. //
  552. //////////////////////////////////////////////////////////////////////////////
  553. STDMETHODIMP
  554. CEnumManageableResources::Clone(
  555. IEnumClusCfgManagedResources ** ppenumOut
  556. )
  557. {
  558. TraceFunc( "[IEnumClusCfgManagedResources]" );
  559. //
  560. // KB: not going to implement this method.
  561. //
  562. HRESULT hr = THR( E_NOTIMPL );
  563. HRETURN( hr );
  564. } //*** CEnumManageableResources::Clone
  565. //////////////////////////////////////////////////////////////////////////////
  566. //
  567. // STDMETHODIMP
  568. // CEnumManageableResources::Count(
  569. // DWORD * pnCountOut
  570. // )
  571. //
  572. //////////////////////////////////////////////////////////////////////////////
  573. STDMETHODIMP
  574. CEnumManageableResources::Count(
  575. DWORD * pnCountOut
  576. )
  577. {
  578. TraceFunc( "[IEnumClusCfgManagedResources]" );
  579. HRESULT hr = S_OK;
  580. if ( pnCountOut == NULL )
  581. {
  582. hr = THR( E_POINTER );
  583. goto Cleanup;
  584. }
  585. *pnCountOut = m_cAlloced;
  586. Cleanup:
  587. HRETURN( hr );
  588. } //*** CEnumManageableResources::Count