/////////////////////////////////////////////////////////////////////////////// /* File: history.cpp Description: To prevent the watchdog from excessive repeate notifications, the system administrator can set a minimum period for notification silence. This class (CHistory) manages the reading of this setting along with remembering the last time an action occured. A client of the object is able to ask it if a given action should be performed on the basis of past actions. CHistory Revision History: Date Description Programmer -------- --------------------------------------------------- ---------- 07/01/97 Initial creation. BrianAu */ /////////////////////////////////////////////////////////////////////////////// #include #pragma hdrstop #include "history.h" #include "policy.h" // // Defined in dskquowd.cpp // extern TCHAR g_szRegSubKeyUser[]; extern TCHAR g_szRegSubKeyAdmin[]; // // History-related registry parameter value names. // const TCHAR CHistory::SZ_REG_LAST_NOTIFY_POPUP_TIME[] = TEXT("LastNotifyPopupTime"); const TCHAR CHistory::SZ_REG_LAST_NOTIFY_EMAIL_TIME[] = TEXT("LastNotifyEmailTime"); CHistory::CHistory( CPolicy& policy ) : m_policy(policy) { // // Build our registry parameter table. This will create // any keys (using the defaults provided) that don't already exist. // FILETIME ft = {0, 0}; m_RegParams.AddBinaryParam(HKEY_CURRENT_USER, g_szRegSubKeyAdmin, SZ_REG_LAST_NOTIFY_POPUP_TIME, (LPBYTE)&ft, sizeof(ft)); m_RegParams.AddBinaryParam(HKEY_CURRENT_USER, g_szRegSubKeyAdmin, SZ_REG_LAST_NOTIFY_EMAIL_TIME, (LPBYTE)&ft, sizeof(ft)); } // // Compare the current time with the last time a popup was displayed // and the minimum popup period stored in the registry. // If the elapsed time since the last popup exceeds the minimum period // value stored in the registry, return TRUE. // BOOL CHistory::ShouldPopupDialog( VOID ) { FILETIME ftLastPopup; FILETIME ftNow; DWORD dwMinPeriod = 0; GetSysTime(&ftNow); m_RegParams.GetParameter(HKEY_CURRENT_USER, g_szRegSubKeyAdmin, SZ_REG_LAST_NOTIFY_POPUP_TIME, (LPBYTE)&ftLastPopup, sizeof(ftLastPopup)); // // Get the minimum popup period from the policy object. // dwMinPeriod = (DWORD)m_policy.GetMinNotifyPopupDialogPeriod(); return (INT)dwMinPeriod <= CalcDiffMinutes(ftNow, ftLastPopup); } // // Compare the current time with the last time email was sent // and the minimum email period stored in the registry. // If the elapsed time since the last email exceeds the minimum period // value stored in the registry, return TRUE. // BOOL CHistory::ShouldSendEmail( VOID ) { FILETIME ftLastEmail; FILETIME ftNow; DWORD dwMinPeriod = 0; GetSysTime(&ftNow); m_RegParams.GetParameter(HKEY_CURRENT_USER, g_szRegSubKeyAdmin, SZ_REG_LAST_NOTIFY_EMAIL_TIME, (LPBYTE)&ftLastEmail, sizeof(ftLastEmail)); // // Get the minimum popup period from the policy object. // dwMinPeriod = (DWORD)m_policy.GetMinNotifyEmailPeriod(); return (INT)dwMinPeriod <= CalcDiffMinutes(ftNow, ftLastEmail); } // // Should we do ANY notifications based on history information? // BOOL CHistory::ShouldDoAnyNotifications( VOID ) { return ShouldSendEmail() || ShouldPopupDialog(); } // // Save the current system time in the registry as the "last time" // a popup was displayed. // VOID CHistory::RecordDialogPoppedUp( VOID ) { FILETIME ftNow; GetSysTime(&ftNow); m_RegParams.SetParameter(HKEY_CURRENT_USER, g_szRegSubKeyAdmin, SZ_REG_LAST_NOTIFY_POPUP_TIME, (LPBYTE)&ftNow, sizeof(ftNow)); } // // Save the current system time in the registry as the "last time" // an email message was sent. // VOID CHistory::RecordEmailSent( VOID ) { FILETIME ftNow; GetSysTime(&ftNow); m_RegParams.SetParameter(HKEY_CURRENT_USER, g_szRegSubKeyAdmin, SZ_REG_LAST_NOTIFY_EMAIL_TIME, (LPBYTE)&ftNow, sizeof(ftNow)); } // // Get the system time as a FILETIME struct. // VOID CHistory::GetSysTime( LPFILETIME pftOut ) { SYSTEMTIME st; GetSystemTime(&st); SystemTimeToFileTime(&st, pftOut); } // // Calculate the difference between two FILETIME structures and // return the difference converted to minutes. // INT CHistory::CalcDiffMinutes( const FILETIME& ftA, const FILETIME& ftB ) { LARGE_INTEGER liMinA; LARGE_INTEGER liMinB; LARGE_INTEGER liDiff; liMinA.LowPart = ftA.dwLowDateTime; liMinA.HighPart = ftA.dwHighDateTime; liMinB.LowPart = ftB.dwLowDateTime; liMinB.HighPart = ftB.dwHighDateTime; liDiff.QuadPart = liMinA.QuadPart - liMinB.QuadPart; return (INT)(liDiff.QuadPart / ((__int64)600000000L)); }