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.

274 lines
7.5 KiB

  1. // --------------------------------------------------------------------------------
  2. // Factory.cpp
  3. // Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  4. // Steven J. Bailey
  5. // --------------------------------------------------------------------------------
  6. #include "pch.hxx"
  7. #include "dllmain.h"
  8. #include "factory.h"
  9. #include <newimp.h>
  10. #include <eudrimp.h>
  11. #include <commimp.h>
  12. #include <mapiconv.h>
  13. #include <netsimp.h>
  14. #include <Impath16.h>
  15. #include <oe4imp.h>
  16. // --------------------------------------------------------------------------------
  17. // Global Object Info Table
  18. // --------------------------------------------------------------------------------
  19. static CClassFactory g_rgFactory[] = {
  20. CClassFactory(&CLSID_COE4Import, 0, (PFCREATEINSTANCE)COE4Import_CreateInstance),
  21. CClassFactory(&CLSID_CIMN1Import, 0, (PFCREATEINSTANCE)COE4Import_CreateInstance),
  22. CClassFactory(&CLSID_CAthena16Import, 0, (PFCREATEINSTANCE)CAthena16Import_CreateInstance),
  23. CClassFactory(&CLSID_CEudoraImport, 0, (PFCREATEINSTANCE)CEudoraImport_CreateInstance),
  24. CClassFactory(&CLSID_CExchImport, 0, (PFCREATEINSTANCE)CExchImport_CreateInstance),
  25. CClassFactory(&CLSID_CNetscapeImport, 0, (PFCREATEINSTANCE)CNetscapeImport_CreateInstance),
  26. CClassFactory(&CLSID_CCommunicatorImport, 0, (PFCREATEINSTANCE)CCommunicatorImport_CreateInstance),
  27. };
  28. // --------------------------------------------------------------------------------
  29. // DllGetClassObject
  30. // --------------------------------------------------------------------------------
  31. STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
  32. {
  33. // Locals
  34. HRESULT hr=S_OK;
  35. ULONG i;
  36. // Bad param
  37. if (ppv == NULL)
  38. {
  39. hr = TrapError(E_INVALIDARG);
  40. goto exit;
  41. }
  42. // No memory allocator
  43. if (NULL == g_pMalloc)
  44. {
  45. hr = TrapError(E_OUTOFMEMORY);
  46. goto exit;
  47. }
  48. // Find Object Class
  49. for (i=0; i<ARRAYSIZE(g_rgFactory); i++)
  50. {
  51. // Compare for clsids
  52. if (IsEqualCLSID(rclsid, *g_rgFactory[i].m_pclsid))
  53. {
  54. // Delegate to the factory
  55. CHECKHR(hr = g_rgFactory[i].QueryInterface(riid, ppv));
  56. // Done
  57. goto exit;
  58. }
  59. }
  60. // Otherwise, no class
  61. hr = TrapError(CLASS_E_CLASSNOTAVAILABLE);
  62. exit:
  63. // Done
  64. return hr;
  65. }
  66. // --------------------------------------------------------------------------------
  67. // CClassFactory::CClassFactory
  68. // --------------------------------------------------------------------------------
  69. CClassFactory::CClassFactory(CLSID const *pclsid, DWORD dwFlags, PFCREATEINSTANCE pfCreateInstance)
  70. : m_pclsid(pclsid), m_dwFlags(dwFlags), m_pfCreateInstance(pfCreateInstance)
  71. {
  72. }
  73. // --------------------------------------------------------------------------------
  74. // CClassFactory::QueryInterface
  75. // --------------------------------------------------------------------------------
  76. STDMETHODIMP CClassFactory::QueryInterface(REFIID riid, void **ppvObj)
  77. {
  78. // Invalid Arg
  79. if (NULL == ppvObj)
  80. return TrapError(E_INVALIDARG);
  81. // IClassFactory or IUnknown
  82. if (!IsEqualIID(riid, IID_IClassFactory) && !IsEqualIID(riid, IID_IUnknown))
  83. return TrapError(E_NOINTERFACE);
  84. // Return the Class Facotry
  85. *ppvObj = (LPVOID)this;
  86. // Add Ref the dll
  87. DllAddRef();
  88. // Done
  89. return S_OK;
  90. }
  91. // --------------------------------------------------------------------------------
  92. // CClassFactory::AddRef
  93. // --------------------------------------------------------------------------------
  94. STDMETHODIMP_(ULONG) CClassFactory::AddRef(void)
  95. {
  96. DllAddRef();
  97. return 2;
  98. }
  99. // --------------------------------------------------------------------------------
  100. // CClassFactory::Release
  101. // --------------------------------------------------------------------------------
  102. STDMETHODIMP_(ULONG) CClassFactory::Release(void)
  103. {
  104. DllRelease();
  105. return 1;
  106. }
  107. // --------------------------------------------------------------------------------
  108. // CClassFactory::CreateInstance
  109. // --------------------------------------------------------------------------------
  110. STDMETHODIMP CClassFactory::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObj)
  111. {
  112. // Locals
  113. HRESULT hr=S_OK;
  114. IUnknown *pObject=NULL;
  115. // Bad param
  116. if (ppvObj == NULL)
  117. return TrapError(E_INVALIDARG);
  118. // Init
  119. *ppvObj = NULL;
  120. // Verify that a controlling unknown asks for IUnknown
  121. if (NULL != pUnkOuter)
  122. return TrapError(CLASS_E_NOAGGREGATION);
  123. // No memory allocator
  124. if (NULL == g_pMalloc)
  125. return TrapError(E_OUTOFMEMORY);
  126. // Create the object...
  127. CHECKHR(hr = CreateObjectInstance(pUnkOuter, &pObject));
  128. // Get the interface requested from pObj
  129. CHECKHR(hr = pObject->QueryInterface(riid, ppvObj));
  130. exit:
  131. // Cleanup
  132. SafeRelease(pObject);
  133. // Done
  134. Assert(FAILED(hr) ? NULL == *ppvObj : TRUE);
  135. return hr;
  136. }
  137. // --------------------------------------------------------------------------------
  138. // CClassFactory::LockServer
  139. // --------------------------------------------------------------------------------
  140. STDMETHODIMP CClassFactory::LockServer(BOOL fLock)
  141. {
  142. if (fLock)
  143. InterlockedIncrement(&g_cLock);
  144. else
  145. InterlockedDecrement(&g_cLock);
  146. return NOERROR;
  147. }
  148. //#ifdef DEAD
  149. HRESULT CAthena16Import_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppUnknown)
  150. {
  151. // Invalid Arg
  152. Assert(ppUnknown);
  153. // Initialize
  154. *ppUnknown = NULL;
  155. // Create me
  156. CAthena16Import *pNew = new CAthena16Import;
  157. if (NULL == pNew)
  158. return TrapError(E_OUTOFMEMORY);
  159. // Cast to unknown
  160. *ppUnknown = SAFECAST(pNew, IMailImport *);
  161. // Done
  162. return S_OK;
  163. }
  164. //#endif // DEAD
  165. HRESULT CEudoraImport_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppUnknown)
  166. {
  167. // Invalid Arg
  168. Assert(ppUnknown);
  169. // Initialize
  170. *ppUnknown = NULL;
  171. // Create me
  172. CEudoraImport *pNew = new CEudoraImport;
  173. if (NULL == pNew)
  174. return TrapError(E_OUTOFMEMORY);
  175. // Cast to unknown
  176. *ppUnknown = SAFECAST(pNew, IMailImport *);
  177. // Done
  178. return S_OK;
  179. }
  180. HRESULT CExchImport_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppUnknown)
  181. {
  182. // Invalid Arg
  183. Assert(ppUnknown);
  184. // Initialize
  185. *ppUnknown = NULL;
  186. // Create me
  187. CExchImport *pNew = new CExchImport;
  188. if (NULL == pNew)
  189. return TrapError(E_OUTOFMEMORY);
  190. // Cast to unknown
  191. *ppUnknown = SAFECAST(pNew, IMailImport *);
  192. // Done
  193. return S_OK;
  194. }
  195. HRESULT CNetscapeImport_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppUnknown)
  196. {
  197. // Invalid Arg
  198. Assert(ppUnknown);
  199. // Initialize
  200. *ppUnknown = NULL;
  201. // Create me
  202. CNetscapeImport *pNew = new CNetscapeImport;
  203. if (NULL == pNew)
  204. return TrapError(E_OUTOFMEMORY);
  205. // Cast to unknown
  206. *ppUnknown = SAFECAST(pNew, IMailImport *);
  207. // Done
  208. return S_OK;
  209. }
  210. HRESULT CCommunicatorImport_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppUnknown)
  211. {
  212. // Invalid Arg
  213. Assert(ppUnknown);
  214. // Initialize
  215. *ppUnknown = NULL;
  216. // Create me
  217. CCommunicatorImport *pNew = new CCommunicatorImport;
  218. if (NULL == pNew)
  219. return TrapError(E_OUTOFMEMORY);
  220. // Cast to unknown
  221. *ppUnknown = SAFECAST(pNew, IMailImport *);
  222. // Done
  223. return S_OK;
  224. }