#ifndef __AGCModule_h__
#define __AGCModule_h__
extern "C" const CLSID CLSID_AGCGlobal;
#include <..\TCLib\AutoHandle.h>
#ifdef AGC_MODULE
class CAGCModule
{
public:
IAGCGlobalPtr GetAGCGlobal()
{
HRESULT hr;
if (NULL == m_spcf)
{
hr = _Module.GetClassObject(CLSID_AGCGlobal, IID_IClassFactory,
(void**)&m_spcf);
assert(SUCCEEDED(hr) && NULL != m_spcf);
}
IAGCGlobalPtr spGlobal;
hr = m_spcf->CreateInstance(NULL, IID_IAGCGlobal, (void**)&spGlobal);
assert(NULL != spGlobal);
return spGlobal;
}
public:
void TriggerEvent(HAGCLISTENERS hListeners, AGCEventID idEvent,
LPCOLESTR pszSubject, AGCUniqueID idSubject,
AGCUniqueID idObject1, AGCUniqueID idObject2, long cArgTriplets, ...);
void TriggerEvent(HAGCLISTENERS hListeners, AGCEventID idEvent,
LPCSTR pszSubject, AGCUniqueID idSubject,
AGCUniqueID idObject1, AGCUniqueID idObject2, long cArgTriplets, ...);
void TriggerContextEvent(HAGCLISTENERS hListeners, AGCEventID idEvent,
LPCSTR pszContext, LPCOLESTR pszSubject, AGCUniqueID idSubject,
AGCUniqueID idObject1, AGCUniqueID idObject2, long cArgTriplets, ...);
void TriggerContextEvent(HAGCLISTENERS hListeners, AGCEventID idEvent,
LPCSTR pszContext, LPCSTR pszSubject, AGCUniqueID idSubject,
AGCUniqueID idObject1, AGCUniqueID idObject2, long cArgTriplets, ...);
HRESULT MakeAGCEvent(AGCEventID idEvent, IAGCEvent** ppEvent,
LPCSTR pszContext, LPCOLESTR pszSubject, AGCUniqueID idSubject,
long cArgTriplets, ...);
HRESULT MakeAGCEvent(AGCEventID idEvent, IAGCEvent** ppEvent,
LPCSTR pszContext, LPCSTR pszSubject, AGCUniqueID idSubject,
long cArgTriplets, ...);
protected:
void DoTriggerEvent(HAGCLISTENERS hListeners, AGCEventID idEvent,
LPCSTR pszContext, LPCOLESTR pszSubject, AGCUniqueID idSubject,
AGCUniqueID idObject1, AGCUniqueID idObject2,
long cArgTriplets, void* pvArgs)
{
bool bIsError = GetAGCGlobal()->GetEventSeverity(idEvent) == EVENTLOG_ERROR_TYPE;
if (!bIsError)
GetAGCGlobal()->TriggerEvent(hListeners, idEvent, pszContext,
pszSubject, idSubject, idObject1, idObject2, cArgTriplets, pvArgs);
else
{
GetAGCGlobal()->TriggerEventSynchronous(hListeners, idEvent, pszContext,
pszSubject, idSubject, idObject1, idObject2, cArgTriplets, pvArgs);
*(DWORD*)0 = 0; exit(EXIT_FAILURE);
}
}
protected:
IClassFactoryPtr m_spcf;
};
#else #ifndef _assert_h_
#ifndef assert
#define assert(x) while (false) {}
#endif inline void debugf(const char* , ...) {}
#endif #ifndef RETURN_FAILED
#define RETURN_FAILED(exp) \
{ \
HRESULT _hr = exp; \
if (FAILED(_hr)) \
return _hr; \
}
#endif #ifndef sizeofArray
#define sizeofArray(x) (sizeof(x) / sizeof(x[0]))
#endif class CAGCModule
{
public:
CAGCModule();
public:
IAGCGlobal* GetAGCGlobal();
_ATL_REGMAP_ENTRY* GetRegMapEntries();
void SetDebugBreakOnErrors(bool bBreak);
bool GetDebugBreakOnErrors() const;
public:
HRESULT Init();
void Term();
bool IsRegistered();
HRESULT Register();
public:
void TriggerEvent(HAGCLISTENERS hListeners, AGCEventID idEvent,
LPCOLESTR pszSubject, AGCUniqueID idSubject,
AGCUniqueID idObject1, AGCUniqueID idObject2, long cArgTriplets, ...);
void TriggerEvent(HAGCLISTENERS hListeners, AGCEventID idEvent,
LPCSTR pszSubject, AGCUniqueID idSubject,
AGCUniqueID idObject1, AGCUniqueID idObject2, long cArgTriplets, ...);
void TriggerContextEvent(HAGCLISTENERS hListeners, AGCEventID idEvent,
LPCSTR pszContext, LPCOLESTR pszSubject, AGCUniqueID idSubject,
AGCUniqueID idObject1, AGCUniqueID idObject2, long cArgTriplets, ...);
void TriggerContextEvent(HAGCLISTENERS hListeners, AGCEventID idEvent,
LPCSTR pszContext, LPCSTR pszSubject, AGCUniqueID idSubject,
AGCUniqueID idObject1, AGCUniqueID idObject2, long cArgTriplets, ...);
HRESULT MakeAGCEvent(AGCEventID idEvent, IAGCEvent** ppEvent,
LPCSTR pszContext, LPCOLESTR pszSubject, AGCUniqueID idSubject,
long cArgTriplets, ...);
HRESULT MakeAGCEvent(AGCEventID idEvent, IAGCEvent** ppEvent,
LPCSTR pszContext, LPCSTR pszSubject, AGCUniqueID idSubject,
long cArgTriplets, ...);
protected:
void DoTriggerEvent(HAGCLISTENERS hListeners, AGCEventID idEvent,
LPCSTR pszContext, LPCOLESTR pszSubject, AGCUniqueID idSubject,
AGCUniqueID idObject1, AGCUniqueID idObject2,
long cArgTriplets, void* pvArgs);
protected:
IAGCGlobalPtr m_spGlobal;
bool m_bDebugBreakOnErrors;
};
inline CAGCModule::CAGCModule() :
m_bDebugBreakOnErrors(true)
{
}
inline IAGCGlobal* CAGCModule::GetAGCGlobal()
{
#ifdef _DEBUG
if (NULL == m_spGlobal)
debugf("CAGCModule::GetAGCGlobal(): Init not successfully called!\n");
assert(NULL != m_spGlobal);
#endif return m_spGlobal;
}
inline _ATL_REGMAP_ENTRY* CAGCModule::GetRegMapEntries()
{
static OLECHAR s_szModulePath[_MAX_PATH];
static _ATL_REGMAP_ENTRY s_map[] =
{
{OLESTR("AGCModule"), s_szModulePath},
{NULL , NULL}
};
HINSTANCE hinst = GetAGCGlobal()->GetResourceInstance();
assert(hinst);
TCHAR szModulePath[_MAX_PATH];
GetModuleFileName(hinst, szModulePath, sizeofArray(szModulePath));
USES_CONVERSION;
wcscpy(s_szModulePath, T2COLE(szModulePath));
return s_map;
}
inline void CAGCModule::SetDebugBreakOnErrors(bool bBreak)
{
m_bDebugBreakOnErrors = bBreak;
}
inline bool CAGCModule::GetDebugBreakOnErrors() const
{
return m_bDebugBreakOnErrors;
}
inline HRESULT CAGCModule::Init()
{
if (!IsRegistered())
{
HRESULT hr = Register();
assert(hr);
if (FAILED(hr))
return hr;
}
RETURN_FAILED(m_spGlobal.CreateInstance(CLSID_AGCGlobal));
m_spGlobal->Initialize();
return S_OK;
}
inline void CAGCModule::Term()
{
if (NULL != m_spGlobal)
m_spGlobal->Terminate();
m_spGlobal = NULL;
}
inline bool CAGCModule::IsRegistered()
{
if (NULL != m_spGlobal)
return true;
return SUCCEEDED(m_spGlobal.CreateInstance(CLSID_AGCGlobal));
}
inline HRESULT CAGCModule::Register()
{
TCHAR szModule[_MAX_PATH];
::GetModuleFileName(NULL, szModule, sizeofArray(szModule));
TCHAR szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szPath[_MAX_PATH];
_tsplitpath(szModule, szDrive, szDir, NULL, NULL);
_tmakepath(szPath, szDrive, szDir, NULL, NULL);
TCHAR szCurDirPrev[_MAX_PATH] = TEXT("");
GetCurrentDirectory(sizeofArray(szCurDirPrev), szCurDirPrev);
SetCurrentDirectory(szPath);
TCHAR szAGC[_MAX_PATH];
_tmakepath(szAGC, szDrive, szDir, TEXT("AGC"), TEXT(".dll"));
HINSTANCE hinst = ::LoadLibrary(szAGC);
HRESULT hr = HRESULT_FROM_WIN32(::GetLastError());
if (hinst)
{
typedef HRESULT (CALLBACK *PFNREG)();
PFNREG pfn = (PFNREG)GetProcAddress(hinst, "DllRegisterServer");
hr = pfn ? (*pfn)() : HRESULT_FROM_WIN32(::GetLastError());
FreeLibrary(hinst);
}
SetCurrentDirectory(szCurDirPrev);
return hr;
}
inline void CAGCModule::DoTriggerEvent(HAGCLISTENERS hListeners,
AGCEventID idEvent, LPCSTR pszContext,
LPCOLESTR pszSubject, AGCUniqueID idSubject,
AGCUniqueID idObject1, AGCUniqueID idObject2,
long cArgTriplets, void* pvArgs)
{
bool bIsError;
if (NULL != m_spGlobal)
{
bIsError = m_spGlobal->GetEventSeverity(idEvent) == EVENTLOG_ERROR_TYPE;
if (!bIsError)
m_spGlobal->TriggerEvent(hListeners, idEvent, pszContext,
pszSubject, idSubject, idObject1, idObject2, cArgTriplets, pvArgs);
else
m_spGlobal->TriggerEventSynchronous(hListeners, idEvent, pszContext,
pszSubject, idSubject, idObject1, idObject2, cArgTriplets, pvArgs);
}
else
{
TCHAR szModule[_MAX_PATH], szName[_MAX_PATH];
GetModuleFileName(NULL, szModule, sizeofArray(szModule));
_tsplitpath(szModule, NULL, NULL, szName, NULL);
TCEventSourceHandle sh = RegisterEventSource(NULL, szName);
const DWORD dwEventID = (3 << 30) | EventID_AGCNotInitialized;
ReportEvent(sh, EVENTLOG_ERROR_TYPE, 0, dwEventID, NULL, 0, 0, NULL, NULL);
bIsError = true;
}
if (bIsError && EventID_AGCAssert != idEvent)
{
#ifdef _DEBUG
if (GetDebugBreakOnErrors())
*(DWORD*)0 = 0;
#endif exit(EXIT_FAILURE);
}
}
#endif inline void CAGCModule::TriggerEvent(HAGCLISTENERS hListeners,
AGCEventID idEvent, LPCOLESTR pszSubject, AGCUniqueID idSubject,
AGCUniqueID idObject1, AGCUniqueID idObject2, long cArgTriplets, ...)
{
va_list argptr;
va_start(argptr, cArgTriplets);
DoTriggerEvent(hListeners, idEvent, NULL, pszSubject, idSubject,
idObject1, idObject2, cArgTriplets, argptr);
va_end(argptr);
}
inline void CAGCModule::TriggerEvent(HAGCLISTENERS hListeners,
AGCEventID idEvent, LPCSTR pszSubject, AGCUniqueID idSubject,
AGCUniqueID idObject1, AGCUniqueID idObject2, long cArgTriplets, ...)
{
USES_CONVERSION;
va_list argptr;
va_start(argptr, cArgTriplets);
DoTriggerEvent(hListeners, idEvent, NULL, A2COLE(pszSubject), idSubject,
idObject1, idObject2, cArgTriplets, argptr);
va_end(argptr);
}
inline void CAGCModule::TriggerContextEvent(HAGCLISTENERS hListeners,
AGCEventID idEvent, LPCSTR pszContext,
LPCOLESTR pszSubject, AGCUniqueID idSubject,
AGCUniqueID idObject1, AGCUniqueID idObject2, long cArgTriplets, ...)
{
va_list argptr;
va_start(argptr, cArgTriplets);
DoTriggerEvent(hListeners, idEvent, pszContext, pszSubject, idSubject,
idObject1, idObject2, cArgTriplets, argptr);
va_end(argptr);
}
inline void CAGCModule::TriggerContextEvent(HAGCLISTENERS hListeners,
AGCEventID idEvent, LPCSTR pszContext,
LPCSTR pszSubject, AGCUniqueID idSubject,
AGCUniqueID idObject1, AGCUniqueID idObject2, long cArgTriplets, ...)
{
USES_CONVERSION;
va_list argptr;
va_start(argptr, cArgTriplets);
DoTriggerEvent(hListeners, idEvent, pszContext, A2COLE(pszSubject), idSubject,
idObject1, idObject2, cArgTriplets, argptr);
va_end(argptr);
}
inline HRESULT CAGCModule::MakeAGCEvent(AGCEventID idEvent,
IAGCEvent** ppEvent, LPCSTR pszContext,
LPCOLESTR pszSubject, AGCUniqueID idSubject, long cArgTriplets, ...)
{
va_list argptr;
va_start(argptr, cArgTriplets);
HRESULT hr = GetAGCGlobal()->MakeAGCEvent(idEvent, pszContext,
pszSubject, idSubject, cArgTriplets, argptr, ppEvent);
va_end(argptr);
return hr;
}
inline HRESULT CAGCModule::MakeAGCEvent(AGCEventID idEvent,
IAGCEvent** ppEvent, LPCSTR pszContext,
LPCSTR pszSubject, AGCUniqueID idSubject, long cArgTriplets, ...)
{
USES_CONVERSION;
va_list argptr;
va_start(argptr, cArgTriplets);
HRESULT hr = GetAGCGlobal()->MakeAGCEvent(idEvent, pszContext,
A2COLE(pszSubject), idSubject, cArgTriplets, argptr, ppEvent);
va_end(argptr);
return hr;
}
#endif