136 lines
4.6 KiB
C
136 lines
4.6 KiB
C
|
|
|||
|
//+----------------------------------------------------------------------------
|
|||
|
//
|
|||
|
// File:
|
|||
|
// dacache.h
|
|||
|
//
|
|||
|
// Classes:
|
|||
|
// CDataAdviseCache
|
|||
|
//
|
|||
|
// Functions:
|
|||
|
//
|
|||
|
// History:
|
|||
|
// 31-Jan-95 t-ScottH add Dump method to CDataAdviseCache class
|
|||
|
// 24-Jan-94 alexgo first pass at converting to Cairo-style
|
|||
|
// memory allocation
|
|||
|
// 11/02/93 - ChrisWe - file inspection and cleanup
|
|||
|
//
|
|||
|
//-----------------------------------------------------------------------------
|
|||
|
|
|||
|
#ifndef _DACACHE_H_
|
|||
|
#define _DACACHE_H_
|
|||
|
|
|||
|
#ifdef _DEBUG
|
|||
|
#include <dbgexts.h>
|
|||
|
#endif // _DEBUG
|
|||
|
|
|||
|
#include <map_dwdw.h>
|
|||
|
|
|||
|
//+----------------------------------------------------------------------------
|
|||
|
//
|
|||
|
// Class:
|
|||
|
// CDataAdviseCache
|
|||
|
//
|
|||
|
// Purpose:
|
|||
|
// A CDataAdviseCache is used to remember data advises across
|
|||
|
// loaded<-->running transitions. The data advise cache holds
|
|||
|
// on to advise sinks that are interested in data, even if there
|
|||
|
// is no data object, because the server is not activated.
|
|||
|
// These advise sinks can be registered with a running data object
|
|||
|
// later on, when it is activated, or they can be Unadvised()
|
|||
|
// if the object is to go inactive.
|
|||
|
//
|
|||
|
// Interface:
|
|||
|
// Advise - add a new advise sink for the indicated data object,
|
|||
|
// if there is one; if no data object, record the
|
|||
|
// advise sink for future use
|
|||
|
//
|
|||
|
// Unadvise - remove an advise sink from the advise sink cache,
|
|||
|
// and from the data object, if there is one
|
|||
|
//
|
|||
|
// EnumAdvise - enumerate all the registered advise sinks
|
|||
|
//
|
|||
|
// ClientToDelegate - Maps a client connection number to a
|
|||
|
// delegate connection number. Client connection numbers
|
|||
|
// are those returned by Advise(), while the delegate
|
|||
|
// connection numbers are those used by the data object
|
|||
|
// itself.
|
|||
|
//
|
|||
|
// EnumAndAdvise - A data object has become newly active (or
|
|||
|
// has just been deactivated.) This will enumerate all
|
|||
|
// the registered advise sinks, and call Advise() (or
|
|||
|
// Unadvise()) on the data object.
|
|||
|
//
|
|||
|
// CreateDataAdviseCache - creates an instance of the
|
|||
|
// CDataAdviseCache; there is no public constructor,
|
|||
|
// because internal data structures must be allocated,
|
|||
|
// and these allocations could fail. There is no way
|
|||
|
// to indicate such a failure when using "new," so
|
|||
|
// clients are required to use this function instead.
|
|||
|
//
|
|||
|
// ~CDataAdviseCache
|
|||
|
//
|
|||
|
// Notes:
|
|||
|
// This is an internal helper class, and does not support any
|
|||
|
// interfaces.
|
|||
|
//
|
|||
|
// Because a connection number must be returned even in the loaded
|
|||
|
// state, there must be two sets of connection numbers: client
|
|||
|
// numbers are "fake" connection numbers returned to the caller;
|
|||
|
// delegate numbers are those returned by the "real" running
|
|||
|
// object. We maintain a map from client numbers to delegate
|
|||
|
// numbers. If not running, our client numbers map to zero.
|
|||
|
// Client numbers also map to zero if the delegate refused the
|
|||
|
// Advise when it began to run. We use a DWORD->DWORD map.
|
|||
|
//
|
|||
|
// History:
|
|||
|
// 31-Jan-95 t-ScottH add Dump method (_DEBUG only)
|
|||
|
// 11/02/93 - ChrisWe - file inspection and cleanup
|
|||
|
//
|
|||
|
//-----------------------------------------------------------------------------
|
|||
|
|
|||
|
class FAR CDataAdviseCache : public CPrivAlloc
|
|||
|
{
|
|||
|
public:
|
|||
|
HRESULT Advise(LPDATAOBJECT pDataObject, FORMATETC FAR* pFetc,
|
|||
|
DWORD advf, LPADVISESINK pAdvise,
|
|||
|
DWORD FAR* pdwClient);
|
|||
|
// first 4 parms are as in DataObject::Advise
|
|||
|
HRESULT Unadvise(IDataObject FAR* pDataObject, DWORD dwClient);
|
|||
|
HRESULT EnumAdvise(LPENUMSTATDATA FAR* ppenumAdvise);
|
|||
|
HRESULT EnumAndAdvise(LPDATAOBJECT pDataObject, BOOL fAdvise);
|
|||
|
// Advise or Unadvise
|
|||
|
|
|||
|
static FARINTERNAL CreateDataAdviseCache(
|
|||
|
class CDataAdviseCache FAR* FAR* ppDataAdvCache);
|
|||
|
~CDataAdviseCache();
|
|||
|
|
|||
|
#ifdef _DEBUG
|
|||
|
HRESULT Dump(char **ppszDump, ULONG ulFlag, int nIndentLevel);
|
|||
|
|
|||
|
// need to be able to access CDataAdviseCache 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_defobject);
|
|||
|
friend DEBUG_EXTENSION_API(dump_deflink);
|
|||
|
friend DEBUG_EXTENSION_API(dump_dataadvisecache);
|
|||
|
#endif // _DEBUG
|
|||
|
|
|||
|
private:
|
|||
|
CDataAdviseCache();
|
|||
|
HRESULT ClientToDelegate(DWORD dwClient, DWORD FAR* pdwDelegate);
|
|||
|
|
|||
|
LPDATAADVISEHOLDER m_pDAH; // a data advise holder
|
|||
|
CMapDwordDword m_mapClientToDelegate; // the map of clients to delegates
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
typedef class CDataAdviseCache DATAADVCACHE;
|
|||
|
typedef DATAADVCACHE FAR* LPDATAADVCACHE;
|
|||
|
|
|||
|
#endif // _DACACHE_H_
|
|||
|
|
|||
|
|