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.

442 lines
13 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 <mshtml.h>
  8. #include <mshtmhst.h>
  9. #include <prsht.h>
  10. #include "dllmain.h"
  11. #include "factory.h"
  12. #include <imnact.h>
  13. #include "acctman.h"
  14. #include <icwacct.h>
  15. #include <acctimp.h>
  16. #include <icwwiz.h>
  17. #include <eudora.h>
  18. #include <netscape.h>
  19. #include <exchacct.h>
  20. #include "navnews.h"
  21. #include <CommAct.h> // Netscape Communicator - Mail Account Import
  22. #include <CommNews.h> // Netscape Communicator - News Account Import
  23. #include <AgntNews.h> // Forte Agent - News Account Import
  24. #include <NExpress.h> // News Express - News Account Import
  25. #include <hotwiz.h>
  26. #include "hotwizui.h"
  27. // --------------------------------------------------------------------------------
  28. // Pretty
  29. // --------------------------------------------------------------------------------
  30. #define OBJTYPE0 0
  31. #define OBJTYPE1 OIF_ALLOWAGGREGATION
  32. // --------------------------------------------------------------------------------
  33. // Global Object Info Table
  34. // --------------------------------------------------------------------------------
  35. static CClassFactory g_rgFactory[] = {
  36. CClassFactory(&CLSID_ImnAccountManager, OBJTYPE0, (PFCREATEINSTANCE)IImnAccountManager_CreateInstance),
  37. CClassFactory(&CLSID_ApprenticeAcctMgr, OBJTYPE0, (PFCREATEINSTANCE)IICWApprentice_CreateInstance),
  38. CClassFactory(&CLSID_CEudoraAcctImport, OBJTYPE0, (PFCREATEINSTANCE)CEudoraAcctImport_CreateInstance),
  39. CClassFactory(&CLSID_CNscpAcctImport, OBJTYPE0, (PFCREATEINSTANCE)CNscpAcctImport_CreateInstance),
  40. CClassFactory(&CLSID_CCommAcctImport, OBJTYPE0, (PFCREATEINSTANCE)CCommAcctImport_CreateInstance),
  41. CClassFactory(&CLSID_CMAPIAcctImport, OBJTYPE0, (PFCREATEINSTANCE)CMAPIAcctImport_CreateInstance),
  42. CClassFactory(&CLSID_CCommNewsAcctImport, OBJTYPE0, (PFCREATEINSTANCE)CCommNewsAcctImport_CreateInstance), // Netscape Communicator
  43. CClassFactory(&CLSID_CNavNewsAcctImport, OBJTYPE0, (PFCREATEINSTANCE)CNavNewsAcctImport_CreateInstance), // Netscape Navigator
  44. CClassFactory(&CLSID_CAgentAcctImport, OBJTYPE0, (PFCREATEINSTANCE)CCAgentAcctImport_CreateInstance), // Forte Agent
  45. CClassFactory(&CLSID_CNExpressAcctImport, OBJTYPE0, (PFCREATEINSTANCE)CNExpressAcctImport_CreateInstance), // News Express
  46. CClassFactory(&CLSID_OEHotMailWizard, OBJTYPE0, (PFCREATEINSTANCE)CHotMailWizard_CreateInstance) // HoTMaiL Wizard
  47. };
  48. // --------------------------------------------------------------------------------
  49. // DllGetClassObject
  50. // --------------------------------------------------------------------------------
  51. STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
  52. {
  53. // Locals
  54. HRESULT hr=S_OK;
  55. ULONG i;
  56. // Bad param
  57. if (ppv == NULL)
  58. {
  59. hr = TrapError(E_INVALIDARG);
  60. goto exit;
  61. }
  62. // No memory allocator
  63. if (NULL == g_pMalloc)
  64. {
  65. hr = TrapError(E_OUTOFMEMORY);
  66. goto exit;
  67. }
  68. // Find Object Class
  69. for (i=0; i<ARRAYSIZE(g_rgFactory); i++)
  70. {
  71. // Compare for clsids
  72. if (IsEqualCLSID(rclsid, *g_rgFactory[i].m_pclsid))
  73. {
  74. // Delegate to the factory
  75. CHECKHR(hr = g_rgFactory[i].QueryInterface(riid, ppv));
  76. // Done
  77. goto exit;
  78. }
  79. }
  80. // Otherwise, no class
  81. hr = TrapError(CLASS_E_CLASSNOTAVAILABLE);
  82. exit:
  83. // Done
  84. return hr;
  85. }
  86. // --------------------------------------------------------------------------------
  87. // CClassFactory::CClassFactory
  88. // --------------------------------------------------------------------------------
  89. CClassFactory::CClassFactory(CLSID const *pclsid, DWORD dwFlags, PFCREATEINSTANCE pfCreateInstance)
  90. : m_pclsid(pclsid), m_dwFlags(dwFlags), m_pfCreateInstance(pfCreateInstance)
  91. {
  92. }
  93. // --------------------------------------------------------------------------------
  94. // CClassFactory::QueryInterface
  95. // --------------------------------------------------------------------------------
  96. STDMETHODIMP CClassFactory::QueryInterface(REFIID riid, void **ppvObj)
  97. {
  98. // Invalid Arg
  99. if (NULL == ppvObj)
  100. return TrapError(E_INVALIDARG);
  101. // IClassFactory or IUnknown
  102. if (!IsEqualIID(riid, IID_IClassFactory) && !IsEqualIID(riid, IID_IUnknown))
  103. return TrapError(E_NOINTERFACE);
  104. // Return the Class Facotry
  105. *ppvObj = (LPVOID)this;
  106. // Add Ref the dll
  107. DllAddRef();
  108. // Done
  109. return S_OK;
  110. }
  111. // --------------------------------------------------------------------------------
  112. // CClassFactory::AddRef
  113. // --------------------------------------------------------------------------------
  114. STDMETHODIMP_(ULONG) CClassFactory::AddRef(void)
  115. {
  116. DllAddRef();
  117. return 2;
  118. }
  119. // --------------------------------------------------------------------------------
  120. // CClassFactory::Release
  121. // --------------------------------------------------------------------------------
  122. STDMETHODIMP_(ULONG) CClassFactory::Release(void)
  123. {
  124. DllRelease();
  125. return 1;
  126. }
  127. // --------------------------------------------------------------------------------
  128. // CClassFactory::CreateInstance
  129. // --------------------------------------------------------------------------------
  130. STDMETHODIMP CClassFactory::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObj)
  131. {
  132. // Locals
  133. HRESULT hr=S_OK;
  134. IUnknown *pObject=NULL;
  135. // Bad param
  136. if (ppvObj == NULL)
  137. return TrapError(E_INVALIDARG);
  138. // Init
  139. *ppvObj = NULL;
  140. // Verify that a controlling unknown asks for IUnknown
  141. if (NULL != pUnkOuter && IID_IUnknown != riid)
  142. return TrapError(CLASS_E_NOAGGREGATION);
  143. // No memory allocator
  144. if (NULL == g_pMalloc)
  145. return TrapError(E_OUTOFMEMORY);
  146. // Can I do aggregaton
  147. if (pUnkOuter !=NULL && !(m_dwFlags & OIF_ALLOWAGGREGATION))
  148. return TrapError(CLASS_E_NOAGGREGATION);
  149. // Create the object...
  150. CHECKHR(hr = CreateObjectInstance(pUnkOuter, &pObject));
  151. // Aggregated, then we know we're looking for an IUnknown, return pObject, otherwise, QI
  152. if (pUnkOuter)
  153. {
  154. // Matches Release after Exit
  155. pObject->AddRef();
  156. // Return pObject::IUnknown
  157. *ppvObj = (LPVOID)pObject;
  158. }
  159. // Otherwise
  160. else
  161. {
  162. // Get the interface requested from pObj
  163. CHECKHR(hr = pObject->QueryInterface(riid, ppvObj));
  164. }
  165. exit:
  166. // Cleanup
  167. SafeRelease(pObject);
  168. // Done
  169. Assert(FAILED(hr) ? NULL == *ppvObj : TRUE);
  170. return hr;
  171. }
  172. // --------------------------------------------------------------------------------
  173. // CClassFactory::LockServer
  174. // --------------------------------------------------------------------------------
  175. STDMETHODIMP CClassFactory::LockServer(BOOL fLock)
  176. {
  177. if (fLock) InterlockedIncrement(&g_cLock);
  178. else InterlockedDecrement(&g_cLock);
  179. return NOERROR;
  180. }
  181. // --------------------------------------------------------------------------------
  182. // IImnAccountManager_CreateInstance
  183. // --------------------------------------------------------------------------------
  184. HRESULT APIENTRY IImnAccountManager_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppUnknown)
  185. {
  186. // Invalid Arg
  187. Assert(ppUnknown);
  188. // Initialize
  189. *ppUnknown = NULL;
  190. // Create me
  191. CAccountManager *pNew;
  192. HrCreateAccountManager((IImnAccountManager **)&pNew);
  193. if (NULL == pNew)
  194. return TrapError(E_OUTOFMEMORY);
  195. // Cast to unknown
  196. *ppUnknown = SAFECAST(pNew, IImnAccountManager *);
  197. // Done
  198. return S_OK;
  199. }
  200. // --------------------------------------------------------------------------------
  201. // IICWApprentice_CreateInstance
  202. // --------------------------------------------------------------------------------
  203. HRESULT APIENTRY IICWApprentice_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppUnknown)
  204. {
  205. // Invalid Arg
  206. Assert(ppUnknown);
  207. // Initialize
  208. *ppUnknown = NULL;
  209. // Create me
  210. CICWApprentice *pNew = new CICWApprentice();
  211. if (NULL == pNew)
  212. return TrapError(E_OUTOFMEMORY);
  213. // Cast to unknown
  214. *ppUnknown = SAFECAST(pNew, IICWApprentice *);
  215. // Done
  216. return S_OK;
  217. }
  218. HRESULT APIENTRY CEudoraAcctImport_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppUnknown)
  219. {
  220. // Invalid Arg
  221. Assert(ppUnknown);
  222. // Initialize
  223. *ppUnknown = NULL;
  224. // Create me
  225. CEudoraAcctImport *pNew = new CEudoraAcctImport();
  226. if (NULL == pNew)
  227. return TrapError(E_OUTOFMEMORY);
  228. // Cast to unknown
  229. *ppUnknown = SAFECAST(pNew, IAccountImport *);
  230. // Done
  231. return S_OK;
  232. }
  233. HRESULT APIENTRY CNscpAcctImport_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppUnknown)
  234. {
  235. // Invalid Arg
  236. Assert(ppUnknown);
  237. // Initialize
  238. *ppUnknown = NULL;
  239. // Create me
  240. CNscpAcctImport *pNew = new CNscpAcctImport();
  241. if (NULL == pNew)
  242. return TrapError(E_OUTOFMEMORY);
  243. // Cast to unknown
  244. *ppUnknown = SAFECAST(pNew, IAccountImport *);
  245. // Done
  246. return S_OK;
  247. }
  248. HRESULT APIENTRY CCommAcctImport_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppUnknown)
  249. {
  250. // Invalid Arg
  251. Assert(ppUnknown);
  252. // Initialize
  253. *ppUnknown = NULL;
  254. // Create me
  255. CCommAcctImport *pNew = new CCommAcctImport();
  256. if (NULL == pNew)
  257. return TrapError(E_OUTOFMEMORY);
  258. // Cast to unknown
  259. *ppUnknown = SAFECAST(pNew, IAccountImport *);
  260. // Done
  261. return S_OK;
  262. }
  263. HRESULT APIENTRY CMAPIAcctImport_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppUnknown)
  264. {
  265. // Invalid Arg
  266. Assert(ppUnknown);
  267. // Initialize
  268. *ppUnknown = NULL;
  269. // Create me
  270. CMAPIAcctImport *pNew = new CMAPIAcctImport();
  271. if (NULL == pNew)
  272. return TrapError(E_OUTOFMEMORY);
  273. // Cast to unknown
  274. *ppUnknown = SAFECAST(pNew, IAccountImport *);
  275. // Done
  276. return S_OK;
  277. }
  278. HRESULT APIENTRY CCommNewsAcctImport_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppUnknown)
  279. {
  280. // Invalid Arg
  281. Assert(ppUnknown);
  282. // Initialize
  283. *ppUnknown = NULL;
  284. // Create me
  285. CCommNewsAcctImport *pNew = new CCommNewsAcctImport();
  286. if (NULL == pNew)
  287. return TrapError(E_OUTOFMEMORY);
  288. // Cast to unknown
  289. *ppUnknown = SAFECAST(pNew, IAccountImport *);
  290. // Done
  291. return S_OK;
  292. }
  293. HRESULT APIENTRY CNavNewsAcctImport_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppUnknown)
  294. {
  295. // Invalid Arg
  296. Assert(ppUnknown);
  297. // Initialize
  298. *ppUnknown = NULL;
  299. // Create me
  300. CNavNewsAcctImport *pNew = new CNavNewsAcctImport();
  301. if (NULL == pNew)
  302. return TrapError(E_OUTOFMEMORY);
  303. // Cast to unknown
  304. *ppUnknown = SAFECAST(pNew, IAccountImport *);
  305. // Done
  306. return S_OK;
  307. }
  308. HRESULT APIENTRY CCAgentAcctImport_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppUnknown)
  309. {
  310. // Invalid Arg
  311. Assert(ppUnknown);
  312. // Initialize
  313. *ppUnknown = NULL;
  314. // Create me
  315. CAgentAcctImport *pNew = new CAgentAcctImport();
  316. if (NULL == pNew)
  317. return TrapError(E_OUTOFMEMORY);
  318. // Cast to unknown
  319. *ppUnknown = SAFECAST(pNew, IAccountImport *);
  320. // Done
  321. return S_OK;
  322. }
  323. HRESULT APIENTRY CNExpressAcctImport_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppUnknown)
  324. {
  325. // Invalid Arg
  326. Assert(ppUnknown);
  327. // Initialize
  328. *ppUnknown = NULL;
  329. // Create me
  330. CNExpressAcctImport *pNew = new CNExpressAcctImport();
  331. if (NULL == pNew)
  332. return TrapError(E_OUTOFMEMORY);
  333. // Cast to unknown
  334. *ppUnknown = SAFECAST(pNew, IAccountImport *);
  335. // Done
  336. return S_OK;
  337. }
  338. // --------------------------------------------------------------------------------
  339. // CHotMailWizard_CreateInstance
  340. // --------------------------------------------------------------------------------
  341. HRESULT APIENTRY CHotMailWizard_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppUnknown)
  342. {
  343. // Invalid Arg
  344. Assert(ppUnknown);
  345. // Initialize
  346. *ppUnknown = NULL;
  347. // Create me
  348. CHotMailWizard *pNew;
  349. pNew = new CHotMailWizard();
  350. if (NULL == pNew)
  351. return TrapError(E_OUTOFMEMORY);
  352. // Cast to unknown
  353. *ppUnknown = SAFECAST(pNew, IHotWizard *);
  354. // Done
  355. return S_OK;
  356. }