2025-04-27 07:49:33 -04:00

133 lines
2.8 KiB
C++

#include "precomp.h"
PpNotificationThread g_NotificationThread;
LONG g_bStarted;
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved // reserved
)
{
switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
g_bStarted = FALSE;
DisableThreadLibraryCalls(hinstDLL);
#ifdef MEM_DBG
{
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
tmpFlag |= _CRTDBG_ALLOC_MEM_DF;
tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag( tmpFlag );
char *myBuf = new char[64];
strcpy(myBuf, "Nexus leak ok!"); // Let em know it's working
}
#endif
if(!g_pAlert)
{
g_pAlert = CreatePassportAlertObject(PassportAlertInterface::EVENT_TYPE);
if(g_pAlert)
{
g_pAlert->initLog(PM_ALERTS_REGISTRY_KEY, EVCAT_NEXUS, NULL, 1);
}
else
_ASSERT(g_pAlert);
}
break;
case DLL_PROCESS_DETACH:
delete g_pAlert;
if(g_bStarted)
{
// DARRENAN 4092
// Remove lines that wait for thread to stop, a
// guaranteed deadlock.
g_NotificationThread.stop();
}
break;
default:
break;
}
return TRUE;
}
HANDLE WINAPI
RegisterCCDUpdateNotification(
LPCTSTR pszCCDName,
ICCDUpdate* piCCDUpdate
)
{
HANDLE hClientHandle;
HRESULT hr;
hr = g_NotificationThread.AddCCDClient(tstring(pszCCDName), piCCDUpdate, &hClientHandle);
if(hr != S_OK)
{
hClientHandle = NULL;
}
if(!InterlockedExchange(&g_bStarted, TRUE))
g_NotificationThread.start();
return hClientHandle;
}
BOOL WINAPI
UnregisterCCDUpdateNotification(
HANDLE hNotificationHandle
)
{
return (g_NotificationThread.RemoveClient(hNotificationHandle) == S_OK);
}
HANDLE WINAPI
RegisterConfigChangeNotification(
IConfigurationUpdate* piConfigUpdate
)
{
HANDLE hClientHandle;
HRESULT hr;
hr = g_NotificationThread.AddLocalConfigClient(piConfigUpdate, &hClientHandle);
if(hr != S_OK)
{
hClientHandle = NULL;
}
if(!InterlockedExchange(&g_bStarted, TRUE))
g_NotificationThread.start();
return hClientHandle;
}
BOOL WINAPI
UnregisterConfigChangeNotification(
HANDLE hNotificationHandle
)
{
return (g_NotificationThread.RemoveClient(hNotificationHandle) == S_OK);
}
BOOL WINAPI
GetCCD(
LPCTSTR pszCCDName,
IXMLDocument** ppiXMLDocument,
BOOL bForceFetch
)
{
return (g_NotificationThread.GetCCD(tstring(pszCCDName), ppiXMLDocument, bForceFetch) == S_OK);
}