windows-nt/Source/XPSP1/NT/shell/osshell/dskquota/watchdog/history.cpp
2020-09-26 16:20:57 +08:00

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));
}