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.

1107 lines
26 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2002 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // TaskCancelCleanup.cpp
  7. //
  8. // Description:
  9. // CTaskCancelCleanup implementation.
  10. //
  11. // Maintained By:
  12. // Galen Barbee (GalenB) 25-JAN-2002
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. //////////////////////////////////////////////////////////////////////////////
  16. // Include Files
  17. //////////////////////////////////////////////////////////////////////////////
  18. #include "Pch.h"
  19. #include <ClusCfgPrivate.h>
  20. #include "TaskCancelCleanup.h"
  21. #include <StatusReports.h>
  22. //////////////////////////////////////////////////////////////////////////////
  23. // Constant Definitions
  24. //////////////////////////////////////////////////////////////////////////////
  25. DEFINE_THISCLASS("CTaskCancelCleanup")
  26. //*************************************************************************//
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CTaskCancelCleanup class
  29. /////////////////////////////////////////////////////////////////////////////
  30. //////////////////////////////////////////////////////////////////////////////
  31. //++
  32. //
  33. // CTaskCancelCleanup::S_HrCreateInstance
  34. //
  35. // Description:
  36. // Create a CTaskCancelCleanup instance.
  37. //
  38. // Arguments:
  39. // None.
  40. //
  41. // Return Values:
  42. // S_OK
  43. // Success.
  44. //
  45. // E_POINTER
  46. // The passed in ppunk is NULL.
  47. //
  48. // other HRESULTs
  49. // Object creation failed.
  50. //
  51. //--
  52. //////////////////////////////////////////////////////////////////////////////
  53. HRESULT
  54. CTaskCancelCleanup::S_HrCreateInstance(
  55. IUnknown ** ppunkOut
  56. )
  57. {
  58. TraceFunc( "" );
  59. HRESULT hr = S_OK;
  60. CTaskCancelCleanup * ptcc = NULL;
  61. Assert( ppunkOut != NULL );
  62. if ( ppunkOut == NULL )
  63. {
  64. hr = THR( E_POINTER );
  65. goto Cleanup;
  66. } // if:
  67. ptcc = new CTaskCancelCleanup;
  68. if ( ptcc == NULL )
  69. {
  70. hr = THR( E_OUTOFMEMORY );
  71. goto Cleanup;
  72. } // if:
  73. hr = THR( ptcc->HrInit() );
  74. if ( FAILED( hr ) )
  75. {
  76. goto Cleanup;
  77. } // if:
  78. hr = THR( ptcc->TypeSafeQI( IUnknown, ppunkOut ) );
  79. if ( FAILED( hr ) )
  80. {
  81. goto Cleanup;
  82. } // if:
  83. TraceMoveToMemoryList( *ppunkOut, g_GlobalMemoryList );
  84. Cleanup:
  85. if ( ptcc != NULL )
  86. {
  87. ptcc->Release();
  88. } // if:
  89. HRETURN( hr );
  90. } //*** CTaskCancelCleanup::S_HrCreateInstance
  91. //////////////////////////////////////////////////////////////////////////////
  92. //++
  93. //
  94. // CTaskCancelCleanup::CTaskCancelCleanup
  95. //
  96. // Description:
  97. // Constructor of the CTaskCancelCleanup class. This initializes
  98. // the m_cRef variable to 1 instead of 0 to account of possible
  99. // QueryInterface failure in DllGetClassObject.
  100. //
  101. // Arguments:
  102. // None.
  103. //
  104. // Return Value:
  105. // None.
  106. //
  107. // Remarks:
  108. // None.
  109. //
  110. //--
  111. //////////////////////////////////////////////////////////////////////////////
  112. CTaskCancelCleanup::CTaskCancelCleanup( void )
  113. : m_cRef( 1 )
  114. {
  115. TraceFunc( "" );
  116. InterlockedIncrement( &g_cObjects );
  117. Assert( m_fStop == false );
  118. Assert( m_cookieCluster == 0 );
  119. Assert( m_picccCallback == NULL );
  120. Assert( m_cookieCompletion == 0 );
  121. Assert( m_pnui == NULL );
  122. Assert( m_pom == NULL );
  123. Assert( m_pnui == NULL );
  124. TraceFuncExit();
  125. } //*** CTaskCancelCleanup::CTaskCancelCleanup
  126. //////////////////////////////////////////////////////////////////////////////
  127. //++
  128. //
  129. // CTaskCancelCleanup::~CTaskCancelCleanup
  130. //
  131. // Description:
  132. // Desstructor of the CTaskCancelCleanup class.
  133. //
  134. // Arguments:
  135. // None.
  136. //
  137. // Return Value:
  138. // None.
  139. //
  140. // Remarks:
  141. // None.
  142. //
  143. //--
  144. //////////////////////////////////////////////////////////////////////////////
  145. CTaskCancelCleanup::~CTaskCancelCleanup( void )
  146. {
  147. TraceFunc( "" );
  148. TraceMoveFromMemoryList( this, g_GlobalMemoryList );
  149. if ( m_pom != NULL )
  150. {
  151. m_pom->Release();
  152. } // if:
  153. if ( m_picccCallback != NULL )
  154. {
  155. m_picccCallback->Release();
  156. } // if:
  157. if ( m_pnui != NULL )
  158. {
  159. m_pnui->Release();
  160. } // if:
  161. InterlockedDecrement( &g_cObjects );
  162. TraceFuncExit();
  163. } //*** CTaskCancelCleanup::~CTaskCancelCleanup
  164. //*************************************************************************//
  165. /////////////////////////////////////////////////////////////////////////////
  166. // CTaskCancelCleanup -- IUnknown interface.
  167. /////////////////////////////////////////////////////////////////////////////
  168. //////////////////////////////////////////////////////////////////////////////
  169. //++
  170. //
  171. // CTaskCancelCleanup::AddRef
  172. //
  173. // Description:
  174. // Increment the reference count of this object by one.
  175. //
  176. // Arguments:
  177. // None.
  178. //
  179. // Return Value:
  180. // The new reference count.
  181. //
  182. // Remarks:
  183. // None.
  184. //
  185. //--
  186. //////////////////////////////////////////////////////////////////////////////
  187. STDMETHODIMP_( ULONG )
  188. CTaskCancelCleanup::AddRef( void )
  189. {
  190. TraceFunc( "[IUnknown]" );
  191. InterlockedIncrement( &m_cRef );
  192. CRETURN( m_cRef );
  193. } //*** CTaskCancelCleanup::AddRef
  194. //////////////////////////////////////////////////////////////////////////////
  195. //++
  196. //
  197. // CTaskCancelCleanup::Release
  198. //
  199. // Description:
  200. // Decrement the reference count of this object by one.
  201. //
  202. // Arguments:
  203. // None.
  204. //
  205. // Return Value:
  206. // The new reference count.
  207. //
  208. // Remarks:
  209. // None.
  210. //
  211. //--
  212. //////////////////////////////////////////////////////////////////////////////
  213. STDMETHODIMP_( ULONG )
  214. CTaskCancelCleanup::Release( void )
  215. {
  216. TraceFunc( "[IUnknown]" );
  217. LONG cRef;
  218. cRef = InterlockedDecrement( &m_cRef );
  219. if ( cRef == 0 )
  220. {
  221. TraceDo( delete this );
  222. } // if:
  223. CRETURN( cRef );
  224. } //*** CTaskCancelCleanup::Release
  225. //////////////////////////////////////////////////////////////////////////////
  226. //++
  227. //
  228. // CTaskCancelCleanup::QueryInterface
  229. //
  230. // Description:
  231. // Query this object for the passed in interface.
  232. //
  233. // Arguments:
  234. // riidIn
  235. // Id of interface requested.
  236. //
  237. // ppvOut
  238. // Pointer to the requested interface.
  239. //
  240. // Return Value:
  241. // S_OK
  242. // If the interface is available on this object.
  243. //
  244. // E_NOINTERFACE
  245. // If the interface is not available.
  246. //
  247. // E_POINTER
  248. // ppvOut was NULL.
  249. //
  250. // Remarks:
  251. // None.
  252. //
  253. //--
  254. //////////////////////////////////////////////////////////////////////////////
  255. STDMETHODIMP
  256. CTaskCancelCleanup::QueryInterface(
  257. REFIID riidIn
  258. , LPVOID * ppvOut
  259. )
  260. {
  261. TraceQIFunc( riidIn, ppvOut );
  262. HRESULT hr = S_OK;
  263. //
  264. // Validate arguments.
  265. //
  266. Assert( ppvOut != NULL );
  267. if ( ppvOut == NULL )
  268. {
  269. hr = THR( E_POINTER );
  270. goto Cleanup;
  271. } //if:
  272. //
  273. // Handle known interfaces.
  274. //
  275. if ( IsEqualIID( riidIn, IID_IUnknown ) )
  276. {
  277. *ppvOut = static_cast< ITaskCancelCleanup * >( this );
  278. } // if: IUnknown
  279. else if ( IsEqualIID( riidIn, IID_ITaskCancelCleanup ) )
  280. {
  281. *ppvOut = TraceInterface( __THISCLASS__, ITaskCancelCleanup, this, 0 );
  282. } // else if: ITaskCancelCleanup
  283. else if ( IsEqualIID( riidIn, IID_IDoTask ) )
  284. {
  285. *ppvOut = TraceInterface( __THISCLASS__, IDoTask, this, 0 );
  286. } // else if: IDoTask
  287. else if ( IsEqualIID( riidIn, IID_IClusCfgCallback ) )
  288. {
  289. *ppvOut = TraceInterface( __THISCLASS__, IClusCfgCallback, this, 0 );
  290. } // else if: IClusCfgCallback
  291. else
  292. {
  293. *ppvOut = NULL;
  294. hr = E_NOINTERFACE;
  295. } // else:
  296. //
  297. // Add a reference to the interface if successful.
  298. //
  299. if ( SUCCEEDED( hr ) )
  300. {
  301. ((IUnknown *) *ppvOut)->AddRef();
  302. } // if: success
  303. Cleanup:
  304. QIRETURN_IGNORESTDMARSHALLING( hr, riidIn );
  305. } //*** CTaskCancelCleanup::QueryInterface
  306. //*************************************************************************//
  307. /////////////////////////////////////////////////////////////////////////////
  308. // CTaskCancelCleanup -- IDoTask interface.
  309. /////////////////////////////////////////////////////////////////////////////
  310. //////////////////////////////////////////////////////////////////////////////
  311. //++
  312. //
  313. // CTaskCancelCleanup::BeginTask
  314. //
  315. // Description:
  316. // Entry point for this task.
  317. //
  318. // Arguments:
  319. // None.
  320. //
  321. // Return Value:
  322. // S_OK
  323. // Success
  324. //
  325. // HRESULT failure.
  326. //
  327. // Remarks:
  328. // None.
  329. //
  330. //--
  331. //////////////////////////////////////////////////////////////////////////////
  332. STDMETHODIMP
  333. CTaskCancelCleanup::BeginTask( void )
  334. {
  335. TraceFunc( "[IDoTask]" );
  336. HRESULT hr = S_OK;
  337. IUnknown * punk = NULL;
  338. OBJECTCOOKIE cookieDummy;
  339. ULONG celtDummy;
  340. IEnumCookies * pec = NULL;
  341. OBJECTCOOKIE cookieNode;
  342. hr = THR( HrTaskSetup() );
  343. if ( FAILED( hr ) )
  344. {
  345. goto Cleanup;
  346. } // if:
  347. //
  348. // Ask the object manager for the node cookie enumerator.
  349. //
  350. hr = THR( m_pom->FindObject( CLSID_NodeType, m_cookieCluster, NULL, DFGUID_EnumCookies, &cookieDummy, &punk ) );
  351. if ( FAILED( hr ) )
  352. {
  353. LOG_STATUS_REPORT( L"[TaskCancelCleanup] Could not get the node cookie enumerator.", hr );
  354. goto Cleanup;
  355. } // if:
  356. hr = THR( punk->TypeSafeQI( IEnumCookies, &pec ) );
  357. if ( FAILED( hr ) )
  358. {
  359. LOG_STATUS_REPORT( L"[TaskCancelCleanup] Could not query for the cookie enumerator interface.", hr );
  360. goto Cleanup;
  361. } // if:
  362. punk->Release();
  363. punk = NULL;
  364. for ( ; m_fStop == false; )
  365. {
  366. //
  367. // Grab the next node.
  368. //
  369. hr = STHR( pec->Next( 1, &cookieNode, &celtDummy ) );
  370. if ( hr == S_FALSE )
  371. {
  372. hr = S_OK;
  373. break; // exit condition
  374. } // if:
  375. if ( FAILED( hr ) )
  376. {
  377. LOG_STATUS_REPORT( L"[TaskCancelCleanup] Node cookie enumerator Next() method failed.", hr );
  378. goto Cleanup;
  379. } // if:
  380. //
  381. // Process each node in turn...
  382. //
  383. hr = STHR( HrProcessNode( cookieNode ) );
  384. if ( FAILED( hr ) )
  385. {
  386. goto Cleanup;
  387. } // if:
  388. } // for:
  389. Cleanup:
  390. THR( HrTaskCleanup( hr ) );
  391. if ( punk != NULL )
  392. {
  393. punk->Release();
  394. } // if:
  395. if ( pec != NULL )
  396. {
  397. pec->Release();
  398. } // if:
  399. HRETURN( hr );
  400. } //*** CTaskCancelCleanup::BeginTask
  401. //////////////////////////////////////////////////////////////////////////////
  402. //++
  403. //
  404. // CTaskCancelCleanup::StopTask
  405. //
  406. // Description:
  407. // This task has been asked to stop.
  408. //
  409. // Arguments:
  410. // None.
  411. //
  412. // Return Value:
  413. // S_OK
  414. // Success
  415. //
  416. // Remarks:
  417. // None.
  418. //
  419. //--
  420. //////////////////////////////////////////////////////////////////////////////
  421. STDMETHODIMP
  422. CTaskCancelCleanup::StopTask( void )
  423. {
  424. TraceFunc( "[IDoTask]" );
  425. HRESULT hr = S_OK;
  426. m_fStop = true;
  427. LOG_STATUS_REPORT( L"[TaskCancelCleanup] This task has been asked to stop.", hr );
  428. HRETURN( hr );
  429. } //*** CTaskCancelCleanup::StopTask
  430. //////////////////////////////////////////////////////////////////////////////
  431. //++
  432. //
  433. // CTaskCancelCleanup::SetClusterCookie
  434. //
  435. // Description:
  436. // Get the cookie of the cluster that we are supposed to be working on.
  437. //
  438. // Arguments:
  439. // cookieClusterIn
  440. //
  441. // Return Value:
  442. // S_OK
  443. // Success
  444. //
  445. // Remarks:
  446. // None.
  447. //
  448. //--
  449. //////////////////////////////////////////////////////////////////////////////
  450. STDMETHODIMP
  451. CTaskCancelCleanup::SetClusterCookie(
  452. OBJECTCOOKIE cookieClusterIn
  453. )
  454. {
  455. TraceFunc( "[ITaskCancelCleanup]" );
  456. HRESULT hr = S_OK;
  457. m_cookieCluster = cookieClusterIn;
  458. HRETURN( hr );
  459. } //*** CTaskCancelCleanup::SetClusterCookie
  460. //////////////////////////////////////////////////////////////////////////////
  461. //++
  462. //
  463. // CTaskCancelCleanup::SetCompletionCookie
  464. //
  465. // Description:
  466. // Get the completion cookie that we will send back when the task is
  467. // complete.
  468. //
  469. // Arguments:
  470. // cookieIn
  471. //
  472. // Return Value:
  473. // S_OK
  474. // Success
  475. //
  476. // Remarks:
  477. // None.
  478. //
  479. //--
  480. //////////////////////////////////////////////////////////////////////////////
  481. STDMETHODIMP
  482. CTaskCancelCleanup::SetCompletionCookie(
  483. OBJECTCOOKIE cookieCompletionIn
  484. )
  485. {
  486. TraceFunc( "[ITaskCancelCleanup]" );
  487. HRESULT hr = S_OK;
  488. m_cookieCompletion = cookieCompletionIn;
  489. HRETURN( hr );
  490. } //*** CTaskAnalyzeCluster::SetCompletionCookie
  491. //*************************************************************************//
  492. /////////////////////////////////////////////////////////////////////////////
  493. // CTaskCancelCleanup -- IClusCfgCallback interface.
  494. /////////////////////////////////////////////////////////////////////////////
  495. //////////////////////////////////////////////////////////////////////////////
  496. //++
  497. //
  498. // CTaskCancelCleanup::SendStatusReport
  499. //
  500. // Description:
  501. //
  502. //
  503. // Arguments:
  504. //
  505. //
  506. // Return Value:
  507. // S_OK
  508. // Success
  509. //
  510. // Remarks:
  511. // None.
  512. //
  513. //--
  514. //////////////////////////////////////////////////////////////////////////////
  515. STDMETHODIMP
  516. CTaskCancelCleanup::SendStatusReport(
  517. LPCWSTR pcszNodeNameIn
  518. , CLSID clsidTaskMajorIn
  519. , CLSID clsidTaskMinorIn
  520. , ULONG ulMinIn
  521. , ULONG ulMaxIn
  522. , ULONG ulCurrentIn
  523. , HRESULT hrStatusIn
  524. , LPCWSTR pcszDescriptionIn
  525. , FILETIME * pftTimeIn
  526. , LPCWSTR pcszReferenceIn
  527. )
  528. {
  529. TraceFunc( "[IClusCfgCallback]" );
  530. Assert( m_picccCallback != NULL );
  531. HRESULT hr = S_OK;
  532. //
  533. // Send the message!
  534. //
  535. hr = THR( m_picccCallback->SendStatusReport(
  536. pcszNodeNameIn
  537. , clsidTaskMajorIn
  538. , clsidTaskMinorIn
  539. , ulMinIn
  540. , ulMaxIn
  541. , ulCurrentIn
  542. , hrStatusIn
  543. , pcszDescriptionIn
  544. , pftTimeIn
  545. , pcszReferenceIn
  546. ) );
  547. if ( m_fStop == true )
  548. {
  549. hr = E_ABORT;
  550. } // if:
  551. HRETURN( hr );
  552. } //*** CTaskCancelCleanup::SendStatusReport
  553. //*************************************************************************//
  554. /////////////////////////////////////////////////////////////////////////////
  555. // CTaskCancelCleanup -- Private methods.
  556. /////////////////////////////////////////////////////////////////////////////
  557. //////////////////////////////////////////////////////////////////////////////
  558. //++
  559. //
  560. // CTaskCancelCleanup::HrInit
  561. //
  562. // Description:
  563. // Failable initialization for this class.
  564. //
  565. // Arguments:
  566. // None.
  567. //
  568. // Return Value:
  569. // S_OK
  570. // Success
  571. //
  572. // HRESULT failure.
  573. //
  574. // Remarks:
  575. // None.
  576. //
  577. //--
  578. //////////////////////////////////////////////////////////////////////////////
  579. STDMETHODIMP
  580. CTaskCancelCleanup::HrInit( void )
  581. {
  582. TraceFunc( "" );
  583. HRESULT hr = S_OK;
  584. Assert( m_cRef == 1 );
  585. HRETURN( hr );
  586. } //*** CTaskCancelCleanup::HrInit
  587. //////////////////////////////////////////////////////////////////////////////
  588. //++
  589. //
  590. // CTaskCancelCleanup::HrProcessNode
  591. //
  592. // Description:
  593. // Look at the resources on the passed in node and tell all that
  594. // support IClusCfgVerifyQuorum that the config session has been
  595. // canceled and that they need to cleanup.
  596. //
  597. // Arguments:
  598. // cookieNodeIn
  599. //
  600. // Return Value:
  601. // S_OK
  602. // Success
  603. //
  604. // HRESULT failure.
  605. //
  606. // Remarks:
  607. // None.
  608. //
  609. //--
  610. //////////////////////////////////////////////////////////////////////////////
  611. HRESULT
  612. CTaskCancelCleanup::HrProcessNode(
  613. OBJECTCOOKIE cookieNodeIn
  614. )
  615. {
  616. TraceFunc( "" );
  617. Assert( m_pom != NULL );
  618. HRESULT hr = S_OK;
  619. BSTR bstrNodeName = NULL;
  620. IClusCfgNodeInfo * pccni = NULL;
  621. IUnknown * punk = NULL;
  622. OBJECTCOOKIE cookieDummy;
  623. IEnumClusCfgManagedResources * peccmr = NULL;
  624. IClusCfgManagedResourceInfo * pccmri = NULL;
  625. ULONG celtDummy;
  626. IClusCfgVerifyQuorum * piccvq = NULL;
  627. //
  628. // Get the node info object for the passed in node cookie.
  629. //
  630. hr = m_pom->GetObject( DFGUID_NodeInformation, cookieNodeIn, reinterpret_cast< IUnknown ** >( &punk ) );
  631. if ( FAILED( hr ) )
  632. {
  633. THR( hr );
  634. LOG_STATUS_REPORT( L"[TaskCancelCleanup] Could not get the node info object.", hr );
  635. goto Cleanup;
  636. } // if:
  637. hr = THR( punk->TypeSafeQI( IClusCfgNodeInfo, &pccni ) );
  638. if ( FAILED( hr ) )
  639. {
  640. LOG_STATUS_REPORT( L"[TaskCancelCleanup] Could not query for the node info object interface.", hr );
  641. goto Cleanup;
  642. } // if:
  643. punk->Release();
  644. punk = NULL;
  645. //
  646. // Get the node's name and track the memory...
  647. //
  648. hr = THR( pccni->GetName( &bstrNodeName ) );
  649. if ( FAILED( hr ) )
  650. {
  651. LOG_STATUS_REPORT( L"[TaskCancelCleanup] Could not get the name of the node.", hr );
  652. goto Cleanup;
  653. } // if:
  654. TraceMemoryAddBSTR( bstrNodeName );
  655. LOG_STATUS_REPORT_STRING( L"[TaskCancelCleanup] Cleaning up node %1!ws!...", bstrNodeName, hr );
  656. //
  657. // Get the managed resources enum for the node...
  658. //
  659. hr = THR( m_pom->FindObject( CLSID_ManagedResourceType, cookieNodeIn, NULL, DFGUID_EnumManageableResources, &cookieDummy, &punk ) );
  660. if ( FAILED( hr ) )
  661. {
  662. LOG_STATUS_REPORT_STRING( L"[TaskCancelCleanup] Could not get the managed resource enumerator for node %1!ws!.", bstrNodeName, hr );
  663. goto Cleanup;
  664. } // if:
  665. hr = THR( punk->TypeSafeQI( IEnumClusCfgManagedResources, &peccmr ) );
  666. if ( FAILED( hr ) )
  667. {
  668. LOG_STATUS_REPORT( L"[TaskCancelCleanup] Could not query for the managed resource enumerator interface.", hr );
  669. goto Cleanup;
  670. } // if:
  671. punk->Release();
  672. punk = NULL;
  673. for ( ; m_fStop == false; )
  674. {
  675. //
  676. // Cleanup
  677. //
  678. if ( pccmri != NULL )
  679. {
  680. pccmri->Release();
  681. pccmri = NULL;
  682. } // if:
  683. if ( piccvq != NULL )
  684. {
  685. piccvq->Release();
  686. piccvq = NULL;
  687. } // if:
  688. //
  689. // Get next resource.
  690. //
  691. hr = STHR( peccmr->Next( 1, &pccmri, &celtDummy ) );
  692. if ( FAILED( hr ) )
  693. {
  694. LOG_STATUS_REPORT( L"[TaskCancelCleanup] Managed resource enumerator Next() method failed.", hr );
  695. goto Cleanup;
  696. } // if:
  697. if ( hr == S_FALSE )
  698. {
  699. hr = S_OK;
  700. break; // exit condition
  701. } // if:
  702. //
  703. // Get the IClusCfgVerifyQuorum interface. Not all objects will support
  704. // this interface.
  705. //
  706. hr = pccmri->TypeSafeQI( IClusCfgVerifyQuorum, &piccvq );
  707. if ( hr == E_NOINTERFACE )
  708. {
  709. continue; // we can skip those objects that don't support this interface...
  710. } // if:
  711. else if ( FAILED( hr ) )
  712. {
  713. THR( hr );
  714. LOG_STATUS_REPORT( L"[TaskCancelCleanup] Could query for the IClusCfgVerifyQuorum interface.", hr );
  715. continue;
  716. } // else if:
  717. else
  718. {
  719. hr = STHR( piccvq->Cleanup( crCANCELLED ) ); // don't really care if this call fails...
  720. if ( FAILED( hr ) )
  721. {
  722. LOG_STATUS_REPORT( L"[TaskCancelCleanup] IClusCfgVerifyQuorum::Cleanup() method failed.", hr );
  723. continue;
  724. } // if:
  725. } // else:
  726. } // for:
  727. Cleanup:
  728. LOG_STATUS_REPORT_STRING( L"[TaskCancelCleanup] Node %1!ws! cleaned up.", bstrNodeName, hr );
  729. if ( pccmri != NULL )
  730. {
  731. pccmri->Release();
  732. } // if:
  733. if ( punk != NULL )
  734. {
  735. punk->Release();
  736. } // if:
  737. if ( peccmr != NULL )
  738. {
  739. peccmr->Release();
  740. } // if:
  741. if ( pccni != NULL )
  742. {
  743. pccni->Release();
  744. } // if:
  745. TraceSysFreeString( bstrNodeName );
  746. HRETURN( hr );
  747. } //*** CTaskCancelCleanup::HrProcessNode
  748. //////////////////////////////////////////////////////////////////////////////
  749. //++
  750. //
  751. // CTaskCancelCleanup::HrTaskCleanup
  752. //
  753. // Description:
  754. // The task is running down and we need to tell the caller the status
  755. // and to let them know that we are done.
  756. //
  757. // Arguments:
  758. // hrIn
  759. //
  760. // Return Value:
  761. // S_OK
  762. // Success
  763. //
  764. // HRESULT failure.
  765. //
  766. // Remarks:
  767. // None.
  768. //
  769. //--
  770. //////////////////////////////////////////////////////////////////////////////
  771. HRESULT
  772. CTaskCancelCleanup::HrTaskCleanup(
  773. HRESULT hrIn
  774. )
  775. {
  776. TraceFunc( "" );
  777. Assert( m_pom != NULL );
  778. Assert( m_pnui != NULL );
  779. HRESULT hr = S_OK;
  780. if ( m_cookieCompletion != 0 )
  781. {
  782. HRESULT hr2;
  783. IUnknown * punk;
  784. hr2 = THR( m_pom->GetObject( DFGUID_StandardInfo, m_cookieCompletion, &punk ) );
  785. if ( SUCCEEDED( hr2 ) )
  786. {
  787. IStandardInfo * psi;
  788. hr2 = THR( punk->TypeSafeQI( IStandardInfo, &psi ) );
  789. punk->Release();
  790. if ( SUCCEEDED( hr2 ) )
  791. {
  792. hr2 = THR( psi->SetStatus( hrIn ) );
  793. psi->Release();
  794. } // if:
  795. else
  796. {
  797. LOG_STATUS_REPORT( L"[TaskCancelCleanup] Could not query the completion cookie objet for IStandardInfo.", hr );
  798. } // else:
  799. } // if:
  800. else
  801. {
  802. LOG_STATUS_REPORT( L"[TaskCancelCleanup] Could not get the completion cookie object.", hr );
  803. } // else:
  804. //
  805. // Have the notification manager signal the completion cookie.
  806. //
  807. hr2 = THR( m_pnui->ObjectChanged( m_cookieCompletion ) );
  808. if ( FAILED( hr2 ) )
  809. {
  810. LOG_STATUS_REPORT( L"[TaskCancelCleanup] Could not notify that this task is done.", hr );
  811. hr = hr2;
  812. } // if:
  813. m_cookieCompletion = 0;
  814. } // if: completion cookie was obtained
  815. HRETURN( hr );
  816. } //*** CTaskCancelCleanup::HrTaskCleanup
  817. //////////////////////////////////////////////////////////////////////////////
  818. //++
  819. //
  820. // CTaskCancelCleanup::HrTaskSetup
  821. //
  822. // Description:
  823. // Do all task setup.
  824. //
  825. // Arguments:
  826. // None.
  827. //
  828. // Return Value:
  829. // S_OK
  830. // Success
  831. //
  832. // HRESULT failure.
  833. //
  834. // Remarks:
  835. // None.
  836. //
  837. //--
  838. //////////////////////////////////////////////////////////////////////////////
  839. HRESULT
  840. CTaskCancelCleanup::HrTaskSetup( void )
  841. {
  842. TraceFunc( "" );
  843. HRESULT hr = S_OK;
  844. IServiceProvider * psp = NULL;
  845. IConnectionPointContainer * pcpc = NULL;
  846. IConnectionPoint * pcp = NULL;
  847. //
  848. // Get the service manager...
  849. //
  850. hr = THR( CoCreateInstance( CLSID_ServiceManager, NULL, CLSCTX_INPROC_SERVER, TypeSafeParams( IServiceProvider, &psp ) ) );
  851. if ( FAILED( hr ) )
  852. {
  853. goto Cleanup;
  854. } // if:
  855. //
  856. // Get the notification manager...
  857. //
  858. hr = THR( psp->TypeSafeQS( CLSID_NotificationManager, IConnectionPointContainer, &pcpc ) );
  859. if ( FAILED( hr ) )
  860. {
  861. goto Cleanup;
  862. } // if:
  863. hr = THR( pcpc->FindConnectionPoint( IID_IClusCfgCallback, &pcp ) );
  864. if ( FAILED( hr ) )
  865. {
  866. goto Cleanup;
  867. } // if:
  868. hr = THR( pcp->TypeSafeQI( IClusCfgCallback, &m_picccCallback ) );
  869. if ( FAILED( hr ) )
  870. {
  871. goto Cleanup;
  872. } // if:
  873. pcp->Release();
  874. pcp = NULL;
  875. //
  876. // It is now okay to use SendStatusReport...
  877. //
  878. //
  879. // Get the UI notification
  880. //
  881. hr = THR( pcpc->FindConnectionPoint( IID_INotifyUI, &pcp ) );
  882. if ( FAILED( hr ) )
  883. {
  884. LOG_STATUS_REPORT( L"[TaskCancelCleanup] Could not find notify UI connection point.", hr );
  885. goto Cleanup;
  886. } // if:
  887. hr = THR( pcp->TypeSafeQI( INotifyUI, &m_pnui ) );
  888. if ( FAILED( hr ) )
  889. {
  890. LOG_STATUS_REPORT( L"[TaskCancelCleanup] Could not query for the notify UI interface.", hr );
  891. goto Cleanup;
  892. } // if:
  893. //
  894. // Get the object manager from the service manager...
  895. //
  896. hr = THR( psp->TypeSafeQS( CLSID_ObjectManager, IObjectManager, &m_pom ) );
  897. if ( FAILED( hr ) )
  898. {
  899. LOG_STATUS_REPORT( L"[TaskCancelCleanup] Could not query for the object manager service.", hr );
  900. goto Cleanup;
  901. } // if:
  902. Cleanup:
  903. if ( pcp != NULL )
  904. {
  905. pcp->Release();
  906. } // if:
  907. if ( pcpc != NULL )
  908. {
  909. pcpc->Release();
  910. } // if:
  911. if ( psp != NULL )
  912. {
  913. psp->Release();
  914. } // if:
  915. HRETURN( hr );
  916. } //*** CTaskCancelCleanup::HrTaskSetup