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.

462 lines
11 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1999-2001 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // TaskVerifyIPAddress.cpp
  7. //
  8. // Description:
  9. // Object Manager implementation.
  10. //
  11. // Maintained By:
  12. // Galen Barbee (GalenB) 14-JUL-1999
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. #include "Pch.h"
  16. #include "TaskVerifyIPAddress.h"
  17. DEFINE_THISCLASS("CTaskVerifyIPAddress")
  18. // ************************************************************************
  19. //
  20. // Constructor / Destructor
  21. //
  22. // ************************************************************************
  23. //////////////////////////////////////////////////////////////////////////////
  24. //
  25. // HRESULT
  26. // CTaskVerifyIPAddress::S_HrCreateInstance(
  27. // IUnknown ** ppunkOut
  28. // )
  29. //
  30. //////////////////////////////////////////////////////////////////////////////
  31. HRESULT
  32. CTaskVerifyIPAddress::S_HrCreateInstance(
  33. IUnknown ** ppunkOut
  34. )
  35. {
  36. TraceFunc( "" );
  37. HRESULT hr = S_OK;
  38. CTaskVerifyIPAddress * ptvipa = NULL;
  39. Assert( ppunkOut != NULL );
  40. if ( ppunkOut == NULL )
  41. {
  42. hr = THR( E_POINTER );
  43. goto Cleanup;
  44. }
  45. ptvipa = new CTaskVerifyIPAddress;
  46. if ( ptvipa == NULL )
  47. {
  48. hr = THR( E_OUTOFMEMORY );
  49. goto Cleanup;
  50. }
  51. hr = THR( ptvipa->HrInit() );
  52. if ( FAILED( hr ) )
  53. {
  54. goto Cleanup;
  55. }
  56. hr = THR( ptvipa->TypeSafeQI( IUnknown, ppunkOut ) );
  57. if ( FAILED( hr ) )
  58. {
  59. goto Cleanup;
  60. }
  61. Cleanup:
  62. if ( ptvipa != NULL )
  63. {
  64. ptvipa->Release();
  65. }
  66. HRETURN( hr );
  67. } //*** CTaskVerifyIPAddress::S_HrCreateInstance
  68. //////////////////////////////////////////////////////////////////////////////
  69. //
  70. // CTaskVerifyIPAddress::CTaskVerifyIPAddress
  71. //
  72. //////////////////////////////////////////////////////////////////////////////
  73. CTaskVerifyIPAddress::CTaskVerifyIPAddress( void )
  74. : m_cRef( 1 )
  75. {
  76. TraceFunc( "" );
  77. InterlockedIncrement( &g_cObjects );
  78. TraceFuncExit();
  79. } //*** CTaskVerifyIPAddress::CTaskVerifyIPAddress
  80. //////////////////////////////////////////////////////////////////////////////
  81. //
  82. // STDMETHODIMP
  83. // CTaskVerifyIPAddress::HrInit
  84. //
  85. //////////////////////////////////////////////////////////////////////////////
  86. STDMETHODIMP
  87. CTaskVerifyIPAddress::HrInit( void )
  88. {
  89. TraceFunc( "" );
  90. HRESULT hr = S_OK;
  91. // IUnknown stuff
  92. Assert( m_cRef == 1 );
  93. HRETURN( hr );
  94. } //*** CTaskVerifyIPAddress::HrInit
  95. //////////////////////////////////////////////////////////////////////////////
  96. //
  97. // CTaskVerifyIPAddress::~CTaskVerifyIPAddress
  98. //
  99. //////////////////////////////////////////////////////////////////////////////
  100. CTaskVerifyIPAddress::~CTaskVerifyIPAddress( void )
  101. {
  102. TraceFunc( "" );
  103. InterlockedDecrement( &g_cObjects );
  104. TraceFuncExit();
  105. } //*** CTaskVerifyIPAddress::~CTaskVerifyIPAddress
  106. // ************************************************************************
  107. //
  108. // IUnknown
  109. //
  110. // ************************************************************************
  111. //////////////////////////////////////////////////////////////////////////////
  112. //++
  113. //
  114. // CTaskVerifyIPAddress::QueryInterface
  115. //
  116. // Description:
  117. // Query this object for the passed in interface.
  118. //
  119. // Arguments:
  120. // riidIn
  121. // Id of interface requested.
  122. //
  123. // ppvOut
  124. // Pointer to the requested interface.
  125. //
  126. // Return Value:
  127. // S_OK
  128. // If the interface is available on this object.
  129. //
  130. // E_NOINTERFACE
  131. // If the interface is not available.
  132. //
  133. // E_POINTER
  134. // ppvOut was NULL.
  135. //
  136. // Remarks:
  137. // None.
  138. //
  139. //--
  140. //////////////////////////////////////////////////////////////////////////////
  141. STDMETHODIMP
  142. CTaskVerifyIPAddress::QueryInterface(
  143. REFIID riidIn
  144. , LPVOID * ppvOut
  145. )
  146. {
  147. TraceQIFunc( riidIn, ppvOut );
  148. HRESULT hr = S_OK;
  149. //
  150. // Validate arguments.
  151. //
  152. Assert( ppvOut != NULL );
  153. if ( ppvOut == NULL )
  154. {
  155. hr = THR( E_POINTER );
  156. goto Cleanup;
  157. }
  158. //
  159. // Handle known interfaces.
  160. //
  161. if ( IsEqualIID( riidIn, IID_IUnknown ) )
  162. {
  163. *ppvOut = static_cast< ITaskVerifyIPAddress * >( this );
  164. } // if: IUnknown
  165. else if ( IsEqualIID( riidIn, IID_ITaskVerifyIPAddress ) )
  166. {
  167. *ppvOut = TraceInterface( __THISCLASS__, ITaskVerifyIPAddress, this, 0 );
  168. } // else if: ITaskVerifyIPAddress
  169. else if ( IsEqualIID( riidIn, IID_IDoTask ) )
  170. {
  171. *ppvOut = TraceInterface( __THISCLASS__, IDoTask, this, 0 );
  172. } // else if: IDoTask
  173. else
  174. {
  175. *ppvOut = NULL;
  176. hr = E_NOINTERFACE;
  177. }
  178. //
  179. // Add a reference to the interface if successful.
  180. //
  181. if ( SUCCEEDED( hr ) )
  182. {
  183. ((IUnknown *) *ppvOut)->AddRef();
  184. } // if: success
  185. Cleanup:
  186. QIRETURN_IGNORESTDMARSHALLING( hr, riidIn );
  187. } //*** CTaskVerifyIPAddress::QueryInterface
  188. //////////////////////////////////////////////////////////////////////////////
  189. //
  190. // STDMETHODIMP_(ULONG)
  191. // CTaskVerifyIPAddress::AddRef
  192. //
  193. //////////////////////////////////////////////////////////////////////////////
  194. STDMETHODIMP_(ULONG)
  195. CTaskVerifyIPAddress::AddRef( void )
  196. {
  197. TraceFunc( "[IUnknown]" );
  198. InterlockedIncrement( &m_cRef );
  199. CRETURN( m_cRef );
  200. } //*** CTaskVerifyIPAddress::AddRef
  201. //////////////////////////////////////////////////////////////////////////////
  202. //
  203. // STDMETHODIMP_(ULONG)
  204. // CTaskVerifyIPAddress::Release
  205. //
  206. //////////////////////////////////////////////////////////////////////////////
  207. STDMETHODIMP_(ULONG)
  208. CTaskVerifyIPAddress::Release( void )
  209. {
  210. TraceFunc( "[IUnknown]" );
  211. LONG cRef;
  212. cRef = InterlockedDecrement( &m_cRef );
  213. if ( cRef == 0 )
  214. {
  215. TraceDo( delete this );
  216. }
  217. CRETURN( cRef );
  218. } //*** CTaskVerifyIPAddress::Release
  219. //****************************************************************************
  220. //
  221. // IDoTask / ITaskVerifyIPAddress
  222. //
  223. //****************************************************************************
  224. //////////////////////////////////////////////////////////////////////////////
  225. //
  226. // STDMETHODIMP
  227. // CTaskVerifyIPAddress::BeginTask
  228. //
  229. //////////////////////////////////////////////////////////////////////////////
  230. STDMETHODIMP
  231. CTaskVerifyIPAddress::BeginTask( void )
  232. {
  233. TraceFunc( "[IDoTask]" );
  234. BOOL fRet;
  235. HRESULT hr = S_OK;
  236. IServiceProvider * psp = NULL;
  237. IConnectionPointContainer * pcpc = NULL;
  238. IConnectionPoint * pcp = NULL;
  239. INotifyUI * pnui = NULL;
  240. IObjectManager * pom = NULL;
  241. hr = THR( CoCreateInstance( CLSID_ServiceManager,
  242. NULL,
  243. CLSCTX_INPROC_SERVER,
  244. TypeSafeParams( IServiceProvider, &psp )
  245. ) );
  246. if ( FAILED( hr ) )
  247. goto Cleanup;
  248. hr = THR( psp->TypeSafeQS( CLSID_ObjectManager,
  249. IObjectManager,
  250. &pom
  251. ) );
  252. if ( FAILED( hr ) )
  253. goto Cleanup;
  254. hr = THR( psp->TypeSafeQS( CLSID_NotificationManager,
  255. IConnectionPointContainer,
  256. &pcpc
  257. ) );
  258. if ( FAILED( hr ) )
  259. goto Cleanup;
  260. hr = THR( pcpc->FindConnectionPoint( IID_INotifyUI,
  261. &pcp
  262. ) );
  263. if ( FAILED( hr ) )
  264. goto Cleanup;
  265. hr = THR( pcp->TypeSafeQI( INotifyUI, &pnui ) );
  266. if ( FAILED( hr ) )
  267. goto Cleanup;
  268. // release promptly
  269. psp->Release();
  270. psp = NULL;
  271. fRet = ClRtlIsDuplicateTcpipAddress( m_dwIPAddress );
  272. if ( fRet )
  273. {
  274. hr = S_FALSE;
  275. }
  276. else
  277. {
  278. hr = S_OK;
  279. }
  280. Cleanup:
  281. if ( psp != NULL )
  282. {
  283. psp->Release();
  284. }
  285. if ( pom != NULL )
  286. {
  287. //
  288. // Update the cookie's status indicating the result of our task.
  289. //
  290. IUnknown * punk;
  291. HRESULT hr2;
  292. hr2 = THR( pom->GetObject( DFGUID_StandardInfo,
  293. m_cookie,
  294. &punk
  295. ) );
  296. if ( SUCCEEDED( hr2 ) )
  297. {
  298. IStandardInfo * psi;
  299. hr2 = THR( punk->TypeSafeQI( IStandardInfo, &psi ) );
  300. punk->Release();
  301. if ( SUCCEEDED( hr2 ) )
  302. {
  303. hr2 = THR( psi->SetStatus( hr ) );
  304. psi->Release();
  305. }
  306. }
  307. pom->Release();
  308. }
  309. if ( pcpc != NULL )
  310. {
  311. pcpc->Release();
  312. }
  313. if ( pcp != NULL )
  314. {
  315. pcp->Release();
  316. }
  317. if ( pnui != NULL )
  318. {
  319. //
  320. // Signal the cookie to indicate that we are done.
  321. //
  322. THR( pnui->ObjectChanged( m_cookie ) );
  323. pnui->Release();
  324. }
  325. HRETURN( hr );
  326. } //*** CTaskVerifyIPAddress::BeginTask
  327. //////////////////////////////////////////////////////////////////////////////
  328. //
  329. // STDMETHODIMP
  330. // CTaskVerifyIPAddress::StopTask
  331. //
  332. //////////////////////////////////////////////////////////////////////////////
  333. STDMETHODIMP
  334. CTaskVerifyIPAddress::StopTask( void )
  335. {
  336. TraceFunc( "[IDoTask]" );
  337. HRESULT hr = S_OK;
  338. HRETURN( hr );
  339. } //*** CTaskVerifyIPAddress::StopTask
  340. //////////////////////////////////////////////////////////////////////////////
  341. //
  342. // STDMETHODIMP
  343. // CTaskVerifyIPAddress::SetIPAddress(
  344. // DWORD dwIPAddressIn
  345. // )
  346. //
  347. //////////////////////////////////////////////////////////////////////////////
  348. STDMETHODIMP
  349. CTaskVerifyIPAddress::SetIPAddress(
  350. DWORD dwIPAddressIn
  351. )
  352. {
  353. TraceFunc( "[ITaskVerifyIPAddress]" );
  354. HRESULT hr = S_OK;
  355. m_dwIPAddress = dwIPAddressIn;
  356. HRETURN( hr );
  357. } //*** CTaskVerifyIPAddress::SetIPAddress
  358. //////////////////////////////////////////////////////////////////////////////
  359. //
  360. // STDMETHODIMP
  361. // CTaskVerifyIPAddress::SetCookie(
  362. // OBJECTCOOKIE cookieIn
  363. // )
  364. //
  365. //////////////////////////////////////////////////////////////////////////////
  366. STDMETHODIMP
  367. CTaskVerifyIPAddress::SetCookie(
  368. OBJECTCOOKIE cookieIn
  369. )
  370. {
  371. TraceFunc( "[ITaskVerifyIPAddress]" );
  372. HRESULT hr = S_OK;
  373. m_cookie = cookieIn;
  374. HRETURN( hr );
  375. } //*** CTaskVerifyIPAddress::SetCookie