|
|
1.1 root 1: // Microsoft Foundation Classes C++ library.
2: // Copyright (C) 1992 Microsoft Corporation,
3: // All rights reserved.
4:
5: // This source code is only intended as a supplement to the
6: // Microsoft Foundation Classes Reference and Microsoft
7: // QuickHelp documentation provided with the library.
8: // See these sources for detailed information regarding the
9: // Microsoft Foundation Classes product.
10:
11:
12: #ifndef __AFXOLE_H__
13: #define __AFXOLE_H__
14:
15: /////////////////////////////////////////////////////////////////////////////
16: // Classes declared in this file
17:
18: //CException
19: class COleException; // caught by client
20:
21: // Client side of linking and embedding
22: class COleClientItem; // embedded ole object
23: class COleClientDoc; // a document containing COleClientItems
24:
25: // Server (/provider) side of linking and embedding
26: class COleServerItem; // embedded ole object
27: class COleServerDoc; // server document
28: class COleServer; // server application
29:
30: /////////////////////////////////////////////////////////////////////////////
31: // Make sure 'afxwin.h' is included first
32: #ifndef __AFXWIN_H__
33: #include "afxwin.h"
34: #endif
35:
36: #define SERVERONLY /* use smaller server version of OLEOBJECT VTable */
37: #include "ole.h"
38:
39: #define OLE_MAXNAMESIZE 256 /* 255 real characters */
40:
41: /////////////////////////////////////////////////////////////////////////////
42: // COleException - something going wrong
43:
44: class COleException : public CException
45: {
46: DECLARE_DYNAMIC(COleException)
47: public:
48: OLESTATUS m_status;
49: COleException(OLESTATUS status);
50:
51: static OLESTATUS Process(CException*); // helper
52: };
53:
54: void AfxThrowOleException(OLESTATUS status);
55:
56: /////////////////////////////////////////////////////////////////////////////
57: // User interface helper functions
58:
59: void AfxOleSetEditMenu(COleClientItem* pClient, CMenu* pMenu,
60: UINT iMenuItem, UINT nIDVerbMin);
61: BOOL AfxOleInsertDialog(CString& name);
62: BOOL AfxOleLinksDialog(COleClientDoc* pDoc);
63:
64: //////////////////////////////////////////////////////////////////////////////
65: // COleClientItem - Client view of an OLEOBJECT + OLECLIENT for callbacks
66:
67: class COleClientItem : public CObject
68: {
69: // Implementation
70: protected:
71: OLECLIENT m_oleClient; // must be first member variable
72: public: // in case you want direct access
73: LPOLEOBJECT m_lpObject;
74: protected:
75: OLESTATUS m_lastStatus;
76: COleClientDoc* m_pDocument;
77:
78: DECLARE_DYNAMIC(COleClientItem)
79:
80: // Constructors
81: public:
82: COleClientItem(COleClientDoc* pContainerDoc);
83: ~COleClientItem();
84:
85: // create from the clipboard
86: BOOL CreateFromClipboard(LPCSTR lpszItemName,
87: OLEOPT_RENDER renderopt = olerender_draw,
88: OLECLIPFORMAT cfFormat = 0);
89: BOOL CreateStaticFromClipboard(LPCSTR lpszItemName,
90: OLEOPT_RENDER renderopt = olerender_draw,
91: OLECLIPFORMAT cfFormat = 0);
92: BOOL CreateLinkFromClipboard(LPCSTR lpszItemName,
93: OLEOPT_RENDER renderopt = olerender_draw,
94: OLECLIPFORMAT cfFormat = 0);
95:
96: // create from a protocol name (Insert New Object dialog)
97: BOOL CreateNewObject(LPCSTR lpszClass, LPCSTR lpszItemName,
98: OLEOPT_RENDER renderopt = olerender_draw,
99: OLECLIPFORMAT cfFormat = 0);
100: // special create for invisible
101: BOOL CreateInvisibleObject(LPCSTR lpszClass, LPCSTR lpszItemName,
102: OLEOPT_RENDER renderopt = olerender_draw,
103: OLECLIPFORMAT cfFormat = 0, BOOL bActivate = FALSE);
104:
105: // create a copy
106: BOOL CreateCloneFrom(COleClientItem* pObject, LPCSTR lpszItemName);
107:
108: // General Attributes
109: OLESTATUS GetLastStatus() const;
110: UINT GetType(); // OT_LINK, OT_EMBEDDED or OT_STATIC
111: CString GetName();
112:
113: BOOL GetSize(LPPOINT lpSize); // return FALSE if BLANK
114: BOOL GetBounds(LPRECT lpBounds); // return FALSE if BLANK
115:
116: BOOL IsOpen(); // currently open on server side
117:
118: // Data access
119: OLECLIPFORMAT EnumFormats(OLECLIPFORMAT nFormat) const;
120: HANDLE GetData(OLECLIPFORMAT nFormat, BOOL& bMustDelete);
121: void SetData(OLECLIPFORMAT nFormat, HANDLE hData);
122: void RequestData(OLECLIPFORMAT nFormat);
123:
124: // Other rare access information
125: BOOL IsEqual(COleClientItem* pObject);
126: HANDLE GetLinkFormatData(); // internal use
127: COleClientDoc* GetDocument() const; // return container
128:
129: // global state - if anyone waiting for release => not normal operations
130: static BOOL InWaitForRelease();
131:
132: // Helpers for checking clipboard data availability
133: static BOOL CanPaste(OLEOPT_RENDER renderopt = olerender_draw,
134: OLECLIPFORMAT cfFormat = 0);
135: static BOOL CanPasteLink(OLEOPT_RENDER renderopt = olerender_draw,
136: OLECLIPFORMAT cfFormat = 0);
137:
138: // Attributes that apply to Linked Objects only
139:
140: // Link options are rarely changed (except through Links dialog)
141: OLEOPT_UPDATE GetLinkUpdateOptions();
142: void SetLinkUpdateOptions(OLEOPT_UPDATE updateOpt);
143:
144: // General Operations
145: // Clean up
146: void Release(); // detach (close if needed)
147: void Delete(); // get rid of it then detach
148:
149: // Drawing
150: BOOL Draw(CDC *pDC, LPRECT lpBounds, LPRECT lpWBounds,
151: CDC* pFormatDC);
152:
153: // Activation
154: void Activate(UINT nVerb, BOOL bShow = TRUE, BOOL bTakeFocus = TRUE,
155: CWnd * pWndContainer = NULL, LPRECT lpBounds = NULL);
156:
157: // more advanced operations
158: void Rename(LPCSTR lpszNewname); // call to rename item
159: void CopyToClipboard();
160: void SetTargetDevice(HANDLE hData);
161: // handle to an OLETARGETDEVICE
162:
163: // Operations that apply to Embedded Objects only
164: void SetHostNames(LPCSTR lpszHost, LPCSTR lpszHostObj);
165: void SetBounds(LPRECT lpRect);
166: void SetColorScheme(LPLOGPALETTE lpLogPalette);
167:
168: // Operations that apply to Linked Objects only
169: void UpdateLink(); // make up-to-date
170: void CloseLink(); // close connection
171: // can be used for embedded (rare)
172: void ReconnectLink(); // reactivate connection
173:
174: virtual BOOL FreezeLink(LPCSTR lpszFrozenName);
175: // link -> embedded
176:
177:
178: // Overridables (notifications of OLECLIENT)
179: protected:
180: // standard notifications from the server telling you about
181: // changes to the item
182:
183: // notifications you must implement
184: virtual void OnChange(OLE_NOTIFICATION wNotification) = 0;
185: // Change due to link update, document save or document close
186:
187: // notifications you can re-implement (not necessary)
188: virtual void OnRenamed(); // document has been renamed
189: virtual void OnRelease();
190:
191: // low level notification hook from the OLE DLLs
192: virtual int ClientCallBack(OLE_NOTIFICATION wNotification);
193:
194: // Overridables for User Interface and Error traps
195: protected:
196: // deciding what are exceptions and what are ok for creation
197: virtual BOOL CheckCreate(OLESTATUS status);
198: virtual void CheckAsync(OLESTATUS status);
199: virtual void CheckGeneral(OLESTATUS status);
200:
201: virtual void WaitForServer();
202: public:
203: virtual BOOL ReportError(OLESTATUS status);
204:
205: // Implementation
206: #ifdef _DEBUG
207: public:
208: virtual void AssertValid() const;
209: virtual void Dump(CDumpContext& dc) const;
210: #endif
211:
212: protected:
213: static int cWaitForRelease;
214: public:
215: virtual void Serialize(CArchive& ar); // from CObject for storing only
216: static COleClientItem* FromLp(LPOLECLIENT lpClient);
217:
218: friend struct _afxOleClientItemImplementation;
219: friend class COleClientDoc;
220: };
221:
222:
223: //////////////////////////////////////////////////////////////////////////////
224: // COleClientDoc - registered client document
225:
226: class COleClientDoc : public CObject
227: {
228: DECLARE_DYNAMIC(COleClientDoc)
229:
230: // Constructors and Destructors
231: public:
232: COleClientDoc();
233: ~COleClientDoc();
234:
235: BOOL Register(LPCSTR lpszClass, LPCSTR lpszDoc);
236: void Revoke(); // called by destructor
237:
238: // Attributes
239: BOOL IsOpen() const; // TRUE if successfully registered
240:
241: // Operations (notify the global registry)
242: void NotifyRename(LPCSTR lpszNewName);
243: // call this after document is renamed
244: void NotifyRevert(); // call this after document reverts to original
245: void NotifySaved(); // call this after document is saved
246:
247: // Overridables you must implement for yourself
248:
249: // iteration
250: POSITION GetStartPosition() const
251: { return NULL; } // start of iteration
252: virtual COleClientItem* GetNextItem(POSITION& rPosition,
253: BOOL* pIsSelected) = 0;
254: // return next item, update BOOL according to selection
255:
256: // Overridables you do not have to implement
257: protected:
258: virtual void CheckGeneral(OLESTATUS status) const;
259:
260: // Implementation
261: public:
262: LHCLIENTDOC m_lhClientDoc;
263:
264: #ifdef _DEBUG
265: public:
266: virtual void AssertValid() const;
267: virtual void Dump(CDumpContext& dc) const;
268: #endif
269: };
270:
271: /////////////////////////////////////////////////////////////////////////////
272: /////////////////////////////////////////////////////////////////////////////
273: // COleServerItem - Server view of an OLEOBJECT + OLECLIENT
274:
275:
276: class COleServerItem : public CObject
277: {
278: protected:
279: // NOTE: EVERYTHING in this class is protected - since everything
280: // in this class is designed for implementing an OLE server.
281: // Requests will come from OLE Clients through non-C++ mechanisms,
282: // which will result in virtual functions in this class being
283: // called.
284:
285: // Implementation
286: OLEOBJECT m_oleObject; // must be first member variable
287: LPOLECLIENT m_lpClient;
288: DECLARE_DYNAMIC(COleServerItem)
289:
290: // Constructors
291: COleServerItem();
292: ~COleServerItem();
293:
294: // Public Attributes
295: public:
296: COleServerDoc* GetDocument() const; // return container
297:
298: // Implementation Attributes
299: protected:
300: COleServerDoc* m_pDocument;
301: HPALETTE m_hPalette;
302: CRect m_rectBounds; // HIMETRIC ! - if IsRectNull => not set yet
303:
304: BOOL IsConnected(); // TRUE if connected to client
305:
306: // Operations for notifying client
307: public:
308: int NotifyClient(OLE_NOTIFICATION wNotification);
309: void NotifyChanged(); // call this after you change item
310:
311: void BeginRevoke(); // revoke client connection
312:
313: // Overridables you must implement for yourself
314: // Raw data access
315: virtual void Serialize(CArchive& ar) = 0; // for Native data
316:
317: protected:
318: // User interface
319: virtual OLESTATUS OnShow(BOOL bTakeFocus) = 0;
320:
321: // Drawing for metafile format (return FALSE if not supported)
322: virtual BOOL OnDraw(CMetaFileDC* pDC) = 0;
323: // draw to boundaries set in m_rectBounds
324:
325: // Overridables you may want to implement yourself
326: virtual OLESTATUS OnRelease();
327: // do extra cleanup
328: virtual OLESTATUS OnExtraVerb(UINT nVerb);
329: // do extra verbs - default is not implemented
330: virtual OLESTATUS OnSetTargetDevice(LPOLETARGETDEVICE lpTargetDevice);
331: // track target device changes - default ignores
332: virtual OLESTATUS OnSetBounds(LPRECT lpRect);
333: // track size changes - default updates m_rectBounds
334:
335: // standard get data as text
336: virtual BOOL OnGetTextData(CString& rStringReturn);
337: // default to not supported
338:
339: // more advanced implementation
340: virtual OLESTATUS OnGetData(OLECLIPFORMAT nFormat, LPHANDLE lphReturn);
341:
342: public: // may be called for direct clipboard access too
343: virtual HANDLE GetMetafileData();
344: // calls 'OnDraw(...)'
345: virtual HANDLE GetNativeData();
346: // calls 'Serialize(...)'
347:
348: protected:
349: // Overridables you do not have to implement
350: virtual LPVOID OnQueryProtocol(LPCSTR lpszProtocol) const;
351: // default handles "StdFileEditing"
352: virtual OLESTATUS OnSetColorScheme(LPLOGPALETTE lpLogPalette);
353: // default updates m_hPalette
354: virtual OLECLIPFORMAT OnEnumFormats(OLECLIPFORMAT nFormat) const;
355: // default handles native + std. formats
356: virtual OLESTATUS OnSetData(OLECLIPFORMAT nFormat, HANDLE hData);
357: // default routes to GetNativeData
358: virtual OLESTATUS OnDoVerb(UINT nVerb, BOOL bShow, BOOL bTakeFocus);
359: // default routes to OnShow &/or OnExtraVerb
360:
361: // Implementation
362: #ifdef _DEBUG
363: public:
364: virtual void AssertValid() const;
365: virtual void Dump(CDumpContext& dc) const;
366: #endif
367: protected:
368: static COleServerItem* FromLp(LPOLEOBJECT lpObject);
369: friend struct _afxOleServerItemImplementation;
370: friend class COleServerDoc;
371: friend struct _afxOleServerDocImplementation;
372: };
373:
374:
375: //////////////////////////////////////////////////////////////////////////////
376: // COleServerDoc - registered server document containing COleServerItems
377:
378: class COleServerDoc : public CObject
379: {
380: protected:
381: // Implementation
382: OLESERVERDOC m_oleServerDoc; // must be first member variable
383: LHSERVERDOC m_lhServerDoc; // registered handle
384: BOOL m_bWaiting;
385: DECLARE_DYNAMIC(COleServerDoc)
386:
387: // Constructors and Destructors
388: public:
389: COleServerDoc();
390: ~COleServerDoc();
391:
392: // Special construction routines if opened by user (or linked file)
393: BOOL Register(COleServer* pServer, LPCSTR lpszDoc);
394: // call if opened by user (eg: File Open)
395: void Revoke(); // Revoke and wait to finish
396:
397: // Attributes
398: COleServer* m_pServer;
399: HPALETTE m_hPalette;
400:
401: BOOL IsOpen() const; // TRUE if successfully registered
402:
403: // Operations
404: // changes to the entire document (automatically notifies clients)
405: void NotifyRename(LPCSTR lpszNewName);
406: void NotifyRevert();
407: void NotifySaved();
408:
409: // specific notifications for all clients
410: void NotifyAllClients(OLE_NOTIFICATION wNotification);
411: void NotifyClosed(); // call this after you close document
412: void NotifyChanged(); // call this after you change some
413: // global attibute like doc dimensions
414:
415: protected:
416: // Overridables you must implement for yourself
417: virtual COleServerItem* OnGetDocument() = 0;
418: // return new item representing entire document
419: virtual COleServerItem* OnGetItem(LPCSTR lpszItemName) = 0;
420: // return new item for the named item
421:
422: // iteration
423: POSITION GetStartPosition() const
424: { return NULL; } // start of iteration
425: virtual COleServerItem* GetNextItem(POSITION& rPosition) = 0;
426: // return next item in iteration
427:
428: // Overridables you may want to implement yourself
429: virtual OLESTATUS OnSave();
430: virtual OLESTATUS OnClose();
431: virtual OLESTATUS OnExecute(LPVOID lpCommands);
432: virtual OLESTATUS OnSetDocDimensions(LPRECT lpRect);
433:
434: // Overridables you do not have to implement
435: virtual OLESTATUS OnSetHostNames(LPCSTR lpszHost, LPCSTR lpszHostObj);
436: virtual OLESTATUS OnSetColorScheme(LPLOGPALETTE lpLogPalette);
437: virtual OLESTATUS OnRelease();
438:
439: // Overridables for Error traps
440: protected:
441: virtual void CheckAsync(OLESTATUS status);
442:
443: // Implementation
444: protected:
445: static COleServerDoc* FromLp(LPOLESERVERDOC lpServerDoc);
446: void AddItem(COleServerItem* pItem, LPOLECLIENT lpClient);
447:
448: // Used in implementation (opened by COleServer)
449: OLESTATUS BeginRevoke(); // Revoke but don't wait
450:
451: #ifdef _DEBUG
452: public:
453: virtual void AssertValid() const;
454: virtual void Dump(CDumpContext& dc) const;
455: #endif
456: friend struct _afxOleServerDocImplementation;
457: friend class COleServer;
458: friend struct _afxOleServerImplementation;
459: };
460:
461: //////////////////////////////////////////////////////////////////////////////
462: // COleServer - registered server application
463:
464: class COleServer : public CObject
465: {
466: protected:
467: // Implementation
468: OLESERVER m_oleServer; // must be first member variable
469: LHSERVER m_lhServer; // registered handle
470: DECLARE_DYNAMIC(COleServer)
471:
472: // Constructors and Destructors
473: public:
474: COleServer(BOOL bLaunchEmbedded);
475: ~COleServer();
476:
477: BOOL Register(LPCSTR lpszClass, BOOL bMultiInstance);
478: void BeginRevoke();
479:
480: // Attributes
481: BOOL IsOpen() const; // TRUE if successfully registered
482: BOOL m_bLaunchEmbedded;
483:
484: // Overridables you must implement for yourself
485: protected:
486: // for those supporting embedding
487: virtual COleServerDoc* OnCreateDoc(LPCSTR lpszClass,
488: LPCSTR lpszDoc) = 0;
489: virtual COleServerDoc* OnEditDoc(LPCSTR lpszClass,
490: LPCSTR lpszDoc) = 0;
491:
492: // Overridables you may want to implement yourself
493: // for those supporting links
494: virtual COleServerDoc* OnOpenDoc(LPCSTR lpszDoc);
495: // for those supporting embedding from templates
496: virtual COleServerDoc* OnCreateDocFromTemplate(LPCSTR lpszClass,
497: LPCSTR lpszDoc, LPCSTR lpszTemplate);
498: // for those supporting DDE execute commands
499: virtual OLESTATUS OnExecute(LPVOID lpCommands);
500:
501: // Overridables you do not have to implement
502: virtual OLESTATUS OnExit(); // default to BeginRevoke
503: virtual OLESTATUS OnRelease(); // default to cleanup
504:
505: // Implementation support of managing # of open documents
506: protected:
507: int m_cOpenDocuments;
508: void AddDocument(COleServerDoc* pDoc, LHSERVERDOC lhServerDoc);
509: void RemoveDocument(COleServerDoc* pDoc);
510:
511: // Implementation
512: #ifdef _DEBUG
513: public:
514: virtual void AssertValid() const;
515: virtual void Dump(CDumpContext& dc) const;
516: #endif
517: protected:
518: static COleServer * FromLp(LPOLESERVER lpServer);
519: friend class COleServerDoc;
520:
521: friend struct _afxOleServerImplementation;
522: };
523:
524: // Helper to register server in case of no .REG file loaded
525: BOOL AfxOleRegisterServerName(LPCSTR lpszClass, LPCSTR lpszLocalClassName);
526:
527: //////////////////////////////////////////////////////////////////////////////
528: // Helper class for implementation
529:
530: class CSharedFile : public CMemFile
531: {
532: DECLARE_DYNAMIC(CSharedFile)
533:
534: public:
535: // Constructors
536: CSharedFile(UINT nAllocFlags = GMEM_DDESHARE, UINT nGrowBytes = 1024);
537: ~CSharedFile();
538:
539: // Attributes
540: HANDLE Detach();
541: void SetHandle(HANDLE hGlobalMemory);
542:
543: // Special implementation
544: protected:
545: virtual BYTE FAR* Alloc(UINT nBytes);
546: virtual BYTE FAR* Realloc(BYTE FAR* lpMem, UINT nBytes);
547: virtual void Free(BYTE FAR* lpMem);
548:
549: UINT m_nAllocFlags;
550: HANDLE m_hGlobalMemory;
551: };
552:
553: //////////////////////////////////////////////////////////////////////////////
554: // Inlines
555:
556: // for client classes
557: inline OLESTATUS COleClientItem::GetLastStatus() const
558: { return m_lastStatus; }
559: inline COleClientDoc* COleClientItem::GetDocument() const
560: { return m_pDocument; }
561: inline OLECLIPFORMAT COleClientItem::EnumFormats(OLECLIPFORMAT nFormat) const
562: { return ::OleEnumFormats(m_lpObject, nFormat); }
563: inline BOOL COleClientDoc::IsOpen() const
564: { return m_lhClientDoc != NULL; }
565:
566: // for server classes
567: inline COleServerDoc* COleServerItem::GetDocument() const
568: { return m_pDocument; }
569: inline BOOL COleServerItem::IsConnected()
570: { return m_lpClient != NULL; }
571: inline void COleServerItem::NotifyChanged()
572: { NotifyClient(OLE_CHANGED); }
573:
574: inline BOOL COleServerDoc::IsOpen() const
575: { return m_lhServerDoc != NULL; }
576: inline void COleServerDoc::NotifyChanged()
577: { NotifyAllClients(OLE_CHANGED); }
578: inline void COleServerDoc::NotifyClosed()
579: { NotifyAllClients(OLE_CLOSED); }
580:
581: inline BOOL COleServer::IsOpen() const
582: { return m_lhServer != NULL; }
583:
584: //////////////////////////////////////////////////////////////////////////////
585:
586: #endif //__AFXOLE_H__
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.