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.

1430 lines
30 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2001 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // ManagedNetwork.cpp
  7. //
  8. // Description:
  9. // CManagedNetwork implementation.
  10. //
  11. // Maintained By:
  12. // Galen Barbee (GalenB) 02-NOV-2000
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. #include "Pch.h"
  16. #include "IPAddressInfo.h"
  17. #include "ManagedNetwork.h"
  18. DEFINE_THISCLASS("CManagedNetwork")
  19. #define IPADDRESS_INCREMENT 10
  20. // ************************************************************************
  21. //
  22. // Constructor / Destructor
  23. //
  24. // ************************************************************************
  25. //////////////////////////////////////////////////////////////////////////////
  26. //++
  27. //
  28. // HRESULT
  29. // CManagedNetwork::S_HrCreateInstance(
  30. // IUnknown ** ppunkOut
  31. // )
  32. //
  33. //--
  34. //////////////////////////////////////////////////////////////////////////////
  35. HRESULT
  36. CManagedNetwork::S_HrCreateInstance(
  37. IUnknown ** ppunkOut
  38. )
  39. {
  40. TraceFunc( "" );
  41. HRESULT hr = S_OK;
  42. CManagedNetwork * pmn = NULL;
  43. Assert( ppunkOut != NULL );
  44. if ( ppunkOut == NULL )
  45. {
  46. hr = THR( E_POINTER );
  47. goto Cleanup;
  48. }
  49. pmn = new CManagedNetwork;
  50. if ( pmn == NULL )
  51. {
  52. hr = THR( E_OUTOFMEMORY );
  53. goto Cleanup;
  54. }
  55. hr = THR( pmn->HrInit() );
  56. if ( FAILED( hr ) )
  57. {
  58. goto Cleanup;
  59. }
  60. hr = THR( pmn->TypeSafeQI( IUnknown, ppunkOut ) );
  61. if ( FAILED( hr ) )
  62. {
  63. goto Cleanup;
  64. }
  65. Cleanup:
  66. if ( pmn != NULL )
  67. {
  68. pmn->Release();
  69. }
  70. HRETURN( hr );
  71. } //*** CManagedNetwork::S_HrCreateInstance
  72. //////////////////////////////////////////////////////////////////////////////
  73. //++
  74. //
  75. // CManagedNetwork::CManagedNetwork
  76. //
  77. //--
  78. //////////////////////////////////////////////////////////////////////////////
  79. CManagedNetwork::CManagedNetwork( void )
  80. : m_cRef( 1 )
  81. {
  82. TraceFunc( "" );
  83. InterlockedIncrement( &g_cObjects );
  84. TraceFuncExit();
  85. } //*** CManagedNetwork::CManagedNetwork
  86. //////////////////////////////////////////////////////////////////////////////
  87. //++
  88. //
  89. // STDMETHODIMP
  90. // CManagedNetwork::HrInit
  91. //
  92. //--
  93. //////////////////////////////////////////////////////////////////////////////
  94. STDMETHODIMP
  95. CManagedNetwork::HrInit( void )
  96. {
  97. TraceFunc( "" );
  98. HRESULT hr = S_OK;
  99. // IUnknown stuff
  100. Assert( m_cRef == 1 );
  101. // Async/IClusCfgNetworkInfo
  102. Assert( m_bstrUID == NULL );
  103. Assert( m_bstrName == NULL );
  104. Assert( m_fHasNameChanged == FALSE );
  105. Assert( m_bstrDescription == NULL );
  106. Assert( m_fHasDescriptionChanged == FALSE );
  107. Assert( m_fIsPublic == FALSE );
  108. Assert( m_fIsPrivate == FALSE );
  109. Assert( m_punkPrimaryAddress == NULL );
  110. // IExtendObjectManager
  111. HRETURN( hr );
  112. } //*** CManagedNetwork::HrInit
  113. //////////////////////////////////////////////////////////////////////////////
  114. //++
  115. //
  116. // CManagedNetwork::~CManagedNetwork
  117. //
  118. //--
  119. //////////////////////////////////////////////////////////////////////////////
  120. CManagedNetwork::~CManagedNetwork( void )
  121. {
  122. TraceFunc( "" );
  123. if ( m_ppunkIPs != NULL )
  124. {
  125. while ( m_cCurrentIPs != 0 )
  126. {
  127. m_cCurrentIPs --;
  128. Assert( m_ppunkIPs[ m_cCurrentIPs ] != NULL );
  129. if ( m_ppunkIPs[ m_cCurrentIPs ] != NULL )
  130. {
  131. m_ppunkIPs[ m_cCurrentIPs ]->Release();
  132. }
  133. }
  134. TraceFree( m_ppunkIPs );
  135. }
  136. if ( m_punkPrimaryAddress != NULL )
  137. {
  138. m_punkPrimaryAddress->Release();
  139. } // if:
  140. TraceSysFreeString( m_bstrUID );
  141. TraceSysFreeString( m_bstrName );
  142. TraceSysFreeString( m_bstrDescription );
  143. InterlockedDecrement( &g_cObjects );
  144. TraceFuncExit();
  145. } //*** CManagedNetwork::~CManagedNetwork
  146. // ************************************************************************
  147. //
  148. // IUnknown
  149. //
  150. // ************************************************************************
  151. //////////////////////////////////////////////////////////////////////////////
  152. //++
  153. //
  154. // CManagedNetwork::QueryInterface
  155. //
  156. // Description:
  157. // Query this object for the passed in interface.
  158. //
  159. // Arguments:
  160. // riidIn
  161. // Id of interface requested.
  162. //
  163. // ppvOut
  164. // Pointer to the requested interface.
  165. //
  166. // Return Value:
  167. // S_OK
  168. // If the interface is available on this object.
  169. //
  170. // E_NOINTERFACE
  171. // If the interface is not available.
  172. //
  173. // E_POINTER
  174. // ppvOut was NULL.
  175. //
  176. // Remarks:
  177. // None.
  178. //
  179. //--
  180. //////////////////////////////////////////////////////////////////////////////
  181. STDMETHODIMP
  182. CManagedNetwork::QueryInterface(
  183. REFIID riidIn,
  184. LPVOID * ppvOut
  185. )
  186. {
  187. TraceQIFunc( riidIn, ppvOut );
  188. HRESULT hr = S_OK;
  189. //
  190. // Validate arguments.
  191. //
  192. Assert( ppvOut != NULL );
  193. if ( ppvOut == NULL )
  194. {
  195. hr = THR( E_POINTER );
  196. goto Cleanup;
  197. }
  198. //
  199. // Handle known interfaces.
  200. //
  201. if ( IsEqualIID( riidIn, IID_IUnknown ) )
  202. {
  203. *ppvOut = static_cast< IClusCfgNetworkInfo * >( this );
  204. } // if: IUnknown
  205. else if ( IsEqualIID( riidIn, IID_IClusCfgNetworkInfo ) )
  206. {
  207. *ppvOut = TraceInterface( __THISCLASS__, IClusCfgNetworkInfo, this, 0 );
  208. } // else if: IClusCfgNetworkInfo
  209. else if ( IsEqualIID( riidIn, IID_IGatherData ) )
  210. {
  211. *ppvOut = TraceInterface( __THISCLASS__, IGatherData, this, 0 );
  212. } // else if: IGatherData
  213. else if ( IsEqualIID( riidIn, IID_IExtendObjectManager ) )
  214. {
  215. *ppvOut = TraceInterface( __THISCLASS__, IExtendObjectManager, this, 0 );
  216. } // else if: IExtendObjectManager
  217. else if ( IsEqualIID( riidIn, IID_IEnumClusCfgIPAddresses ) )
  218. {
  219. *ppvOut = TraceInterface( __THISCLASS__, IEnumClusCfgIPAddresses, this, 0 );
  220. } // else if: IEnumClusCfgIPAddresses
  221. else
  222. {
  223. *ppvOut = NULL;
  224. hr = E_NOINTERFACE;
  225. }
  226. //
  227. // Add a reference to the interface if successful.
  228. //
  229. if ( SUCCEEDED( hr ) )
  230. {
  231. ((IUnknown *) *ppvOut)->AddRef();
  232. } // if: success
  233. Cleanup:
  234. QIRETURN_IGNORESTDMARSHALLING( hr, riidIn );
  235. } //*** CManagedNetwork::QueryInterface
  236. //////////////////////////////////////////////////////////////////////////////
  237. //++
  238. //
  239. // STDMETHODIMP_( ULONG )
  240. // CManagedNetwork::AddRef
  241. //
  242. //--
  243. //////////////////////////////////////////////////////////////////////////////
  244. STDMETHODIMP_( ULONG )
  245. CManagedNetwork::AddRef( void )
  246. {
  247. TraceFunc( "[IUnknown]" );
  248. InterlockedIncrement( &m_cRef );
  249. CRETURN( m_cRef );
  250. } //*** CManagedNetwork::AddRef
  251. //////////////////////////////////////////////////////////////////////////////
  252. //++
  253. //
  254. // STDMETHODIMP_( ULONG )
  255. // CManagedNetwork::Release
  256. //
  257. //--
  258. //////////////////////////////////////////////////////////////////////////////
  259. STDMETHODIMP_( ULONG )
  260. CManagedNetwork::Release( void )
  261. {
  262. TraceFunc( "[IUnknown]" );
  263. LONG cRef;
  264. cRef = InterlockedDecrement( &m_cRef );
  265. if ( cRef == 0 )
  266. {
  267. TraceDo( delete this );
  268. }
  269. CRETURN( cRef );
  270. } //*** CManagedNetwork::Release
  271. // ************************************************************************
  272. //
  273. // IClusCfgNetworkInfo
  274. //
  275. // ************************************************************************
  276. ///////////////////////////////////////////////////////////////////////////////
  277. //++
  278. //
  279. // STDMETHODIMP
  280. // CManagedNetwork::GetUID(
  281. // BSTR * pbstrUIDOut
  282. // )
  283. //
  284. //--
  285. ///////////////////////////////////////////////////////////////////////////////
  286. STDMETHODIMP
  287. CManagedNetwork::GetUID(
  288. BSTR * pbstrUIDOut
  289. )
  290. {
  291. TraceFunc( "[IClusCfgNetworkInfo]" );
  292. HRESULT hr = S_OK;
  293. if ( pbstrUIDOut == NULL )
  294. {
  295. hr = THR( E_POINTER );
  296. goto Cleanup;
  297. }
  298. if ( m_bstrUID == NULL )
  299. {
  300. hr = THR( E_POINTER );
  301. goto Cleanup;
  302. }
  303. *pbstrUIDOut = SysAllocString( m_bstrUID );
  304. if ( *pbstrUIDOut == NULL )
  305. {
  306. hr = THR( E_OUTOFMEMORY );
  307. goto Cleanup;
  308. }
  309. Cleanup:
  310. HRETURN( hr );
  311. } //*** CManagedNetwork::GetUID
  312. ///////////////////////////////////////////////////////////////////////////////
  313. //++
  314. //
  315. // STDMETHODIMP
  316. // CManagedNetwork::GetName(
  317. // BSTR * pbstrNameOut
  318. // )
  319. //
  320. //--
  321. ///////////////////////////////////////////////////////////////////////////////
  322. STDMETHODIMP
  323. CManagedNetwork::GetName(
  324. BSTR * pbstrNameOut
  325. )
  326. {
  327. TraceFunc( "[IClusCfgNetworkInfo]" );
  328. HRESULT hr = S_OK;
  329. if ( pbstrNameOut == NULL )
  330. {
  331. hr = THR( E_POINTER );
  332. goto Cleanup;
  333. }
  334. if ( m_bstrName == NULL )
  335. {
  336. hr = THR( E_POINTER );
  337. goto Cleanup;
  338. }
  339. *pbstrNameOut = SysAllocString( m_bstrName );
  340. if ( *pbstrNameOut == NULL )
  341. {
  342. hr = THR( E_OUTOFMEMORY );
  343. goto Cleanup;
  344. }
  345. Cleanup:
  346. HRETURN( hr );
  347. } //*** CManagedNetwork::GetName
  348. ///////////////////////////////////////////////////////////////////////////////
  349. //++
  350. //
  351. // STDMETHODIMP
  352. // CManagedNetwork::SetName(
  353. // LPCWSTR pcszNameIn
  354. // )
  355. //
  356. //--
  357. ///////////////////////////////////////////////////////////////////////////////
  358. STDMETHODIMP
  359. CManagedNetwork::SetName(
  360. LPCWSTR pcszNameIn
  361. )
  362. {
  363. TraceFunc1( "[IClusCfgNetworkInfo] pcszNameIn = '%ws'", ( pcszNameIn == NULL ? L"<null>" : pcszNameIn ) );
  364. HRESULT hr = S_OK;
  365. BSTR bstrNewName;
  366. if ( pcszNameIn == NULL )
  367. {
  368. hr = THR( E_INVALIDARG );
  369. goto Cleanup;
  370. }
  371. bstrNewName = TraceSysAllocString( pcszNameIn );
  372. if ( bstrNewName == NULL )
  373. {
  374. hr = THR( E_OUTOFMEMORY );
  375. goto Cleanup;
  376. }
  377. if ( m_bstrName != NULL )
  378. {
  379. TraceSysFreeString( m_bstrName );
  380. }
  381. m_bstrName = bstrNewName;
  382. m_fHasNameChanged = TRUE;
  383. Cleanup:
  384. HRETURN( hr );
  385. } //*** CManagedNetwork::SetName
  386. //////////////////////////////////////////////////////////////////////////////
  387. //++
  388. //
  389. // STDMETHODIMP
  390. // CManagedNetwork::GetDescription(
  391. // BSTR * pbstrDescriptionOut
  392. // )
  393. //
  394. //--
  395. //////////////////////////////////////////////////////////////////////////////
  396. STDMETHODIMP
  397. CManagedNetwork::GetDescription(
  398. BSTR * pbstrDescriptionOut
  399. )
  400. {
  401. TraceFunc( "[IClusCfgNetworkInfo]" );
  402. HRESULT hr;
  403. if ( pbstrDescriptionOut == NULL )
  404. {
  405. hr = THR( E_POINTER );
  406. goto Cleanup;
  407. }
  408. if ( m_bstrDescription == NULL )
  409. {
  410. hr = THR( E_POINTER );
  411. goto Cleanup;
  412. }
  413. *pbstrDescriptionOut = SysAllocString( m_bstrDescription );
  414. if ( *pbstrDescriptionOut == NULL )
  415. {
  416. hr = THR( E_OUTOFMEMORY );
  417. goto Cleanup;
  418. }
  419. hr = S_OK;
  420. Cleanup:
  421. HRETURN( hr );
  422. } //*** CManagedNetwork::GetDescription
  423. //////////////////////////////////////////////////////////////////////////////
  424. //++
  425. //
  426. // STDMETHODIMP
  427. // CManagedNetwork::SetDescription(
  428. // LPCWSTR pcszDescriptionIn
  429. // )
  430. //
  431. //--
  432. //////////////////////////////////////////////////////////////////////////////
  433. STDMETHODIMP
  434. CManagedNetwork::SetDescription(
  435. LPCWSTR pcszDescriptionIn
  436. )
  437. {
  438. TraceFunc1( "[IClusCfgNetworkInfo] pcszNameIn = '%ws'", ( pcszDescriptionIn == NULL ? L"<null>" : pcszDescriptionIn ) );
  439. HRESULT hr = S_OK;
  440. BSTR bstrNewDescription;
  441. if ( pcszDescriptionIn == NULL )
  442. {
  443. hr = THR( E_INVALIDARG );
  444. goto Cleanup;
  445. }
  446. bstrNewDescription = TraceSysAllocString( pcszDescriptionIn );
  447. if ( bstrNewDescription == NULL )
  448. {
  449. hr = THR( E_OUTOFMEMORY );
  450. goto Cleanup;
  451. }
  452. if ( m_bstrDescription != NULL )
  453. {
  454. TraceSysFreeString( m_bstrDescription );
  455. }
  456. m_bstrDescription = bstrNewDescription;
  457. m_fHasDescriptionChanged = TRUE;
  458. Cleanup:
  459. HRETURN( hr );
  460. } //*** CManagedNetwork::SetDescription
  461. //////////////////////////////////////////////////////////////////////////////
  462. //++
  463. //
  464. // STDMETHODIMP
  465. // CClusCfgNetworkInfo::GetPrimaryNetworkAddress
  466. //
  467. //--
  468. //////////////////////////////////////////////////////////////////////////////
  469. STDMETHODIMP
  470. CManagedNetwork::GetPrimaryNetworkAddress(
  471. IClusCfgIPAddressInfo ** ppIPAddressOut
  472. )
  473. {
  474. TraceFunc( "[IClusCfgNetworkInfo]" );
  475. Assert( m_punkPrimaryAddress != NULL );
  476. HRESULT hr;
  477. if ( ppIPAddressOut == NULL )
  478. {
  479. hr = THR( E_POINTER );
  480. } // if:
  481. else
  482. {
  483. hr = THR( m_punkPrimaryAddress->TypeSafeQI( IClusCfgIPAddressInfo, ppIPAddressOut ) );
  484. } // else:
  485. HRETURN( hr );
  486. } //*** CManagedNetwork::GetPrimaryNetworkAddress
  487. //////////////////////////////////////////////////////////////////////////////
  488. //++
  489. //
  490. // STDMETHODIMP
  491. // CClusCfgNetworkInfo::SetPrimaryNetworkAddress
  492. //
  493. //--
  494. //////////////////////////////////////////////////////////////////////////////
  495. STDMETHODIMP
  496. CManagedNetwork::SetPrimaryNetworkAddress(
  497. IClusCfgIPAddressInfo * pIPAddressIn
  498. )
  499. {
  500. TraceFunc( "[IClusCfgNetworkInfo]" );
  501. HRESULT hr = THR( E_NOTIMPL );
  502. HRETURN( hr );
  503. } //*** CManagedNetwork::SetPrimaryNetworkAddress
  504. //////////////////////////////////////////////////////////////////////////////
  505. //++
  506. //
  507. // STDMETHODIMP
  508. // CManagedNetwork::IsPublic
  509. //
  510. //--
  511. //////////////////////////////////////////////////////////////////////////////
  512. STDMETHODIMP
  513. CManagedNetwork::IsPublic( void )
  514. {
  515. TraceFunc( "[IClusCfgNetworkInfo]" );
  516. HRESULT hr;
  517. if ( m_fIsPublic )
  518. {
  519. hr = S_OK;
  520. }
  521. else
  522. {
  523. hr = S_FALSE;
  524. }
  525. HRETURN( hr );
  526. } //*** CManagedNetwork::IsPublic
  527. //////////////////////////////////////////////////////////////////////////////
  528. //++
  529. //
  530. // STDMETHODIMP
  531. // CManagedNetwork::SetPublic(
  532. // BOOL fIsPublicIn
  533. // )
  534. //
  535. //--
  536. //////////////////////////////////////////////////////////////////////////////
  537. STDMETHODIMP
  538. CManagedNetwork::SetPublic(
  539. BOOL fIsPublicIn
  540. )
  541. {
  542. TraceFunc1( "[IClusCfgNetworkInfo] fIsPublic = %s", BOOLTOSTRING( fIsPublicIn ) );
  543. HRESULT hr = S_OK;
  544. m_fIsPublic = fIsPublicIn;
  545. HRETURN( hr );
  546. } //*** CManagedNetwork::SetPublic
  547. //////////////////////////////////////////////////////////////////////////////
  548. //++
  549. //
  550. // STDMETHODIMP
  551. // CManagedNetwork::IsPrivate
  552. //
  553. //--
  554. //////////////////////////////////////////////////////////////////////////////
  555. STDMETHODIMP
  556. CManagedNetwork::IsPrivate( void )
  557. {
  558. TraceFunc( "[IClusCfgNetworkInfo]" );
  559. HRESULT hr;
  560. if ( m_fIsPrivate )
  561. {
  562. hr = S_OK;
  563. }
  564. else
  565. {
  566. hr = S_FALSE;
  567. }
  568. HRETURN( hr );
  569. } //*** CManagedNetwork::IsPrivate
  570. //////////////////////////////////////////////////////////////////////////////
  571. //++
  572. //
  573. // STDMETHODIMP
  574. // CManagedNetwork::SetPrivate(
  575. // BOOL fIsPrivateIn
  576. // )
  577. //
  578. //--
  579. //////////////////////////////////////////////////////////////////////////////
  580. STDMETHODIMP
  581. CManagedNetwork::SetPrivate(
  582. BOOL fIsPrivateIn
  583. )
  584. {
  585. TraceFunc1( "[IClusCfgNetworkInfo] fIsPrivate = %s", BOOLTOSTRING( fIsPrivateIn ) );
  586. HRESULT hr = S_OK;
  587. m_fIsPrivate = fIsPrivateIn;
  588. HRETURN( hr );
  589. } //*** CManagedNetwork::SetPrivate
  590. //****************************************************************************
  591. //
  592. // IGatherData
  593. //
  594. //****************************************************************************
  595. //////////////////////////////////////////////////////////////////////////////
  596. //++
  597. //
  598. // STDMETHODIMP
  599. // CManagedNetwork::Gather(
  600. // OBJECTCOOKIE cookieParentIn,
  601. // IUnknown * punkIn
  602. // )
  603. //
  604. //--
  605. //////////////////////////////////////////////////////////////////////////////
  606. STDMETHODIMP
  607. CManagedNetwork::Gather(
  608. OBJECTCOOKIE cookieParentIn,
  609. IUnknown * punkIn
  610. )
  611. {
  612. TraceFunc( "[IGatherData]" );
  613. HRESULT hr;
  614. IUnknown * punk = NULL;
  615. IClusCfgNetworkInfo * pccni = NULL;
  616. IEnumClusCfgIPAddresses * peccia = NULL;
  617. IObjectManager * pom = NULL;
  618. OBJECTCOOKIE cookie;
  619. IServiceProvider * psp = NULL;
  620. IGatherData * pgd = NULL;
  621. IClusCfgIPAddressInfo * piccipai = NULL;
  622. //
  623. // Make sure we don't "gather" the same object twice.
  624. //
  625. if ( m_fGathered )
  626. {
  627. hr = THR( E_UNEXPECTED );
  628. goto Cleanup; // don't cleanup the object.
  629. }
  630. //
  631. // Check parameters.
  632. //
  633. if ( punkIn == NULL )
  634. {
  635. hr = THR( E_INVALIDARG );
  636. goto Cleanup;
  637. }
  638. //
  639. // Gather the information.
  640. //
  641. hr = THR( punkIn->TypeSafeQI( IClusCfgNetworkInfo, &pccni ) );
  642. if ( FAILED( hr ) )
  643. {
  644. goto Cleanup;
  645. }
  646. //
  647. // Gather UID
  648. //
  649. hr = THR( pccni->GetUID( &m_bstrUID ) );
  650. if ( FAILED( hr ) )
  651. {
  652. goto Error;
  653. }
  654. TraceMemoryAddBSTR( m_bstrUID );
  655. //
  656. // Gather Name
  657. //
  658. hr = THR( pccni->GetName( &m_bstrName ) );
  659. if ( FAILED( hr ) )
  660. {
  661. goto Error;
  662. }
  663. TraceMemoryAddBSTR( m_bstrName );
  664. //
  665. // Gather Description
  666. //
  667. hr = THR( pccni->GetDescription( &m_bstrDescription ) );
  668. if ( FAILED( hr ) )
  669. {
  670. goto Error;
  671. }
  672. TraceMemoryAddBSTR( m_bstrDescription );
  673. //
  674. // Gather IsPrivate
  675. //
  676. hr = STHR( pccni->IsPrivate() );
  677. if ( FAILED( hr ) )
  678. {
  679. goto Error;
  680. }
  681. if ( hr == S_OK )
  682. {
  683. m_fIsPrivate = TRUE;
  684. }
  685. else
  686. {
  687. m_fIsPrivate = FALSE;
  688. }
  689. //
  690. // Gather IsPublic
  691. //
  692. hr = STHR( pccni->IsPublic() );
  693. if ( FAILED( hr ) )
  694. {
  695. goto Error;
  696. }
  697. if ( hr == S_OK )
  698. {
  699. m_fIsPublic = TRUE;
  700. }
  701. else
  702. {
  703. m_fIsPublic = FALSE;
  704. }
  705. //
  706. //
  707. // If the parent cookie is ZERO, then we don't grab the secondary IP
  708. // address information.
  709. //
  710. if ( cookieParentIn != 0 )
  711. {
  712. // Gather the IP Addresses
  713. //
  714. hr = THR( punkIn->TypeSafeQI( IEnumClusCfgIPAddresses, &peccia ) );
  715. if ( FAILED( hr ) )
  716. {
  717. goto Cleanup;
  718. }
  719. //
  720. // Gather the object manager.
  721. //
  722. hr = THR( CoCreateInstance( CLSID_ServiceManager,
  723. NULL,
  724. CLSCTX_INPROC_SERVER,
  725. TypeSafeParams( IServiceProvider, &psp )
  726. ) );
  727. if ( FAILED( hr ) )
  728. {
  729. goto Cleanup;
  730. }
  731. hr = THR( psp->TypeSafeQS( CLSID_ObjectManager,
  732. IObjectManager,
  733. &pom
  734. ) );
  735. psp->Release(); // release promptly
  736. if ( FAILED( hr ) )
  737. {
  738. goto Cleanup;
  739. }
  740. hr = THR( pom->FindObject( CLSID_NetworkType,
  741. cookieParentIn,
  742. m_bstrUID,
  743. IID_NULL,
  744. &cookie,
  745. &punk // dummy
  746. ) );
  747. Assert( punk == NULL );
  748. if ( FAILED( hr ) )
  749. {
  750. goto Cleanup;
  751. }
  752. hr = THR( EnumChildrenAndTransferInformation( cookie, peccia ) );
  753. if ( FAILED( hr ) )
  754. {
  755. goto Cleanup;
  756. }
  757. }
  758. //
  759. // Gather Primary Network Address
  760. //
  761. hr = THR( pccni->GetPrimaryNetworkAddress( &piccipai ) );
  762. if ( FAILED( hr ) )
  763. {
  764. goto Cleanup;
  765. }
  766. hr = THR( CIPAddressInfo::S_HrCreateInstance( &m_punkPrimaryAddress ) );
  767. if ( FAILED( hr ) )
  768. {
  769. goto Cleanup;
  770. }
  771. hr = THR( m_punkPrimaryAddress->TypeSafeQI( IGatherData, &pgd ) );
  772. if ( FAILED( hr ) )
  773. {
  774. goto Cleanup;
  775. }
  776. hr = THR( pgd->Gather( cookieParentIn, piccipai ) );
  777. if ( FAILED( hr ) )
  778. {
  779. goto Cleanup;
  780. }
  781. //
  782. // Anything else to gather??
  783. //
  784. hr = S_OK;
  785. m_fGathered = TRUE;
  786. Cleanup:
  787. if ( pgd != NULL )
  788. {
  789. pgd->Release();
  790. } // if:
  791. if ( piccipai != NULL )
  792. {
  793. piccipai->Release();
  794. } // if:
  795. if ( pom != NULL )
  796. {
  797. pom->Release();
  798. }
  799. if ( peccia != NULL )
  800. {
  801. peccia->Release();
  802. } // if:
  803. if ( pccni != NULL )
  804. {
  805. pccni->Release();
  806. }
  807. HRETURN( hr );
  808. Error:
  809. //
  810. // On error, invalidate all data.
  811. //
  812. if ( m_bstrUID != NULL )
  813. {
  814. TraceSysFreeString( m_bstrUID );
  815. m_bstrUID = NULL;
  816. }
  817. if ( m_bstrName != NULL )
  818. {
  819. TraceSysFreeString( m_bstrName );
  820. m_bstrName = NULL;
  821. }
  822. if ( m_bstrDescription != NULL )
  823. {
  824. TraceSysFreeString( m_bstrDescription );
  825. m_bstrDescription = NULL;
  826. }
  827. m_fIsPrivate = FALSE;
  828. m_fIsPublic = FALSE;
  829. goto Cleanup;
  830. } //*** CManagedNetwork::Gather
  831. // ************************************************************************
  832. //
  833. // IExtendObjectManager
  834. //
  835. // ************************************************************************
  836. //////////////////////////////////////////////////////////////////////////////
  837. //++
  838. //
  839. // STDMETHODIMP
  840. // CManagedNetwork::FindObject(
  841. // OBJECTCOOKIE cookieIn
  842. // , REFCLSID rclsidTypeIn
  843. // , LPCWSTR pcszNameIn
  844. // , LPUNKNOWN * punkOut
  845. // )
  846. //
  847. //--
  848. //////////////////////////////////////////////////////////////////////////////
  849. STDMETHODIMP
  850. CManagedNetwork::FindObject(
  851. OBJECTCOOKIE cookieIn
  852. , REFCLSID rclsidTypeIn
  853. , LPCWSTR pcszNameIn
  854. , LPUNKNOWN * ppunkOut
  855. )
  856. {
  857. TraceFunc( "[IExtendObjectManager]" );
  858. HRESULT hr = S_OK;
  859. //
  860. // Check parameters.
  861. //
  862. // We need a cookie.
  863. if ( cookieIn == NULL )
  864. {
  865. hr = THR( E_INVALIDARG );
  866. goto Cleanup;
  867. }
  868. // We need to be representing a NetworkType
  869. if ( !IsEqualIID( rclsidTypeIn, CLSID_NetworkType ) )
  870. {
  871. hr = THR( E_INVALIDARG );
  872. goto Cleanup;
  873. }
  874. // We need to have a name.
  875. if ( pcszNameIn == NULL )
  876. {
  877. hr = THR( E_INVALIDARG );
  878. goto Cleanup;
  879. }
  880. hr = THR( QueryInterface( DFGUID_NetworkResource,
  881. reinterpret_cast< void ** >( ppunkOut )
  882. ) );
  883. if ( FAILED( hr ) )
  884. {
  885. goto Cleanup;
  886. }
  887. hr = S_OK;
  888. Cleanup:
  889. HRETURN( hr );
  890. } //*** CManagedNetwork::FindObject
  891. // ************************************************************************
  892. //
  893. // Private methods.
  894. //
  895. // ************************************************************************
  896. //////////////////////////////////////////////////////////////////////////////
  897. //++
  898. //
  899. // STDMETHODIMP
  900. // CManagedNetwork::EnumChildrenAndTransferInformation(
  901. // IEnumClusCfgIPAddresses * pecciaIn
  902. // )
  903. //
  904. //--
  905. //////////////////////////////////////////////////////////////////////////////
  906. STDMETHODIMP
  907. CManagedNetwork::EnumChildrenAndTransferInformation(
  908. OBJECTCOOKIE cookieIn,
  909. IEnumClusCfgIPAddresses * pecciaIn
  910. )
  911. {
  912. TraceFunc( "" );
  913. HRESULT hr = S_OK;
  914. IClusCfgIPAddressInfo * pccipai = NULL;
  915. ULONG cFetched;
  916. IGatherData * pgd = NULL;
  917. IUnknown * punk = NULL;
  918. DWORD cIPs = 0;
  919. Assert( m_ppunkIPs == NULL );
  920. Assert( m_cCurrentIPs == 0 );
  921. Assert( m_cAllocedIPs == 0 );
  922. hr = THR( pecciaIn->Count( &cIPs ) );
  923. if ( FAILED( hr ) )
  924. {
  925. goto Cleanup;
  926. }
  927. if ( cIPs > 0 )
  928. {
  929. m_ppunkIPs = (IUnknown **) TraceAlloc( HEAP_ZERO_MEMORY, cIPs * sizeof(IUnknown *) );
  930. if ( m_ppunkIPs == NULL )
  931. {
  932. hr = THR( E_OUTOFMEMORY );
  933. goto Cleanup;
  934. }
  935. }
  936. m_cAllocedIPs = cIPs;
  937. for ( m_cCurrentIPs = 0 ; m_cCurrentIPs < m_cAllocedIPs ; m_cCurrentIPs += 1 )
  938. {
  939. //
  940. // Grab the next address.
  941. //
  942. hr = STHR( pecciaIn->Next( 1, &pccipai, &cFetched ) );
  943. if ( FAILED( hr ) )
  944. {
  945. goto Cleanup;
  946. }
  947. if ( hr == S_FALSE )
  948. {
  949. break; // exit condition
  950. }
  951. Assert( cFetched == 1 );
  952. //
  953. // Create a new IP Address object.
  954. //
  955. hr = THR( CIPAddressInfo::S_HrCreateInstance( &punk ) );
  956. if ( FAILED( hr ) )
  957. {
  958. goto Cleanup;
  959. }
  960. //
  961. // Retrieve the information.
  962. //
  963. hr = THR( punk->TypeSafeQI( IGatherData, &pgd ) );
  964. if ( FAILED( hr ) )
  965. {
  966. goto Cleanup;
  967. }
  968. hr = THR( pgd->Gather( cookieIn, pccipai ) );
  969. if ( FAILED( hr ) )
  970. {
  971. goto Cleanup;
  972. }
  973. //
  974. // Place it in the array.
  975. //
  976. m_ppunkIPs[ m_cCurrentIPs ] = punk;
  977. punk = NULL; // not released because it's now in the m_ppunkIPs array
  978. //
  979. // Release temporary objects.
  980. //
  981. pgd->Release();
  982. pgd = NULL;
  983. pccipai->Release();
  984. pccipai = NULL;
  985. } // for:
  986. m_cIter = 0;
  987. hr = S_OK;
  988. Cleanup:
  989. if ( punk != NULL )
  990. {
  991. punk->Release();
  992. } // if:
  993. if ( pgd != NULL )
  994. {
  995. pgd->Release();
  996. } // if:
  997. if ( pccipai != NULL )
  998. {
  999. pccipai->Release();
  1000. }
  1001. HRETURN( hr );
  1002. } //*** CManagedNetwork::EnumChildrenAndTransferInformation
  1003. //****************************************************************************
  1004. //
  1005. // IEnumClusCfgIPAddresses
  1006. //
  1007. //****************************************************************************
  1008. //////////////////////////////////////////////////////////////////////////////
  1009. //++
  1010. //
  1011. // STDMETHODIMP
  1012. // CManagedNetwork::Next(
  1013. // ULONG celt,
  1014. // IClusCfgIPAddressInfo ** rgOut,
  1015. // ULONG * pceltFetchedOut
  1016. // )
  1017. //
  1018. //////////////////////////////////////////////////////////////////////////////
  1019. STDMETHODIMP
  1020. CManagedNetwork::Next(
  1021. ULONG celt,
  1022. IClusCfgIPAddressInfo ** rgOut,
  1023. ULONG * pceltFetchedOut
  1024. )
  1025. {
  1026. TraceFunc( "[IEnumClusCfgIPAddresses]" );
  1027. ULONG celtFetched;
  1028. HRESULT hr = S_OK;
  1029. //
  1030. // Check parameters
  1031. //
  1032. if ( rgOut == NULL || celt == 0 )
  1033. {
  1034. hr = THR( E_POINTER );
  1035. goto Cleanup;
  1036. }
  1037. //
  1038. // Zero the return count.
  1039. //
  1040. if ( pceltFetchedOut != NULL )
  1041. {
  1042. *pceltFetchedOut = 0;
  1043. }
  1044. //
  1045. // Clear the buffer
  1046. //
  1047. ZeroMemory( rgOut, celt * sizeof(rgOut[0]) );
  1048. //
  1049. // Loop thru copying the interfaces.
  1050. //
  1051. for( celtFetched = 0
  1052. ; celtFetched + m_cIter < m_cCurrentIPs && celtFetched < celt
  1053. ; celtFetched ++
  1054. )
  1055. {
  1056. hr = THR( m_ppunkIPs[ m_cIter + celtFetched ]->TypeSafeQI( IClusCfgIPAddressInfo, &rgOut[ celtFetched ] ) );
  1057. if ( FAILED( hr ) )
  1058. {
  1059. goto CleanupList;
  1060. }
  1061. } // for: celtFetched
  1062. if ( pceltFetchedOut != NULL )
  1063. {
  1064. *pceltFetchedOut = celtFetched;
  1065. }
  1066. m_cIter += celtFetched;
  1067. if ( celtFetched != celt )
  1068. {
  1069. hr = S_FALSE;
  1070. }
  1071. else
  1072. {
  1073. hr = S_OK;
  1074. }
  1075. Cleanup:
  1076. HRETURN( hr );
  1077. CleanupList:
  1078. for ( ; celtFetched != 0 ; )
  1079. {
  1080. celtFetched --;
  1081. rgOut[ celtFetched ]->Release();
  1082. rgOut[ celtFetched ] = NULL;
  1083. }
  1084. goto Cleanup;
  1085. } //*** CManagedNetwork::Next
  1086. //////////////////////////////////////////////////////////////////////////////
  1087. //++
  1088. //
  1089. // STDMETHODIMP
  1090. // CManagedNetwork::Skip(
  1091. // ULONG cNumberToSkipIn
  1092. // )
  1093. //
  1094. //--
  1095. //////////////////////////////////////////////////////////////////////////////
  1096. STDMETHODIMP
  1097. CManagedNetwork::Skip(
  1098. ULONG cNumberToSkipIn
  1099. )
  1100. {
  1101. TraceFunc( "[IEnumClusCfgIPAddresses]" );
  1102. HRESULT hr = S_OK;
  1103. m_cIter += cNumberToSkipIn;
  1104. if ( m_cIter >= m_cCurrentIPs )
  1105. {
  1106. m_cIter = m_cCurrentIPs;
  1107. hr = S_FALSE;
  1108. }
  1109. HRETURN( hr );
  1110. } //*** CManagedNetwork::Skip
  1111. //////////////////////////////////////////////////////////////////////////////
  1112. //++
  1113. //
  1114. // STDMETHODIMP
  1115. // CManagedNetwork::Reset( void )
  1116. //
  1117. //--
  1118. //////////////////////////////////////////////////////////////////////////////
  1119. STDMETHODIMP
  1120. CManagedNetwork::Reset( void )
  1121. {
  1122. TraceFunc( "[IEnumClusCfgIPAddresses]" );
  1123. HRESULT hr = S_OK;
  1124. m_cIter = 0;
  1125. HRETURN( hr );
  1126. } //*** CManagedNetwork::Reset
  1127. //////////////////////////////////////////////////////////////////////////////
  1128. //++
  1129. //
  1130. // STDMETHODIMP
  1131. // CManagedNetwork::Clone(
  1132. // IEnumClusCfgIPAddresses ** ppEnumClusCfgIPAddressesOut
  1133. // )
  1134. //
  1135. //--
  1136. //////////////////////////////////////////////////////////////////////////////
  1137. STDMETHODIMP
  1138. CManagedNetwork::Clone(
  1139. IEnumClusCfgIPAddresses ** ppEnumClusCfgIPAddressesOut
  1140. )
  1141. {
  1142. TraceFunc( "[IEnumClusCfgIPAddresses]" );
  1143. //
  1144. // KB: GPease 31-JUL-2000
  1145. // Not going to implement this.
  1146. //
  1147. HRESULT hr = THR( E_NOTIMPL );
  1148. HRETURN( hr );
  1149. } //*** CManagedNetwork::Clone
  1150. //////////////////////////////////////////////////////////////////////////////
  1151. //
  1152. // STDMETHODIMP
  1153. // CManagedNetwork::Count(
  1154. // DWORD * pnCountOut
  1155. // )
  1156. //
  1157. //////////////////////////////////////////////////////////////////////////////
  1158. STDMETHODIMP
  1159. CManagedNetwork::Count(
  1160. DWORD * pnCountOut
  1161. )
  1162. {
  1163. TraceFunc( "[IEnumClusCfgIPAddresses]" );
  1164. HRESULT hr = S_OK;
  1165. if ( pnCountOut == NULL )
  1166. {
  1167. hr = THR( E_POINTER );
  1168. goto Cleanup;
  1169. }
  1170. *pnCountOut = m_cCurrentIPs;
  1171. Cleanup:
  1172. HRETURN( hr );
  1173. } //*** CManagedNetwork::Count