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.

279 lines
5.8 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // GroupHandle.cpp
  7. //
  8. // Description:
  9. // Object Manager implementation.
  10. //
  11. // Documentation:
  12. // Yes.
  13. //
  14. // Maintained By:
  15. // Geoffrey Pease (GPease) 22-NOV-1999
  16. //
  17. //////////////////////////////////////////////////////////////////////////////
  18. #include "pch.h"
  19. #include "GroupHandle.h"
  20. DEFINE_THISCLASS("CGroupHandle")
  21. // ************************************************************************
  22. //
  23. // Constructor / Destructor
  24. //
  25. // ************************************************************************
  26. //////////////////////////////////////////////////////////////////////////////
  27. //
  28. // HRESULT
  29. // CGroupHandle::S_HrCreateInstance(
  30. // CGroupHandle ** ppunkOut,
  31. // HGROUP hGroupIn
  32. // )
  33. //
  34. //////////////////////////////////////////////////////////////////////////////
  35. HRESULT
  36. CGroupHandle::S_HrCreateInstance(
  37. CGroupHandle ** ppunkOut,
  38. HGROUP hGroupIn
  39. )
  40. {
  41. TraceFunc( "" );
  42. HRESULT hr;
  43. Assert( ppunkOut != NULL );
  44. CGroupHandle * pGroupHandle = new CGroupHandle;
  45. if ( pGroupHandle != NULL )
  46. {
  47. hr = THR( pGroupHandle->Init( hGroupIn ) );
  48. if ( SUCCEEDED( hr ) )
  49. {
  50. *ppunkOut = pGroupHandle;
  51. (*ppunkOut)->AddRef( );
  52. }
  53. pGroupHandle->Release( );
  54. }
  55. else
  56. {
  57. hr = E_OUTOFMEMORY;
  58. }
  59. HRETURN( hr );
  60. } // S_HrCreateInstance( )
  61. //////////////////////////////////////////////////////////////////////////////
  62. //
  63. // CGroupHandle::CGroupHandle( void )
  64. //
  65. //////////////////////////////////////////////////////////////////////////////
  66. CGroupHandle::CGroupHandle( void )
  67. {
  68. TraceFunc( "" );
  69. InterlockedIncrement( &g_cObjects );
  70. TraceFuncExit();
  71. } // CGroupHandle( )
  72. //////////////////////////////////////////////////////////////////////////////
  73. //
  74. // STDMETHODIMP
  75. // CGroupHandle::Init(
  76. // HGROUP hGroupIn
  77. // )
  78. //
  79. //////////////////////////////////////////////////////////////////////////////
  80. STDMETHODIMP
  81. CGroupHandle::Init(
  82. HGROUP hGroupIn
  83. )
  84. {
  85. TraceFunc( "" );
  86. HRESULT hr = S_OK;
  87. // IUnknown stuff
  88. Assert( m_cRef == 0 );
  89. AddRef( ); // Add one count
  90. // IPrivateGroupHandle
  91. Assert( m_hGroup == NULL );
  92. m_hGroup = hGroupIn;
  93. HRETURN( hr );
  94. } // Init( )
  95. //////////////////////////////////////////////////////////////////////////////
  96. //
  97. // CGroupHandle::~CGroupHandle( )
  98. //
  99. //////////////////////////////////////////////////////////////////////////////
  100. CGroupHandle::~CGroupHandle( )
  101. {
  102. TraceFunc( "" );
  103. if ( m_hGroup != NULL )
  104. {
  105. CloseClusterGroup( m_hGroup );
  106. }
  107. InterlockedDecrement( &g_cObjects );
  108. TraceFuncExit();
  109. } // ~CGroupHandle( )
  110. // ************************************************************************
  111. //
  112. // IUnknown
  113. //
  114. // ************************************************************************
  115. //////////////////////////////////////////////////////////////////////////////
  116. //
  117. // STDMETHODIMP
  118. // CGroupHandle::QueryInterface(
  119. // REFIID riid,
  120. // LPVOID *ppv
  121. // )
  122. //
  123. //////////////////////////////////////////////////////////////////////////////
  124. STDMETHODIMP
  125. CGroupHandle::QueryInterface(
  126. REFIID riid,
  127. LPVOID *ppv
  128. )
  129. {
  130. TraceQIFunc( riid, ppv );
  131. HRESULT hr = E_NOINTERFACE;
  132. if ( IsEqualIID( riid, IID_IUnknown ) )
  133. {
  134. *ppv = static_cast< IUnknown * >( this );
  135. hr = S_OK;
  136. } // if: IUnknown
  137. #if 0
  138. else if ( IsEqualIID( riid, IID_IGroupHandle ) )
  139. {
  140. *ppv = TraceInterface( __THISCLASS__, IGroupHandle, this, 0 );
  141. hr = S_OK;
  142. } // else if: IGroupHandle
  143. #endif
  144. if ( SUCCEEDED( hr ) )
  145. {
  146. ((IUnknown*) *ppv)->AddRef( );
  147. } // if: success
  148. QIRETURN( hr, riid );
  149. } // QueryInterface( )
  150. //////////////////////////////////////////////////////////////////////////////
  151. //
  152. // STDMETHODIMP_(ULONG)
  153. // CGroupHandle::AddRef( void )
  154. //
  155. //////////////////////////////////////////////////////////////////////////////
  156. STDMETHODIMP_(ULONG)
  157. CGroupHandle::AddRef( void )
  158. {
  159. TraceFunc( "[IUnknown]" );
  160. InterlockedIncrement( &m_cRef );
  161. RETURN( m_cRef );
  162. } // AddRef( )
  163. //////////////////////////////////////////////////////////////////////////////
  164. //
  165. // STDMETHODIMP_(ULONG)
  166. // CGroupHandle::Release( void )
  167. //
  168. //////////////////////////////////////////////////////////////////////////////
  169. STDMETHODIMP_(ULONG)
  170. CGroupHandle::Release( void )
  171. {
  172. TraceFunc( "[IUnknown]" );
  173. InterlockedDecrement( &m_cRef );
  174. if ( m_cRef )
  175. RETURN( m_cRef );
  176. TraceDo( delete this );
  177. RETURN(0);
  178. } // Release( )
  179. //****************************************************************************
  180. //
  181. // IPrivateGroupHandle
  182. //
  183. //****************************************************************************
  184. //////////////////////////////////////////////////////////////////////////////
  185. //
  186. // STDMETHODIMP
  187. // CGroupHandle::SetHandle(
  188. // HGROUP hGroupIn
  189. // )
  190. //
  191. //////////////////////////////////////////////////////////////////////////////
  192. STDMETHODIMP
  193. CGroupHandle::SetHandle(
  194. HGROUP hGroupIn
  195. )
  196. {
  197. TraceFunc( "[IPrivateGroupHandle]" );
  198. HRESULT hr = S_OK;
  199. m_hGroup = hGroupIn;
  200. HRETURN( hr );
  201. } // SetHandle( )
  202. //////////////////////////////////////////////////////////////////////////////
  203. //
  204. // STDMETHODIMP
  205. // CGroupHandle::GetHandle(
  206. // HGROUP * phGroupOut
  207. // )
  208. //
  209. //////////////////////////////////////////////////////////////////////////////
  210. STDMETHODIMP
  211. CGroupHandle::GetHandle(
  212. HGROUP * phGroupOut
  213. )
  214. {
  215. TraceFunc( "[IPrivateGroupHandle]" );
  216. HRESULT hr = S_OK;
  217. Assert( phGroupOut != NULL );
  218. *phGroupOut = m_hGroup;
  219. HRETURN( hr );
  220. } // GetHandle( )