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.

301 lines
7.0 KiB

  1. /*
  2. * e n v f a c t . c p p
  3. *
  4. * Purpose:
  5. * Office-Envelope Host factory
  6. *
  7. * Owner:
  8. * brettm.
  9. *
  10. * History:
  11. * July '95: Created
  12. *
  13. * Copyright (C) Microsoft Corp. 1993, 1994.
  14. */
  15. #include <pch.hxx>
  16. #include <mimeole.h>
  17. #include <envelope.h>
  18. #include <mso.h>
  19. #include <envguid.h>
  20. #include "envfact.h"
  21. #include "regutil.h"
  22. #include "demand.h"
  23. #include "menures.h"
  24. class CEnvFactory
  25. {
  26. public:
  27. CEnvFactory();
  28. virtual ~CEnvFactory();
  29. ULONG AddRef();
  30. ULONG Release();
  31. HRESULT Init();
  32. HRESULT OnWMCommand(HWND hwndCmd, INT id, WORD wCmd);
  33. HRESULT AddEnvHostMenu(HMENU hMenuPopup, int iPos);
  34. private:
  35. ULONG m_cRef;
  36. HMENU m_hMenu;
  37. HRESULT BuildPopupMenu();
  38. HRESULT CreateEnvHost(HWND hwnd, LPSTR pszCLSID);
  39. HRESULT DestroyMenu(HMENU hMenu);
  40. };
  41. static CEnvFactory *g_pEnvFactory=0;
  42. HRESULT EnsureEnvFactory();
  43. CEnvFactory::CEnvFactory()
  44. {
  45. m_cRef = 1;
  46. m_hMenu = NULL;
  47. }
  48. CEnvFactory::~CEnvFactory()
  49. {
  50. if (m_hMenu)
  51. {
  52. Assert(IsMenu(m_hMenu));
  53. DestroyMenu(m_hMenu);
  54. }
  55. }
  56. ULONG CEnvFactory::AddRef()
  57. {
  58. return ++m_cRef;
  59. }
  60. ULONG CEnvFactory::Release()
  61. {
  62. if (--m_cRef==0)
  63. {
  64. delete this;
  65. return 0;
  66. }
  67. return m_cRef;
  68. }
  69. HRESULT CEnvFactory::Init()
  70. {
  71. return S_OK;
  72. }
  73. HRESULT CEnvFactory::BuildPopupMenu()
  74. {
  75. HKEY hKey,
  76. hKeyHost;
  77. int i;
  78. ULONG cb;
  79. TCHAR rgch[MAX_PATH];
  80. TCHAR rgchCLSID[MAX_PATH];
  81. LONG lResult;
  82. HMENU hMenu;
  83. MENUITEMINFO mii;
  84. HRESULT hr=E_FAIL;
  85. int idm = ID_ENVELOPE_HOST_FIRST;
  86. DWORD dwType;
  87. hMenu = CreatePopupMenu();
  88. if (!hMenu)
  89. return E_OUTOFMEMORY;
  90. mii.cbSize = sizeof(MENUITEMINFO);
  91. mii.fMask = MIIM_DATA|MIIM_TYPE|MIIM_ID;
  92. mii.fType = MFT_STRING;
  93. if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, c_szEnvHostClientPath, 0, KEY_READ, &hKey))
  94. {
  95. cb = sizeof(rgch);
  96. // Enumerate through the keys
  97. for (i = 0; ; i++)
  98. {
  99. // Enumerate Friendly Names
  100. cb = sizeof(rgch);
  101. lResult = RegEnumKeyEx(hKey, i, rgch, &cb, 0, NULL, NULL, NULL);
  102. // No more items
  103. if (lResult == ERROR_NO_MORE_ITEMS)
  104. break;
  105. // Error, lets move onto the next account
  106. if (lResult != ERROR_SUCCESS)
  107. break;
  108. // Lets open they server key
  109. if (RegOpenKeyEx(hKey, rgch, 0, KEY_READ, &hKeyHost) != ERROR_SUCCESS)
  110. continue;
  111. cb = sizeof(rgch);
  112. if (ERROR_SUCCESS == RegQueryValueEx(hKeyHost, NULL, 0, &dwType, (LPBYTE)rgch, &cb) && cb)
  113. {
  114. cb = sizeof(rgchCLSID);
  115. if (GetCLSIDFromSubKey(hKeyHost, rgchCLSID, &cb)==S_OK)
  116. {
  117. mii.dwTypeData = rgch;
  118. mii.cch = lstrlen(rgch);
  119. mii.dwItemData = (DWORD_PTR)PszDupA(rgchCLSID);
  120. mii.wID = idm++;
  121. if (InsertMenuItem(hMenu, 0, TRUE, &mii))
  122. hr = S_OK;
  123. }
  124. }
  125. RegCloseKey(hKeyHost);
  126. }
  127. RegCloseKey(hKey);
  128. }
  129. if (!FAILED(hr))
  130. m_hMenu = hMenu;
  131. else
  132. DestroyMenu(hMenu);
  133. return hr;
  134. }
  135. HRESULT CEnvFactory::OnWMCommand(HWND hwndCmd, INT id, WORD wCmd)
  136. {
  137. MENUITEMINFO mii;
  138. if (id >= ID_ENVELOPE_HOST_FIRST && id <= ID_ENVELOPE_HOST_LAST)
  139. {
  140. Assert (m_hMenu && IsMenu(m_hMenu));
  141. mii.fMask = MIIM_DATA;
  142. mii.cbSize = sizeof(MENUITEMINFO);
  143. SideAssert(GetMenuItemInfo(m_hMenu, id, FALSE, &mii));
  144. CreateEnvHost(hwndCmd, (LPSTR)mii.dwItemData);
  145. return S_OK;
  146. }
  147. return S_FALSE;
  148. }
  149. HRESULT CEnvFactory::DestroyMenu(HMENU hMenu)
  150. {
  151. ULONG uItem,
  152. cItems;
  153. MENUITEMINFO mii;
  154. mii.cbSize = sizeof(MENUITEMINFO);
  155. mii.fMask = MIIM_DATA;
  156. cItems = GetMenuItemCount(hMenu);
  157. for (uItem = 0; uItem < cItems; uItem++)
  158. {
  159. if (GetMenuItemInfo(hMenu, uItem, TRUE, &mii) && mii.dwItemData)
  160. MemFree((LPVOID)mii.dwItemData);
  161. }
  162. ::DestroyMenu(hMenu);
  163. return S_OK;
  164. }
  165. HRESULT CEnvFactory::CreateEnvHost(HWND hwnd, LPSTR pszCLSID)
  166. {
  167. IMsoEnvelopeHost *pHost = NULL;
  168. HRESULT hr = S_OK;
  169. TCHAR rgch[CCHMAX_STRINGRES];
  170. TCHAR rgchErr[CCHMAX_STRINGRES+50];
  171. CLSID clsid;
  172. UINT idsErr = idsErrEnvHostCreateNote;
  173. LPWSTR pwszCLSID;
  174. IF_NULLEXIT(pwszCLSID = PszToUnicode(CP_ACP, pszCLSID));
  175. IF_FAILEXIT(hr = CLSIDFromString(pwszCLSID, &clsid));
  176. IF_FAILEXIT(hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER|CLSCTX_LOCAL_SERVER,
  177. IID_IMsoEnvelopeHost, (LPVOID *)&pHost));
  178. idsErr = idsErrEnvHostCoCreate;
  179. IF_FAILEXIT(hr = pHost->CreateNote(NULL, CLSID_OEEnvelope, NULL, NULL, NULL, 0));
  180. exit:
  181. if (FAILED(hr))
  182. {
  183. LoadString(g_hLocRes, idsErr, rgch, ARRAYSIZE(rgch));
  184. wnsprintf(rgchErr, ARRAYSIZE(rgchErr), "%s\nhr=0x%x", rgch, hr);
  185. AthMessageBox(hwnd, MAKEINTRESOURCE(idsAthena), rgchErr, NULL, MB_OK);
  186. }
  187. ReleaseObj(pHost);
  188. MemFree(pwszCLSID);
  189. return hr;
  190. }
  191. HRESULT CEnvFactory::AddEnvHostMenu(HMENU hMenuPopup, int iPos)
  192. {
  193. MENUITEMINFO mii;
  194. TCHAR rgch[CCHMAX_STRINGRES];
  195. if (!m_hMenu)
  196. BuildPopupMenu();
  197. if (m_hMenu)
  198. {
  199. mii.cbSize = sizeof(MENUITEMINFO);
  200. mii.fMask = MIIM_TYPE|MIIM_SUBMENU|MIIM_ID;
  201. mii.fType = MFT_STRING;
  202. mii.wID = ID_POPUP_ENVELOPE_HOST;
  203. LoadString(g_hLocRes, idsCreateEnvHostPoupMenu, rgch, ARRAYSIZE(rgch));
  204. mii.dwTypeData = rgch;
  205. mii.cch = lstrlen(rgch);
  206. mii.hSubMenu = m_hMenu;
  207. InsertMenuItem(hMenuPopup, iPos, TRUE, &mii);
  208. }
  209. return S_OK;
  210. }
  211. HRESULT Envelope_WMCommand(HWND hwndCmd, INT id, WORD wCmd)
  212. {
  213. if (EnsureEnvFactory() != S_OK)
  214. return E_FAIL;
  215. return g_pEnvFactory->OnWMCommand(hwndCmd, id, wCmd);
  216. }
  217. HRESULT Envelope_AddHostMenu(HMENU hMenuPopup, int iPos)
  218. {
  219. if (EnsureEnvFactory() != S_OK)
  220. return E_FAIL;
  221. return g_pEnvFactory->AddEnvHostMenu(hMenuPopup, iPos);
  222. }
  223. HRESULT EnsureEnvFactory()
  224. {
  225. HRESULT hr = S_OK;
  226. if (!g_pEnvFactory)
  227. {
  228. g_pEnvFactory = new CEnvFactory();
  229. if (!g_pEnvFactory)
  230. return E_OUTOFMEMORY;
  231. hr = g_pEnvFactory->Init();
  232. }
  233. return hr;
  234. }
  235. HRESULT Envelope_FreeGlobals()
  236. {
  237. SafeRelease(g_pEnvFactory);
  238. return S_OK;
  239. }