summaryrefslogtreecommitdiffstats
path: root/private/ole32/ole232/inc/olecache.h
diff options
context:
space:
mode:
Diffstat (limited to 'private/ole32/ole232/inc/olecache.h')
-rw-r--r--private/ole32/ole232/inc/olecache.h554
1 files changed, 554 insertions, 0 deletions
diff --git a/private/ole32/ole232/inc/olecache.h b/private/ole32/ole232/inc/olecache.h
new file mode 100644
index 000000000..adc5bdc56
--- /dev/null
+++ b/private/ole32/ole232/inc/olecache.h
@@ -0,0 +1,554 @@
+
+//+----------------------------------------------------------------------------
+//
+// File:
+// olecache.h
+//
+// Contents:
+// Ole presentation cache default implementation specification
+//
+// Classes:
+// COleCache - ole multiple presentation cache
+// CCacheEnum - enumerator for COleCache
+//
+// Functions:
+//
+// History:
+// 31-Jan-95 t-ScottH add Dump method to: COleCache
+// CCacheEnum
+// CCacheEnumFormatEtc
+// moved CCacheEnumFormatEtc class def'n
+// from cpp to this header file
+// add a flag to COLECACHEFLAGs to indicate
+// aggregation in _DEBUG builds
+// 24-Jan-94 alexgo first pass converting to Cairo style
+// memory allocation
+// 11/15/93 - ChrisWe - file inspection and cleanup;
+// remove use of nested classes in COleCache, where
+// possible; remove declaration of CreateDataCache,
+// since it is declared in dvobj.h
+//
+//-----------------------------------------------------------------------------
+
+#include <olepres.h>
+
+#ifdef _DEBUG
+#include <dbgexts.h>
+#endif // _DEBUG
+
+#ifndef _OLECACHE_H_
+#define _OLECACHE_H_
+
+//+----------------------------------------------------------------------------
+//
+// Class:
+// COleCache
+//
+// Purpose:
+// Ole presentation cache; this maintains the presentations for
+// one embedding.
+//
+// For every unique FORMATETC, a cache node is created; cache
+// nodes encapsulate a presentation object and advise sink.
+//
+// COleCache handles persistence of cache nodes, saving (loading)
+// their presentation objects, format descriptions, and advise
+// options.
+//
+// Interface:
+// IUnknown (public IUnknown for aggregation purposes)
+// IOleCacheControl
+// IOleCache2
+// IPersistStorage
+// IViewObject2
+// IDataObject
+// m_UnkPrivate
+// the private IUnknown for aggregation purposes
+//
+// INTERNAL GetExtent(DWORD dwDrawAspect, LPSIZEL lpsizel);
+// returns the size of the aspect indicated
+//
+// Private Interface used by friend classes:
+// INTERNAL_(void) OnChange(DWORD dwAspect, LONG lindex,
+// BOOL fDirty);
+// CCacheNode instances use this to alert the cache to
+// changes to themselves so that the cache can be
+// marked dirty, if that is necessary
+// INTERNAL_(LPSTORAGE) GetStg(void);
+// CCacheNode uses this to obtain storage when cache
+// nodes are being saved
+//
+// INTERNAL_(void) DetachCacheEnum(CCacheEnum FAR* pCacheEnum);
+// When about to be destroyed, CCacheEnum instances
+// use this to request to be taken off
+// the list of cache enumerators that COleCache
+// maintains.
+//
+// Notes:
+// The constructor returns a pointer to the public IUnknown
+// of the object. The private one is available at m_UnkPrivate.
+//
+// The cache maintains its contents in an array. Ids of the
+// cache nodes, such as those returned from Cache(), start out
+// being the index of the node in the array. To detect
+// reuse of an array element, each id is incremented by the maximum
+// size of the array each time it is reused. To find an element by
+// id simply take (id % max_array_size). (id / max_array_size)
+// gives the number of times the array element has been used to
+// cache data. (We do not allocate all the array members at once,
+// but instead grow the array on demand, up to the maximum
+// compile-time array size, MAX_CACHELIST_ITEMS.)
+// If id's do not match
+// exactly, before taking the modulo value, we know that a
+// request has been made for an earlier generation of data that
+// no longer exists.
+//
+// The cache automatically maintains a "native format" node.
+// This node cannot be deleted by the user, and is always kept
+// up to date on disk. This node attempts to keep either a
+// CF_METAFILEPICT, or CF_DIB rendering, with preference in
+// this order.
+// REVIEW, it's not clear how this node ever gets loaded.
+//
+// History:
+// 31-Jan-95 t-ScottH add Dump method (_DEBUG only)
+// 11/15/93 - ChrisWe - file inspection and cleanup;
+// removed use of nested classes where possible;
+// got rid of obsolete declaration of GetOlePresStream;
+// moved presentation stream limits to ole2int.h;
+// coalesced many BOOL flags into a single unsigned
+// quantity
+//
+//-----------------------------------------------------------------------------
+
+// declare the array of cache node pointers
+// COleCache will maintain an array of these
+class FAR CCacheNode; // see cachenod.h for its definition
+typedef CCacheNode FAR* LPCACHENODE;
+
+typedef struct _CACHELIST_ITEM
+{
+ DWORD dwCacheId; // the id assigned to this cache node
+ LPCACHENODE lpCacheNode; // pointer to the cache node
+} CACHELIST_ITEM, FAR* LPCACHELIST;
+
+// forward declare the cache enumerator
+class FAR CCacheEnum;
+
+class FAR COleCache : public IOleCacheControl, public IOleCache2,
+ public IPersistStorage, public CPrivAlloc, public CThreadCheck
+{
+public:
+ COleCache(IUnknown FAR* pUnkOuter, REFCLSID rclsid);
+ ~COleCache();
+
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
+ STDMETHOD_(ULONG,AddRef)(void) ;
+ STDMETHOD_(ULONG,Release)(void);
+
+ // *** IOleCacheControl methods ***
+ STDMETHOD(OnRun)(THIS_ LPDATAOBJECT pDataObject);
+ STDMETHOD(OnStop)(void);
+
+ // *** IOleCache methods ***
+ STDMETHOD(Cache)(THIS_ LPFORMATETC lpFormatetc, DWORD advf,
+ LPDWORD lpdwCacheId);
+ STDMETHOD(Uncache)(THIS_ DWORD dwCacheId);
+ STDMETHOD(EnumCache)(THIS_ LPENUMSTATDATA FAR* ppenumStatData);
+ STDMETHOD(InitCache)(THIS_ LPDATAOBJECT pDataObject);
+ STDMETHOD(SetData)(LPFORMATETC pformatetc, LPSTGMEDIUM pmedium,
+ BOOL fRelease);
+
+ // *** IOleCache2 methods ***
+ STDMETHOD(UpdateCache)(LPDATAOBJECT pDataObject, DWORD grfUpdf,
+ LPVOID pReserved);
+ STDMETHOD(DiscardCache)(DWORD dwDiscardOptions);
+
+
+ // IPersist methods
+ STDMETHOD(GetClassID)(LPCLSID pClassID);
+
+ // IPersistStorage methods
+ STDMETHOD(IsDirty)(void);
+ STDMETHOD(InitNew)(LPSTORAGE pstg);
+ STDMETHOD(Load)(LPSTORAGE pstg);
+ STDMETHOD(Save)(LPSTORAGE pstgSave, BOOL fSameAsLoad);
+ STDMETHOD(SaveCompleted)(LPSTORAGE pstgNew);
+ STDMETHOD(HandsOffStorage)(void);
+
+
+ // Other public methods, called by defhndlr and deflink
+ INTERNAL GetExtent(DWORD dwDrawAspect, LPSIZEL lpsizel);
+
+#ifdef _CHICAGO_
+ static INTERNAL DrawStackSwitch(
+ LPVOID *pCV,
+ DWORD dwDrawAspect,
+ LONG lindex, void FAR* pvAspect, DVTARGETDEVICE FAR * ptd,
+ HDC hicTargetDev, HDC hdcDraw,
+ LPCRECTL lprcBounds,
+ LPCRECTL lprcWBounds,
+ BOOL (CALLBACK * pfnContinue)(DWORD),
+ DWORD dwContinue);
+#endif
+
+
+
+ // used as the private IUnknown for aggregation
+ // this is implemented as a nested class because of the member
+ // name collisions with the other IUnknown
+ // m_UnkPrivate is a public member so that other OLE internal
+ // classes that aggregate this can reach it, since use
+ // of "new COleCache" will return the public IUnknown
+ class CCacheUnkImpl : public IUnknown
+ {
+ public:
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
+ STDMETHOD_(ULONG,AddRef)(void) ;
+ STDMETHOD_(ULONG,Release)(void);
+ };
+ DECLARE_NC(COleCache, CCacheUnkImpl)
+ CCacheUnkImpl m_UnkPrivate; // vtable for private IUnknown
+
+ // used to get cache contents and to get advises when cache changes
+ // this has to be implemented as a nested class because
+ // IDataObject::SetData collides with IOleCache::SetData
+ class CCacheDataImpl : public IDataObject
+ {
+ public:
+ // IUnknown methods
+ STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
+ STDMETHOD_(ULONG,AddRef)(void);
+ STDMETHOD_(ULONG,Release)(void);
+
+ // IDataObject methods
+ STDMETHOD(GetData)(LPFORMATETC pformatetcIn,
+ LPSTGMEDIUM pmedium );
+ STDMETHOD(GetDataHere)(THIS_ LPFORMATETC pformatetc,
+ LPSTGMEDIUM pmedium );
+ STDMETHOD(QueryGetData)(THIS_ LPFORMATETC pformatetc );
+ STDMETHOD(GetCanonicalFormatEtc)(LPFORMATETC pformatetc,
+ LPFORMATETC pformatetcOut);
+ STDMETHOD(SetData)(LPFORMATETC pformatetc, LPSTGMEDIUM pmedium,
+ BOOL fRelease);
+ STDMETHOD(EnumFormatEtc)(DWORD dwDirection,
+ LPENUMFORMATETC FAR* ppenumFormatEtc);
+ STDMETHOD(DAdvise)(FORMATETC FAR* pFormatetc, DWORD advf,
+ IAdviseSink FAR* pAdvSink,
+ DWORD FAR* pdwConnection);
+ STDMETHOD(DUnadvise)(DWORD dwConnection);
+ STDMETHOD(EnumDAdvise)(LPENUMSTATDATA FAR* ppenumAdvise);
+ };
+
+ friend class CCacheDataImpl;
+
+ CCacheDataImpl m_Data; // vtable for IDataObject
+
+#ifdef _DEBUG
+
+ HRESULT Dump(char **ppszDump, ULONG ulFlag, int nIndentLevel);
+
+ // need to be able to access COleCache private data members in the
+ // following debugger extension APIs
+ // this allows the debugger extension APIs to copy memory from the
+ // debuggee process memory to the debugger's process memory
+ // this is required since the Dump method follows pointers to other
+ // structures and classes
+ friend DEBUG_EXTENSION_API(dump_olecache);
+ friend DEBUG_EXTENSION_API(dump_defobject);
+ friend DEBUG_EXTENSION_API(dump_deflink);
+
+#endif // _DEBUG
+
+
+
+private:
+ // Called by CCacheNode
+ INTERNAL_(void) OnChange(DWORD dwAspect, LONG lindex, BOOL fDirty);
+ INTERNAL_(LPSTORAGE) GetStg(void);
+
+ // Cache Enumerator list maintainance routines
+ INTERNAL_(void) DetachCacheEnum(CCacheEnum FAR* pCacheEnum);
+
+ // Cachenode list manipulation routines. Purely internal, called only
+ // by COleCache and its nested classes
+ INTERNAL_(BOOL) GrowCacheList(void);
+ INTERNAL_(void) DeleteAll(void);
+ INTERNAL_(DWORD) Attach(LPCACHENODE lpCacheNode);
+ INTERNAL_(LPCACHENODE) Detach(DWORD dwCacheId);
+
+ INTERNAL_(LPCACHENODE) GetNext(LPDWORD lpdwCacheId);
+ INTERNAL_(LPCACHENODE) GetAt(DWORD dwCacheId);
+ INTERNAL_(LPCACHENODE) GetAt(DWORD dwAspect, LONG lindex,
+ CLIPFORMAT cfFormat, DVTARGETDEVICE FAR* ptd,
+ DWORD FAR* lpdwCacheId);
+ INTERNAL_(LPCACHENODE) GetNext(DWORD dwAspect, LONG lindex,
+ DWORD FAR* dwCacheId);
+ INTERNAL_(LPCACHENODE) GetAt(LPFORMATETC lpforetc, LPDWORD lpdwCacheId);
+
+
+ INTERNAL_(LPOLEPRESOBJECT) GetPresObjForDrawing(DWORD dwAspect,
+ LONG lindex, DVTARGETDEVICE FAR* ptd);
+ INTERNAL_(LPOLEPRESOBJECT) GetPresObj(DWORD dwAspect, LONG lindex,
+ CLIPFORMAT cfFormat, DVTARGETDEVICE FAR* ptd,
+ DWORD FAR* pdwCacheId);
+
+ INTERNAL_(LPCACHENODE) AddCacheNodeForNative(void);
+ inline INTERNAL_(void) DeleteCacheNodeForNative(void);
+ inline INTERNAL_(void) MoveCacheNodeForNative(void);
+ INTERNAL_(LPCACHENODE) UpdateCacheNodeForNative(void);
+ INTERNAL_(void) FindObjectFormat(LPSTORAGE pstg);
+ INTERNAL wSaveCompleted(LPSTORAGE pstgNew, BOOL fDiscardDrawCacheAlso);
+
+ // used to set up view advises and draw the object
+ // this has to be implemented as a nested class because GetExtent
+ // collides with another methods on COleCache
+ class CCacheViewImpl : public IViewObject2
+ {
+ public:
+ // IUnknown methods
+ STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
+ STDMETHOD_(ULONG,AddRef)(void);
+ STDMETHOD_(ULONG,Release)(void);
+
+ // IViewObject methods
+ STDMETHOD(Draw)(DWORD dwDrawAspect, LONG lindex,
+ void FAR* pvAspect, DVTARGETDEVICE FAR * ptd,
+ HDC hicTargetDev, HDC hdcDraw,
+ LPCRECTL lprcBounds,
+ LPCRECTL lprcWBounds,
+ BOOL(CALLBACK * pfnContinue)(DWORD),
+ DWORD dwContinue);
+
+ STDMETHOD(GetColorSet)(DWORD dwDrawAspect, LONG lindex,
+ void FAR* pvAspect, DVTARGETDEVICE FAR * ptd,
+ HDC hicTargetDev,
+ LPLOGPALETTE FAR* ppColorSet);
+
+ STDMETHOD(Freeze)(DWORD dwDrawAspect, LONG lindex,
+ void FAR* pvAspect, DWORD FAR* pdwFreeze);
+ STDMETHOD(Unfreeze)(DWORD dwFreeze);
+ STDMETHOD(SetAdvise)(DWORD aspects, DWORD advf,
+ LPADVISESINK pAdvSink);
+ STDMETHOD(GetAdvise)(DWORD FAR* pAspects, DWORD FAR* pAdvf,
+ LPADVISESINK FAR* ppAdvSink);
+
+ // IViewObject2 methods
+ STDMETHOD(GetExtent)(DWORD dwDrawAspect, LONG lindex,
+ DVTARGETDEVICE FAR * ptd, LPSIZEL lpsizel);
+
+#ifdef _CHICAGO_
+ // private Draw method
+ STDMETHOD(SSDraw)(DWORD dwDrawAspect, LONG lindex,
+ void FAR* pvAspect, DVTARGETDEVICE FAR * ptd,
+ HDC hicTargetDev, HDC hdcDraw,
+ LPCRECTL lprcBounds,
+ LPCRECTL lprcWBounds,
+ BOOL(CALLBACK * pfnContinue)(DWORD),
+ DWORD dwContinue);
+#endif
+
+ };
+
+
+ DECLARE_NC(COleCache, CCacheViewImpl)
+ CCacheViewImpl m_View; // vtable for IViewObject2
+
+ friend CCacheNode; // REVIEW, is this necessary?
+ friend CCacheEnum;
+
+ ULONG m_refs; // reference count
+ IUnknown FAR* m_pUnkOuter; // aggregating IUnknown
+
+ LPSTORAGE m_pStg; // the storage used to store this on disk
+
+ typedef unsigned COLECACHEFLAG; // flag type; used in implementation
+ COLECACHEFLAG m_uFlag;
+#define COLECACHEF_DIRTY 0x0001 /* cache not on disk */
+#define COLECACHEF_NOSCRIBBLEMODE 0x0002
+#define COLECACHEF_SAMEASLOAD 0x0004
+#define COLECACHEF_PBRUSHORMSDRAW 0x0008
+#define COLECACHEF_STATIC 0x0010
+ /* CLSID_StaticMetafile or CLSID_StaticDib */
+#define COLECACHEF_FORMATKNOWN 0x0020
+
+// this is for clearing out the format flags, use &= and ~
+#define COLECACHEF_NOTNORMAL (COLECACHEF_STATIC | COLECACHEF_FORMATKNOWN)
+
+#ifdef _DEBUG
+ // in debug builds keep track of if we are aggregated
+ #define COLECACHEF_AGGREGATED 0x1000
+#endif // _DEBUG
+
+ LPCACHELIST m_pCacheList; // cache node list array
+ ULONG m_uCacheNodeMax; // size of m_pCacheList
+ ULONG m_uCacheNodeCnt; // number of items in m_pCacheList in use
+#define MAX_CACHELIST_ITEMS 99 /* maximum number of items in m_pCacheList */
+#define NUM_CACHELIST_ITEMS 5 /* number of items to start with, and grow by */
+
+ CCacheEnum FAR* m_pCacheEnum; // pointer to the cache enumerators' list
+
+ // single view advise back to consumer of the cache
+ IAdviseSink FAR* m_pViewAdvSink;
+ DWORD m_advfView; // the advise control flags for the view's advise sink
+ DWORD m_aspectsView;
+
+ // for caching the dwCacheId that's currently used for drawing
+ DWORD m_dwDrawCacheId;
+
+ // (bit) list of frozen Aspects, used by Freeze() and Unfreeze()
+ DWORD m_dwFrozenAspects;
+
+ IDataObject FAR* m_pDataObject; // non-NULL if running; no ref count
+
+ CLSID m_clsid;
+ CLIPFORMAT m_cfFormat; // format of the object
+ BOOL m_fUsedToBePBrush;
+};
+
+
+//+----------------------------------------------------------------------------
+//
+// Class:
+// CCacheEnum
+//
+// Purpose:
+// provides an implementation of an enumerator over COleCache
+//
+// Interface:
+// IEnumSTATDATA
+// a standard enumeration interface
+// CCacheEnum
+// constructor; has arguments to allow its use for
+// cloning the enumerator
+//
+// Notes:
+// Whenever the enumerator encounters an item that is of
+// format CF_DIB, it will return a synthesized CF_BITMAP item for
+// the same element immediately afterwards.
+//
+// The enumerator keeps the id of the element last returned
+// as its state.
+//
+// When the enumerator is to be destroyed, the cache must
+// be notified with DetachCacheEnum(), which removes the enumerator
+// from the list of enumerators maintained by the cache.
+//
+// When the cache is to be destroyed, the enumerator must be
+// notified with OnOleCacheDelete(), so that it knows that it's
+// pointer to the cache is no longer valid
+//
+// REVIEW, not multi-thread safe
+//
+// History:
+// 31-Jan-95 t-ScottH added Dump method (_DEBUG only)
+// 11/15/93 - ChrisWe - file inspection and cleanup
+//
+//-----------------------------------------------------------------------------
+
+class FAR CCacheEnum : public IEnumSTATDATA, public CPrivAlloc,
+ public CThreadCheck
+{
+public:
+ CCacheEnum(COleCache FAR* pOleCache, DWORD dwCurrent, BOOL fDib);
+
+ // IUnknown methods
+ STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppv);
+ STDMETHOD_(ULONG, AddRef)(void);
+ STDMETHOD_(ULONG, Release)(void);
+
+ // IEnumSTATDATA methods
+ STDMETHOD(Next)(ULONG celt, STATDATA FAR * rgelt,
+ ULONG FAR* pceltFetched);
+ STDMETHOD(Skip)(ULONG celt);
+ STDMETHOD(Reset)(void);
+ STDMETHOD(Clone)(LPENUMSTATDATA FAR* ppenum);
+
+#ifdef _DEBUG
+ HRESULT Dump(char **ppszDumpOA, ULONG ulFlag, int nIndentLevel);
+#endif // _DEBUG
+
+ friend COleCache;
+
+private:
+ ~CCacheEnum();
+
+ // called by COleCache, when it is released
+ INTERNAL_(void) OnOleCacheDelete(void);
+
+ ULONG m_refs; // reference count
+ BOOL m_fDib; // last item returned was a CF_DIB
+ ULONG m_ulCurCacheId; // current cache id enumerator is on
+ COleCache FAR* m_pOleCache; // pointer to the cache
+ CCacheEnum FAR* m_pNextCacheEnum; // next cache enumerator that exists
+};
+typedef CCacheEnum FAR* LPCACHEENUM;
+
+
+//+----------------------------------------------------------------------------
+//
+// Class:
+// CCacheEnumFormatEtc
+//
+// Purpose:
+// provides an implemenation of IEnumFORMATETC over COleCache;
+// This enumerator is returned by the cache's implementation of
+// IDataObject, when asked for EnumFormatEtc()
+//
+// Interface:
+// IEnumFORMATETC
+// a standard enumeration interface
+// CCacheEnumFormatEtc
+// constructor; has arguments to allow its use for
+// cloning the enumerator
+//
+// Notes:
+// COleCache already has one enumerator providing IEnumSTATDATA.
+// Note that a FORMATETC is a member of the STATDATA structure.
+// Therefore, to provide this (as a convenience for putting
+// cached items on the clipboard, which requires IDataObject to
+// return IEnumFORMATETC,) we build it on top of the existing
+// IEnumSTATDATA enumerator, discarding the unneeded elements.
+//
+// REVIEW, not multi-thread safe
+//
+// History:
+// 31-Jan-95 t-ScottH add Dump method (_DEBUG only)
+// 02/08/94 - ChrisWe - created
+//
+//-----------------------------------------------------------------------------
+class FAR CCacheEnumFormatEtc : public IEnumFORMATETC, public CPrivAlloc,
+ public CThreadCheck
+{
+public:
+ CCacheEnumFormatEtc(IEnumSTATDATA FAR *pIES);
+
+ // IUnknown methods
+ STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppv);
+ STDMETHOD_(ULONG, AddRef)(void);
+ STDMETHOD_(ULONG, Release)(void);
+
+ // IEnumFORMATETC methods
+ STDMETHOD(Next)(ULONG celt, FORMATETC FAR * rgelt,
+ ULONG FAR* pceltFetched);
+ STDMETHOD(Skip)(ULONG celt);
+ STDMETHOD(Reset)(void);
+ STDMETHOD(Clone)(LPENUMFORMATETC FAR* ppenum);
+
+#ifdef _DEBUG
+ HRESULT Dump(char **ppszDumpOA, ULONG ulFlag, int nIndentLevel);
+#endif // _DEBUG
+
+private:
+ ~CCacheEnumFormatEtc();
+
+ ULONG m_refs; // reference count
+ IEnumSTATDATA FAR *m_pIES; // enumerator used as basis for this one
+};
+
+
+
+#endif //_OLECACHE_H_
+