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.
 
 
 
 
 
 

302 lines
7.0 KiB

/*
* e n v f a c t . c p p
*
* Purpose:
* Office-Envelope Host factory
*
* Owner:
* brettm.
*
* History:
* July '95: Created
*
* Copyright (C) Microsoft Corp. 1993, 1994.
*/
#include <pch.hxx>
#include <mimeole.h>
#include <envelope.h>
#include <mso.h>
#include <envguid.h>
#include "envfact.h"
#include "regutil.h"
#include "demand.h"
#include "menures.h"
class CEnvFactory
{
public:
CEnvFactory();
virtual ~CEnvFactory();
ULONG AddRef();
ULONG Release();
HRESULT Init();
HRESULT OnWMCommand(HWND hwndCmd, INT id, WORD wCmd);
HRESULT AddEnvHostMenu(HMENU hMenuPopup, int iPos);
private:
ULONG m_cRef;
HMENU m_hMenu;
HRESULT BuildPopupMenu();
HRESULT CreateEnvHost(HWND hwnd, LPSTR pszCLSID);
HRESULT DestroyMenu(HMENU hMenu);
};
static CEnvFactory *g_pEnvFactory=0;
HRESULT EnsureEnvFactory();
CEnvFactory::CEnvFactory()
{
m_cRef = 1;
m_hMenu = NULL;
}
CEnvFactory::~CEnvFactory()
{
if (m_hMenu)
{
Assert(IsMenu(m_hMenu));
DestroyMenu(m_hMenu);
}
}
ULONG CEnvFactory::AddRef()
{
return ++m_cRef;
}
ULONG CEnvFactory::Release()
{
if (--m_cRef==0)
{
delete this;
return 0;
}
return m_cRef;
}
HRESULT CEnvFactory::Init()
{
return S_OK;
}
HRESULT CEnvFactory::BuildPopupMenu()
{
HKEY hKey,
hKeyHost;
int i;
ULONG cb;
TCHAR rgch[MAX_PATH];
TCHAR rgchCLSID[MAX_PATH];
LONG lResult;
HMENU hMenu;
MENUITEMINFO mii;
HRESULT hr=E_FAIL;
int idm = ID_ENVELOPE_HOST_FIRST;
DWORD dwType;
hMenu = CreatePopupMenu();
if (!hMenu)
return E_OUTOFMEMORY;
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_DATA|MIIM_TYPE|MIIM_ID;
mii.fType = MFT_STRING;
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, c_szEnvHostClientPath, 0, KEY_READ, &hKey))
{
cb = sizeof(rgch);
// Enumerate through the keys
for (i = 0; ; i++)
{
// Enumerate Friendly Names
cb = sizeof(rgch);
lResult = RegEnumKeyEx(hKey, i, rgch, &cb, 0, NULL, NULL, NULL);
// No more items
if (lResult == ERROR_NO_MORE_ITEMS)
break;
// Error, lets move onto the next account
if (lResult != ERROR_SUCCESS)
break;
// Lets open they server key
if (RegOpenKeyEx(hKey, rgch, 0, KEY_READ, &hKeyHost) != ERROR_SUCCESS)
continue;
cb = sizeof(rgch);
if (ERROR_SUCCESS == RegQueryValueEx(hKeyHost, NULL, 0, &dwType, (LPBYTE)rgch, &cb) && cb)
{
cb = sizeof(rgchCLSID);
if (GetCLSIDFromSubKey(hKeyHost, rgchCLSID, &cb)==S_OK)
{
mii.dwTypeData = rgch;
mii.cch = lstrlen(rgch);
mii.dwItemData = (DWORD_PTR)PszDupA(rgchCLSID);
mii.wID = idm++;
if (InsertMenuItem(hMenu, 0, TRUE, &mii))
hr = S_OK;
}
}
RegCloseKey(hKeyHost);
}
RegCloseKey(hKey);
}
if (!FAILED(hr))
m_hMenu = hMenu;
else
DestroyMenu(hMenu);
return hr;
}
HRESULT CEnvFactory::OnWMCommand(HWND hwndCmd, INT id, WORD wCmd)
{
MENUITEMINFO mii;
if (id >= ID_ENVELOPE_HOST_FIRST && id <= ID_ENVELOPE_HOST_LAST)
{
Assert (m_hMenu && IsMenu(m_hMenu));
mii.fMask = MIIM_DATA;
mii.cbSize = sizeof(MENUITEMINFO);
SideAssert(GetMenuItemInfo(m_hMenu, id, FALSE, &mii));
CreateEnvHost(hwndCmd, (LPSTR)mii.dwItemData);
return S_OK;
}
return S_FALSE;
}
HRESULT CEnvFactory::DestroyMenu(HMENU hMenu)
{
ULONG uItem,
cItems;
MENUITEMINFO mii;
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_DATA;
cItems = GetMenuItemCount(hMenu);
for (uItem = 0; uItem < cItems; uItem++)
{
if (GetMenuItemInfo(hMenu, uItem, TRUE, &mii) && mii.dwItemData)
MemFree((LPVOID)mii.dwItemData);
}
::DestroyMenu(hMenu);
return S_OK;
}
HRESULT CEnvFactory::CreateEnvHost(HWND hwnd, LPSTR pszCLSID)
{
IMsoEnvelopeHost *pHost = NULL;
HRESULT hr = S_OK;
TCHAR rgch[CCHMAX_STRINGRES];
TCHAR rgchErr[CCHMAX_STRINGRES+50];
CLSID clsid;
UINT idsErr = idsErrEnvHostCreateNote;
LPWSTR pwszCLSID;
IF_NULLEXIT(pwszCLSID = PszToUnicode(CP_ACP, pszCLSID));
IF_FAILEXIT(hr = CLSIDFromString(pwszCLSID, &clsid));
IF_FAILEXIT(hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER|CLSCTX_LOCAL_SERVER,
IID_IMsoEnvelopeHost, (LPVOID *)&pHost));
idsErr = idsErrEnvHostCoCreate;
IF_FAILEXIT(hr = pHost->CreateNote(NULL, CLSID_OEEnvelope, NULL, NULL, NULL, 0));
exit:
if (FAILED(hr))
{
LoadString(g_hLocRes, idsErr, rgch, ARRAYSIZE(rgch));
wnsprintf(rgchErr, ARRAYSIZE(rgchErr), "%s\nhr=0x%x", rgch, hr);
AthMessageBox(hwnd, MAKEINTRESOURCE(idsAthena), rgchErr, NULL, MB_OK);
}
ReleaseObj(pHost);
MemFree(pwszCLSID);
return hr;
}
HRESULT CEnvFactory::AddEnvHostMenu(HMENU hMenuPopup, int iPos)
{
MENUITEMINFO mii;
TCHAR rgch[CCHMAX_STRINGRES];
if (!m_hMenu)
BuildPopupMenu();
if (m_hMenu)
{
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_TYPE|MIIM_SUBMENU|MIIM_ID;
mii.fType = MFT_STRING;
mii.wID = ID_POPUP_ENVELOPE_HOST;
LoadString(g_hLocRes, idsCreateEnvHostPoupMenu, rgch, ARRAYSIZE(rgch));
mii.dwTypeData = rgch;
mii.cch = lstrlen(rgch);
mii.hSubMenu = m_hMenu;
InsertMenuItem(hMenuPopup, iPos, TRUE, &mii);
}
return S_OK;
}
HRESULT Envelope_WMCommand(HWND hwndCmd, INT id, WORD wCmd)
{
if (EnsureEnvFactory() != S_OK)
return E_FAIL;
return g_pEnvFactory->OnWMCommand(hwndCmd, id, wCmd);
}
HRESULT Envelope_AddHostMenu(HMENU hMenuPopup, int iPos)
{
if (EnsureEnvFactory() != S_OK)
return E_FAIL;
return g_pEnvFactory->AddEnvHostMenu(hMenuPopup, iPos);
}
HRESULT EnsureEnvFactory()
{
HRESULT hr = S_OK;
if (!g_pEnvFactory)
{
g_pEnvFactory = new CEnvFactory();
if (!g_pEnvFactory)
return E_OUTOFMEMORY;
hr = g_pEnvFactory->Init();
}
return hr;
}
HRESULT Envelope_FreeGlobals()
{
SafeRelease(g_pEnvFactory);
return S_OK;
}