|
|
/*
* d o c . c p p * * Purpose: * * History * * Copyright (C) Microsoft Corp. 1995, 1996. */
#include <pch.hxx>
#include <resource.h>
#include <strconst.h>
#ifdef PLUSPACK
#include "htmlsp.h"
#endif //PLUSPACK
#include "demand.h"
#include "dllmain.h"
#include "msoert.h"
#include "doc.h"
#include "htiframe.h" //ITargetFrame2
#include "htiface.h" //ITargetFramePriv
#include "body.h"
#include "util.h"
#include "oleutil.h"
#include "triutil.h"
//+---------------------------------------------------------------
//
// Member: Constructor
//
// Synopsis:
//
//---------------------------------------------------------------
CDoc::CDoc(IUnknown *pUnkOuter) : CPrivateUnknown(pUnkOuter) { m_ulState = OS_PASSIVE; m_hwndParent = NULL; m_pClientSite = NULL; m_pIPSite = NULL; m_lpszAppName = NULL; m_pInPlaceFrame=NULL; m_pInPlaceUIWindow=NULL; m_pBodyObj=NULL; m_pTypeInfo=NULL; DllAddRef(); }
//+---------------------------------------------------------------
//
// Member: Destructor
//
// Synopsis:
//
//---------------------------------------------------------------
CDoc::~CDoc() { DllRelease(); SafeMemFree(m_lpszAppName); SafeRelease(m_pClientSite); }
//+---------------------------------------------------------------
//
// Member: PrivateQueryInterface
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::PrivateQueryInterface(REFIID riid, LPVOID *lplpObj) { TraceCall("CDoc::PrivateQueryInterface");
if(!lplpObj) return E_INVALIDARG;
*lplpObj = NULL;
if (IsEqualIID(riid, IID_IOleObject)) *lplpObj = (LPVOID)(IOleObject *)this; else if (IsEqualIID(riid, IID_IOleDocument)) *lplpObj = (LPVOID)(IOleDocument *)this; else if (IsEqualIID(riid, IID_IOleDocumentView)) *lplpObj = (LPVOID)(IOleDocumentView *)this; else if (IsEqualIID(riid, IID_IOleCommandTarget)) *lplpObj = (LPVOID)(IOleCommandTarget *)this; else if (IsEqualIID(riid, IID_IServiceProvider)) *lplpObj = (LPVOID)(IServiceProvider *)this; else if (IsEqualIID(riid, IID_IOleInPlaceObject)) *lplpObj = (LPVOID)(IOleInPlaceObject *)this; else if (IsEqualIID(riid, IID_IOleInPlaceActiveObject)) *lplpObj = (LPVOID)(IOleInPlaceActiveObject *)this; else if (IsEqualIID(riid, IID_IPersistStreamInit)) *lplpObj = (LPVOID)(IPersistStreamInit *)this; else if (IsEqualIID(riid, IID_IPersistMoniker)) *lplpObj = (LPVOID)(IPersistMoniker *)this; else if (IsEqualIID(riid, IID_IDispatch)) *lplpObj = (LPVOID)(IDispatch *)this; else if (IsEqualIID(riid, IID_IMimeEdit)) *lplpObj = (LPVOID)(IMimeEdit *)this; else if (IsEqualIID(riid, IID_IQuickActivate)) *lplpObj = (LPVOID)(IQuickActivate *)this; #ifdef OFFICE_BINDER
else if (IsEqualIID(riid, IID_IPersistStorage)) *lplpObj = (LPVOID)(IPersistStorage *)this; #endif
else if (IsEqualIID(riid, IID_IPersistMime)) *lplpObj = (LPVOID)(IPersistMime *)this; else if (IsEqualIID(riid, IID_IPersistFile)) *lplpObj = (LPVOID)(IPersistFile *)this; else { //DebugPrintInterface(riid, "CDoc::{not supported}=");
return E_NOINTERFACE; } AddRef(); return NOERROR; }
//+---------------------------------------------------------------
//
// Member: GetClassID
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::GetClassID(CLSID *pClassID) { TraceCall("CDoc::GetClassID");
*pClassID = CLSID_MimeEdit; return NOERROR; }
// *** IPersistMime ***
//+---------------------------------------------------------------
//
// Member: Load
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::Load(IMimeMessage *pMsg) { TraceCall("CDoc::Load");
return m_pBodyObj ? m_pBodyObj->Load(pMsg) : TraceResult(E_UNEXPECTED); }
//+---------------------------------------------------------------
//
// Member: Save
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::Save(IMimeMessage *pMsg, DWORD dwFlags) { IPersistMime *pPM; HRESULT hr;
TraceCall("CDoc::Save");
if (!m_pBodyObj) return TraceResult(E_UNEXPECTED);
hr = m_pBodyObj->QueryInterface(IID_IPersistMime, (LPVOID *)&pPM); if (!FAILED(hr)) { hr = pPM->Save(pMsg, dwFlags); pPM->Release(); } return hr; }
// *** IPersistStreamInit ***
//+---------------------------------------------------------------
//
// Member: IsDirty
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::IsDirty() { TraceCall("CDoc::IsDirty");
return m_pBodyObj?m_pBodyObj->IsDirty():TraceResult(E_UNEXPECTED); }
//+---------------------------------------------------------------
//
// Member: Load
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::Load(LPSTREAM pstm) { TraceCall("CDoc::Load");
return m_pBodyObj?m_pBodyObj->LoadStream(pstm):TraceResult(E_UNEXPECTED); }
//+---------------------------------------------------------------
//
// Member: Save
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::Save(LPSTREAM pstm, BOOL fClearDirty) { TraceCall("CDoc::Save"); return S_OK; }
//+---------------------------------------------------------------
//
// Member: GetSizeMax
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::GetSizeMax(ULARGE_INTEGER * pCbSize) { TraceCall("CDoc::GetSizeMax"); return E_NOTIMPL; }
//+---------------------------------------------------------------
//
// Member: InitNew
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::InitNew() { TraceCall("CDoc::InitNew"); if (m_pBodyObj) return m_pBodyObj->UnloadAll();
return S_OK; }
// *** IOleDocument ***
//+---------------------------------------------------------------
//
// Member: CreateView
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::CreateView(IOleInPlaceSite *pIPSite, IStream *pstm, DWORD dwReserved, IOleDocumentView **ppView) { HRESULT hr;
TraceCall("CDoc::CreateView");
if (pIPSite == NULL || ppView == NULL) return TraceResult(E_INVALIDARG);
if (m_pClientSite == NULL) return TraceResult(E_FAIL);
hr = SetInPlaceSite(pIPSite); if (FAILED(hr)) { TraceResult(hr); goto error; }
hr = PrivateQueryInterface(IID_IOleDocumentView, (void **)ppView); if (FAILED(hr)) { TraceResult(hr); goto error; }
error: return hr; }
//+---------------------------------------------------------------
//
// Member: GetDocMiscStatus
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::GetDocMiscStatus(DWORD *pdwStatus) { TraceCall("CDoc::GetDocMiscStatus"); *pdwStatus = DOCMISC_CANTOPENEDIT | DOCMISC_NOFILESUPPORT; return S_OK; }
//+---------------------------------------------------------------
//
// Member: EnumViews
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::EnumViews(IEnumOleDocumentViews **ppEnum, IOleDocumentView **ppView) { TraceCall("CDoc::EnumViews");
HRESULT hr = S_OK;
if (ppEnum == NULL || ppView == NULL) return TraceResult(E_INVALIDARG); *ppEnum = NULL;
return PrivateQueryInterface(IID_IOleDocumentView, (void **)ppView); }
// *** IOleDocumentView ***
//+---------------------------------------------------------------
//
// Member: SetInPlaceSite
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::SetInPlaceSite(IOleInPlaceSite *pIPSite) { TraceCall("CDoc::SetInPlaceSite");
// destroys the docobj and detaches from the current client site
// replaces the client site pointer read for a ::Show
DeactivateInPlace(); ReplaceInterface(m_pIPSite, pIPSite); return S_OK; }
//+---------------------------------------------------------------
//
// Member: GetInPlaceSite
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::GetInPlaceSite(IOleInPlaceSite **ppIPSite) { TraceCall("CDoc::GetInPlaceSite");
if (!ppIPSite) return E_INVALIDARG;
if (*ppIPSite=m_pIPSite) { m_pIPSite->AddRef(); return S_OK; } else return E_FAIL; }
//+---------------------------------------------------------------
//
// Member: GetDocument
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::GetDocument(IUnknown **ppunk) { TraceCall("CDoc::GetDocument");
if (ppunk==NULL) return E_INVALIDARG;
*ppunk = (IOleDocument *)this; (*ppunk)->AddRef(); return S_OK; }
//+---------------------------------------------------------------
//
// Member: SetRect
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::SetRect(LPRECT prcView) { if (m_pBodyObj) m_pBodyObj->SetRect(prcView); return S_OK; }
//+---------------------------------------------------------------
//
// Member: GetRect
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::GetRect(LPRECT prcView) { TraceCall("CDoc::GetRect");
if (m_pBodyObj) m_pBodyObj->GetRect(prcView); return S_OK; }
//+---------------------------------------------------------------
//
// Member: SetRectComplex
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::SetRectComplex(LPRECT prcView, LPRECT prcHScroll, LPRECT prcVScroll, LPRECT prcSizeBox) { TraceCall("CDoc::SetRectComplex"); return E_NOTIMPL; }
//+---------------------------------------------------------------
//
// Member: Show
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::Show(BOOL fShow) { HRESULT hr;
TraceCall("CDoc::Show"); hr = ActivateInPlace(); if (FAILED(hr)) { TraceResult(hr); goto error; }
error: return hr; }
//+---------------------------------------------------------------
//
// Member: UIActivate
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::UIActivate(BOOL fUIActivate) { HRESULT hr=S_OK;
TraceCall("CDoc::UIActivate");
#ifdef OFFICE_BINDER
if (fUIActivate) { hr = ActivateInPlace(); } #endif
if (m_pBodyObj) return m_pBodyObj->UIActivate(fUIActivate); return hr; }
//+---------------------------------------------------------------
//
// Member: Open
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::Open() { TraceCall("CDoc::Open"); // no single instance View|Frame supported
return E_NOTIMPL; } //+---------------------------------------------------------------
//
// Member: CloseView
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::CloseView(DWORD dwReserved) { TraceCall("CDoc::CloseView"); // to close the view, set the Site to NULL
SetInPlaceSite(NULL); return S_OK; } //+---------------------------------------------------------------
//
// Member: SaveViewState
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::SaveViewState(LPSTREAM pstm) { TraceCall("CDoc::SaveViewState"); return S_OK; // we don't keep view state
} //+---------------------------------------------------------------
//
// Member: ApplyViewState
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::ApplyViewState(LPSTREAM pstm) { TraceCall("CDoc::ApplyViewState"); return S_OK; }
//+---------------------------------------------------------------
//
// Member: Clone
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::Clone(IOleInPlaceSite *pIPSiteNew, IOleDocumentView **ppViewNew) { TraceCall("CDoc::Clone"); return E_NOTIMPL; }
// *** IOleObject ***
//+---------------------------------------------------------------
//
// Member: SetClientSite
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::SetClientSite(IOleClientSite *pClientSite) { TraceCall("CDoc::SetClientSite");
if (m_pClientSite && pClientSite) { // don't allow them to change the client site
TraceInfo("Host attempt to change client-site fefused"); return E_INVALIDARG; }
ReplaceInterface(m_pClientSite, pClientSite); return S_OK; }
//+---------------------------------------------------------------
//
// Member: GetClientSite
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::GetClientSite(IOleClientSite **ppClientSite) { TraceCall("CDoc::GetClientSite");
if (!ppClientSite) return E_INVALIDARG;
if (*ppClientSite=m_pClientSite) { m_pClientSite->AddRef(); return S_OK; } else return E_FAIL; }
//+---------------------------------------------------------------
//
// Member: SetHostNames
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::SetHostNames(LPCOLESTR szContainerAppW, LPCOLESTR szContainerObjW) { TraceCall("CDoc::SetHostNames");
SafeMemFree(m_lpszAppName); if (szContainerAppW) m_lpszAppName = PszToANSI(CP_ACP, szContainerAppW);
return S_OK; }
//+---------------------------------------------------------------
//
// Member: Close
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::Close(DWORD dwSaveOption) { HRESULT hr = S_OK; BOOL fSave; int id; TCHAR szTitle[MAX_PATH];
TraceCall("CDoc::Close");
// if our object is dirty then we should save it, depending on the
// save options
if (m_pClientSite && m_pBodyObj && m_pBodyObj->IsDirty()==S_OK) { switch(dwSaveOption) { case OLECLOSE_SAVEIFDIRTY: fSave = TRUE; break;
case OLECLOSE_NOSAVE: fSave = FALSE; break;
case OLECLOSE_PROMPTSAVE: { if(m_ulState != OS_UIACTIVE) { // if we're not UI active, then don't prompt
fSave=TRUE; break; }
GetHostName(szTitle, sizeof(szTitle)/sizeof(TCHAR)); id = AthMessageBox(m_hwndParent, szTitle, MAKEINTRESOURCE(idsSaveModifiedObject), NULL, MB_YESNOCANCEL); if (id == 0) return TraceResult(E_OUTOFMEMORY); else if (id == IDCANCEL) return TraceResult(OLE_E_PROMPTSAVECANCELLED);
fSave=(id == IDYES); } break;
default: return TraceResult(E_INVALIDARG); } if (fSave) hr = m_pClientSite->SaveObject(); }
if (hr==S_OK) hr = DeactivateInPlace();
return hr; }
//+---------------------------------------------------------------
//
// Member: SetMoniker
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::SetMoniker(DWORD dwWhichMoniker, IMoniker *pmk) { TraceCall("CDoc::SetMoniker"); return E_NOTIMPL; }
//+---------------------------------------------------------------
//
// Member: GetMoniker
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk) { TraceCall("CDoc::GetMoniker"); return E_NOTIMPL; }
//+---------------------------------------------------------------
//
// Member: InitFromData
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::InitFromData(IDataObject *pDataObject, BOOL fCreation, DWORD dwReserved) { TraceCall("CDoc::InitFromData"); return E_NOTIMPL; }
//+---------------------------------------------------------------
//
// Member: GetClipboardData
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::GetClipboardData(DWORD dwReserved, IDataObject **ppDataObject) { TraceCall("CDoc::GetClipboardData"); if (ppDataObject == NULL) return TraceResult(E_INVALIDARG);
*ppDataObject = NULL; return TraceResult(E_NOTIMPL); }
//+---------------------------------------------------------------
//
// Member: DoVerb
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::DoVerb(LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect) { TraceCall("CDoc::DoVerb"); switch (iVerb) { case OLEIVERB_SHOW: case OLEIVERB_PRIMARY: return DoShow(pActiveSite, hwndParent, lprcPosRect);; case OLEIVERB_INPLACEACTIVATE: return Show(TRUE); } return OLEOBJ_S_INVALIDVERB; }
//+---------------------------------------------------------------
//
// Member: EnumVerbs
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::EnumVerbs(IEnumOLEVERB **ppEnumOleVerb) { TraceCall("CDoc::EnumVerbs"); return E_NOTIMPL; }
//+---------------------------------------------------------------
//
// Member: Update
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::Update() { TraceCall("CDoc::Update"); return S_OK; }
//+---------------------------------------------------------------
//
// Member: IsUpToDate
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::IsUpToDate() { TraceCall("CDoc::IsUpToDate"); return S_OK; }
//+---------------------------------------------------------------
//
// Member: GetUserClassID
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::GetUserClassID(CLSID *pCLSID) { TraceCall("CDoc::GetUserClassID"); if (pCLSID==NULL) return TraceResult(E_INVALIDARG);
*pCLSID = CLSID_MimeEdit; return S_OK; }
//+---------------------------------------------------------------
//
// Member: GetUserType
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::GetUserType(DWORD dwFormOfType, LPOLESTR *pszUserType) { TCHAR szRes[CCHMAX_STRINGRES]; int ids;
TraceCall("CDoc::GetUserType"); if (pszUserType==NULL) return TraceResult(E_INVALIDARG);
*pszUserType = NULL;
switch (dwFormOfType) { case USERCLASSTYPE_APPNAME: ids = idsUserTypeApp; break;
case USERCLASSTYPE_SHORT: ids = idsUserTypeShort; break;
case USERCLASSTYPE_FULL: ids = idsUserTypeFull; break;
default: return TraceResult(E_INVALIDARG); }
if (!LoadString(g_hLocRes, ids, szRes, sizeof(szRes)/sizeof(TCHAR))) return TraceResult(E_OUTOFMEMORY);
*pszUserType = PszToUnicode(CP_ACP, szRes); return *pszUserType ? S_OK : TraceResult(E_OUTOFMEMORY); }
//+---------------------------------------------------------------
//
// Member: SetExtent
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::SetExtent(DWORD dwDrawAspect, SIZEL *psizel) { TraceCall("CDoc::SetExtent"); return E_NOTIMPL; }
//+---------------------------------------------------------------
//
// Member: GetExtent
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::GetExtent(DWORD dwDrawAspect, SIZEL *psizel) { TraceCall("CDoc::GetExtent"); return E_NOTIMPL; }
//+---------------------------------------------------------------
//
// Member: Advise
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::Advise(IAdviseSink *pAdvSink, DWORD *pdwConnection) { TraceCall("CDoc::Advise"); return S_OK; }
//+---------------------------------------------------------------
//
// Member: Unadvise
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::Unadvise(DWORD dwConnection) { TraceCall("CDoc::Unadvise"); return E_NOTIMPL; }
//+---------------------------------------------------------------
//
// Member: EnumAdvise
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::EnumAdvise(IEnumSTATDATA **ppenumAdvise) { TraceCall("CDoc::EnumAdvise"); return E_NOTIMPL; }
//+---------------------------------------------------------------
//
// Member: GetMiscStatus
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::GetMiscStatus(DWORD dwAspect, DWORD *pdwStatus) { TraceCall("CDoc::GetMiscStatus"); if (pdwStatus==NULL) return E_INVALIDARG;
*pdwStatus = OLEMISC_INSIDEOUT; // BUGBUG: not sure what to set here
return S_OK; }
//+---------------------------------------------------------------
//
// Member: SetColorScheme
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::SetColorScheme(LOGPALETTE *pLogpal) { TraceCall("CDoc::SetColorScheme");
return E_NOTIMPL; }
// *** IOleInPlaceObject ***
//+---------------------------------------------------------------
//
// Member: InPlaceDeactivate
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::InPlaceDeactivate() { TraceCall("CDoc::InPlaceDeactivate"); return DeactivateInPlace(); }
//+---------------------------------------------------------------
//
// Member: UIDeactivate
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::UIDeactivate() { TraceCall("CDoc::UIDeactivate");
if (m_pBodyObj) m_pBodyObj->UIActivate(FALSE);
return S_OK; }
//+---------------------------------------------------------------
//
// Member: SetObjectRects
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::SetObjectRects(LPCRECT lprcPosRect, LPCRECT lprcClipRect) { TraceCall("CDoc::SetObjectRects"); return SetRect((LPRECT)lprcPosRect); }
//+---------------------------------------------------------------
//
// Member: ReactivateAndUndo
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::ReactivateAndUndo() { TraceCall("CDoc::ReactivateAndUndo"); return S_OK; }
//+---------------------------------------------------------------
//
// Member: GetWindow
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::GetWindow(HWND *phwnd) { TraceCall("CDoc::GetWindow");
if (phwnd==NULL) return E_INVALIDARG;
return m_pBodyObj?m_pBodyObj->GetWindow(phwnd):E_FAIL; }
//+---------------------------------------------------------------
//
// Member: ContextSensitiveHelp
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::ContextSensitiveHelp(BOOL fEnterMode) { TraceCall("CDoc::ContextSensitiveHelp"); return E_NOTIMPL; }
//+---------------------------------------------------------------
//
// Member: TranslateAccelerator
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::TranslateAccelerator(LPMSG lpmsg) { return m_pBodyObj ? m_pBodyObj->PrivateTranslateAccelerator(lpmsg) : S_FALSE; }
//+---------------------------------------------------------------
//
// Member: OnFrameWindowActivate
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::OnFrameWindowActivate(BOOL fActivate) { TraceCall("CDoc::OnFrameWindowActivate"); if (m_pBodyObj) m_pBodyObj->OnFrameActivate(fActivate);
return S_OK; }
//+---------------------------------------------------------------
//
// Member: OnDocWindowActivate
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::OnDocWindowActivate(BOOL fActivate) { TraceCall("CDoc::OnDocWindowActivate"); return S_OK; }
//+---------------------------------------------------------------
//
// Member: ResizeBorder
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::ResizeBorder(LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fFrameWindow) { TraceCall("CDoc::ResizeBorder"); return S_OK; }
//+---------------------------------------------------------------
//
// Member: EnableModeless
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::EnableModeless(BOOL fEnable) { TraceCall("CDoc::EnableModeless"); return S_OK; }
//+---------------------------------------------------------------
//
// Member: QueryStatus
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText) { TraceCall("CDoc::QueryStatus");
if (m_pBodyObj==NULL) return TraceResult(E_UNEXPECTED);
return m_pBodyObj->PrivateQueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText); }
//+---------------------------------------------------------------
//
// Member: Exec
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) { HRESULT hr=E_FAIL;
TraceCall("CDoc::Exec");
if (m_pBodyObj==NULL) return TraceResult(E_UNEXPECTED);
return m_pBodyObj->PrivateExec(pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut); }
//+---------------------------------------------------------------
//
// Member: QueryService
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::QueryService(REFGUID guidService, REFIID riid, LPVOID *ppvObject) { TraceCall("CDoc::QueryService");
if (m_pBodyObj==NULL) return TraceResult(E_UNEXPECTED);
return m_pBodyObj->PrivateQueryService(guidService, riid, ppvObject); }
//+---------------------------------------------------------------
//
// Member: CDoc::DoShow
//
// Synopsis: response to IOleObject::DoVerb for showing object
//
//---------------------------------------------------------------
HRESULT CDoc::DoShow(IOleClientSite *pActiveSite, HWND hwndParent, LPCRECT lprcPosRect) { HRESULT hr;
TraceCall("CDoc::DoShow");
if (m_ulState >= OS_INPLACE) // if we're already running return S_OK
return S_OK; if (!IsWindow(hwndParent)) return OLEOBJ_S_INVALIDHWND;
if (pActiveSite == NULL) return E_INVALIDARG;
ReplaceInterface(m_pClientSite, pActiveSite); m_hwndParent = hwndParent;
return ActivateView(); }
//+---------------------------------------------------------------
//
// Member: CDoc::ActivateView
//
// Synopsis: Activate an IOleDocumentView
//
//---------------------------------------------------------------
HRESULT CDoc::ActivateView() { HRESULT hr; IOleDocumentSite *pDocSite;
TraceCall("CDoc::ActivateView");
Assert(m_ulState < OS_INPLACE); Assert(m_pClientSite);
if (!FAILED(hr = m_pClientSite->QueryInterface(IID_IOleDocumentSite, (void **)&pDocSite))) { hr = pDocSite->ActivateMe((IOleDocumentView *)this); pDocSite->Release(); }
return hr; }
HRESULT CDoc::Load(BOOL fFullyAvailable, IMoniker *pMoniker, IBindCtx *pBindCtx, DWORD grfMode) { return m_pBodyObj->Load(fFullyAvailable, pMoniker, pBindCtx, grfMode); }
HRESULT CDoc::GetCurMoniker(IMoniker **ppMoniker) { return m_pBodyObj->GetCurMoniker(ppMoniker); }
HRESULT CDoc::Save(IMoniker *pMoniker, IBindCtx *pBindCtx, BOOL fRemember) { return m_pBodyObj->Save(pMoniker, pBindCtx, fRemember); }
HRESULT CDoc::SaveCompleted(IMoniker *pMoniker, IBindCtx *pBindCtx) { return m_pBodyObj->SaveCompleted(pMoniker, pBindCtx); }
//+---------------------------------------------------------------
//
// Member: ActivateInPlace
//
// Synopsis: In place activates the object using the std. inplace
// activation protocol to create the inplace window.
//
//---------------------------------------------------------------
HRESULT CDoc::ActivateInPlace() { HRESULT hr; HWND hwndSite; RECT rcPos, rcClip; OLEINPLACEFRAMEINFO rFrameInfo;
TraceCall("CDoc::ActivateInPlace");
if (!m_pClientSite) return TraceResult(E_UNEXPECTED);
if (m_ulState >= OS_INPLACE) // if we're already running return S_OK
return S_OK;
// If we don't already have an inplace site, query for one. Note. we don't yet support
// negotiation for a windowless site. We may want to add this code.
if (!m_pIPSite) m_pClientSite->QueryInterface(IID_IOleInPlaceSite, (void **)&m_pIPSite);
if (!m_pIPSite) return TraceResult(E_FAIL);
if (m_pIPSite->CanInPlaceActivate() != S_OK) { TraceInfo("Container refused In-Place activation!"); return TraceResult(E_FAIL); }
Assert(m_pInPlaceFrame==NULL && m_pInPlaceUIWindow==NULL);
rFrameInfo.cb = sizeof(OLEINPLACEFRAMEINFO); ZeroMemory(&rcPos, sizeof(RECT)); ZeroMemory(&rcClip, sizeof(RECT));
hr = m_pIPSite->GetWindowContext(&m_pInPlaceFrame, &m_pInPlaceUIWindow, &rcPos, &rcClip, &rFrameInfo); if (FAILED(hr)) { TraceResult(hr); goto error; }
hr = m_pIPSite->GetWindow(&hwndSite); if (FAILED(hr)) { TraceResult(hr); goto error; }
hr = AttachWin(hwndSite, &rcPos); if (FAILED(hr)) { TraceResult(hr); goto error; }
// Notify our container that we are going in-place active.
m_ulState = OS_INPLACE; m_pIPSite->OnInPlaceActivate();
if (m_pInPlaceFrame) m_pInPlaceFrame->SetActiveObject((IOleInPlaceActiveObject *)this, NULL);
if (m_pInPlaceUIWindow) m_pInPlaceUIWindow->SetActiveObject((IOleInPlaceActiveObject *)this, NULL); error: return hr; }
//+---------------------------------------------------------------
//
// Member: AttachWin
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::AttachWin(HWND hwndParent, LPRECT lprcPos) { HRESULT hr; DWORD dwFlags=MEBF_OUTERCLIENTEDGE|MEBF_FORMATBARSEP; VARIANTARG va; IOleCommandTarget *pCmdTarget; BODYHOSTINFO rHostInfo;
TraceCall("CDoc::AttachWin");
if (!IsWindow(hwndParent) || lprcPos == NULL) return TraceResult(E_INVALIDARG);
// get border flags from host before we create the body, so we can fix the client edges
if (m_pClientSite && m_pClientSite->QueryInterface(IID_IOleCommandTarget, (LPVOID *)&pCmdTarget)==S_OK) { if (pCmdTarget->Exec(&CMDSETID_MimeEditHost, MEHOSTCMDID_BORDERFLAGS, 0, NULL, &va)==S_OK && va.vt==VT_I4) dwFlags = va.lVal; pCmdTarget->Release(); }
rHostInfo.pInPlaceSite = m_pIPSite; rHostInfo.pInPlaceFrame = m_pInPlaceFrame; rHostInfo.pDoc = (IOleInPlaceActiveObject *)this; hr = CreateBodyObject(hwndParent, dwFlags, lprcPos, &rHostInfo, &m_pBodyObj); if (FAILED(hr)) { TraceResult(hr); goto error; }
error: return hr; }
//+---------------------------------------------------------------
//
// Member: DeactivateInPlace
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::DeactivateInPlace() { TraceCall("CDoc::DeactivateInPlace");
if (m_pBodyObj) { m_pBodyObj->Close(); m_pBodyObj->Release(); m_pBodyObj=NULL; }
// Notify our container that we're in-place deactivating
if (m_ulState == OS_INPLACE) { // The container may reenter us, so need to remember that
// we've done almost all the transition to OS_RUNNING
m_ulState = OS_RUNNING;
// Errors from this notification are ignored (in the function
// which calls this one); we don't allow our container to stop
// us from in-place deactivating
if (m_pIPSite) m_pIPSite->OnInPlaceDeactivate();
}
SafeRelease(m_pIPSite); SafeRelease(m_pInPlaceFrame); SafeRelease(m_pInPlaceUIWindow); return S_OK; }
//+---------------------------------------------------------------
//
// Member: ActivateUI
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::ActivateUI() { HRESULT hr;
TraceCall("CDoc::ActivateUI");
if (!m_pIPSite) return TraceResult(E_UNEXPECTED);
m_ulState = OS_UIACTIVE;
if (FAILED(hr=m_pIPSite->OnUIActivate())) { // If the container fails the OnUIActivate call, then we
// give up and stay IPA
if (m_ulState == OS_UIACTIVE) m_ulState = OS_INPLACE;
}
return hr; }
//+---------------------------------------------------------------
//
// Member: DeactivateUI
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::DeactivateUI() { TraceCall("CDoc::DectivateInPlace");
if (!m_pIPSite) return TraceResult(E_UNEXPECTED);
m_ulState = OS_INPLACE; m_pIPSite->OnUIDeactivate(FALSE); return S_OK; }
//+---------------------------------------------------------------
//
// Member: GetHostName
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::GetHostName(LPSTR szTitle, ULONG cch) { TraceCall("CDoc::GetHostName");
*szTitle = 0;
if (m_lpszAppName) { StrCpyN(szTitle, m_lpszAppName, cch); } else { SideAssert(LoadString(g_hLocRes, idsAppName, szTitle, cch)); } return S_OK; }
#ifdef OFFICE_BINDER
HRESULT CDoc::InitNew(IStorage *pStg) { return S_OK; } HRESULT CDoc::Load(IStorage *pStg) { return S_OK; }
HRESULT CDoc::Save(IStorage *pStgSave, BOOL fSameAsLoad) { return S_OK; }
HRESULT CDoc::SaveCompleted(IStorage *pStgNew) { return S_OK; }
HRESULT CDoc::HandsOffStorage() { return S_OK; } #endif
HRESULT CDoc::GetTypeInfoCount(UINT *pctinfo) { *pctinfo = 1; return S_OK; }
HRESULT CDoc::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo **pptinfo) { HRESULT hr;
*pptinfo = NULL; if (itinfo) return DISP_E_BADINDEX;
hr = EnsureTypeLibrary(); if (FAILED(hr)) goto error;
m_pTypeInfo->AddRef(); *pptinfo = m_pTypeInfo;
error: return hr; }
HRESULT CDoc::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgdispid) { HRESULT hr;
hr = EnsureTypeLibrary(); if (FAILED(hr)) goto error;
hr = DispGetIDsOfNames(m_pTypeInfo, rgszNames, cNames, rgdispid);
error: return hr; }
HRESULT CDoc::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdispparams, VARIANT *pvarResult, EXCEPINFO *pexcepinfo, UINT *puArgErr) { HRESULT hr;
hr = EnsureTypeLibrary(); if (FAILED(hr)) goto error;
hr = DispInvoke((IDispatch *)this, m_pTypeInfo, dispidMember, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
error: return hr; }
// *** IQuickActivate ***
//+---------------------------------------------------------------
//
// Member: QuickActivate
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::QuickActivate(QACONTAINER *pQaContainer, QACONTROL *pQaControl) { TraceCall("CDoc::QuickActivate");
if (pQaControl == NULL || pQaContainer == NULL) return E_INVALIDARG;
pQaControl->cbSize = sizeof(QACONTROL); pQaControl->dwMiscStatus = OLEMISC_INSIDEOUT|OLEMISC_ACTIVATEWHENVISIBLE; pQaControl->dwViewStatus = 0; pQaControl->dwEventCookie = 0; pQaControl->dwPropNotifyCookie = 0; pQaControl->dwPointerActivationPolicy = 0;
if (m_pClientSite || pQaContainer->pClientSite==NULL) return E_FAIL;
m_pClientSite = pQaContainer->pClientSite; m_pClientSite ->AddRef();
return S_OK; }
//+---------------------------------------------------------------
//
// Member: SetContentExtent
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::SetContentExtent(LPSIZEL pSizel) { TraceCall("CDoc::SetContentExtent"); return S_OK; }
//+---------------------------------------------------------------
//
// Member: GetContentExtent
//
// Synopsis:
//
//---------------------------------------------------------------
HRESULT CDoc::GetContentExtent(LPSIZEL pSizel) { TraceCall("CDoc::GetContentExtent"); return S_OK; }
HRESULT CDoc::EnsureTypeLibrary() { HRESULT hr; ITypeLib *pTypeLib; TraceCall("EnsureTypeLibrary()");
if (m_pTypeInfo) return S_OK;
hr = GetTypeLibrary(&pTypeLib); if (!FAILED(hr)) { hr = pTypeLib->GetTypeInfoOfGuid(IID_IMimeEdit, &m_pTypeInfo); pTypeLib->Release(); } return hr; }
HRESULT CDoc::get_src(BSTR *pbstr) { *pbstr = NULL; return E_NOTIMPL; }
HRESULT CDoc::put_src(BSTR bstr) { IMoniker *pmk;
HRESULT hr; IMimeMessage *pMsg; IPersistMoniker *pPMK; if (CreateURLMoniker(NULL, bstr, &pmk)) return E_FAIL;
hr = CoCreateInstance(CLSID_IMimeMessage, NULL, CLSCTX_INPROC_SERVER, IID_IMimeMessage, (LPVOID *)&pMsg); if (!FAILED(hr)) { hr = pMsg->QueryInterface(IID_IPersistMoniker, (LPVOID *)&pPMK); if (!FAILED(hr)) { hr=pPMK->Load(TRUE, pmk, NULL, STGM_READWRITE); if (!FAILED(hr)) { hr = Load(pMsg); } pPMK->Release(); } pMsg->Release(); } return hr; }
HRESULT CDoc::put_header(LONG lStyle) { VARIANTARG va;
va.vt = VT_I4; va.lVal = lStyle; return m_pBodyObj?m_pBodyObj->PrivateExec(&CMDSETID_MimeEdit, MECMDID_STYLE, OLECMDEXECOPT_DODEFAULT, &va, NULL):E_FAIL; } HRESULT CDoc::put_editMode(VARIANT_BOOL b) { VARIANTARG va;
va.vt = VT_BOOL; va.boolVal = b; return m_pBodyObj?m_pBodyObj->PrivateExec(&CMDSETID_MimeEdit, MECMDID_EDITMODE, OLECMDEXECOPT_DODEFAULT, &va, NULL):E_FAIL; }
HRESULT CDoc::get_editMode(VARIANT_BOOL *pbool) { VARIANTARG va; TraceCall("CDoc::get_editMode");
if (m_pBodyObj && m_pBodyObj->PrivateExec(&CMDSETID_MimeEdit, MECMDID_EDITMODE, OLECMDEXECOPT_DODEFAULT, NULL, &va)==S_OK) { Assert(va.vt == VT_BOOL); *pbool = va.boolVal; return S_OK; } return TraceResult(E_FAIL); }
HRESULT CDoc::get_messageSource(BSTR *pbstr) { IMimeMessage *pMsg; IStream *pstm; HRESULT hr=E_FAIL;
if (MimeOleCreateMessage(NULL, &pMsg)==S_OK) { if (!FAILED(Save(pMsg, MECD_HTML|MECD_PLAINTEXT|MECD_ENCODEIMAGES|MECD_ENCODESOUNDS)) && pMsg->Commit(0)==S_OK && pMsg->GetMessageSource(&pstm, 0)==S_OK) { hr = HrIStreamToBSTR(GetACP(), pstm, pbstr); pstm->Release(); } pMsg->Release(); } return hr; }
HRESULT CDoc::get_text(BSTR *pbstr) { IStream *pstm;
*pbstr = NULL; if (GetBodyStream(m_pBodyObj->GetDoc(), FALSE, &pstm)==S_OK) { HrIStreamToBSTR(NULL, pstm, pbstr); pstm->Release(); } return S_OK; }
HRESULT CDoc::get_html(BSTR *pbstr) { // BUGBUGBUG: hack for HOTMAIL page demo
IStream *pstm; HCHARSET hCharset;
*pbstr = NULL; MimeOleGetCodePageCharset(1252, CHARSET_BODY, &hCharset); m_pBodyObj->SetCharset(hCharset);
if (GetBodyStream(m_pBodyObj->GetDoc(), TRUE, &pstm)==S_OK) { HrIStreamToBSTR(NULL, pstm, pbstr); pstm->Release(); } return S_OK; // BUGBUGBUG: hack for HOTMAIL page demo
}
HRESULT CDoc::get_doc(IDispatch **ppDoc) { *ppDoc = 0; if (m_pBodyObj) (m_pBodyObj->GetDoc())->QueryInterface(IID_IDispatch, (LPVOID *)ppDoc); return S_OK; }
HRESULT CDoc::get_header(LONG *plStyle) { VARIANTARG va; HRESULT hr;
if (!m_pBodyObj) return E_FAIL;
hr = m_pBodyObj->PrivateExec(&CMDSETID_MimeEdit, MECMDID_STYLE, OLECMDEXECOPT_DODEFAULT, NULL, &va); *plStyle = va.lVal; return hr; }
HRESULT CDoc::clear() { if (m_pBodyObj) m_pBodyObj->UnloadAll(); return S_OK; }
HRESULT CDoc::Load(LPCOLESTR pszFileName, DWORD dwMode) { HRESULT hr; IMimeMessage *pMsg; IPersistFile *pPF; hr = CoCreateInstance(CLSID_IMimeMessage, NULL, CLSCTX_INPROC_SERVER, IID_IMimeMessage, (LPVOID *)&pMsg); if (!FAILED(hr)) { hr = pMsg->QueryInterface(IID_IPersistFile, (LPVOID *)&pPF); if (!FAILED(hr)) { hr = pPF->Load(pszFileName, dwMode); if (!FAILED(hr)) { hr = Load(pMsg); } pPF->Release(); } pMsg->Release(); } return hr; }
HRESULT CDoc::Save(LPCOLESTR pszFileName, BOOL fRemember) { return E_NOTIMPL; }
HRESULT CDoc::SaveCompleted(LPCOLESTR pszFileName) { return S_OK; }
HRESULT CDoc::GetCurFile(LPOLESTR * ppszFileName) { return E_NOTIMPL; }
|