AGCGlobal.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #ifndef __AGCGlobal_h__
  2. #define __AGCGlobal_h__
  3. /////////////////////////////////////////////////////////////////////////////
  4. // AGCGlobal : Declaration of the CAGCGlobal class.
  5. //
  6. #include <AGC.h>
  7. #include "resource.h"
  8. #include <..\TCLib\ObjectLock.h>
  9. #include <..\TCLib\RangeSet.h>
  10. /////////////////////////////////////////////////////////////////////////////
  11. // Forward Declarations
  12. class CAGCEvent;
  13. class CAGCEventThread;
  14. /////////////////////////////////////////////////////////////////////////////
  15. //
  16. class ATL_NO_VTABLE CAGCGlobal :
  17. public IAGCGlobal,
  18. public CComObjectRootEx<CComMultiThreadModel>,
  19. public CComCoClass<CAGCGlobal, &CLSID_AGCGlobal>
  20. {
  21. // Declarations
  22. public:
  23. DECLARE_CLASSFACTORY_SINGLETON(CAGCGlobal)
  24. DECLARE_REGISTRY_RESOURCEID(IDR_AGCGlobal)
  25. // Interface Map
  26. public:
  27. BEGIN_COM_MAP(CAGCGlobal)
  28. COM_INTERFACE_ENTRY(IAGCGlobal)
  29. END_COM_MAP()
  30. // Construction / Destruction
  31. public:
  32. CAGCGlobal();
  33. void FinalRelease();
  34. // Implementation
  35. protected:
  36. static void FreeListenersImpl(HAGCLISTENERS hListeners);
  37. static IGlobalInterfaceTablePtr& GetGIT();
  38. static TCINT64 MakeKey(AGCEventID idEvent, AGCUniqueID idUnique);
  39. static const IID* InterpretIID(const void* pvIgc, REFIID iid);
  40. // IAGCGlobal Interface Methods
  41. public:
  42. // Object Creation Registration
  43. STDMETHODIMP_(void) RegisterObjectCreator(REFIID riid,
  44. PFNAGCCreator pfnCreator);
  45. STDMETHODIMP_(void) RevokeObjectCreator(REFIID riid);
  46. // IGC to AGC Mapping
  47. STDMETHODIMP GetAGCObject(const void* pvIgc, REFIID riid, void** ppUnk);
  48. STDMETHODIMP_(void) AddAGCObject(const void* pvIgc, IUnknown* pUnkAGC);
  49. STDMETHODIMP_(void) RemoveAGCObject(const void* pvIgc,
  50. boolean bForceDestruct);
  51. // Event Registration
  52. STDMETHODIMP_(void) SetEventSinksAreGITCookies(boolean bEventSinksAreGITCookies);
  53. STDMETHODIMP_(boolean) GetEventSinksAreGITCookies();
  54. STDMETHODIMP_(void) RegisterEvent(AGCEventID eventID, AGCUniqueID uniqueID,
  55. IAGCEventSink* pEventSink);
  56. STDMETHODIMP_(boolean) RevokeEvent(AGCEventID eventID, AGCUniqueID uniqueID,
  57. IAGCEventSink* pEventSink);
  58. STDMETHODIMP_(void) RegisterEventRanges(IAGCEventIDRanges* pRanges,
  59. AGCUniqueID uniqueID, IAGCEventSink* pEventSink);
  60. STDMETHODIMP_(void) RevokeEventRanges(IAGCEventIDRanges* pRanges,
  61. AGCUniqueID uniqueID, IAGCEventSink* pEventSink);
  62. STDMETHODIMP_(int) RevokeAllEvents(IAGCEventSink* pEventSink);
  63. STDMETHODIMP_(int) RegisterAllEvents(IAGCEventSink* pEventSink);
  64. STDMETHODIMP_(HAGCLISTENERS) EventListeners(AGCEventID idEvent,
  65. AGCUniqueID idSubject = -1,
  66. AGCUniqueID idObject1 = -1, AGCUniqueID idObject2 = -1);
  67. STDMETHODIMP_(void) TriggerEvent(HAGCLISTENERS hListeners, AGCEventID idEvent,
  68. LPCSTR pszContext, LPCOLESTR pszSubject, AGCUniqueID idSubject,
  69. AGCUniqueID idObject1, AGCUniqueID idObject2, long cArgTriplets, void* pvArgs);
  70. STDMETHODIMP_(void) TriggerEventSynchronous(HAGCLISTENERS hListeners, AGCEventID idEvent,
  71. LPCSTR pszContext, LPCOLESTR pszSubject, AGCUniqueID idSubject,
  72. AGCUniqueID idObject1, AGCUniqueID idObject2, long cArgTriplets, void* pvArgs);
  73. STDMETHODIMP_(void) FreeListeners(HAGCLISTENERS hListeners);
  74. STDMETHODIMP_(boolean) IsRegistered(AGCEventID eventID, AGCUniqueID uniqueID,
  75. IAGCEventSink* pEventSink);
  76. STDMETHODIMP MakeAGCEvent(AGCEventID idEvent, LPCSTR pszContext, LPCOLESTR pszSubject,
  77. AGCUniqueID idSubject, long cArgTriplets, void* pvArgs, IAGCEvent** ppEvent);
  78. STDMETHODIMP_(void) SetAvailableEventIDRanges(IAGCEventIDRanges* pRanges);
  79. STDMETHODIMP_(void) GetAvailableEventIDRanges(IAGCEventIDRanges** ppRanges);
  80. STDMETHODIMP_(WORD) GetEventSeverity(AGCEventID idEvent);
  81. // Miscellaneous
  82. STDMETHODIMP_(HINSTANCE) GetResourceInstance();
  83. STDMETHODIMP MakeAGCVector(const void* pVectorRaw, IAGCVector** ppVector);
  84. STDMETHODIMP MakeAGCOrientation(const void* pOrientationRaw,
  85. IAGCOrientation** ppOrientation);
  86. STDMETHODIMP MakeAGCEventIDRange(AGCEventID lower, AGCEventID upper,
  87. IAGCEventIDRange** ppRange);
  88. // IGlobalInterfaceTable Interface Methods (delegate to single GIT instance)
  89. STDMETHODIMP RegisterInterfaceInGlobal(IUnknown* pUnk, REFIID riid, DWORD* pdwCookie);
  90. STDMETHODIMP RevokeInterfaceFromGlobal(DWORD dwCookie);
  91. STDMETHODIMP GetInterfaceFromGlobal(DWORD dwCookie, REFIID riid, void** ppv);
  92. // Object Initialization and Cleanup
  93. STDMETHODIMP_(void) Initialize();
  94. STDMETHODIMP_(void) Terminate();
  95. // Debugging Support
  96. STDMETHODIMP_(void) SetDebugHook(IAGCDebugHook* pdh);
  97. // Types
  98. protected:
  99. typedef TCObjectLock<CAGCGlobal> XLock;
  100. // Object Creation Registration
  101. typedef std::map<CLSID, PFNAGCCreator> XAGCCreatorMap;
  102. typedef XAGCCreatorMap::iterator XAGCCreatorMapIt;
  103. // IGC to AGC Mapping
  104. typedef std::map<const void*, IUnknown*> XIgcToAGCMap;
  105. typedef XIgcToAGCMap::iterator XIgcToAGCMapIt;
  106. // Event Registration
  107. typedef std::vector<IAGCEventSink*> XEventSinks;
  108. typedef XEventSinks::iterator XEventSinksIt;
  109. typedef rangeset<range<AGCEventID> > XEventIDRanges;
  110. typedef XEventIDRanges::iterator XEventIDRangeIt;
  111. // For XRegEvents, the map's key is 64 bits:
  112. // the lower DWORD (32 bits) is the AGCUniqueID
  113. // the upper DWORD (32 bits) is the AGCEventID
  114. typedef std::map<TCINT64, XEventSinks> XRegEvents;
  115. typedef XRegEvents::iterator XRegEventsIt;
  116. // Data Members
  117. protected:
  118. // Object Creation Registration
  119. XAGCCreatorMap m_mapCreator;
  120. // IGC to AGC Mapping
  121. XIgcToAGCMap m_map;
  122. // Event Registration
  123. XRegEvents m_RegEvents;
  124. bool m_bEventSinksAreGITCookies;
  125. XEventIDRanges m_EventIDRanges;
  126. // Event Firing
  127. CAGCEventThread* m_pthEvents;
  128. // Friends
  129. protected:
  130. friend class CAGCEventThread;
  131. };
  132. /////////////////////////////////////////////////////////////////////////////
  133. // Construction / Destruction
  134. inline CAGCGlobal::CAGCGlobal() :
  135. m_bEventSinksAreGITCookies(false),
  136. m_pthEvents(NULL)
  137. {
  138. }
  139. /////////////////////////////////////////////////////////////////////////////
  140. // Implementation
  141. inline void CAGCGlobal::FreeListenersImpl(HAGCLISTENERS hListeners)
  142. {
  143. if (hListeners)
  144. delete reinterpret_cast<XEventSinks*>(hListeners);
  145. }
  146. inline IGlobalInterfaceTablePtr& CAGCGlobal::GetGIT()
  147. {
  148. static IGlobalInterfaceTablePtr spGIT;
  149. if (NULL == spGIT)
  150. _SVERIFYE(spGIT.CreateInstance(CLSID_StdGlobalInterfaceTable));
  151. return spGIT;
  152. }
  153. inline TCINT64 CAGCGlobal::MakeKey(AGCEventID idEvent, AGCUniqueID idUnique)
  154. {
  155. return (TCINT64(idEvent) << 32) | idUnique;
  156. }
  157. /////////////////////////////////////////////////////////////////////////////
  158. #endif // !__AGCGlobal_h__