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.

856 lines
17 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2001 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // CIPAddressInfo.cpp
  7. //
  8. // Description:
  9. // This file contains the definition of the CIPAddressInfo
  10. // class.
  11. //
  12. // Maintained By:
  13. // Galen Barbee (GalenB) 23-MAR-2000
  14. //
  15. //////////////////////////////////////////////////////////////////////////////
  16. //////////////////////////////////////////////////////////////////////////////
  17. // Include Files
  18. //////////////////////////////////////////////////////////////////////////////
  19. #include "Pch.h"
  20. #include "IPAddressInfo.h"
  21. #include <ClusRtl.h>
  22. //////////////////////////////////////////////////////////////////////////////
  23. // Constant Definitions
  24. //////////////////////////////////////////////////////////////////////////////
  25. DEFINE_THISCLASS( "CIPAddressInfo" );
  26. /////////////////////////////////////////////////////////////////////////////
  27. // CIPAddressInfo class
  28. /////////////////////////////////////////////////////////////////////////////
  29. //////////////////////////////////////////////////////////////////////////////
  30. //++
  31. //
  32. // CIPAddressInfo::S_HrCreateInstance
  33. //
  34. // Description:
  35. // Create a CIPAddressInfo instance.
  36. //
  37. // Arguments:
  38. // ppunkOut
  39. //
  40. // Return Values:
  41. // S_OK
  42. // E_POINTER
  43. // E_OUTOFMEMORY
  44. //
  45. //--
  46. //////////////////////////////////////////////////////////////////////////////
  47. HRESULT
  48. CIPAddressInfo::S_HrCreateInstance( IUnknown ** ppunkOut )
  49. {
  50. TraceFunc( "" );
  51. HRESULT hr = S_OK;
  52. CIPAddressInfo * pipai = NULL;
  53. Assert( ppunkOut != NULL );
  54. if ( ppunkOut == NULL )
  55. {
  56. hr = THR( E_POINTER );
  57. goto Cleanup;
  58. } // if:
  59. pipai = new CIPAddressInfo();
  60. if ( pipai == NULL )
  61. {
  62. hr = THR( E_OUTOFMEMORY );
  63. goto Cleanup;
  64. } // if: error allocating object
  65. hr = THR( pipai->HrInit() );
  66. if ( FAILED( hr ) )
  67. {
  68. goto Cleanup;
  69. } // if: HrInit() failed
  70. hr = THR( pipai->TypeSafeQI( IUnknown, ppunkOut ) );
  71. if ( FAILED( hr ) )
  72. {
  73. goto Cleanup;
  74. }
  75. Cleanup:
  76. if ( pipai != NULL )
  77. {
  78. pipai->Release();
  79. } // if:
  80. HRETURN( hr );
  81. } //*** CIPAddressInfo::S_HrCreateInstance
  82. //////////////////////////////////////////////////////////////////////////////
  83. //++
  84. //
  85. // CIPAddressInfo::CIPAddressInfo
  86. //
  87. // Description:
  88. // Constructor of the CIPAddressInfo class. This initializes
  89. // the m_cRef variable to 1 instead of 0 to account of possible
  90. // QueryInterface failure in DllGetClassObject.
  91. //
  92. // Arguments:
  93. // None.
  94. //
  95. // Return Value:
  96. // None.
  97. //
  98. // Remarks:
  99. // None.
  100. //
  101. //--
  102. //////////////////////////////////////////////////////////////////////////////
  103. CIPAddressInfo::CIPAddressInfo( void )
  104. : m_cRef( 1 )
  105. {
  106. TraceFunc( "" );
  107. // Increment the count of components in memory so the DLL hosting this
  108. // object cannot be unloaded.
  109. InterlockedIncrement( &g_cObjects );
  110. Assert( m_ulIPAddress == 0 );
  111. Assert( m_ulIPSubnet == 0 );
  112. Assert( m_bstrUID == NULL );
  113. Assert( m_bstrName == NULL );
  114. TraceFuncExit();
  115. } //*** CIPAddressInfo::CIPAddressInfo
  116. //////////////////////////////////////////////////////////////////////////////
  117. //++
  118. //
  119. // CIPAddressInfo::~CIPAddressInfo
  120. //
  121. // Description:
  122. // Desstructor of the CIPAddressInfo class.
  123. //
  124. // Arguments:
  125. // None.
  126. //
  127. // Return Value:
  128. // None.
  129. //
  130. // Remarks:
  131. // None.
  132. //
  133. //--
  134. //////////////////////////////////////////////////////////////////////////////
  135. CIPAddressInfo::~CIPAddressInfo( void )
  136. {
  137. TraceFunc( "" );
  138. if ( m_bstrUID != NULL )
  139. {
  140. TraceSysFreeString( m_bstrUID );
  141. }
  142. if ( m_bstrName != NULL )
  143. {
  144. TraceSysFreeString( m_bstrName );
  145. }
  146. InterlockedDecrement( &g_cObjects );
  147. TraceFuncExit();
  148. } //*** CIPAddressInfo::~CIPAddressInfo
  149. //*************************************************************************//
  150. /////////////////////////////////////////////////////////////////////////////
  151. // CIPAddressInfo -- IUknkown interface.
  152. /////////////////////////////////////////////////////////////////////////////
  153. //////////////////////////////////////////////////////////////////////////////
  154. //++
  155. //
  156. // CIPAddressInfo::AddRef
  157. //
  158. // Description:
  159. // Increment the reference count of this object by one.
  160. //
  161. // Arguments:
  162. // None.
  163. //
  164. // Return Value:
  165. // The new reference count.
  166. //
  167. // Remarks:
  168. // None.
  169. //
  170. //--
  171. //////////////////////////////////////////////////////////////////////////////
  172. STDMETHODIMP_( ULONG )
  173. CIPAddressInfo::AddRef( void )
  174. {
  175. TraceFunc( "[IUnknown]" );
  176. InterlockedIncrement( & m_cRef );
  177. CRETURN( m_cRef );
  178. } //*** CIPAddressInfo::AddRef
  179. //////////////////////////////////////////////////////////////////////////////
  180. //++
  181. //
  182. // CIPAddressInfo::Release
  183. //
  184. // Description:
  185. // Decrement the reference count of this object by one.
  186. //
  187. // Arguments:
  188. // None.
  189. //
  190. // Return Value:
  191. // The new reference count.
  192. //
  193. // Remarks:
  194. // None.
  195. //
  196. //--
  197. //////////////////////////////////////////////////////////////////////////////
  198. STDMETHODIMP_( ULONG )
  199. CIPAddressInfo::Release( void )
  200. {
  201. TraceFunc( "[IUnknown]" );
  202. LONG cRef;
  203. cRef = InterlockedDecrement( &m_cRef );
  204. if ( cRef == 0 )
  205. {
  206. TraceDo( delete this );
  207. }
  208. CRETURN( cRef );
  209. } //*** CIPAddressInfo::Release
  210. //////////////////////////////////////////////////////////////////////////////
  211. //++
  212. //
  213. // CIPAddressInfo::QueryInterface
  214. //
  215. // Description:
  216. // Query this object for the passed in interface.
  217. //
  218. // Arguments:
  219. // riidIn
  220. // Id of interface requested.
  221. //
  222. // ppvOut
  223. // Pointer to the requested interface.
  224. //
  225. // Return Value:
  226. // S_OK
  227. // If the interface is available on this object.
  228. //
  229. // E_NOINTERFACE
  230. // If the interface is not available.
  231. //
  232. // E_POINTER
  233. // ppvOut was NULL.
  234. //
  235. // Remarks:
  236. // None.
  237. //
  238. //--
  239. //////////////////////////////////////////////////////////////////////////////
  240. STDMETHODIMP
  241. CIPAddressInfo::QueryInterface(
  242. REFIID riidIn
  243. , void ** ppvOut
  244. )
  245. {
  246. TraceQIFunc( riidIn, ppvOut );
  247. HRESULT hr = S_OK;
  248. //
  249. // Validate arguments.
  250. //
  251. Assert( ppvOut != NULL );
  252. if ( ppvOut == NULL )
  253. {
  254. hr = THR( E_POINTER );
  255. goto Cleanup;
  256. }
  257. //
  258. // Handle known interfaces.
  259. //
  260. if ( IsEqualIID( riidIn, IID_IUnknown ) )
  261. {
  262. *ppvOut = static_cast< IClusCfgIPAddressInfo * >( this );
  263. } // if: IUnknown
  264. else if ( IsEqualIID( riidIn, IID_IClusCfgIPAddressInfo ) )
  265. {
  266. *ppvOut = TraceInterface( __THISCLASS__, IClusCfgIPAddressInfo, this, 0 );
  267. } // else if:
  268. else if ( IsEqualIID( riidIn, IID_IGatherData ) )
  269. {
  270. *ppvOut = TraceInterface( __THISCLASS__, IGatherData, this, 0 );
  271. } // else if: IGatherData
  272. else
  273. {
  274. *ppvOut = NULL;
  275. hr = E_NOINTERFACE;
  276. } // else
  277. //
  278. // Add a reference to the interface if successful.
  279. //
  280. if ( SUCCEEDED( hr ) )
  281. {
  282. ((IUnknown *) *ppvOut)->AddRef();
  283. } // if: success
  284. Cleanup:
  285. QIRETURN_IGNORESTDMARSHALLING( hr, riidIn );
  286. } //*** CIPAddressInfo::QueryInterface
  287. //*************************************************************************//
  288. /////////////////////////////////////////////////////////////////////////////
  289. // CIPAddressInfo class -- IObjectManager interface
  290. /////////////////////////////////////////////////////////////////////////////
  291. //////////////////////////////////////////////////////////////////////////////
  292. //++
  293. //
  294. // CIPAddressInfo::FindObject
  295. //
  296. // Description:
  297. //
  298. // Arguments:
  299. //
  300. // Return Value:
  301. //
  302. //
  303. // Remarks:
  304. // None.
  305. //
  306. //--
  307. //////////////////////////////////////////////////////////////////////////////
  308. STDMETHODIMP
  309. CIPAddressInfo::FindObject(
  310. OBJECTCOOKIE cookieIn
  311. , REFCLSID rclsidTypeIn
  312. , LPCWSTR pcszNameIn
  313. , LPUNKNOWN * ppunkOut
  314. )
  315. {
  316. TraceFunc( "[IExtendObjectManager]" );
  317. HRESULT hr = S_OK;
  318. //
  319. // Check parameters.
  320. //
  321. // We need a cookie.
  322. if ( cookieIn == NULL )
  323. {
  324. hr = THR( E_INVALIDARG );
  325. goto Cleanup;
  326. }
  327. // We need to be representing a IPAddressType
  328. if ( ! IsEqualIID( rclsidTypeIn, CLSID_IPAddressType ) )
  329. {
  330. hr = THR( E_INVALIDARG );
  331. goto Cleanup;
  332. }
  333. // We need to have a name.
  334. if ( pcszNameIn == NULL )
  335. {
  336. hr = THR( E_INVALIDARG );
  337. goto Cleanup;
  338. }
  339. //
  340. // Not found, nor do we know how to make a task to find it!
  341. //
  342. hr = THR( E_NOTIMPL );
  343. Cleanup:
  344. HRETURN( hr );
  345. } //*** CIPAddressInfo::FindObject
  346. //*************************************************************************//
  347. /////////////////////////////////////////////////////////////////////////////
  348. // CIPAddressInfo class -- IGatherData interface
  349. /////////////////////////////////////////////////////////////////////////////
  350. //////////////////////////////////////////////////////////////////////////////
  351. //++
  352. //
  353. // CIPAddressInfo::Gather
  354. //
  355. // Description:
  356. //
  357. // Arguments:
  358. // None.
  359. //
  360. // Return Value:
  361. //
  362. //
  363. // Remarks:
  364. // None.
  365. //
  366. //--
  367. //////////////////////////////////////////////////////////////////////////////
  368. STDMETHODIMP
  369. CIPAddressInfo::Gather(
  370. OBJECTCOOKIE cookieParentIn,
  371. IUnknown * punkIn
  372. )
  373. {
  374. TraceFunc( "[IGatherData]" );
  375. HRESULT hr;
  376. IClusCfgIPAddressInfo * pccipai = NULL;
  377. //
  378. // Check parameters.
  379. //
  380. if ( punkIn == NULL )
  381. {
  382. hr = THR( E_INVALIDARG );
  383. goto Cleanup;
  384. } // if:
  385. //
  386. // Grab the right interface.
  387. //
  388. hr = THR( punkIn->TypeSafeQI( IClusCfgIPAddressInfo, &pccipai ) );
  389. if ( FAILED( hr ) )
  390. {
  391. goto Cleanup;
  392. }
  393. //
  394. // Transfer the information.
  395. //
  396. //
  397. // Transfer the IP Address
  398. //
  399. hr = THR( pccipai->GetIPAddress( &m_ulIPAddress ) );
  400. if ( FAILED( hr ) )
  401. {
  402. goto Error;
  403. }
  404. //
  405. // Transfer the Subnet mask
  406. //
  407. hr = THR( pccipai->GetSubnetMask( &m_ulIPSubnet ) );
  408. if ( FAILED( hr ) )
  409. {
  410. goto Error;
  411. }
  412. //
  413. // Transfer the UID
  414. //
  415. hr = THR( pccipai->GetUID( &m_bstrUID ) );
  416. if ( FAILED( hr ) )
  417. {
  418. goto Error;
  419. }
  420. TraceMemoryAddBSTR( m_bstrUID );
  421. //
  422. // Compute our name
  423. //
  424. hr = THR( LoadName() );
  425. if ( FAILED( hr ) )
  426. {
  427. goto Error;
  428. }
  429. Cleanup:
  430. if ( pccipai != NULL )
  431. {
  432. pccipai->Release();
  433. } // if:
  434. HRETURN( hr );
  435. Error:
  436. if ( m_bstrUID != NULL )
  437. {
  438. TraceSysFreeString( m_bstrUID );
  439. } // if:
  440. if ( m_bstrName != NULL )
  441. {
  442. TraceSysFreeString( m_bstrName );
  443. } // if:
  444. m_ulIPAddress = 0;
  445. m_ulIPSubnet = 0;
  446. goto Cleanup;
  447. } //*** CIPAddressInfo::Gather
  448. //*************************************************************************//
  449. /////////////////////////////////////////////////////////////////////////////
  450. // CIPAddressInfo class -- IClusCfgIPAddressInfo interface
  451. /////////////////////////////////////////////////////////////////////////////
  452. //////////////////////////////////////////////////////////////////////////////
  453. //++
  454. //
  455. // CIPAddressInfo::GetUID
  456. //
  457. // Description:
  458. //
  459. // Arguments:
  460. // None.
  461. //
  462. // Return Value:
  463. //
  464. //
  465. // Remarks:
  466. // None.
  467. //
  468. //--
  469. //////////////////////////////////////////////////////////////////////////////
  470. STDMETHODIMP
  471. CIPAddressInfo::GetUID( BSTR * pbstrUIDOut )
  472. {
  473. TraceFunc( "[IClusCfgIPAddressInfo]" );
  474. HRESULT hr = S_OK;
  475. if ( pbstrUIDOut == NULL )
  476. {
  477. hr = THR( E_POINTER );
  478. goto Cleanup;
  479. } // if:
  480. *pbstrUIDOut = SysAllocString( m_bstrUID );
  481. if ( *pbstrUIDOut == NULL )
  482. {
  483. hr = THR( E_OUTOFMEMORY );
  484. } // if:
  485. Cleanup:
  486. HRETURN( hr );
  487. } //*** CIPAddressInfo::GetUID
  488. //////////////////////////////////////////////////////////////////////////////
  489. //++
  490. //
  491. // CIPAddressInfo::GetUIDGetIPAddress
  492. //
  493. // Description:
  494. //
  495. // Arguments:
  496. // None.
  497. //
  498. // Return Value:
  499. //
  500. //
  501. // Remarks:
  502. // None.
  503. //
  504. //--
  505. //////////////////////////////////////////////////////////////////////////////
  506. STDMETHODIMP
  507. CIPAddressInfo::GetIPAddress( ULONG * pulDottedQuadOut )
  508. {
  509. TraceFunc( "[IClusCfgIPAddressInfo]" );
  510. HRESULT hr;
  511. if ( pulDottedQuadOut != NULL )
  512. {
  513. *pulDottedQuadOut = m_ulIPAddress;
  514. hr = S_OK;
  515. } // if:
  516. else
  517. {
  518. hr = THR( E_POINTER );
  519. } // else:
  520. HRETURN( hr );
  521. } //*** CIPAddressInfo::GetNetworkGetIPAddress
  522. //////////////////////////////////////////////////////////////////////////////
  523. //++
  524. //
  525. // CIPAddressInfo::SetIPAddress
  526. //
  527. // Description:
  528. //
  529. // Arguments:
  530. // None.
  531. //
  532. // Return Value:
  533. //
  534. //
  535. // Remarks:
  536. // None.
  537. //
  538. //--
  539. //////////////////////////////////////////////////////////////////////////////
  540. STDMETHODIMP
  541. CIPAddressInfo::SetIPAddress( ULONG ulDottedQuad )
  542. {
  543. TraceFunc( "[IClusCfgIPAddressInfo]" );
  544. HRESULT hr = THR( E_NOTIMPL );
  545. HRETURN( hr );
  546. } //*** CIPAddressInfo::SetIPAddress
  547. //////////////////////////////////////////////////////////////////////////////
  548. //++
  549. //
  550. // CIPAddressInfo::GetSubnetMask
  551. //
  552. // Description:
  553. //
  554. // Arguments:
  555. // None.
  556. //
  557. // Return Value:
  558. //
  559. //
  560. // Remarks:
  561. // None.
  562. //
  563. //--
  564. //////////////////////////////////////////////////////////////////////////////
  565. STDMETHODIMP
  566. CIPAddressInfo::GetSubnetMask( ULONG * pulDottedQuadOut )
  567. {
  568. TraceFunc( "[IClusCfgIPAddressInfo]" );
  569. HRESULT hr;
  570. if ( pulDottedQuadOut != NULL )
  571. {
  572. *pulDottedQuadOut = m_ulIPSubnet;
  573. hr = S_OK;
  574. } // if:
  575. else
  576. {
  577. hr = THR( E_POINTER );
  578. } // else:
  579. HRETURN( hr );
  580. } //*** CIPAddressInfo::GetSubnetMask
  581. //////////////////////////////////////////////////////////////////////////////
  582. //++
  583. //
  584. // CIPAddressInfo::SetSubnetMask
  585. //
  586. // Description:
  587. //
  588. // Arguments:
  589. // None.
  590. //
  591. // Return Value:
  592. //
  593. //
  594. // Remarks:
  595. // None.
  596. //
  597. //--
  598. //////////////////////////////////////////////////////////////////////////////
  599. STDMETHODIMP
  600. CIPAddressInfo::SetSubnetMask( ULONG ulDottedQuad )
  601. {
  602. TraceFunc( "[IClusCfgIPAddressInfo]" );
  603. HRESULT hr = THR( E_NOTIMPL );
  604. HRETURN( hr );
  605. } //*** CIPAddressInfo::SetSubnetMask
  606. //*************************************************************************//
  607. /////////////////////////////////////////////////////////////////////////////
  608. // CIPAddressInfo class -- Private Methods.
  609. /////////////////////////////////////////////////////////////////////////////
  610. //////////////////////////////////////////////////////////////////////////////
  611. //++
  612. //
  613. // CIPAddressInfo::HrInit
  614. //
  615. // Description:
  616. // Initialize this component.
  617. //
  618. // Arguments:
  619. // None.
  620. //
  621. // Return Value:
  622. //
  623. //
  624. // Remarks:
  625. // None.
  626. //
  627. //--
  628. //////////////////////////////////////////////////////////////////////////////
  629. STDMETHODIMP
  630. CIPAddressInfo::HrInit( void )
  631. {
  632. TraceFunc( "" );
  633. HRESULT hr = S_OK;
  634. // IUnknown
  635. Assert( m_cRef == 1 );
  636. HRETURN( hr );
  637. } //*** CIPAddressInfo::HrInit
  638. //////////////////////////////////////////////////////////////////////////////
  639. //++
  640. //
  641. // CIPAddressInfo::LoadName
  642. //
  643. // Description:
  644. //
  645. // Arguments:
  646. // None.
  647. //
  648. // Return Value:
  649. //
  650. //
  651. // Remarks:
  652. // None.
  653. //
  654. //--
  655. //////////////////////////////////////////////////////////////////////////////
  656. STDMETHODIMP
  657. CIPAddressInfo::LoadName( void )
  658. {
  659. TraceFunc( "" );
  660. Assert( m_ulIPAddress != 0 );
  661. Assert( m_ulIPSubnet != 0 );
  662. HRESULT hr = S_OK;
  663. LPWSTR pszIPAddress = NULL;
  664. LPWSTR pszIPSubnet = NULL;
  665. DWORD sc;
  666. WCHAR sz[ 256 ];
  667. sc = TW32( ClRtlTcpipAddressToString( m_ulIPAddress, &pszIPAddress ) );
  668. if ( sc != ERROR_SUCCESS )
  669. {
  670. hr = HRESULT_FROM_WIN32( sc );
  671. goto Cleanup;
  672. } // if:
  673. sc = TW32( ClRtlTcpipAddressToString( m_ulIPSubnet, &pszIPSubnet ) );
  674. if ( sc != ERROR_SUCCESS )
  675. {
  676. hr = HRESULT_FROM_WIN32( sc );
  677. goto Cleanup;
  678. } // if:
  679. hr = THR( StringCchPrintfW( sz, ARRAYSIZE( sz ), L"%ws:%ws", pszIPAddress, pszIPSubnet ) );
  680. if ( FAILED( hr ) )
  681. {
  682. goto Cleanup;
  683. }
  684. m_bstrName = TraceSysAllocString( sz );
  685. if ( m_bstrName == NULL )
  686. {
  687. hr = THR( E_OUTOFMEMORY );
  688. goto Cleanup;
  689. } // if:
  690. hr = S_OK;
  691. Cleanup:
  692. if ( pszIPAddress != NULL )
  693. {
  694. LocalFree( pszIPAddress );
  695. } // if:
  696. if ( pszIPSubnet != NULL )
  697. {
  698. LocalFree( pszIPSubnet );
  699. } // if:
  700. HRETURN( hr );
  701. } //*** CIPAddressInfo::LoadName