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.

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