224 lines
5.6 KiB
C++
224 lines
5.6 KiB
C++
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
/* 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 <precomp.hxx>
|
||
|
#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));
|
||
|
}
|
||
|
|