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.

1233 lines
29 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2002 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // ResourceEntry.h
  7. //
  8. // Description:
  9. // ResourceEntry implementation.
  10. //
  11. // Maintained By:
  12. // Ozan Ozhan (OzanO) 10-JUL-2001
  13. // Galen Barbee (GalenB) 14-JUN-2001
  14. // Geoffrey Pease (GPease) 15-JUN-2000
  15. //
  16. //////////////////////////////////////////////////////////////////////////////
  17. #include "Pch.h"
  18. #include "GroupHandle.h"
  19. #include "ResourceEntry.h"
  20. DEFINE_THISCLASS("CResourceEntry")
  21. #define DEPENDENCY_INCREMENT 10
  22. // ************************************************************************
  23. //
  24. // Constructor / Destructor
  25. //
  26. // ************************************************************************
  27. //////////////////////////////////////////////////////////////////////////////
  28. //
  29. // CResourceEntry::CResourceEntry( void )
  30. //
  31. //////////////////////////////////////////////////////////////////////////////
  32. CResourceEntry::CResourceEntry( void )
  33. : m_pcccCallback( NULL )
  34. , m_lcid( LOCALE_SYSTEM_DEFAULT )
  35. {
  36. TraceFunc( "" );
  37. Assert( m_fConfigured == FALSE );
  38. Assert( m_bstrName == NULL );
  39. Assert( m_pccmrcResource == NULL );
  40. Assert( m_clsidType == IID_NULL );
  41. Assert( m_clsidClassType == IID_NULL );
  42. Assert( m_dfFlags == dfUNKNOWN );
  43. Assert( m_cAllocedDependencies == 0 );
  44. Assert( m_cDependencies == 0 );
  45. Assert( m_rgDependencies == NULL );
  46. Assert( m_cAllocedDependents == 0 );
  47. Assert( m_cDependents == 0 );
  48. Assert( m_rgDependents == NULL );
  49. Assert( m_groupHandle == NULL );
  50. Assert( m_hResource == NULL );
  51. TraceFuncExit();
  52. } //*** CResourceEntry::CResourceEntry
  53. //////////////////////////////////////////////////////////////////////////////
  54. //
  55. // CResourceEntry::~CResourceEntry
  56. //
  57. //////////////////////////////////////////////////////////////////////////////
  58. CResourceEntry::~CResourceEntry( void )
  59. {
  60. TraceFunc( "" );
  61. // Release the callback interface
  62. if ( m_pcccCallback != NULL )
  63. {
  64. m_pcccCallback->Release();
  65. } // if: the callback interface pointer is not NULL
  66. if ( m_bstrName != NULL )
  67. {
  68. TraceSysFreeString( m_bstrName );
  69. }
  70. if ( m_rgDependencies != NULL )
  71. {
  72. TraceFree( m_rgDependencies );
  73. }
  74. if ( m_rgDependents != NULL )
  75. {
  76. THR( ClearDependents() );
  77. }
  78. if ( m_groupHandle != NULL )
  79. {
  80. m_groupHandle->Release();
  81. }
  82. if ( m_hResource != NULL )
  83. {
  84. CloseClusterResource( m_hResource );
  85. }
  86. TraceFuncExit();
  87. } //*** CResourceEntry::~CResourceEntry
  88. //////////////////////////////////////////////////////////////////////////////
  89. //++
  90. //
  91. // CResourceEntry::S_HrCreateInstance
  92. //
  93. // Description:
  94. // Creates a CResourceEntry instance.
  95. //
  96. // Arguments:
  97. // pcrtiResTypeInfoIn
  98. // Pointer to structure that contains information about this
  99. // resource type.
  100. //
  101. // ppunkOut
  102. // The IUnknown interface of the new object.
  103. //
  104. // Return Values:
  105. // S_OK
  106. // Success.
  107. //
  108. // E_OUTOFMEMORY
  109. // Not enough memory to create the object.
  110. //
  111. // other HRESULTs
  112. // Object initialization failed.
  113. //
  114. //--
  115. //////////////////////////////////////////////////////////////////////////////
  116. HRESULT
  117. CResourceEntry::S_HrCreateInstance(
  118. CResourceEntry ** ppcreOut
  119. , IClusCfgCallback * pcccCallback
  120. , LCID lcidIn
  121. )
  122. {
  123. TraceFunc( "" );
  124. HRESULT hr = S_OK;
  125. CResourceEntry * pResEntry = NULL;
  126. Assert( ppcreOut != NULL );
  127. if ( ppcreOut == NULL )
  128. {
  129. hr = THR( E_POINTER );
  130. goto Cleanup;
  131. }
  132. pResEntry = new CResourceEntry;
  133. if ( pResEntry == NULL )
  134. {
  135. hr = THR( E_OUTOFMEMORY );
  136. goto Cleanup;
  137. }
  138. hr = THR( pResEntry->HrInit( pcccCallback, lcidIn ) );
  139. if ( FAILED( hr ) )
  140. {
  141. delete pResEntry;
  142. goto Cleanup;
  143. }
  144. *ppcreOut = pResEntry;
  145. Cleanup:
  146. HRETURN( hr );
  147. } //*** CResourceEntry::S_HrCreateInstance
  148. //////////////////////////////////////////////////////////////////////////////
  149. //
  150. // STDMETHODIMP
  151. // CResourceEntry::HrInit(
  152. // IClusCfgCallback * pcccCallback
  153. // )
  154. //
  155. //////////////////////////////////////////////////////////////////////////////
  156. STDMETHODIMP
  157. CResourceEntry::HrInit(
  158. IClusCfgCallback * pcccCallback
  159. , LCID lcidIn
  160. )
  161. {
  162. TraceFunc( "" );
  163. HRESULT hr = S_OK;
  164. pcccCallback->AddRef();
  165. m_pcccCallback = pcccCallback;
  166. m_lcid = lcidIn;
  167. HRETURN( hr );
  168. } //*** CResourceEntry::HrInit
  169. //****************************************************************************
  170. //
  171. // STDMETHODIMP
  172. // CResourceEntry::SendStatusReport(
  173. // LPCWSTR pcszNodeNameIn
  174. // , CLSID clsidTaskMajorIn
  175. // , CLSID clsidTaskMinorIn
  176. // , ULONG ulMinIn
  177. // , ULONG ulMaxIn
  178. // , ULONG ulCurrentIn
  179. // , HRESULT hrStatusIn
  180. // , LPCWSTR pcszDescriptionIn
  181. // , FILETIME * pftTimeIn
  182. // , LPCWSTR pcszReferenceIn
  183. // )
  184. //
  185. //****************************************************************************
  186. STDMETHODIMP
  187. CResourceEntry::SendStatusReport(
  188. LPCWSTR pcszNodeNameIn
  189. , CLSID clsidTaskMajorIn
  190. , CLSID clsidTaskMinorIn
  191. , ULONG ulMinIn
  192. , ULONG ulMaxIn
  193. , ULONG ulCurrentIn
  194. , HRESULT hrStatusIn
  195. , LPCWSTR pcszDescriptionIn
  196. , FILETIME * pftTimeIn
  197. , LPCWSTR pcszReferenceIn
  198. )
  199. {
  200. TraceFunc( "[IClusCfgCallback]" );
  201. HRESULT hr = S_OK;
  202. FILETIME ft;
  203. if ( pftTimeIn == NULL )
  204. {
  205. GetSystemTimeAsFileTime( &ft );
  206. pftTimeIn = &ft;
  207. } // if:
  208. if ( m_pcccCallback != NULL )
  209. {
  210. hr = STHR( m_pcccCallback->SendStatusReport(
  211. pcszNodeNameIn
  212. , clsidTaskMajorIn
  213. , clsidTaskMinorIn
  214. , ulMinIn
  215. , ulMaxIn
  216. , ulCurrentIn
  217. , hrStatusIn
  218. , pcszDescriptionIn
  219. , pftTimeIn
  220. , pcszReferenceIn
  221. ) );
  222. }
  223. HRETURN( hr );
  224. } //*** CResourceEntry::SendStatusReport
  225. //////////////////////////////////////////////////////////////////////////////
  226. //
  227. // STDMETHODIMP
  228. // CResourceEntry::SetName(
  229. // BSTR bstrIn
  230. // )
  231. //
  232. //////////////////////////////////////////////////////////////////////////////
  233. STDMETHODIMP
  234. CResourceEntry::SetName(
  235. BSTR bstrIn
  236. )
  237. {
  238. TraceFunc( "[IResourceEntry]" );
  239. HRESULT hr = S_OK;
  240. Assert( bstrIn != NULL );
  241. if ( m_bstrName != NULL )
  242. {
  243. TraceSysFreeString( m_bstrName );
  244. }
  245. m_bstrName = bstrIn;
  246. HRETURN( hr );
  247. } //*** CResourceEntry::SetName
  248. //////////////////////////////////////////////////////////////////////////////
  249. //
  250. // STDMETHODIMP
  251. // CResourceEntry::GetName(
  252. // BSTR * pbstrOut
  253. // )
  254. //
  255. //////////////////////////////////////////////////////////////////////////////
  256. STDMETHODIMP
  257. CResourceEntry::GetName(
  258. BSTR * pbstrOut
  259. )
  260. {
  261. TraceFunc( "[IResourceEntry]" );
  262. HRESULT hr = S_OK;
  263. Assert( pbstrOut != NULL );
  264. *pbstrOut = m_bstrName;
  265. HRETURN( hr );
  266. } //*** CResourceEntry::GetName
  267. //////////////////////////////////////////////////////////////////////////////
  268. //
  269. // STDMETHODIMP
  270. // CResourceEntry::SetAssociatedResource(
  271. // IClusCfgManagedResourceCfg * pccmrcIn
  272. // )
  273. //
  274. //////////////////////////////////////////////////////////////////////////////
  275. STDMETHODIMP
  276. CResourceEntry::SetAssociatedResource(
  277. IClusCfgManagedResourceCfg * pccmrcIn
  278. )
  279. {
  280. TraceFunc( "[IResourceEntry]" );
  281. HRESULT hr = S_OK;
  282. if ( m_pccmrcResource != NULL )
  283. {
  284. m_pccmrcResource->Release();
  285. }
  286. m_pccmrcResource = pccmrcIn;
  287. m_pccmrcResource->AddRef();
  288. HRETURN( hr );
  289. } //*** CResourceEntry::SetAssociatedResource
  290. //////////////////////////////////////////////////////////////////////////////
  291. //
  292. // STDMETHODIMP
  293. // CResourceEntry::GetAssociatedResource(
  294. // IClusCfgManagedResourceCfg ** ppccmrcOut
  295. // )
  296. //
  297. //////////////////////////////////////////////////////////////////////////////
  298. STDMETHODIMP
  299. CResourceEntry::GetAssociatedResource(
  300. IClusCfgManagedResourceCfg ** ppccmrcOut
  301. )
  302. {
  303. TraceFunc( "[IResourceEntry]" );
  304. HRESULT hr;
  305. if ( m_pccmrcResource != NULL )
  306. {
  307. *ppccmrcOut = m_pccmrcResource;
  308. (*ppccmrcOut)->AddRef();
  309. hr = S_OK;
  310. }
  311. else
  312. {
  313. hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA );
  314. }
  315. HRETURN( hr );
  316. } //*** CResourceEntry::GetAssociatedResource
  317. //////////////////////////////////////////////////////////////////////////////
  318. //
  319. // STDMETHODIMP
  320. // CResourceEntry::SetType(
  321. // const CLSID * pclsidIn
  322. // )
  323. //
  324. //////////////////////////////////////////////////////////////////////////////
  325. STDMETHODIMP
  326. CResourceEntry::SetType(
  327. const CLSID * pclsidIn
  328. )
  329. {
  330. TraceFunc( "[IResourceEntry]" );
  331. HRESULT hr = S_OK;
  332. m_clsidType = * pclsidIn;
  333. HRETURN( hr );
  334. } //*** CResourceEntry::SetType
  335. //////////////////////////////////////////////////////////////////////////////
  336. //
  337. // STDMETHODIMP
  338. // CResourceEntry::GetType(
  339. // CLSID * pclsidOut
  340. // )
  341. //
  342. //////////////////////////////////////////////////////////////////////////////
  343. STDMETHODIMP
  344. CResourceEntry::GetType(
  345. CLSID * pclsidOut
  346. )
  347. {
  348. TraceFunc( "[IResourceEntry]" );
  349. HRESULT hr = S_OK;
  350. *pclsidOut = m_clsidType;
  351. HRETURN( hr );
  352. } //*** CResourceEntry::GetType
  353. //////////////////////////////////////////////////////////////////////////////
  354. //
  355. // STDMETHODIMP
  356. // CResourceEntry::GetTypePtr(
  357. // const CLSID ** ppclsidOut
  358. // )
  359. //
  360. //////////////////////////////////////////////////////////////////////////////
  361. STDMETHODIMP
  362. CResourceEntry::GetTypePtr(
  363. const CLSID ** ppclsidOut
  364. )
  365. {
  366. TraceFunc( "[IResourceEntry]" );
  367. HRESULT hr = S_OK;
  368. Assert( ppclsidOut != NULL );
  369. *ppclsidOut = &m_clsidType;
  370. HRETURN( hr );
  371. } //*** CResourceEntry:: GetTypePtr
  372. //////////////////////////////////////////////////////////////////////////////
  373. //
  374. // STDMETHODIMP
  375. // CResourceEntry::SetClassType(
  376. // const CLSID * pclsidIn
  377. // )
  378. //
  379. //////////////////////////////////////////////////////////////////////////////
  380. STDMETHODIMP
  381. CResourceEntry::SetClassType(
  382. const CLSID * pclsidIn
  383. )
  384. {
  385. TraceFunc( "[IResourceEntry]" );
  386. HRESULT hr = S_OK;
  387. m_clsidClassType = *pclsidIn;
  388. HRETURN( hr );
  389. } //*** CResourceEntry::SetClassType
  390. //////////////////////////////////////////////////////////////////////////////
  391. //
  392. // STDMETHODIMP
  393. // CResourceEntry::GetClassType(
  394. // CLSID * pclsidOut
  395. // )
  396. //
  397. //////////////////////////////////////////////////////////////////////////////
  398. STDMETHODIMP
  399. CResourceEntry::GetClassType(
  400. CLSID * pclsidOut
  401. )
  402. {
  403. TraceFunc( "[IResourceEntry]" );
  404. HRESULT hr = S_OK;
  405. *pclsidOut = m_clsidClassType;
  406. HRETURN( hr );
  407. } //*** CResourceEntry::GetClassType
  408. //////////////////////////////////////////////////////////////////////////////
  409. //
  410. // STDMETHODIMP
  411. // CResourceEntry::GetClassTypePtr(
  412. // const CLSID ** ppclsidOut
  413. // )
  414. //
  415. //////////////////////////////////////////////////////////////////////////////
  416. STDMETHODIMP
  417. CResourceEntry::GetClassTypePtr(
  418. const CLSID ** ppclsidOut
  419. )
  420. {
  421. TraceFunc( "[IResourceEntry]" );
  422. HRESULT hr = S_OK;
  423. Assert( ppclsidOut != NULL );
  424. *ppclsidOut = &m_clsidClassType;
  425. HRETURN( hr );
  426. } //*** CResourceEntry::GetClassTypePtr
  427. //////////////////////////////////////////////////////////////////////////////
  428. //
  429. // STDMETHODIMP
  430. // CResourceEntry::SetFlags(
  431. // EDependencyFlags dfIn
  432. // )
  433. //
  434. //////////////////////////////////////////////////////////////////////////////
  435. STDMETHODIMP
  436. CResourceEntry::SetFlags(
  437. EDependencyFlags dfIn
  438. )
  439. {
  440. TraceFunc( "[IResourceEntry]" );
  441. HRESULT hr = S_OK;
  442. m_dfFlags = dfIn;
  443. HRETURN( hr );
  444. } //*** CResourceEntry::SetFlags
  445. //////////////////////////////////////////////////////////////////////////////
  446. //
  447. // STDMETHODIMP
  448. // CResourceEntry::GetFlags(
  449. // EDependencyFlags * pdfOut
  450. // )
  451. //
  452. //////////////////////////////////////////////////////////////////////////////
  453. STDMETHODIMP
  454. CResourceEntry::GetFlags(
  455. EDependencyFlags * pdfOut
  456. )
  457. {
  458. TraceFunc( "[IResourceEntry]" );
  459. HRESULT hr = S_OK;
  460. Assert( pdfOut != NULL );
  461. *pdfOut = m_dfFlags;
  462. HRETURN( hr );
  463. } //*** CResourceEntry::GetFlags
  464. //////////////////////////////////////////////////////////////////////////////
  465. //
  466. // STDMETHODIMP
  467. // CResourceEntry::AddTypeDependency(
  468. // const CLSID * pclsidIn,
  469. // EDependencyFlags dfIn
  470. // )
  471. //
  472. //////////////////////////////////////////////////////////////////////////////
  473. STDMETHODIMP
  474. CResourceEntry::AddTypeDependency(
  475. const CLSID * pclsidIn,
  476. EDependencyFlags dfIn
  477. )
  478. {
  479. TraceFunc( "[IResourceEntry]" );
  480. HRESULT hr = S_OK;
  481. if ( m_cAllocedDependencies == 0 )
  482. {
  483. m_rgDependencies = (DependencyEntry *) TraceAlloc( HEAP_ZERO_MEMORY, sizeof(DependencyEntry) * DEPENDENCY_INCREMENT );
  484. if ( m_rgDependencies == NULL )
  485. goto OutOfMemory;
  486. m_cAllocedDependencies = DEPENDENCY_INCREMENT;
  487. Assert( m_cDependencies == 0 );
  488. }
  489. else if ( m_cDependencies == m_cAllocedDependencies )
  490. {
  491. DependencyEntry * pdepends;
  492. pdepends = (DependencyEntry *) TraceAlloc( HEAP_ZERO_MEMORY, sizeof(DependencyEntry) * ( m_cAllocedDependencies + DEPENDENCY_INCREMENT ) );
  493. if ( pdepends == NULL )
  494. goto OutOfMemory;
  495. CopyMemory( pdepends, m_rgDependencies, sizeof(DependencyEntry) * m_cAllocedDependencies );
  496. TraceFree( m_rgDependencies );
  497. m_rgDependencies = pdepends;
  498. }
  499. m_rgDependencies[ m_cDependencies ].clsidType = *pclsidIn;
  500. m_rgDependencies[ m_cDependencies ].dfFlags = (EDependencyFlags) dfIn;
  501. m_cDependencies++;
  502. Cleanup:
  503. HRETURN( hr );
  504. OutOfMemory:
  505. hr = E_OUTOFMEMORY;
  506. goto Cleanup;
  507. } //*** CResourceEntry::AddTypeDependency
  508. //////////////////////////////////////////////////////////////////////////////
  509. //
  510. // STDMETHODIMP
  511. // CResourceEntry::GetCountOfTypeDependencies(
  512. // ULONG * pcOut
  513. // )
  514. //
  515. //////////////////////////////////////////////////////////////////////////////
  516. STDMETHODIMP
  517. CResourceEntry::GetCountOfTypeDependencies(
  518. ULONG * pcOut
  519. )
  520. {
  521. TraceFunc( "[IResourceEntry]" );
  522. HRESULT hr = S_OK;
  523. Assert( pcOut != NULL );
  524. *pcOut = m_cDependencies;
  525. HRETURN( hr );
  526. } //*** CResourceEntry::GetCountOfTypeDependencies
  527. //////////////////////////////////////////////////////////////////////////////
  528. //
  529. // STDMETHODIMP
  530. // CResourceEntry::GetTypeDependency(
  531. // ULONG idxIn,
  532. // const CLSID * pclsidOut,
  533. // EDependencyFlags * dfOut
  534. // )
  535. //
  536. //////////////////////////////////////////////////////////////////////////////
  537. STDMETHODIMP
  538. CResourceEntry::GetTypeDependency(
  539. ULONG idxIn,
  540. CLSID * pclsidOut,
  541. EDependencyFlags * dfOut
  542. )
  543. {
  544. TraceFunc( "[IResourceEntry]" );
  545. HRESULT hr = S_OK;
  546. Assert( pclsidOut != NULL );
  547. Assert( dfOut != NULL );
  548. Assert( idxIn < m_cDependencies );
  549. *pclsidOut = m_rgDependencies[ idxIn ].clsidType;
  550. *dfOut = m_rgDependencies[ idxIn ].dfFlags;
  551. HRETURN( hr );
  552. } //*** CResourceEntry::GetTypeDependency
  553. //////////////////////////////////////////////////////////////////////////////
  554. //
  555. // STDMETHODIMP
  556. // CResourceEntry::GetTypeDependencyPtr(
  557. // ULONG idxIn,
  558. // const CLSID ** ppclsidOut,
  559. // EDependencyFlags * dfOut
  560. // )
  561. //
  562. //////////////////////////////////////////////////////////////////////////////
  563. STDMETHODIMP
  564. CResourceEntry::GetTypeDependencyPtr(
  565. ULONG idxIn,
  566. const CLSID ** ppclsidOut,
  567. EDependencyFlags * dfOut
  568. )
  569. {
  570. TraceFunc( "[IResourceEntry]" );
  571. HRESULT hr = S_OK;
  572. Assert( ppclsidOut != NULL );
  573. Assert( dfOut != NULL );
  574. Assert( idxIn < m_cDependencies );
  575. *ppclsidOut = &m_rgDependencies[ idxIn ].clsidType;
  576. *dfOut = m_rgDependencies[ idxIn ].dfFlags;
  577. HRETURN( hr );
  578. } //*** CResourceEntry::GetTypeDependencyPtr
  579. //////////////////////////////////////////////////////////////////////////////
  580. //
  581. // STDMETHODIMP
  582. // CResourceEntry::AddDependent(
  583. // ULONG idxIn,
  584. // EDependencyFlags dfFlagsIn
  585. // )
  586. //
  587. //////////////////////////////////////////////////////////////////////////////
  588. STDMETHODIMP
  589. CResourceEntry::AddDependent(
  590. ULONG idxIn,
  591. EDependencyFlags dfFlagsIn
  592. )
  593. {
  594. TraceFunc( "[IResourceEntry]" );
  595. HRESULT hr = S_OK;
  596. if ( m_cAllocedDependents == 0 )
  597. {
  598. m_rgDependents = (DependentEntry *) TraceAlloc( HEAP_ZERO_MEMORY, sizeof(DependentEntry) * DEPENDENCY_INCREMENT );
  599. if ( m_rgDependents == NULL )
  600. goto OutOfMemory;
  601. m_cAllocedDependents = DEPENDENCY_INCREMENT;
  602. Assert( m_cDependents == 0 );
  603. } // if: no dependency buffer allocated yet
  604. else if ( m_cDependents == m_cAllocedDependents )
  605. {
  606. DependentEntry * pdepends;
  607. pdepends = (DependentEntry *) TraceAlloc( HEAP_ZERO_MEMORY, sizeof(DependentEntry) * ( m_cAllocedDependents + DEPENDENCY_INCREMENT ) );
  608. if ( pdepends == NULL )
  609. goto OutOfMemory;
  610. CopyMemory( pdepends, m_rgDependents, sizeof(DependentEntry) * m_cAllocedDependents );
  611. TraceFree( m_rgDependents );
  612. m_rgDependents = pdepends;
  613. } // else if: no space left in the dependency buffer
  614. m_rgDependents[ m_cDependents ].idxResource = idxIn;
  615. m_rgDependents[ m_cDependents ].dfFlags = dfFlagsIn;
  616. m_cDependents++;
  617. Cleanup:
  618. HRETURN( hr );
  619. OutOfMemory:
  620. hr = E_OUTOFMEMORY;
  621. goto Cleanup;
  622. } //*** CResourceEntry::AddDependent
  623. //////////////////////////////////////////////////////////////////////////////
  624. //
  625. // STDMETHODIMP
  626. // CResourceEntry::GetCountOfDependents(
  627. // ULONG * pcOut
  628. // )
  629. //
  630. //////////////////////////////////////////////////////////////////////////////
  631. STDMETHODIMP
  632. CResourceEntry::GetCountOfDependents(
  633. ULONG * pcOut
  634. )
  635. {
  636. TraceFunc( "[IResourceEntry]" );
  637. HRESULT hr = S_OK;
  638. Assert( pcOut != NULL );
  639. *pcOut = m_cDependents;
  640. HRETURN( hr );
  641. } //*** CResourceEntry::GetCountOfDependents
  642. //////////////////////////////////////////////////////////////////////////////
  643. //
  644. // STDMETHODIMP
  645. // CResourceEntry::GetDependent(
  646. // ULONG idxIn,
  647. // ULONG * pidxOut
  648. // EDependencyFlags * pdfOut
  649. // )
  650. //
  651. //////////////////////////////////////////////////////////////////////////////
  652. STDMETHODIMP
  653. CResourceEntry::GetDependent(
  654. ULONG idxIn,
  655. ULONG * pidxOut,
  656. EDependencyFlags * pdfOut
  657. )
  658. {
  659. TraceFunc( "[IResourceEntry]" );
  660. HRESULT hr = S_OK;
  661. Assert( idxIn < m_cDependents );
  662. Assert( pidxOut != NULL );
  663. Assert( pdfOut != NULL );
  664. *pidxOut = m_rgDependents[ idxIn ].idxResource;
  665. *pdfOut = m_rgDependents[ idxIn ].dfFlags;
  666. HRETURN( hr );
  667. } //*** CResourceEntry::GetDependent
  668. //////////////////////////////////////////////////////////////////////////////
  669. //
  670. // STDMETHODIMP
  671. // CResourceEntry::ClearDependents( void )
  672. //
  673. //////////////////////////////////////////////////////////////////////////////
  674. STDMETHODIMP
  675. CResourceEntry::ClearDependents( void )
  676. {
  677. TraceFunc( "[IResourceEntry]" );
  678. HRESULT hr = S_OK;
  679. TraceFree( m_rgDependents );
  680. m_cAllocedDependents = 0;
  681. m_cDependents = 0;
  682. HRETURN( hr );
  683. } //*** CResourceEntry::ClearDependents
  684. //////////////////////////////////////////////////////////////////////////////
  685. //
  686. // STDMETHODIMP
  687. // CResourceEntry::SetGroupHandle(
  688. // HGROUP hGroupIn
  689. // )
  690. //
  691. //////////////////////////////////////////////////////////////////////////////
  692. STDMETHODIMP
  693. CResourceEntry::SetGroupHandle(
  694. CGroupHandle * pghIn
  695. )
  696. {
  697. TraceFunc( "[IResourceEntry]" );
  698. HRESULT hr = S_OK;
  699. Assert( pghIn != NULL );
  700. if ( m_groupHandle != NULL )
  701. {
  702. m_groupHandle->Release();
  703. }
  704. m_groupHandle = pghIn;
  705. m_groupHandle->AddRef();
  706. HRETURN( hr );
  707. } //*** CResourceEntry::SetGroupHandle
  708. //////////////////////////////////////////////////////////////////////////////
  709. //
  710. // STDMETHODIMP
  711. // CResourceEntry::GetGroupHandle(
  712. // CGroupHandle ** pghIn
  713. // )
  714. //
  715. //////////////////////////////////////////////////////////////////////////////
  716. STDMETHODIMP
  717. CResourceEntry::GetGroupHandle(
  718. CGroupHandle ** pghOut
  719. )
  720. {
  721. TraceFunc( "[IResourceEntry]" );
  722. HRESULT hr = S_OK;
  723. Assert( pghOut != NULL );
  724. *pghOut = m_groupHandle;
  725. if ( *pghOut != NULL )
  726. {
  727. (*pghOut)->AddRef();
  728. }
  729. HRETURN( hr );
  730. } //*** CResourceEntry::GetGroupHandle
  731. //////////////////////////////////////////////////////////////////////////////
  732. //
  733. // STDMETHODIMP
  734. // CResourceEntry::SetHResource(
  735. // HRESOURCE hResourceIn
  736. // )
  737. //
  738. //////////////////////////////////////////////////////////////////////////////
  739. STDMETHODIMP
  740. CResourceEntry::SetHResource(
  741. HRESOURCE hResourceIn
  742. )
  743. {
  744. TraceFunc( "[IResourceEntry]" );
  745. HRESULT hr = S_OK;
  746. if ( m_hResource != NULL )
  747. {
  748. BOOL bRet;
  749. bRet = CloseClusterResource( m_hResource );
  750. // This shouldn't fail - and what would we do if it did?
  751. Assert( bRet );
  752. }
  753. m_hResource = hResourceIn;
  754. HRETURN( hr );
  755. } //*** CResourceEntry::SetHResource
  756. //////////////////////////////////////////////////////////////////////////////
  757. //
  758. // STDMETHODIMP
  759. // CResourceEntry::GetHResource(
  760. // HRESOURCE * phResourceOut
  761. // )
  762. //
  763. //////////////////////////////////////////////////////////////////////////////
  764. STDMETHODIMP
  765. CResourceEntry::GetHResource(
  766. HRESOURCE * phResourceOut
  767. )
  768. {
  769. TraceFunc( "[IResourceEntry]" );
  770. HRESULT hr = S_OK;
  771. Assert( phResourceOut != NULL );
  772. *phResourceOut = m_hResource;
  773. if ( *phResourceOut == NULL )
  774. {
  775. hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA );
  776. }
  777. HRETURN( hr );
  778. } //*** CResourceEntry::GetHResource
  779. //////////////////////////////////////////////////////////////////////////////
  780. //
  781. // STDMETHODIMP
  782. // CResourceEntry::SetConfigured(
  783. // BOOL fConfiguredIn
  784. // )
  785. //
  786. //////////////////////////////////////////////////////////////////////////////
  787. STDMETHODIMP
  788. CResourceEntry::SetConfigured(
  789. BOOL fConfiguredIn
  790. )
  791. {
  792. TraceFunc( "[IResourceEntry]" );
  793. HRESULT hr = S_OK;
  794. m_fConfigured = fConfiguredIn;
  795. HRETURN( hr );
  796. } //*** CResourceEntry::SetConfigured
  797. //////////////////////////////////////////////////////////////////////////////
  798. //
  799. // STDMETHODIMP
  800. // CResourceEntry::IsConfigured( void )
  801. //
  802. //////////////////////////////////////////////////////////////////////////////
  803. STDMETHODIMP
  804. CResourceEntry::IsConfigured( void )
  805. {
  806. TraceFunc( "[IResourceEntry]" );
  807. HRESULT hr;
  808. if ( m_fConfigured )
  809. {
  810. hr = S_OK;
  811. }
  812. else
  813. {
  814. hr = S_FALSE;
  815. }
  816. HRETURN( hr );
  817. } //*** CResourceEntry::IsConfigured
  818. //////////////////////////////////////////////////////////////////////////////
  819. //
  820. // STDMETHODIMP
  821. // CResourceEntry::StoreClusterResourceControl(
  822. // DWORD dwClusCtlIn
  823. // , CClusPropList & rcplIn
  824. // )
  825. //
  826. //////////////////////////////////////////////////////////////////////////////
  827. STDMETHODIMP
  828. CResourceEntry::StoreClusterResourceControl(
  829. DWORD dwClusCtlIn
  830. , CClusPropList & rcplIn
  831. )
  832. {
  833. TraceFunc( "[IResourceEntry]" );
  834. HRESULT hr = S_OK;
  835. DWORD sc;
  836. if ( dwClusCtlIn == CLUSCTL_RESOURCE_SET_PRIVATE_PROPERTIES )
  837. {
  838. sc = TW32( m_cplPrivProps.ScAppend( rcplIn ) );
  839. if ( sc != ERROR_SUCCESS )
  840. {
  841. hr = HRESULT_FROM_WIN32( sc );
  842. goto Cleanup;
  843. } // if:
  844. }
  845. else if ( dwClusCtlIn == CLUSCTL_RESOURCE_SET_COMMON_PROPERTIES )
  846. {
  847. sc = TW32( m_cplCommonProps.ScAppend( rcplIn ) );
  848. if ( sc != ERROR_SUCCESS )
  849. {
  850. hr = HRESULT_FROM_WIN32( sc );
  851. goto Cleanup;
  852. } // if:
  853. }
  854. else
  855. {
  856. hr = THR( E_INVALIDARG );
  857. } // else:
  858. Cleanup:
  859. HRETURN( hr );
  860. } //*** CResourceEntry::StoreClusterResourceControl
  861. //////////////////////////////////////////////////////////////////////////////
  862. //++
  863. //
  864. // CResourceEntry::Configure
  865. //
  866. // Description:
  867. //
  868. // Arguments:
  869. // None.
  870. //
  871. // Return Values:
  872. // S_OK
  873. // Other HRESULTs based on return values from ClusterResourceControl.
  874. //
  875. //--
  876. //////////////////////////////////////////////////////////////////////////////
  877. STDMETHODIMP
  878. CResourceEntry::Configure( void )
  879. {
  880. TraceFunc( "[IResourceEntry]" );
  881. Assert( m_hResource != NULL );
  882. HRESULT hr = S_OK;
  883. DWORD sc;
  884. CLUSPROP_LIST * pcpl = NULL;
  885. size_t cbcpl;
  886. //
  887. // Set private properties
  888. //
  889. if ( m_cplPrivProps.BIsListEmpty() == FALSE )
  890. {
  891. pcpl = m_cplPrivProps.Plist();
  892. Assert( pcpl != NULL );
  893. STATUS_REPORT_POSTCFG(
  894. TASKID_Major_Configure_Resources
  895. , TASKID_Minor_CResourceEntry_Configure_Private
  896. , IDS_TASKID_MINOR_SETTING_PRIVATE_PROPERTIES
  897. , hr
  898. );
  899. cbcpl = m_cplPrivProps.CbPropList();
  900. sc = ClusterResourceControl(
  901. m_hResource
  902. , NULL
  903. , CLUSCTL_RESOURCE_SET_PRIVATE_PROPERTIES
  904. , pcpl
  905. , static_cast< DWORD >( cbcpl )
  906. , NULL
  907. , NULL
  908. , NULL
  909. );
  910. if ( sc == ERROR_RESOURCE_PROPERTIES_STORED )
  911. {
  912. LogMsg( "[PC-ResourceEntry] Private properties set successfully for resource '%ws'. Status code = ERROR_RESOURCE_PROPERTIES_STORED.", m_bstrName );
  913. sc = ERROR_SUCCESS;
  914. }
  915. else if ( sc != ERROR_SUCCESS )
  916. {
  917. hr = HRESULT_FROM_WIN32( TW32( sc ) );
  918. LogMsg( "[PC-ResourceEntry] ClusterResourceControl( CLUSCTL_RESOURCE_SET_PRIVATE_PROPERTIES ) failed for resource '%ws'. (sc=%#08x)", m_bstrName, sc );
  919. STATUS_REPORT_MINOR_POSTCFG1(
  920. TASKID_Minor_CResourceEntry_Configure_Private
  921. , IDS_TASKID_MINOR_ERROR_PRIV_RESCONTROL
  922. , hr
  923. , m_bstrName
  924. );
  925. goto Cleanup;
  926. } // else if: error setting private properties
  927. } // if: there are private properties to set
  928. //
  929. // Set common properties.
  930. //
  931. if ( m_cplCommonProps.BIsListEmpty() == FALSE )
  932. {
  933. pcpl = m_cplCommonProps.Plist();
  934. Assert( pcpl != NULL );
  935. STATUS_REPORT_POSTCFG(
  936. TASKID_Major_Configure_Resources
  937. , TASKID_Minor_CResourceEntry_Configure_Common
  938. , IDS_TASKID_MINOR_SETTING_COMMON_PROPERTIES
  939. , hr
  940. );
  941. cbcpl = m_cplCommonProps.CbPropList();
  942. sc = ClusterResourceControl(
  943. m_hResource
  944. , NULL
  945. , CLUSCTL_RESOURCE_SET_COMMON_PROPERTIES
  946. , pcpl
  947. , static_cast< DWORD >( cbcpl )
  948. , NULL
  949. , NULL
  950. , NULL
  951. );
  952. if ( sc == ERROR_RESOURCE_PROPERTIES_STORED )
  953. {
  954. LogMsg( "[PC-ResourceEntry] Common properties set successfully for resource '%ws'. Status code = ERROR_RESOURCE_PROPERTIES_STORED.", m_bstrName );
  955. sc = ERROR_SUCCESS;
  956. }
  957. else if ( sc != ERROR_SUCCESS )
  958. {
  959. hr = HRESULT_FROM_WIN32( TW32( sc ) );
  960. LogMsg( "[PC-ResourceEntry] ClusterResourceControl( CLUSCTL_RESOURCE_SET_COMMON_PROPERTIES ) failed for resource '%ws'. (sc=%#08x)", m_bstrName, sc );
  961. STATUS_REPORT_MINOR_POSTCFG1(
  962. TASKID_Minor_CResourceEntry_Configure_Common
  963. , IDS_TASKID_MINOR_ERROR_COMMON_RESCONTROL
  964. , hr
  965. , m_bstrName
  966. );
  967. goto Cleanup;
  968. } // else if: error setting common properties
  969. } // if: there are common properties to set
  970. Cleanup:
  971. HRETURN( hr );
  972. } //*** CResourceEntry::Configure