#ifndef __AGCGlobal_h__
#define __AGCGlobal_h__
#include <AGC.h>
#include "resource.h"
#include <..\TCLib\ObjectLock.h>
#include <..\TCLib\RangeSet.h>
class CAGCEvent;
class CAGCEventThread;
class ATL_NO_VTABLE CAGCGlobal :
public IAGCGlobal,
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CAGCGlobal, &CLSID_AGCGlobal>
{
public:
DECLARE_CLASSFACTORY_SINGLETON(CAGCGlobal)
DECLARE_REGISTRY_RESOURCEID(IDR_AGCGlobal)
public:
BEGIN_COM_MAP(CAGCGlobal)
COM_INTERFACE_ENTRY(IAGCGlobal)
END_COM_MAP()
public:
CAGCGlobal();
void FinalRelease();
protected:
static void FreeListenersImpl(HAGCLISTENERS hListeners);
static IGlobalInterfaceTablePtr& GetGIT();
static TCINT64 MakeKey(AGCEventID idEvent, AGCUniqueID idUnique);
static const IID* InterpretIID(const void* pvIgc, REFIID iid);
public:
STDMETHODIMP_(void) RegisterObjectCreator(REFIID riid,
PFNAGCCreator pfnCreator);
STDMETHODIMP_(void) RevokeObjectCreator(REFIID riid);
STDMETHODIMP GetAGCObject(const void* pvIgc, REFIID riid, void** ppUnk);
STDMETHODIMP_(void) AddAGCObject(const void* pvIgc, IUnknown* pUnkAGC);
STDMETHODIMP_(void) RemoveAGCObject(const void* pvIgc,
boolean bForceDestruct);
STDMETHODIMP_(void) SetEventSinksAreGITCookies(boolean bEventSinksAreGITCookies);
STDMETHODIMP_(boolean) GetEventSinksAreGITCookies();
STDMETHODIMP_(void) RegisterEvent(AGCEventID eventID, AGCUniqueID uniqueID,
IAGCEventSink* pEventSink);
STDMETHODIMP_(boolean) RevokeEvent(AGCEventID eventID, AGCUniqueID uniqueID,
IAGCEventSink* pEventSink);
STDMETHODIMP_(void) RegisterEventRanges(IAGCEventIDRanges* pRanges,
AGCUniqueID uniqueID, IAGCEventSink* pEventSink);
STDMETHODIMP_(void) RevokeEventRanges(IAGCEventIDRanges* pRanges,
AGCUniqueID uniqueID, IAGCEventSink* pEventSink);
STDMETHODIMP_(int) RevokeAllEvents(IAGCEventSink* pEventSink);
STDMETHODIMP_(int) RegisterAllEvents(IAGCEventSink* pEventSink);
STDMETHODIMP_(HAGCLISTENERS) EventListeners(AGCEventID idEvent,
AGCUniqueID idSubject = -1,
AGCUniqueID idObject1 = -1, AGCUniqueID idObject2 = -1);
STDMETHODIMP_(void) TriggerEvent(HAGCLISTENERS hListeners, AGCEventID idEvent,
LPCSTR pszContext, LPCOLESTR pszSubject, AGCUniqueID idSubject,
AGCUniqueID idObject1, AGCUniqueID idObject2, long cArgTriplets, void* pvArgs);
STDMETHODIMP_(void) TriggerEventSynchronous(HAGCLISTENERS hListeners, AGCEventID idEvent,
LPCSTR pszContext, LPCOLESTR pszSubject, AGCUniqueID idSubject,
AGCUniqueID idObject1, AGCUniqueID idObject2, long cArgTriplets, void* pvArgs);
STDMETHODIMP_(void) FreeListeners(HAGCLISTENERS hListeners);
STDMETHODIMP_(boolean) IsRegistered(AGCEventID eventID, AGCUniqueID uniqueID,
IAGCEventSink* pEventSink);
STDMETHODIMP MakeAGCEvent(AGCEventID idEvent, LPCSTR pszContext, LPCOLESTR pszSubject,
AGCUniqueID idSubject, long cArgTriplets, void* pvArgs, IAGCEvent** ppEvent);
STDMETHODIMP_(void) SetAvailableEventIDRanges(IAGCEventIDRanges* pRanges);
STDMETHODIMP_(void) GetAvailableEventIDRanges(IAGCEventIDRanges** ppRanges);
STDMETHODIMP_(WORD) GetEventSeverity(AGCEventID idEvent);
STDMETHODIMP_(HINSTANCE) GetResourceInstance();
STDMETHODIMP MakeAGCVector(const void* pVectorRaw, IAGCVector** ppVector);
STDMETHODIMP MakeAGCOrientation(const void* pOrientationRaw,
IAGCOrientation** ppOrientation);
STDMETHODIMP MakeAGCEventIDRange(AGCEventID lower, AGCEventID upper,
IAGCEventIDRange** ppRange);
STDMETHODIMP RegisterInterfaceInGlobal(IUnknown* pUnk, REFIID riid, DWORD* pdwCookie);
STDMETHODIMP RevokeInterfaceFromGlobal(DWORD dwCookie);
STDMETHODIMP GetInterfaceFromGlobal(DWORD dwCookie, REFIID riid, void** ppv);
STDMETHODIMP_(void) Initialize();
STDMETHODIMP_(void) Terminate();
STDMETHODIMP_(void) SetDebugHook(IAGCDebugHook* pdh);
protected:
typedef TCObjectLock<CAGCGlobal> XLock;
typedef std::map<CLSID, PFNAGCCreator> XAGCCreatorMap;
typedef XAGCCreatorMap::iterator XAGCCreatorMapIt;
typedef std::map<const void*, IUnknown*> XIgcToAGCMap;
typedef XIgcToAGCMap::iterator XIgcToAGCMapIt;
typedef std::vector<IAGCEventSink*> XEventSinks;
typedef XEventSinks::iterator XEventSinksIt;
typedef rangeset<range<AGCEventID> > XEventIDRanges;
typedef XEventIDRanges::iterator XEventIDRangeIt;
typedef std::map<TCINT64, XEventSinks> XRegEvents;
typedef XRegEvents::iterator XRegEventsIt;
protected:
XAGCCreatorMap m_mapCreator;
XIgcToAGCMap m_map;
XRegEvents m_RegEvents;
bool m_bEventSinksAreGITCookies;
XEventIDRanges m_EventIDRanges;
CAGCEventThread* m_pthEvents;
protected:
friend class CAGCEventThread;
};
inline CAGCGlobal::CAGCGlobal() :
m_bEventSinksAreGITCookies(false),
m_pthEvents(NULL)
{
}
inline void CAGCGlobal::FreeListenersImpl(HAGCLISTENERS hListeners)
{
if (hListeners)
delete reinterpret_cast<XEventSinks*>(hListeners);
}
inline IGlobalInterfaceTablePtr& CAGCGlobal::GetGIT()
{
static IGlobalInterfaceTablePtr spGIT;
if (NULL == spGIT)
_SVERIFYE(spGIT.CreateInstance(CLSID_StdGlobalInterfaceTable));
return spGIT;
}
inline TCINT64 CAGCGlobal::MakeKey(AGCEventID idEvent, AGCUniqueID idUnique)
{
return (TCINT64(idEvent) << 32) | idUnique;
}
#endif