// Microsoft Foundation Classes C++ library. // Copyright (C) 1992 Microsoft Corporation, // All rights reserved. // This source code is only intended as a supplement to the // Microsoft Foundation Classes Reference and Microsoft // QuickHelp and/or WinHelp documentation provided with the library. // See these sources for detailed information regarding the // Microsoft Foundation Classes product. #ifndef __AFXOLE_H__ #define __AFXOLE_H__ #ifndef __AFXWIN_H__ #include "afxwin.h" #endif ///////////////////////////////////////////////////////////////////////////// // AFXOLE - MFC OLE support // Classes declared in this file //CException class COleException; // caught by client //CDocument class COleDocument; // OLE compatible document class COleClientDoc; // contains client items class COleServerDoc; // contains server items only class CDocItem; // part of a document class COleClientItem; // embedded ole object from outside class COleServerItem; // ole object to export class COleServer; // server class COleTemplateServer; // server using DocTemplates ///////////////////////////////////////////////////////////////////////////// #define SERVERONLY #include "ole.h" // max size of OLE name buffer (255 actual characters) #define OLE_MAXNAMESIZE 256 #undef AFXAPP_DATA #define AFXAPP_DATA AFXAPI_DATA ///////////////////////////////////////////////////////////////////////////// // COleException - something going wrong class COleException : public CException { DECLARE_DYNAMIC(COleException) public: OLESTATUS m_status; static OLESTATUS PASCAL Process(CException*); // helper // Implementation (use AfxThrowOleException to create) COleException(OLESTATUS status); }; void AFXAPI AfxThrowOleException(OLESTATUS status); ////////////////////////////////////////////////////////////////////////////// // DocItem support class CDocItem : public CObject { DECLARE_DYNAMIC(CDocItem) // Constructors protected: // abstract class CDocItem(); // Attributes public: CDocument* GetDocument() const; // return container // Operations public: // Overridables public: // Raw data access (native format) virtual void Serialize(CArchive& ar) = 0; // for Native data // Implementation protected: COleDocument* m_pDocument; public: virtual ~CDocItem(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif //_DEBUG friend class COleDocument; // for access to back pointer }; ////////////////////////////////////////////////////////////////////////////// // COleDocument - common OLE container behavior (enables server functionality) class COleDocument : public CDocument { DECLARE_DYNAMIC(COleDocument) // Constructors protected: COleDocument(); // Attributes public: BOOL IsOpenClientDoc() const; BOOL IsOpenServerDoc() const; // Operations // iterating over existing items virtual POSITION GetStartPosition() const; virtual CDocItem* GetNextItem(POSITION& rPosition); // adding new items - for implementation in derived classes void AddItem(CDocItem* pItem); void RemoveItem(CDocItem* pItem); // Implementation public: LHCLIENTDOC m_lhClientDoc; // registered handle LHSERVERDOC m_lhServerDoc; // registered handle CPtrList m_docItemList; // not owned items public: virtual ~COleDocument(); virtual void DeleteContents(); // delete doc items in list #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif }; ///////////////////////////////////////////////////////////////////////////// // COleClientItem - Client view of an OLEOBJECT + OLECLIENT for callbacks class COleClientItem : public CDocItem { DECLARE_DYNAMIC(COleClientItem) // Constructors public: COleClientItem(COleClientDoc* pContainerDoc); // create from the clipboard BOOL CreateFromClipboard(LPCSTR lpszItemName, OLEOPT_RENDER renderopt = olerender_draw, OLECLIPFORMAT cfFormat = 0); BOOL CreateStaticFromClipboard(LPCSTR lpszItemName, OLEOPT_RENDER renderopt = olerender_draw, OLECLIPFORMAT cfFormat = 0); BOOL CreateLinkFromClipboard(LPCSTR lpszItemName, OLEOPT_RENDER renderopt = olerender_draw, OLECLIPFORMAT cfFormat = 0); // create from a protocol name (Insert New Object dialog) BOOL CreateNewObject(LPCSTR lpszTypeName, LPCSTR lpszItemName, OLEOPT_RENDER renderopt = olerender_draw, OLECLIPFORMAT cfFormat = 0); // special create for invisible BOOL CreateInvisibleObject(LPCSTR lpszTypeName, LPCSTR lpszItemName, OLEOPT_RENDER renderopt = olerender_draw, OLECLIPFORMAT cfFormat = 0, BOOL bActivate = FALSE); // create a copy BOOL CreateCloneFrom(COleClientItem* pSrcItem, LPCSTR lpszItemName); // General Attributes OLESTATUS GetLastStatus() const; UINT GetType(); // OT_LINK, OT_EMBEDDED or OT_STATIC CString GetName(); DWORD GetSize(); // return size of item BOOL GetBounds(LPRECT lpBounds); // return FALSE if BLANK BOOL IsOpen(); // currently open on server side // Data access OLECLIPFORMAT EnumFormats(OLECLIPFORMAT nFormat) const; HANDLE GetData(OLECLIPFORMAT nFormat, BOOL& bMustDelete); void SetData(OLECLIPFORMAT nFormat, HANDLE hData); void RequestData(OLECLIPFORMAT nFormat); // Other rare access information BOOL IsEqual(COleClientItem* pOtherItem); COleClientDoc* GetDocument() const; // return container // global state - if anyone waiting for release => not normal operations static BOOL PASCAL InWaitForRelease(); // Helpers for checking clipboard data availability static BOOL PASCAL CanPaste(OLEOPT_RENDER renderopt = olerender_draw, OLECLIPFORMAT cfFormat = 0); static BOOL PASCAL CanPasteLink(OLEOPT_RENDER renderopt = olerender_draw, OLECLIPFORMAT cfFormat = 0); // General Operations // Clean up void Release(); // detach (close if needed) void Delete(); // get rid of it then detach // Drawing BOOL Draw(CDC* pDC, LPCRECT lpBounds, LPCRECT lpWBounds = NULL, CDC* pFormatDC = NULL); // Activation virtual BOOL DoVerb(UINT nVerb); // general run verb, calls Activate void Activate(UINT nVerb, BOOL bShow = TRUE, BOOL bTakeFocus = TRUE, CWnd* pWndContainer = NULL, LPCRECT lpBounds = NULL); // more advanced operations void Rename(LPCSTR lpszNewname); // call to rename item void CopyToClipboard(); void SetTargetDevice(HGLOBAL hData); // handle to an OLETARGETDEVICE // Operations that apply to Embedded Objects only void SetHostNames(LPCSTR lpszHost, LPCSTR lpszHostObj); void SetBounds(LPCRECT lpRect); void SetColorScheme(const LOGPALETTE FAR* lpLogPalette); // Operations that apply to Linked Objects only // Link options are rarely changed (except through Links dialog) OLEOPT_UPDATE GetLinkUpdateOptions(); void SetLinkUpdateOptions(OLEOPT_UPDATE updateOpt); void UpdateLink(); // make up-to-date void CloseLink(); // close connection // can be used for embedded (rare) void ReconnectLink(); // reactivate connection // Overridables (notifications of OLECLIENT) protected: // notifications from the server you must implement virtual void OnChange(OLE_NOTIFICATION wNotification) = 0; // Change due to link update (OLE_CHANGED), // document save (OLE_SAVED) or document close (OLE_CLOSED) // notifications you do not have to implement virtual void OnRenamed(); // document has been renamed // Implementation protected: OLECLIENT m_oleClient; // must be first member variable in this class OLESTATUS m_lastStatus; public: // in case you want direct access LPOLEOBJECT m_lpObject; public: virtual ~COleClientItem(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif virtual void Serialize(CArchive& ar); public: // Implementation helpers virtual BOOL ReportOleError(OLESTATUS status); virtual BOOL FreezeLink(LPCSTR lpszFrozenName); // link -> embedded // Advanced Overridables for implementation static COleClientItem* PASCAL FromLp(LPOLECLIENT lpClient); HGLOBAL GetLinkFormatData(); protected: // Advanced Overridables for implementation virtual int ClientCallBack(OLE_NOTIFICATION wNotification); virtual BOOL CheckCreate(OLESTATUS status); virtual void CheckAsync(OLESTATUS status); virtual void CheckGeneral(OLESTATUS status); virtual void WaitForServer(); virtual void OnRelease(); friend struct _afxOleCliImpl; friend class COleClientDoc; }; ////////////////////////////////////////////////////////////////////////////// // COleClientDoc - document that registered client document class COleClientDoc : public COleDocument { DECLARE_DYNAMIC(COleClientDoc) // Constructors and Destructors public: COleClientDoc(); BOOL RegisterClientDoc(LPCSTR lpszTypeName, LPCSTR lpszDoc); void Revoke(); // called by destructor // Operations (notify the global registry) void NotifyRename(LPCSTR lpszNewName); // call this after document is renamed void NotifyRevert(); // call this after document reverts to original void NotifySaved(); // call this after document is saved virtual COleClientItem* GetPrimarySelectedItem(CView*); // return primary selected item or NULL if none // Implementation public: virtual ~COleClientDoc(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif // Advanced Overridables for implementation virtual void CheckGeneral(OLESTATUS status) const; protected: virtual BOOL OnNewDocument(); virtual BOOL OnOpenDocument(const char* pszPathName); virtual BOOL OnSaveDocument(const char* pszPathName); virtual void OnCloseDocument(); virtual BOOL CanCloseFrame(CFrameWnd* pFrame); virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo); //{{AFX_MSG(COleClientDoc) afx_msg void OnUpdatePasteMenu(CCmdUI* pCmdUI); afx_msg void OnUpdatePasteLinkMenu(CCmdUI* pCmdUI); afx_msg void OnUpdateEditLinksMenu(CCmdUI* pCmdUI); afx_msg void OnEditLinks(); afx_msg void OnUpdateObjectVerbMenu(CCmdUI* pCmdUI); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// // User interface helper functions void AFXAPI AfxOleSetEditMenu(COleClientItem* pClient, CMenu* pMenu, UINT iMenuItem, UINT nIDVerbMin); BOOL AFXAPI AfxOleInsertDialog(CString& name); BOOL AFXAPI AfxOleLinksDialog(COleClientDoc* pDoc, CView* pView); ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // COleServerItem - Server view of an OLEOBJECT + OLECLIENT class COleServerItem : public CDocItem { DECLARE_DYNAMIC(COleServerItem) protected: // NOTE: most members in this class are protected - since everything // in this class is designed for implementing an OLE server. // Requests will come from OLE Clients through non-C++ mechanisms, // which will result in virtual functions in this class being // called. // Constructors COleServerItem(COleServerDoc* pContainerDoc); // Public Attributes public: COleServerDoc* GetDocument() const; // return container BOOL IsConnected() const; // TRUE if connected to client const CString& GetItemName() const; // get name of linked item void SetItemName(const char* pszItemName); // set name of linked item // Operations public: void NotifyChanged(); // call this after you change item void Revoke(); // revoke client connection and wait BOOL CopyToClipboard(BOOL bIncludeNative, BOOL bIncludeLink); // for implementing server 'copy to clipboard' // Overridables you must implement for yourself // Raw data access virtual void Serialize(CArchive& ar) = 0; // for Native data // Drawing for metafile format (return FALSE if not supported or error) virtual BOOL OnDraw(CDC* pDC) = 0; // draw to boundaries set in m_rectBounds // Overridables you may want to implement yourself virtual OLESTATUS OnExtraVerb(UINT nVerb); // do extra verbs - default is not implemented virtual OLESTATUS OnSetTargetDevice(LPOLETARGETDEVICE lpTargetDevice); // track target device changes - default ignores virtual OLESTATUS OnSetBounds(LPCRECT lpRect); // track size changes - default updates m_rectBounds virtual OLESTATUS OnShow(BOOL bTakeFocus); // show item in the user interface virtual BOOL OnGetTextData(CString& rStringReturn) const; // get data as text // more advanced implementation virtual OLESTATUS OnGetData(OLECLIPFORMAT nFormat, LPHANDLE lphReturn); protected: // Overridables you do not have to implement virtual OLESTATUS OnSetColorScheme(const LOGPALETTE FAR* lpLogPalette); // default does nothing virtual OLECLIPFORMAT OnEnumFormats(OLECLIPFORMAT nFormat) const; // default handles native + std. formats virtual OLESTATUS OnSetData(OLECLIPFORMAT nFormat, HANDLE hData); // default routes to GetNativeData virtual OLESTATUS OnDoVerb(UINT nVerb, BOOL bShow, BOOL bTakeFocus); // default routes to OnShow &/or OnExtraVerb // Implementation protected: OLEOBJECT m_oleObject; // must be first member variable LPOLECLIENT m_lpClient; CRect m_rectBounds; // HIMETRIC. If IsRectNull => not set yet CString m_strItemName; // simple item name public: void BeginRevoke(); // revoke client connection int NotifyClient(OLE_NOTIFICATION wNotification); virtual ~COleServerItem(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // Advanced Overridables for implementation virtual HGLOBAL GetLinkFormatData(BOOL bObjectLink); virtual HGLOBAL GetMetafileData(); // calls 'OnDraw(...)' virtual HGLOBAL GetNativeData(); // calls 'Serialize(...)' virtual LPVOID OnQueryProtocol(LPCSTR lpszProtocol) const; // default handles "StdFileEditing" virtual OLESTATUS OnRelease(); // Implementation helpers static COleServerItem* PASCAL FromLp(LPOLEOBJECT lpObject); friend struct _afxOleSvrItemImpl; friend class COleServerDoc; friend struct _afxOleSvrDocImpl; }; ////////////////////////////////////////////////////////////////////////////// // COleServerDoc - registered server document containing COleServerItems class COleServerDoc : public COleDocument { DECLARE_DYNAMIC(COleServerDoc) // Constructors and Destructors public: COleServerDoc(); // Special construction routines if opened by user (or linked file) BOOL RegisterServerDoc(COleServer* pServer, LPCSTR lpszDoc); // call if opened by user (eg: File Open) void Revoke(); // Revoke and wait to finish // Operations // changes to the entire document (automatically notifies clients) void NotifyRename(LPCSTR lpszNewName); void NotifyRevert(); void NotifySaved(); // specific notifications for clients void NotifyClosed(); // call this after you close document void NotifyChanged(); // call this after you change some // global attibute like doc dimensions protected: // Overridables you must implement for yourself virtual COleServerItem* OnGetEmbeddedItem() = 0; // return new item representing entire [embedded] document virtual COleServerItem* OnGetLinkedItem(LPCSTR lpszItemName); // return new item for the named linked item // Overridables you may want to implement yourself virtual OLESTATUS OnClose(); virtual OLESTATUS OnExecute(LPVOID lpCommands); virtual OLESTATUS OnSetDocDimensions(LPCRECT lpRect); // Overridables you do not have to implement virtual OLESTATUS OnSetHostNames(LPCSTR lpszHost, LPCSTR lpszHostObj); virtual OLESTATUS OnSetColorScheme(const LOGPALETTE FAR* lpLogPalette); // Overridables for standard user interface (full server) virtual BOOL OnUpdateDocument(); // implementation of embedded update // Implementation protected: OLESERVERDOC m_oleServerDoc; // must be first member variable BOOL m_bWaiting; public: COleServer* m_pServer; public: virtual ~COleServerDoc(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // Advanced Overridables for implementation virtual void CheckAsync(OLESTATUS status); virtual OLESTATUS OnRelease(); virtual OLESTATUS OnSave(); // not used in V1 // Implementation helpers static COleServerDoc* PASCAL FromLp(LPOLESERVERDOC lpServerDoc); void NotifyAllClients(OLE_NOTIFICATION wNotification); OLESTATUS BeginRevoke(); // Revoke but don't wait void RegisterIfServerAttached(const char* pszPathName); virtual BOOL OnNewDocument(); virtual BOOL OnOpenDocument(const char* pszPathName); virtual BOOL OnSaveDocument(const char* pszPathName); virtual void OnCloseDocument(); virtual BOOL SaveModified(); // return TRUE if ok to continue friend struct _afxOleSvrDocImpl; friend class COleServer; friend struct _afxSvrImpl; //{{AFX_MSG(COleServerDoc) afx_msg void OnUpdateFileSaveMenu(CCmdUI* pCmdUI); afx_msg void OnFileSaveOrUpdate(); afx_msg void OnFileSaveAs(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ////////////////////////////////////////////////////////////////////////////// // COleServer - registered server application class COleServer : public CObject { DECLARE_DYNAMIC(COleServer) // Constructors and Destructors public: COleServer(BOOL bLaunchEmbedded); BOOL Register(LPCSTR lpszTypeName, BOOL bMultiInstance); void BeginRevoke(); // Attributes public: BOOL IsOpen() const; // TRUE if successfully registered const CString& GetServerName() const; // registered name // Overridables you must implement for yourself protected: // for those supporting embedding virtual COleServerDoc* OnCreateDoc(LPCSTR lpszTypeName, LPCSTR lpszDoc) = 0; virtual COleServerDoc* OnEditDoc(LPCSTR lpszTypeName, LPCSTR lpszDoc) = 0; // Overridables you may want to implement yourself // for those supporting links virtual COleServerDoc* OnOpenDoc(LPCSTR lpszDoc); // for those supporting embedding from template files (not CDocTemplates!) virtual COleServerDoc* OnCreateDocFromTemplateFile(LPCSTR lpszTypeName, LPCSTR lpszDoc, LPCSTR lpszTemplate); // for those supporting DDE execute commands virtual OLESTATUS OnExecute(LPVOID lpCommands); // Overridables you do not have to implement virtual OLESTATUS OnExit(); // default to BeginRevoke // Implementation support of managing # of open documents protected: void AddDocument(COleServerDoc* pDoc, LHSERVERDOC lhServerDoc); void RemoveDocument(COleServerDoc* pDoc); // Implementation protected: OLESERVER m_oleServer; // must be first member variable LHSERVER m_lhServer; // registered handle CString m_strServerName; // registered name public: // Public attributes - access only if you know what you are doing BOOL m_bLaunchEmbedded; int m_cOpenDocuments; virtual ~COleServer(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // Advanced Overridables for implementation virtual OLESTATUS OnRelease(); // default to cleanup // Implementation helpers static COleServer* PASCAL FromLp(LPOLESERVER lpServer); friend class COleServerDoc; friend struct _afxSvrImpl; }; // Helper to register server in case of no .REG file loaded BOOL AFXAPI AfxOleRegisterServerName(LPCSTR lpszTypeName, LPCSTR lpszLocalTypeName); ////////////////////////////////////////////////////////////////////////////// // COleTemplateServer - COleServer using CDocTemplates class COleTemplateServer : public COleServer { public: COleTemplateServer(); BOOL RunEmbedded(CDocTemplate* pDocTemplate, BOOL bMultiInstance, LPCSTR lpszCmdLine); // return TRUE if running embedded (may open file on cmd line) // Implementation protected: // Overridables for OLE Server requests virtual COleServerDoc* OnOpenDoc(LPCSTR lpszDoc); virtual COleServerDoc* OnCreateDoc(LPCSTR lpszTypeName, LPCSTR lpszDoc); virtual COleServerDoc* OnEditDoc(LPCSTR lpszTypeName, LPCSTR lpszDoc); // Implementation CDocTemplate* m_pDocTemplate; }; ///////////////////////////////////////////////////////////////////////////// // Inline function declarations #ifdef _AFX_ENABLE_INLINES #define _AFXOLE_INLINE inline #define _AFXOLECLI_INLINE inline #define _AFXOLESVR_INLINE inline #include "afxole.inl" #endif #undef AFXAPP_DATA #define AFXAPP_DATA NEAR ////////////////////////////////////////////////////////////////////////////// #endif //__AFXOLE_H__