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.

258 lines
5.8 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // SAEventFactory.cpp
  7. //
  8. // Description:
  9. // description-for-module
  10. //
  11. // [Header File:]
  12. // SAEventFactory.h
  13. //
  14. // History:
  15. // Xing Jin (i-xingj) 06-Dec-2000
  16. //
  17. //////////////////////////////////////////////////////////////////////////////
  18. #include <windows.h>
  19. #include <stdio.h>
  20. #include <wbemidl.h>
  21. #include <initguid.h>
  22. #include "SAEventFactory.h"
  23. #include "SADiskEvent.h"
  24. extern LONG g_cObj;
  25. extern LONG g_cLock;
  26. //////////////////////////////////////////////////////////////////////////////
  27. //
  28. // CSAEventFactory::CSAEventFactory
  29. //
  30. // Description:
  31. // Class constructor.
  32. //
  33. // Arguments:
  34. // [in] ClsIdIn
  35. //
  36. // History:
  37. // Xing Jin (i-xingj) 06-Dec-2000
  38. //
  39. //////////////////////////////////////////////////////////////////////////////
  40. CSAEventFactory::CSAEventFactory(
  41. const CLSID & ClsIdIn
  42. )
  43. {
  44. m_cRef = 0;
  45. m_ClsId = ClsIdIn;
  46. InterlockedIncrement( &g_cObj );
  47. }
  48. //////////////////////////////////////////////////////////////////////////////
  49. //
  50. // CSAEventFactory::CSAEventFactory
  51. //
  52. // Description:
  53. // Class deconstructor.
  54. //
  55. // History:
  56. // Xing Jin (i-xingj) 06-Dec-2000
  57. //
  58. //////////////////////////////////////////////////////////////////////////////
  59. CSAEventFactory::~CSAEventFactory()
  60. {
  61. // nothing
  62. InterlockedDecrement( &g_cObj );
  63. }
  64. //////////////////////////////////////////////////////////////////////////////
  65. //
  66. // CSAEventFactory::QueryInterface
  67. //
  68. // Description:
  69. // An method implement of IUnkown interface.
  70. //
  71. // Arguments:
  72. // [in] riidIn Identifier of the requested interface
  73. // [out ppvOut Address of output variable that receives the
  74. // interface pointer requested in iid
  75. //
  76. // Returns:
  77. // NOERROR if the interface is supported
  78. // E_NOINTERFACE if not
  79. //
  80. // History:
  81. // Xing Jin (i-xingj) 06-Dec-2000
  82. //
  83. //////////////////////////////////////////////////////////////////////////////
  84. STDMETHODIMP
  85. CSAEventFactory::QueryInterface(
  86. REFIID riidIn,
  87. LPVOID * ppvOut
  88. )
  89. {
  90. *ppvOut = NULL;
  91. if ( ( IID_IUnknown == riidIn )
  92. || ( IID_IClassFactory==riidIn ) )
  93. {
  94. *ppvOut = this;
  95. AddRef();
  96. return NOERROR;
  97. }
  98. return E_NOINTERFACE;
  99. }
  100. //////////////////////////////////////////////////////////////////////////////
  101. //
  102. // CSAEventFactory::AddRef
  103. //
  104. // Description:
  105. // increments the reference count for an interface on an object
  106. //
  107. // Returns:
  108. // The new reference count.
  109. //
  110. // History:
  111. // Xing Jin (i-xingj) 06-Dec-2000
  112. //
  113. //////////////////////////////////////////////////////////////////////////////
  114. ULONG
  115. CSAEventFactory::AddRef()
  116. {
  117. return ++m_cRef;
  118. }
  119. //////////////////////////////////////////////////////////////////////////////
  120. //
  121. // CSAEventFactory::Release
  122. //
  123. // Description:
  124. // decrements the reference count for an interface on an object.
  125. //
  126. // Returns:
  127. // The new reference count.
  128. //
  129. // History:
  130. // Xing Jin (i-xingj) 06-Dec-2000
  131. //
  132. //////////////////////////////////////////////////////////////////////////////
  133. ULONG
  134. CSAEventFactory::Release()
  135. {
  136. if (0 != --m_cRef)
  137. {
  138. return m_cRef;
  139. }
  140. delete this;
  141. return 0;
  142. }
  143. //////////////////////////////////////////////////////////////////////////////
  144. //
  145. // CSAEventFactory::CreateInstance
  146. //
  147. // Description:
  148. // Instance creation.
  149. //
  150. // Arguments:
  151. // [in] riidIn Reference to the identifier of the interface
  152. // [out] pUnkOuter Pointer to whether object is or isn't part of
  153. // an aggregate
  154. // ppvObjOut Address of output variable that receives the
  155. // interface pointer requested in riid
  156. //
  157. // History:
  158. // Xing Jin (i-xingj) 06-Dec-2000
  159. //
  160. //////////////////////////////////////////////////////////////////////////////
  161. STDMETHODIMP
  162. CSAEventFactory::CreateInstance(
  163. LPUNKNOWN pUnkOuter,
  164. REFIID riidIn,
  165. LPVOID * ppvObjOut
  166. )
  167. {
  168. IUnknown* pObj = NULL;
  169. HRESULT hr = E_OUTOFMEMORY;
  170. //
  171. // Defaults
  172. //
  173. *ppvObjOut = NULL;
  174. //
  175. // We aren't supporting aggregation.
  176. //
  177. if ( pUnkOuter )
  178. {
  179. return CLASS_E_NOAGGREGATION;
  180. }
  181. if (m_ClsId == CLSID_DiskEventProvider)
  182. {
  183. pObj = (IWbemProviderInit *) new CSADiskEvent;
  184. }
  185. if ( pObj == NULL )
  186. {
  187. return hr;
  188. }
  189. //
  190. // Initialize the object and verify that it can return the
  191. // interface in question.
  192. //
  193. hr = pObj->QueryInterface( riidIn, ppvObjOut );
  194. //
  195. // Kill the object if initial creation or Init failed.
  196. //
  197. if ( FAILED( hr ) )
  198. {
  199. delete pObj;
  200. }
  201. return hr;
  202. }
  203. //////////////////////////////////////////////////////////////////////////////
  204. //
  205. // CSAEventFactory::LockServer
  206. //
  207. // Description:
  208. // Call by client to keep server in memory.
  209. //
  210. // Arguments:
  211. // [in] fLockIn //Increments or decrements the lock count
  212. //
  213. // History:
  214. // Xing Jin (i-xingj) 06-Dec-2000
  215. //
  216. //////////////////////////////////////////////////////////////////////////////
  217. STDMETHODIMP
  218. CSAEventFactory::LockServer(
  219. BOOL fLockIn
  220. )
  221. {
  222. if ( fLockIn )
  223. {
  224. InterlockedIncrement( &g_cLock );
  225. }
  226. else
  227. {
  228. InterlockedDecrement( &g_cLock );
  229. }
  230. return NOERROR;
  231. }