/**********************************************************************/ /** Microsoft Passport **/ /** Copyright(c) Microsoft Corporation, 1999 - 2001 **/ /**********************************************************************/ /* ppnotificationthread.h implement the methods runing a separte thread watching for registry changes, and timer for CCD refresh FILE HISTORY: */ #ifndef __PPNOTIFICATIONTHREAD_H #define __PPNOTIFICATIONTHREAD_H #include #include #include #include #include "tstring" #include using namespace std; #include "PassportThread.hpp" #include "PassportLock.hpp" #include "PassportEvent.hpp" #include "PassportLockedInteger.hpp" #include "nexus.h" //  Notification types used in structure below #define NOTIF_CONFIG 1 #define NOTIF_CCD 2 ////////////////////////////////////////////////////////////////////////// // // NOTIFICATION_CLIENT -- notification client // // typedef struct { DWORD dwNotificationType; union { IConfigurationUpdate* piConfigUpdate; ICCDUpdate* piCCDUpdate; } NotificationInterface; tstring strCCDName; //  Will be empty for config notif types HANDLE hClientHandle; } NOTIFICATION_CLIENT; typedef vector CLIENT_LIST; ////////////////////////////////////////////////////////////////////////// // // CCD_INFO -- CCD timer element // // class CCD_INFO { public: tstring strCCDName; tstring strCCDURL; tstring strCCDLocalFile; DWORD dwCCDRefreshInterval; DWORD dwDefaultRefreshInterval; HANDLE hCCDTimer; CCD_INFO() { strCCDName = TEXT(""); strCCDURL = TEXT(""); strCCDLocalFile = TEXT(""); dwCCDRefreshInterval = 0; dwDefaultRefreshInterval= 0; hCCDTimer = CreateWaitableTimer(NULL, TRUE, NULL); }; CCD_INFO(const CCD_INFO& ci) { strCCDName = ci.strCCDName; strCCDURL = ci.strCCDURL; strCCDLocalFile = ci.strCCDLocalFile; dwCCDRefreshInterval = ci.dwCCDRefreshInterval; dwDefaultRefreshInterval= ci.dwDefaultRefreshInterval; HANDLE hProcess = GetCurrentProcess(); DuplicateHandle(hProcess, ci.hCCDTimer, hProcess, &hCCDTimer, 0, FALSE, DUPLICATE_SAME_ACCESS); }; ~CCD_INFO() { CloseHandle(hCCDTimer); } const CCD_INFO& operator = (const CCD_INFO& ci) { strCCDName = ci.strCCDName; strCCDURL = ci.strCCDURL; strCCDLocalFile = ci.strCCDLocalFile; dwCCDRefreshInterval = ci.dwCCDRefreshInterval; dwDefaultRefreshInterval= ci.dwDefaultRefreshInterval; CloseHandle(hCCDTimer); HANDLE hProcess = GetCurrentProcess(); DuplicateHandle(hProcess, ci.hCCDTimer, hProcess, &hCCDTimer, 0, FALSE, DUPLICATE_SAME_ACCESS); return ci; } BOOL SetTimer(DWORD dwOneTimeRefreshInterval = 0xFFFFFFFF) { // Reset the timer. LARGE_INTEGER liDueTime; DWORD dwError; DWORD dwRefreshInterval = (dwOneTimeRefreshInterval != 0xFFFFFFFF ? dwOneTimeRefreshInterval : (dwCCDRefreshInterval != 0xFFFFFFFF ? dwCCDRefreshInterval : dwDefaultRefreshInterval ) ); liDueTime.QuadPart = -((LONGLONG)(dwRefreshInterval) * 10000000); if(!SetWaitableTimer(hCCDTimer, &liDueTime, 0, NULL, NULL, FALSE)) { dwError = GetLastError(); return FALSE; } return TRUE; } }; typedef vector CCD_INFO_LIST; ////////////////////////////////////////////////////////////////////////// // // PpNotificationThread -- notification thread // // class PpNotificationThread : public PassportThread, public IConfigurationUpdate { public: PpNotificationThread(); ~PpNotificationThread(); HRESULT AddCCDClient(tstring& strCCDName, ICCDUpdate* piUpdate, HANDLE* phClientHandle); HRESULT AddLocalConfigClient(IConfigurationUpdate* piUpdate, HANDLE* phClientHandle); HRESULT RemoveClient(HANDLE hClientHandle); HRESULT GetCCD(tstring& strCCDName, IXMLDocument** ppiStream, BOOL bForceFetch = TRUE); void run(void); void LocalConfigurationUpdated(void); void stop(void); bool start(void); private: static PassportLockedInteger m_NextHandle; // Private methods. BOOL GetCCDInfo(tstring& strCCDName, CCD_INFO& ccdInfo); BOOL ReadCCDInfo(tstring& strCCDName, DWORD dwDefaultRefreshInterval, CRegKey& CCDRegKey); // Private data CLIENT_LIST m_ClientList; PassportLock m_ClientListLock; CCD_INFO_LIST m_aciCCDInfoList; PassportLock m_CCDInfoLock; PassportEvent m_StartupThread; PassportEvent m_ShutdownThread; PassportEvent m_ShutdownAck; }; #endif // __PPNOTIFICATIONTHREAD_H