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.

332 lines
7.1 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2001 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // Callback.cpp
  7. //
  8. // Description:
  9. // This file contains the implementation of the Callback
  10. // class.
  11. //
  12. // Maintained By:
  13. // Galen Barbee (GalenB) 12-DEC-2000
  14. //
  15. //////////////////////////////////////////////////////////////////////////////
  16. //////////////////////////////////////////////////////////////////////////////
  17. // Include Files
  18. //////////////////////////////////////////////////////////////////////////////
  19. // The precompiled header for this library
  20. #include "Pch.h"
  21. #include "Callback.h"
  22. //////////////////////////////////////////////////////////////////////////////
  23. //++
  24. //
  25. // Callback::Callback
  26. //
  27. // Description:
  28. // Constructor of the Callback class. This initializes
  29. // the m_cRef variable to 1 instead of 0 to account of possible
  30. // QueryInterface failure in DllGetClassObject.
  31. //
  32. // Arguments:
  33. // None.
  34. //
  35. // Return Value:
  36. // None.
  37. //
  38. // Remarks:
  39. // None.
  40. //
  41. //--
  42. //////////////////////////////////////////////////////////////////////////////
  43. Callback::Callback( void )
  44. : m_cRef( 1 )
  45. {
  46. } //*** Callback::Callback
  47. //////////////////////////////////////////////////////////////////////////////
  48. //++
  49. //
  50. // Callback::~Callback
  51. //
  52. // Description:
  53. // Destructor of the Callback class.
  54. //
  55. // Arguments:
  56. // None.
  57. //
  58. // Return Value:
  59. // None.
  60. //
  61. // Remarks:
  62. // None.
  63. //
  64. //--
  65. //////////////////////////////////////////////////////////////////////////////
  66. Callback::~Callback( void )
  67. {
  68. } //*** Callback::~Callback
  69. //////////////////////////////////////////////////////////////////////////////
  70. //++
  71. //
  72. // HRESULT
  73. // Callback::S_HrCreateInstance(
  74. // IUnknown ** ppunkOut
  75. // )
  76. //
  77. // Description:
  78. // Creates a Callback instance.
  79. //
  80. // Arguments:
  81. // ppunkOut
  82. // The IUnknown interface to the newly create object.
  83. //
  84. // Return Values:
  85. // S_OK
  86. // Success.
  87. //
  88. // E_OUTOFMEMORY
  89. // Not enough memory to create the object.
  90. //
  91. // other HRESULTs
  92. // Object initialization failed.
  93. //
  94. //--
  95. //////////////////////////////////////////////////////////////////////////////
  96. HRESULT
  97. Callback::S_HrCreateInstance(
  98. IUnknown ** ppunkOut
  99. )
  100. {
  101. Callback * pccb;
  102. HRESULT hr;
  103. pccb = new Callback();
  104. if ( pccb != NULL )
  105. {
  106. hr = pccb->QueryInterface( IID_IUnknown, reinterpret_cast< void ** >( ppunkOut ) );
  107. pccb->Release();
  108. } // if: error allocating object
  109. else
  110. {
  111. hr = THR( E_OUTOFMEMORY );
  112. } // else: out of memory
  113. return hr;
  114. } //*** Callback::S_HrCreateInstance
  115. //////////////////////////////////////////////////////////////////////////////
  116. //++
  117. //
  118. // Callback::AddRef
  119. //
  120. // Description:
  121. // Increment the reference count of this object by one.
  122. //
  123. // Arguments:
  124. // None.
  125. //
  126. // Return Value:
  127. // The new reference count.
  128. //
  129. // Remarks:
  130. // None.
  131. //
  132. //--
  133. //////////////////////////////////////////////////////////////////////////////
  134. STDMETHODIMP_( ULONG )
  135. Callback::AddRef( void )
  136. {
  137. InterlockedIncrement( &m_cRef );
  138. return m_cRef;
  139. } //*** Callback::AddRef
  140. //////////////////////////////////////////////////////////////////////////////
  141. //++
  142. //
  143. // Callback::Release
  144. //
  145. // Description:
  146. // Decrement the reference count of this object by one.
  147. //
  148. // Arguments:
  149. // None.
  150. //
  151. // Return Value:
  152. // The new reference count.
  153. //
  154. // Remarks:
  155. // None.
  156. //
  157. //--
  158. //////////////////////////////////////////////////////////////////////////////
  159. STDMETHODIMP_( ULONG )
  160. Callback::Release( void )
  161. {
  162. LONG cRef;
  163. cRef = InterlockedDecrement( &m_cRef );
  164. if ( cRef == 0 )
  165. {
  166. delete this;
  167. } // if: reference count decremented to zero
  168. return cRef;
  169. } //*** Callback::Release
  170. //////////////////////////////////////////////////////////////////////////////
  171. //++
  172. //
  173. // Callback::QueryInterface
  174. //
  175. // Description:
  176. // Query this object for the passed in interface.
  177. //
  178. // Arguments:
  179. // riidIn
  180. // Id of interface requested.
  181. //
  182. // ppvOut
  183. // Pointer to the requested interface.
  184. //
  185. // Return Value:
  186. // S_OK
  187. // If the interface is available on this object.
  188. //
  189. // E_NOINTERFACE
  190. // If the interface is not available.
  191. //
  192. // E_POINTER
  193. // ppvOut was NULL.
  194. //
  195. // Remarks:
  196. // None.
  197. //
  198. //--
  199. //////////////////////////////////////////////////////////////////////////////
  200. STDMETHODIMP
  201. Callback::QueryInterface(
  202. REFIID riidIn
  203. , void ** ppvOut
  204. )
  205. {
  206. HRESULT hr = S_OK;
  207. //
  208. // Validate arguments.
  209. //
  210. Assert( ppvOut != NULL );
  211. if ( ppvOut == NULL )
  212. {
  213. hr = THR( E_POINTER );
  214. goto Cleanup;
  215. }
  216. //
  217. // Handle known interfaces.
  218. //
  219. if ( IsEqualIID( riidIn, IID_IUnknown ) )
  220. {
  221. *ppvOut = static_cast< IClusCfgCallback * >( this );
  222. } // if: IUnknown
  223. else if ( IsEqualIID( riidIn, IID_IClusCfgCallback ) )
  224. {
  225. *ppvOut = static_cast< IClusCfgCallback * >( this );
  226. } // else if: IClusCfgCallback
  227. else
  228. {
  229. *ppvOut = NULL;
  230. hr = E_NOINTERFACE;
  231. } // else
  232. //
  233. // Add a reference to the interface if successful.
  234. //
  235. if ( SUCCEEDED( hr ) )
  236. {
  237. ((IUnknown *) *ppvOut)->AddRef();
  238. } // if: success
  239. Cleanup:
  240. return hr;
  241. } //*** Callback::QueryInterface
  242. //////////////////////////////////////////////////////////////////////////////
  243. //++
  244. //
  245. // HRESULT
  246. // Callback::SendStatusReport
  247. //
  248. // Description:
  249. // Handle a progress notification
  250. //
  251. // Arguments:
  252. // bstrNodeNameIn
  253. // Name of the node that sent the status report.
  254. //
  255. // clsidTaskMajorIn
  256. // clsidTaskMinorIn
  257. // GUID identifying the notification.
  258. //
  259. // ulMinIn
  260. // ulMaxIn
  261. // ulCurrentIn
  262. // Values that indicate the percentage of this task that is
  263. // completed.
  264. //
  265. // hrStatusIn
  266. // Error code.
  267. //
  268. // bstrDescriptionIn
  269. // String describing the notification.
  270. //
  271. // Return Value:
  272. // Always
  273. //
  274. // Exceptions Thrown:
  275. // None.
  276. //
  277. //--
  278. //////////////////////////////////////////////////////////////////////////////
  279. HRESULT
  280. Callback::SendStatusReport(
  281. BSTR bstrNodeNameIn
  282. , CLSID clsidTaskMajorIn
  283. , CLSID clsidTaskMinorIn
  284. , ULONG ulMinIn
  285. , ULONG ulMaxIn
  286. , ULONG ulCurrentIn
  287. , HRESULT hrStatusIn
  288. , BSTR bstrDescriptionIn
  289. , FILETIME * pftTimeIn
  290. , BSTR bstrReferenceIn
  291. ) throw()
  292. {
  293. wprintf( L"Notification ( %d, %d, %d ) =>\n '%s' ( Error Code %#08x )\n", ulMinIn, ulMaxIn, ulCurrentIn, bstrDescriptionIn, hrStatusIn );
  294. return S_OK;
  295. } //*** Callback::SendStatusReport