2007-12-10 20:53:52 +00:00

350 lines
19 KiB
C++

/***************************************************************************
* DSOFDOCOBJ.H
*
* DSOFramer: OLE DocObject Site component (used by the control)
*
* Copyright ©1999-2004; Microsoft Corporation. All rights reserved.
* Written by Microsoft Developer Support Office Integration (PSS DSOI)
*
* This code is provided via KB 311765 as a sample. It is not a formal
* product and has not been tested with all containers or servers. Use it
* for educational purposes only. See the EULA.TXT file included in the
* KB download for full terms of use and restrictions.
*
* THIS CODE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
* EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
*
***************************************************************************/
#ifndef DS_DSOFDOCOBJ_H
#define DS_DSOFDOCOBJ_H
////////////////////////////////////////////////////////////////////
// Declarations for Interfaces used in DocObject Containment
//
#include <docobj.h> // Standard DocObjects (common to all AxDocs)
#include "ipprevw.h" // PrintPreview (for select Office apps)
#include "rbbinder.h" // Internet Publishing (for Web Folder write access)
////////////////////////////////////////////////////////////////////////
// Microsoft Office 97-2003 Document Object GUIDs
//
DEFINE_GUID(CLSID_WORD_DOCUMENT_DOC, 0x00020906, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
DEFINE_GUID(CLSID_EXCEL_WORKBOOK_XLS, 0x00020820, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
DEFINE_GUID(CLSID_EXCEL_CHART_XLS, 0x00020821, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
DEFINE_GUID(CLSID_PPT_PRESENTATION_PPT, 0x64818D10, 0x4F9B, 0x11CF, 0x86, 0xEA, 0x00, 0xAA, 0x00, 0xB9, 0x29, 0xE8);
DEFINE_GUID(CLSID_VISIO_DRAWING_VSD, 0x00021A13, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
DEFINE_GUID(CLSID_PROJECT_DOCUMENT_MPP, 0x74B78F3A, 0xC8C8, 0x11D1, 0xBE, 0x11, 0x00, 0xC0, 0x4F, 0xB6, 0xFA, 0xF1);
DEFINE_GUID(CLSID_MSHTML_DOCUMENT, 0x25336920, 0x03F9, 0x11CF, 0x8F, 0xD0, 0x00, 0xAA, 0x00, 0x68, 0x6F, 0x13);
////////////////////////////////////////////////////////////////////////
// Microsoft Office 2007 Document GUIDs
//
DEFINE_GUID(CLSID_WORD_DOCUMENT_DOCX, 0xF4754C9B, 0x64F5, 0x4B40, 0x8A, 0xF4, 0x67, 0x97, 0x32, 0xAC, 0x06, 0x07);
DEFINE_GUID(CLSID_WORD_DOCUMENT_DOCM, 0x18A06B6B, 0x2F3F, 0x4E2B, 0xA6, 0x11, 0x52, 0xBE, 0x63, 0x1B, 0x2D, 0x22);
DEFINE_GUID(CLSID_EXCEL_WORKBOOK_XLSX, 0x00020830, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
DEFINE_GUID(CLSID_EXCEL_WORKBOOK_XLSM, 0x00020832, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
DEFINE_GUID(CLSID_EXCEL_WORKBOOK_XLSB, 0x00020833, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
DEFINE_GUID(CLSID_PPT_PRESENTATION_PPTX, 0xCF4F55F4, 0x8F87, 0x4D47, 0x80, 0xBB, 0x58, 0x08, 0x16, 0x4B, 0xB3, 0xF8);
DEFINE_GUID(CLSID_PPT_PRESENTATION_PPTM, 0xDC020317, 0xE6E2, 0x4A62, 0xB9, 0xFA, 0xB3, 0xEF, 0xE1, 0x66, 0x26, 0xF4);
////////////////////////////////////////////////////////////////////
// IDsoDocObjectSite -- {444CA1F7-B405-4002-95C3-A455BC9F4F55}
//
// Implemented by control host for callbacks. Required interface.
//
interface IDsoDocObjectSite : public IServiceProvider
{
STDMETHOD(GetWindow)(HWND* phWnd) PURE;
STDMETHOD(GetBorder)(LPRECT prcBorder) PURE;
STDMETHOD(SetStatusText)(LPCOLESTR pszText) PURE;
STDMETHOD(GetHostName)(LPWSTR *ppwszHostName) PURE;
STDMETHOD(SysMenuCommand)(UINT uiCharCode) PURE;
};
DEFINE_GUID(IID_IDsoDocObjectSite, 0x444CA1F7, 0xB405, 0x4002, 0x95, 0xC3, 0xA4, 0x55, 0xBC, 0x9F, 0x4F, 0x55);
////////////////////////////////////////////////////////////////////
// CDsoDocObject -- ActiveDocument Container Site Object
//
// The CDsoDocObject object handles all the DocObject embedding for the
// control and os fairly self-contained. Like the control it has its
// own window, but it merely acts as a parent for the embedded object
// window(s) which it activates.
//
// CDsoDocObject works by taking a file (or automation object) and
// copying out the OLE storage used for its persistent data. It then
// creates a new embedding based on the data. If a storage is not
// avaiable, it will attempt to oad the file directly, but the results
// are less predictable using this manner since DocObjects are embeddings
// and not links and this component has limited support for links. As a
// result, we will attempt to keep our own storage copy in most cases.
//
// You should note that this approach is different than one taken by the
// web browser control, which is basically a link container which will
// try to embed (ip activate) if allowed, but if not it opens the file
// externally and keeps the link. If CDsoDocObject cannot embed the object,
// it returns an error. It will not open the object external.
//
// Like the control, this object also uses nested classes for the OLE
// interfaces used in the embedding. They are easier to track and easier
// to debug if a specific interface is over/under released. Again this was
// a design decision to make the sample easier to break apart, but not required.
//
// Because the object is not tied to the top-level window, it constructs
// the OLE merged menu as a set of popup menus which the control then displays
// in whatever form it wants. You would need to customize this if you used
// the control in a host and wanted the menus to merge with the actual host
// menu bar (on the top-level window or form).
//
class CDsoDocObject : public IUnknown
{
public:
CDsoDocObject();
~CDsoDocObject();
// Static Create Method (Host Provides Site Interface)
static STDMETHODIMP_(CDsoDocObject*) CreateInstance(IDsoDocObjectSite* phost);
// IUnknown Implementation
STDMETHODIMP QueryInterface(REFIID riid, void** ppv);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
// IOleClientSite Implementation
BEGIN_INTERFACE_PART(OleClientSite, IOleClientSite)
STDMETHODIMP SaveObject(void);
STDMETHODIMP GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker** ppmk);
STDMETHODIMP GetContainer(IOleContainer** ppContainer);
STDMETHODIMP ShowObject(void);
STDMETHODIMP OnShowWindow(BOOL fShow);
STDMETHODIMP RequestNewObjectLayout(void);
END_INTERFACE_PART(OleClientSite)
// IOleInPlaceSite Implementation
BEGIN_INTERFACE_PART(OleInPlaceSite, IOleInPlaceSite)
STDMETHODIMP GetWindow(HWND* phwnd);
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode);
STDMETHODIMP CanInPlaceActivate(void);
STDMETHODIMP OnInPlaceActivate(void);
STDMETHODIMP OnUIActivate(void);
STDMETHODIMP GetWindowContext(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo);
STDMETHODIMP Scroll(SIZE sz);
STDMETHODIMP OnUIDeactivate(BOOL fUndoable);
STDMETHODIMP OnInPlaceDeactivate(void);
STDMETHODIMP DiscardUndoState(void);
STDMETHODIMP DeactivateAndUndo(void);
STDMETHODIMP OnPosRectChange(LPCRECT lprcPosRect);
END_INTERFACE_PART(OleInPlaceSite)
// IOleDocumentSite Implementation
BEGIN_INTERFACE_PART(OleDocumentSite, IOleDocumentSite)
STDMETHODIMP ActivateMe(IOleDocumentView* pView);
END_INTERFACE_PART(OleDocumentSite)
// IOleInPlaceFrame Implementation
BEGIN_INTERFACE_PART(OleInPlaceFrame, IOleInPlaceFrame)
STDMETHODIMP GetWindow(HWND* phWnd);
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode);
STDMETHODIMP GetBorder(LPRECT prcBorder);
STDMETHODIMP RequestBorderSpace(LPCBORDERWIDTHS pBW);
STDMETHODIMP SetBorderSpace(LPCBORDERWIDTHS pBW);
STDMETHODIMP SetActiveObject(LPOLEINPLACEACTIVEOBJECT pIIPActiveObj, LPCOLESTR pszObj);
STDMETHODIMP InsertMenus(HMENU hMenu, LPOLEMENUGROUPWIDTHS pMGW);
STDMETHODIMP SetMenu(HMENU hMenu, HOLEMENU hOLEMenu, HWND hWndObj);
STDMETHODIMP RemoveMenus(HMENU hMenu);
STDMETHODIMP SetStatusText(LPCOLESTR pszText);
STDMETHODIMP EnableModeless(BOOL fEnable);
STDMETHODIMP TranslateAccelerator(LPMSG pMSG, WORD wID);
END_INTERFACE_PART(OleInPlaceFrame)
// IOleCommandTarget Implementation
BEGIN_INTERFACE_PART(OleCommandTarget , IOleCommandTarget)
STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText);
STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvaIn, VARIANTARG *pvaOut);
END_INTERFACE_PART(OleCommandTarget)
// IServiceProvider Implementation
BEGIN_INTERFACE_PART(ServiceProvider , IServiceProvider)
STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppv);
END_INTERFACE_PART(ServiceProvider)
// IAuthenticate Implementation
BEGIN_INTERFACE_PART(Authenticate , IAuthenticate)
STDMETHODIMP Authenticate(HWND *phwnd, LPWSTR *pszUsername, LPWSTR *pszPassword);
END_INTERFACE_PART(Authenticate)
// IContinueCallback Implementation
BEGIN_INTERFACE_PART(ContinueCallback , IContinueCallback)
STDMETHODIMP FContinue(void);
STDMETHODIMP FContinuePrinting(LONG cPagesPrinted, LONG nCurrentPage, LPOLESTR pwszPrintStatus);
END_INTERFACE_PART(ContinueCallback)
// IOlePreviewCallback Implementation
BEGIN_INTERFACE_PART(PreviewCallback , IOlePreviewCallback)
STDMETHODIMP Notify(DWORD wStatus, LONG nLastPage, LPOLESTR pwszPreviewStatus);
END_INTERFACE_PART(PreviewCallback)
// DocObject Class Methods IDsoDocObjectSite
STDMETHODIMP InitializeNewInstance(IDsoDocObjectSite* phost);
STDMETHODIMP CreateDocObject(REFCLSID rclsid);
STDMETHODIMP CreateDocObject(IStorage *pstg);
STDMETHODIMP CreateFromFile(LPWSTR pwszFile, REFCLSID rclsid, LPBIND_OPTS pbndopts);
STDMETHODIMP CreateFromURL(LPWSTR pwszUrlFile, REFCLSID rclsid, LPBIND_OPTS pbndopts, LPWSTR pwszUserName, LPWSTR pwszPassword);
STDMETHODIMP CreateFromRunningObject(LPUNKNOWN punkObj, LPWSTR pwszObjectName, LPBIND_OPTS pbndopts);
STDMETHODIMP IPActivateView();
STDMETHODIMP IPDeactivateView();
STDMETHODIMP UIActivateView();
STDMETHODIMP UIDeactivateView();
STDMETHODIMP_(BOOL) IsDirty();
STDMETHODIMP Save();
STDMETHODIMP SaveToFile(LPWSTR pwszFile, BOOL fOverwriteFile);
STDMETHODIMP SaveToURL(LPWSTR pwszURL, BOOL fOverwriteFile, LPWSTR pwszUserName, LPWSTR pwszPassword);
STDMETHODIMP PrintDocument(LPCWSTR pwszPrinter, LPCWSTR pwszOutput, UINT cCopies, UINT nFrom, UINT nTo, BOOL fPromptUser);
STDMETHODIMP StartPrintPreview();
STDMETHODIMP ExitPrintPreview(BOOL fForceExit);
STDMETHODIMP DoOleCommand(DWORD dwOleCmdId, DWORD dwOptions, VARIANT* vInParam, VARIANT* vInOutParam);
STDMETHODIMP Close();
// Control should notify us on these conditions (so we can pass to IP object)...
STDMETHODIMP_(void) OnNotifySizeChange(LPRECT prc);
STDMETHODIMP_(void) OnNotifyAppActivate(BOOL fActive, DWORD dwThreadID);
STDMETHODIMP_(void) OnNotifyPaletteChanged(HWND hwndPalChg);
STDMETHODIMP_(void) OnNotifyChangeToolState(BOOL fShowTools);
STDMETHODIMP_(void) OnNotifyControlFocus(BOOL fGotFocus);
STDMETHODIMP HrGetDataFromObject(VARIANT *pvtType, VARIANT *pvtOutput);
STDMETHODIMP HrSetDataInObject(VARIANT *pvtType, VARIANT *pvtInput, BOOL fMbcsString);
STDMETHODIMP_(BOOL) GetDocumentTypeAndFileExtension(WCHAR** ppwszFileType, WCHAR** ppwszFileExt);
// Inline accessors for control to get IP object info...
inline IOleInPlaceActiveObject* GetActiveObject(){return m_pipactive;}
inline IOleObject* GetOleObject(){return m_pole;}
inline HWND GetDocWindow(){return m_hwnd;}
inline HWND GetActiveWindow(){return m_hwndUIActiveObj;}
inline BOOL IsReadOnly(){return m_fOpenReadOnly;}
inline BOOL InPrintPreview(){return ((m_pprtprv != NULL) || (m_fInPptSlideShow));}
inline HWND GetMenuHWND(){return m_hwndMenuObj;}
inline HMENU GetActiveMenu(){return m_hMenuActive;}
inline HMENU GetMergedMenu(){return m_hMenuMerged;}
inline void SetMergedMenu(HMENU h){m_hMenuMerged = h;}
inline LPCWSTR GetSourceName(){return ((m_pwszWebResource) ? m_pwszWebResource : m_pwszSourceFile);}
inline LPCWSTR GetSourceDocName(){return ((m_pwszSourceFile) ? &m_pwszSourceFile[m_idxSourceName] : NULL);}
inline CLSID* GetServerCLSID(){return &m_clsidObject;}
inline BOOL IsIPActive(){return (m_pipobj != NULL);}
BOOL IsWordObject()
{return ((m_clsidObject == CLSID_WORD_DOCUMENT_DOC) ||
(m_clsidObject == CLSID_WORD_DOCUMENT_DOCX) ||
(m_clsidObject == CLSID_WORD_DOCUMENT_DOCM));
}
BOOL IsExcelObject()
{return ((m_clsidObject == CLSID_EXCEL_WORKBOOK_XLS) ||
(m_clsidObject == CLSID_EXCEL_WORKBOOK_XLSX) ||
(m_clsidObject == CLSID_EXCEL_WORKBOOK_XLSM) ||
(m_clsidObject == CLSID_EXCEL_WORKBOOK_XLSB) ||
(m_clsidObject == CLSID_EXCEL_CHART_XLS));
}
BOOL IsPPTObject()
{return ((m_clsidObject == CLSID_PPT_PRESENTATION_PPT) ||
(m_clsidObject == CLSID_PPT_PRESENTATION_PPTX) ||
(m_clsidObject == CLSID_PPT_PRESENTATION_PPTM));
}
BOOL IsVisioObject()
{return (m_clsidObject == CLSID_VISIO_DRAWING_VSD);}
STDMETHODIMP SetRunningServerLock(BOOL fLock);
protected:
// Internal helper methods...
STDMETHODIMP InstantiateDocObjectServer(REFCLSID rclsid, IOleObject **ppole);
STDMETHODIMP CreateObjectStorage(REFCLSID rclsid);
STDMETHODIMP SaveObjectStorage();
STDMETHODIMP SaveDocToMoniker(IMoniker *pmk, IBindCtx *pbc, BOOL fKeepLock);
STDMETHODIMP SaveDocToFile(LPWSTR pwszFullName, BOOL fKeepLock);
STDMETHODIMP ValidateDocObjectServer(REFCLSID rclsid);
STDMETHODIMP_(BOOL) ValidateFileExtension(WCHAR* pwszFile, WCHAR** ppwszOut);
STDMETHODIMP_(void) OnDraw(DWORD dvAspect, HDC hdcDraw, LPRECT prcBounds, LPRECT prcWBounds, HDC hicTargetDev, BOOL fOptimize);
STDMETHODIMP EnsureOleServerRunning(BOOL fLockRunning);
STDMETHODIMP_(void) FreeRunningLock();
STDMETHODIMP_(void) TurnOffWebToolbar(BOOL fTurnedOff);
STDMETHODIMP_(void) ClearMergedMenu();
STDMETHODIMP_(DWORD) CalcDocNameIndex(LPCWSTR pwszPath);
STDMETHODIMP_(void) CheckForPPTPreviewChange();
// These functions allow the component to access files in a Web Folder for
// write access using the Microsoft Provider for Internet Publishing (MSDAIPP),
// which is installed by Office and comes standard in Windows 2000/ME/XP/2003. The
// provider is not required to use the component, only if you wish to save to
// an FPSE or DAV Web Folder (URL).
STDMETHODIMP_(IUnknown*) CreateIPPBindResource();
STDMETHODIMP IPPDownloadWebResource(LPWSTR pwszURL, LPWSTR pwszFile, IStream** ppstmKeepForSave);
STDMETHODIMP IPPUploadWebResource(LPWSTR pwszFile, IStream** ppstmSave, LPWSTR pwszURLSaveTo, BOOL fOverwriteFile);
static STDMETHODIMP_(LRESULT) FrameWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
// The private class variables...
private:
ULONG m_cRef; // Reference count
HWND m_hwnd; // our window
HWND m_hwndCtl; // The control's window
RECT m_rcViewRect; // Viewable area (set by host)
IDsoDocObjectSite *m_psiteCtl; // The control's site interface
IOleCommandTarget *m_pcmdCtl; // IOCT of host (for frame msgs)
LPWSTR m_pwszHostName; // Ole Host Name for container
LPWSTR m_pwszSourceFile; // Path to Source File (on Open)
IMoniker *m_pmkSourceFile; // Moniker to original source file
IBindCtx *m_pbctxSourceFile; // Bind context used to original source file
IStorage *m_pstgSourceFile; // Original File Storage (if open/save file)
DWORD m_idxSourceName; // Index to doc name in m_pwszSourceFile
CLSID m_clsidObject; // CLSID of the embedded object
IStorage *m_pstgroot; // Root temp storage
IStorage *m_pstgfile; // In-memory file storage
IStream *m_pstmview; // In-memory view info stream
LPWSTR m_pwszWebResource; // The full URL to the web resource
IStream *m_pstmWebResource; // Original Download Stream (if open/save URL)
IUnknown *m_punkIPPResource; // MSDAIPP provider resource (for URL authoring)
LPWSTR m_pwszUsername; // Username and password used by MSDAIPP
LPWSTR m_pwszPassword; // for Authentication (see IAuthenticate)
IOleObject *m_pole; // Embedded OLE Object (OLE)
IOleInPlaceObject *m_pipobj; // The IP object methods (OLE)
IOleInPlaceActiveObject *m_pipactive; // The UI Active object methods (OLE)
IOleDocumentView *m_pdocv; // MSO Document View (DocObj)
IOleCommandTarget *m_pcmdt; // MSO Command Target (DocObj)
IOleInplacePrintPreview *m_pprtprv; // MSO Print Preview (DocObj)
HMENU m_hMenuActive; // The menu supplied by embedded object
HMENU m_hMenuMerged; // The merged menu (set by control host)
HOLEMENU m_holeMenu; // The OLE Menu Descriptor
HWND m_hwndMenuObj; // The window for menu commands
HWND m_hwndIPObject; // IP active object window
HWND m_hwndUIActiveObj; // UI Active object window
DWORD m_dwObjectThreadID; // Thread Id of UI server
BORDERWIDTHS m_bwToolSpace; // Toolspace...
// Bitflags (state info)...
unsigned int m_fDisplayTools:1;
unsigned int m_fDisconnectOnQuit:1;
unsigned int m_fAppWindowActive:1;
unsigned int m_fOpenReadOnly:1;
unsigned int m_fObjectInModalCondition:1;
unsigned int m_fObjectIPActive:1;
unsigned int m_fObjectUIActive:1;
unsigned int m_fObjectActivateComplete:1;
unsigned int m_fLockedServerRunning:1;
unsigned int m_fLoadedFromAuto:1;
unsigned int m_fInClose:1;
unsigned int m_fAttemptPptPreview:1;
unsigned int m_fInPptSlideShow:1;
};
#endif //DS_DSOFDOCOBJ_H