|
|
/*
* w i z o m. c p p * * Purpose: * * History * * Copyright (C) Microsoft Corp. 1995, 1996. */
#include <pch.hxx>
#include "dllmain.h"
#include <mshtml.h>
#include <mshtmhst.h>
#include <mimeole.h>
#include "icwacct.h"
#include "hotwiz.h"
#include "hotwizom.h"
#include "hotwizui.h"
#define HASH_GROW_SIZE 32
COEHotWizOm::COEHotWizOm() { m_pTypeInfo = NULL; m_cRef = 1; m_hwndDlg = NULL; m_pHash = NULL; m_pWizHost = NULL;
DllAddRef(); }
COEHotWizOm::~COEHotWizOm() { clearProps();
ReleaseObj(m_pTypeInfo); ReleaseObj(m_pWizHost);
AssertSz(m_pHash == NULL, "clearPops catches this"); DllRelease(); }
HRESULT COEHotWizOm::QueryInterface(REFIID riid, LPVOID *lplpObj) { if(!lplpObj) return E_INVALIDARG;
*lplpObj = NULL;
if (IsEqualIID(riid, IID_IUnknown)) *lplpObj = (LPVOID)(IOEHotWizardOM *)this; else if (IsEqualIID(riid, IID_IDispatch)) *lplpObj = (LPVOID)(IDispatch *)this; else if (IsEqualIID(riid, IID_IOEHotWizardOM)) *lplpObj = (LPVOID)(IOEHotWizardOM *)this; else if (IsEqualIID(riid, IID_IElementBehavior)) *lplpObj = (LPVOID)(IElementBehavior *)this; else return E_NOINTERFACE;
AddRef(); return NOERROR; }
ULONG COEHotWizOm::AddRef() { return ++m_cRef; }
ULONG COEHotWizOm::Release() { if (0 == --m_cRef) { delete this; return 0; } else return m_cRef; } HRESULT COEHotWizOm::Init(HWND hwndDlg, IHotWizardHost *pWizHost) { TCHAR szDll[MAX_PATH]; LPWSTR pszW=NULL; HRESULT hr = E_FAIL; ITypeLib *pTypeLib=NULL;
ReplaceInterface(m_pWizHost, pWizHost);
// see who we are
if (!GetModuleFileName(g_hInst, szDll, ARRAYSIZE(szDll))) { hr = TraceResult(E_FAIL); goto error; }
pszW = PszToUnicode(CP_ACP, szDll); if (!pszW) { hr = TraceResult (E_OUTOFMEMORY); goto error; }
// load the MSOE.DLL typelibrary
hr = LoadTypeLib(pszW, &pTypeLib); if (FAILED(hr)) { TraceResult(hr); goto error; }
// load our type-info data
hr = pTypeLib->GetTypeInfoOfGuid(IID_IOEHotWizardOM, &m_pTypeInfo); if (FAILED(hr)) { TraceResult(hr); goto error; }
m_hwndDlg = hwndDlg;
error: SafeMemFree(pszW); ReleaseObj(pTypeLib); return hr; }
// *** IDispatch ***
HRESULT COEHotWizOm::GetTypeInfoCount(UINT *pctinfo) { *pctinfo = 1; return S_OK; }
HRESULT COEHotWizOm::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo **pptinfo) { if (!m_pTypeInfo) return E_FAIL; if (!pptinfo) return E_INVALIDARG;
if (itinfo) return DISP_E_BADINDEX;
m_pTypeInfo->AddRef(); *pptinfo = m_pTypeInfo; return S_OK; }
HRESULT COEHotWizOm::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgdispid) { if (!m_pTypeInfo) return E_FAIL;
return DispGetIDsOfNames(m_pTypeInfo, rgszNames, cNames, rgdispid); }
HRESULT COEHotWizOm::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdispparams, VARIANT *pvarResult, EXCEPINFO *pexcepinfo, UINT *puArgErr) { if (!m_pTypeInfo) return E_FAIL;
return DispInvoke(this, m_pTypeInfo, dispidMember, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr); }
HRESULT COEHotWizOm::setPropSz(BSTR bstrProp, BSTR bstrVal) { LPSTR pszPropA=NULL; BSTR bstr=NULL; HRESULT hr=S_OK; // make sure we have a valid property
if (bstrProp == NULL || *bstrProp == NULL) return E_INVALIDARG;
// make sure we have a hash
if (!m_pHash) { hr = CoCreateInstance(CLSID_IHashTable, NULL, CLSCTX_INPROC_SERVER, IID_IHashTable, (LPVOID*)&m_pHash); if (FAILED(hr)) { TraceResult(hr); goto error; }
hr = m_pHash->Init(HASH_GROW_SIZE, TRUE); if (FAILED(hr)) { SafeRelease(m_pHash); TraceResult(hr); goto error; } }
// convert property to ANSI to work with our hashtable
pszPropA = PszToANSI(CP_ACP, bstrProp); if (!pszPropA) { hr = TraceResult(E_OUTOFMEMORY); goto error; } // see if this property already exists, if so we're going to replace it
if (m_pHash->Find(pszPropA, TRUE, (LPVOID *)&bstr)==S_OK) { SysFreeString(bstr); bstr = NULL; }
// bstrVal might be NULL if they just want to remove the prop
if (bstrVal) { // dupe our own BSTR to hold onto
bstr = SysAllocString(bstrVal); if (!bstr) { hr = TraceResult(E_OUTOFMEMORY); goto error; }
// insert the new property
hr = m_pHash->Insert(pszPropA, (LPVOID)bstr, NOFLAGS); if (FAILED(hr)) { TraceResult(hr); goto error; } bstr = NULL; // release when destroying the hash
}
error: SafeMemFree(pszPropA); SysFreeString(bstr); return hr; }
HRESULT COEHotWizOm::getPropSz(BSTR bstrProp, BSTR *pbstrVal) { LPSTR pszPropA=NULL; BSTR bstr; // make sure we have a valid property
if (bstrProp == NULL || *bstrProp == NULL) return E_INVALIDARG;
*pbstrVal = NULL;
// if we have no hash then there are no props
if (m_pHash) { // convert property to ANSI to work with our hashtable
pszPropA = PszToANSI(CP_ACP, bstrProp); if (!pszPropA) return TraceResult(E_OUTOFMEMORY); // see if this property exists
if (m_pHash->Find(pszPropA, FALSE, (LPVOID *)&bstr)==S_OK) *pbstrVal = SysAllocString(bstr); }
// if we failed to find, try and return a NULL string, so that the script
// engine doesn't barf with errors
if (*pbstrVal == NULL) *pbstrVal = SysAllocString(L"");
SafeMemFree(pszPropA); return *pbstrVal ? S_OK : E_OUTOFMEMORY; }
HRESULT COEHotWizOm::clearProps() { ULONG cFound; BSTR bstr; LPVOID *rgpv;
if (m_pHash) { m_pHash->Reset();
// free all the strings
while (SUCCEEDED(m_pHash->Next(HASH_GROW_SIZE, &rgpv, &cFound))) { while (cFound--) SysFreeString((BSTR)rgpv[cFound]); MemFree(rgpv); } m_pHash->Release(); m_pHash = NULL; } return S_OK; }
HRESULT COEHotWizOm::createAccount(BSTR bstrINS) { HRESULT hr; LPSTR pszInsA=NULL; LPSTR pszPathA=NULL; HANDLE hFile=NULL; ULONG cbWritten=0;
TraceCall("COEHotWizOm::createAccount");
// if we have a wizard host (possibly outlook in the future), delegate...
if (m_pWizHost) return m_pWizHost->CreateAccountFromINS(bstrINS);
// convert to ANSI
pszInsA = PszToANSI(CP_ACP, bstrINS); if (!pszInsA) { hr = TraceResult(E_OUTOFMEMORY); goto error; }
// create temp INS file for account manager
hr = CreateTempFile("oeacct", ".ins", &pszPathA, &hFile); if (FAILED(hr)) { TraceResult(hr); goto error; }
// write the data to the file
if (!WriteFile(hFile, pszInsA, lstrlen(pszInsA), &cbWritten, NULL)) { hr = TraceResult(E_FAIL); goto error; }
CloseHandle(hFile); hFile = NULL;
// create the account from the temp file
hr = CreateAccountsFromFile(pszPathA, 6); if (FAILED(hr)) { TraceResult(hr); goto error; } error: if (hFile) CloseHandle(hFile);
if (pszPathA) { DeleteFile(pszPathA); MemFree(pszPathA); }
SafeMemFree(pszInsA); return hr; }
HRESULT COEHotWizOm::close(VARIANT_BOOL fPrompt) { // send message to set the prompt flag
SendMessage(m_hwndDlg, HWM_SETDIRTY, (fPrompt == VARIANT_TRUE), 0); // do the close
SendMessage(m_hwndDlg, WM_CLOSE, 0, 0); return S_OK; }
HRESULT COEHotWizOm::get_width(LONG *pl) { RECT rc;
GetWindowRect(m_hwndDlg, &rc);
*pl = rc.right - rc.left; return S_OK; }
HRESULT COEHotWizOm::put_width(LONG l) { LONG lHeight=NULL;
get_height(&lHeight); SetWindowPos(m_hwndDlg, 0, 0, 0, l, lHeight, SWP_NOMOVE|SWP_NOZORDER); return S_OK; }
HRESULT COEHotWizOm::get_height(LONG *pl) { RECT rc;
GetWindowRect(m_hwndDlg, &rc);
*pl = rc.bottom - rc.top; return S_OK; }
HRESULT COEHotWizOm::put_height(LONG l) { LONG lWidth=NULL;
get_width(&lWidth); SetWindowPos(m_hwndDlg, 0, 0, 0, lWidth, l, SWP_NOMOVE|SWP_NOZORDER); return S_OK; }
HRESULT COEHotWizOm::Init(IElementBehaviorSite *pBehaviorSite) { return S_OK; }
HRESULT COEHotWizOm::Notify(LONG lEvent, VARIANT *pVar) { return S_OK; }
HRESULT COEHotWizOm::Detach() { return E_NOTIMPL; }
|