#include "pch.h"
#include "AdminEventLoggerHook.h"
#if !defined(ALLSRV_STANDALONE)
void CAdminEventLoggerHook::EventLogged(CQLogEvent* pquery)
{
CQLogEventData* pqd = pquery->GetData();
assert(pqd->hevt);
::SetEvent(pqd->hevt);
}
STDMETHODIMP CAdminEventLoggerHook::LogEvent(IAGCEvent* pEvent, VARIANT_BOOL bSynchronous)
{
if (!g.sql.GetNotifyThreadID())
return S_OK;
AGCEventID idEvent;
long idSubject;
CComBSTR bstrComputerName, bstrSubjectName, bstrContext;
ZSucceeded(pEvent->get_ID(&idEvent));
ZSucceeded(pEvent->get_SubjectID (&idSubject ));
ZSucceeded(pEvent->get_ComputerName(&bstrComputerName));
ZSucceeded(pEvent->get_SubjectName (&bstrSubjectName ));
ZSucceeded(pEvent->get_Context (&bstrContext ));
void (*pfnDataReady)(CQLogEvent* pquery) = bSynchronous ? EventLogged : NULL;
CQLogEvent* pquery = new CQLogEvent(pfnDataReady);
CQLogEventData* pqd = pquery->GetData();
pquery->SetCallbackOnMainThread(false);
USES_CONVERSION;
pqd->nEvent = idEvent;
pqd->nSubject = idSubject;
if (bstrComputerName.Length())
lstrcpyn(pqd->szComputerName, OLE2CT(bstrComputerName), sizeofArray(pqd->szComputerName));
else
pqd->szComputerName[0] = TEXT('\0');
if (bstrSubjectName.Length())
lstrcpyn(pqd->szSubjectName, OLE2CT(bstrSubjectName), sizeofArray(pqd->szSubjectName));
else
pqd->szSubjectName[0] = TEXT('\0');
if (bstrContext.Length())
lstrcpyn(pqd->szContext, OLE2CT(bstrContext), sizeofArray(pqd->szContext));
else
pqd->szContext[0] = TEXT('\0');
assert(IPersistStreamInitPtr(pEvent) != NULL || IPersistStreamPtr(pEvent) != NULL);
assert(IMarshalPtr(pEvent) != NULL);
CComBSTR bstrTemp;
ZSucceeded(pEvent->SaveToString(&bstrTemp));
WideCharToMultiByte(CP_ACP, 0, bstrTemp, -1,
pqd->szObjectRef, sizeof(pqd->szObjectRef), 0, 0);
TCHandle shevt;
if (bSynchronous)
shevt = ::CreateEvent(NULL, false, false, NULL);
pqd->hevt = shevt.GetHandle();
g.sql.PostQuery(pquery);
if (!shevt.IsNull())
::WaitForSingleObject(shevt, INFINITE);
return S_OK;
}
#endif