//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1993. // // File: daholder.h // // Contents: CDAHolder, concrete version of IDataAdviseHolder // // Classes: CDAHolder // // Functions: // // History: dd-mmm-yy Author Comment // 06-Feb-95 t-ScottH created - split class definition from // cpp file (for debug purposes) // - added Dump method to CDAHolder // //-------------------------------------------------------------------------- #ifndef _DAHOLDER_H_ #define _DAHOLDER_H_ #ifdef _DEBUG #include #endif // _DEBUG //+---------------------------------------------------------------------------- // // Class: // CDAHolder // // Purpose: // provides concrete implementation of IDataAdviseHolder // // Interface: // IDataAdviseHolder // // Notes: // REVIEW, not thread safe, under assumption that docs cant be MT // // Connections are numbered from [1..infinity). We don't use // zero to avoid getting caught on someone else's zero init'ed // memory. Zero is checked for as a connection number on entry // to routines, and rejected. This allows us to use zero as // a way to mark unused STATDATA entries in our array. // // History: // 06-Feb-95 t-Scotth added Dump method (_DEBUG only) // 01/24/94 - AlexGo - now inherit from CPrivAlloc // 10/29/93 - ChrisWe - file inspection and cleanup // //----------------------------------------------------------------------------- // NOTE: CDAHolder MUST inherit from IDataAdviseHolder first in order for the // DumpCDAHolder function to work since we cast the IDataAdviseHolder as a // CDAHolder (if it inherits from IDataAdviseHolder first, then the pointers // are the same) class FAR CDAHolder : public IDataAdviseHolder, public CSafeRefCount { public: CDAHolder(); // *** IUnknown methods *** STDMETHOD(QueryInterface) (REFIID riid, LPVOID FAR* ppv); STDMETHOD_(ULONG,AddRef) () ; STDMETHOD_(ULONG,Release) (); // *** IDataAdviseHolder methods *** STDMETHOD(Advise)(LPDATAOBJECT pDataObj, FORMATETC FAR* pFetc, DWORD advf, IAdviseSink FAR* pAdvSink, DWORD FAR* pdwConnection); STDMETHOD(Unadvise)(DWORD dwConnection); STDMETHOD(EnumAdvise)(IEnumSTATDATA FAR* FAR* ppenumAdvise); STDMETHOD(SendOnDataChange)(IDataObject FAR* pDataObject, DWORD dwReserved, DWORD advf); // *** debug and dump methods *** #ifdef _DEBUG HRESULT Dump(char **ppszDump, ULONG ulFlag, int nIndentLevel); // need to be able to access CDAHolder 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_daholder); friend DEBUG_EXTENSION_API(dump_enumstatdata); friend DEBUG_EXTENSION_API(dump_dataadvisecache); friend DEBUG_EXTENSION_API(dump_defobject); friend DEBUG_EXTENSION_API(dump_deflink); #endif // _DEBUG private: ~CDAHolder(); DWORD m_dwConnection; // next connection number to use int m_iSize; // number of stat data elements in array STATDATA FAR *m_pSD; // array of STATDATA elements #define CDAHOLDER_GROWBY 5 /* number of entries to grow array by each time */ SET_A5; // the enumerator returned by the EnumAdvise method friend class CEnumSTATDATA; }; //+---------------------------------------------------------------------------- // // Class: // CEnumSTATDATA // // Purpose: // is the enumerator returned by CDAHolder::Enum // // Interface: // IEnumSTATDATA // // Notes: // Keeps the underlying CDAHolder alive for the lifetime of // the enumerator. // // History: // 10/29/93 - ChrisWe - file inspection and cleanup // //----------------------------------------------------------------------------- class CEnumSTATDATA : public IEnumSTATDATA, public CPrivAlloc { public: CEnumSTATDATA(CDAHolder FAR* pHolder, int iDataStart); // *** IUnknown methods *** STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppv); STDMETHOD_(ULONG,AddRef)() ; STDMETHOD_(ULONG,Release)(); // *** IEnumSTATDATA methods *** STDMETHOD(Next)(ULONG celt, STATDATA FAR * rgelt, ULONG FAR* pceltFetched); STDMETHOD(Skip)(ULONG celt); STDMETHOD(Reset)(); STDMETHOD(Clone)(LPENUMSTATDATA FAR* ppenum); #ifdef _DEBUG HRESULT Dump(char **ppszDump, ULONG ulFlag, int nIndentLevel); // need to be able to access CEnumSTATDATA 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_enumstatdata); #endif // _DEBUG private: ~CEnumSTATDATA(); ULONG m_refs; // reference count int m_iDataEnum; // index of the next element to return CDAHolder FAR* m_pHolder; // pointer to holder; is ref counted SET_A5; }; #endif // _DAHOLDER_H_