📄 settings.cpp
字号:
//***********************************************************************
// settings.cpp
//
// This file contains the implementation of the "Settings" dialog class.
//
//
// Author: SEA
//
// History:
// Febuary-1996 Larry A. French
// Modified the code to fix various problems. Regrettably, this
// file still contains a fair amount of legacy code that I didn't
// have time to fully rewrite. Also, I did not have time to go
// though and fully comment the code.
//
//
// Copyright (C) 1995, 1996 Microsoft Corporation. All rights reserved.
//
//************************************************************************
// settings.cpp : implementation file
//
#include "stdafx.h"
#include "eventrap.h"
#include "settings.h"
#include "globals.h"
#include "trapreg.h"
// This macro handles comparing bool values for the cases where TRUE can be and
// non-zero value.
#define BOOLS_ARE_DIFFERENT(b1, b2) ((b1 & !b2) || (!b1 & b2))
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
UINT _thrRun(CTrapSettingsDlg *trapDlg)
{
return trapDlg->thrRun();
}
/////////////////////////////////////////////////////////////////////////////
// CTrapSettingsDlg dialog
UINT CTrapSettingsDlg::thrRun()
{
HANDLE hEvents[2];
DWORD retCode;
CRegistryKey regkey;
CRegistryValue regval;
BOOL bThrottleIsTripped = FALSE;
hEvents[0] = (HANDLE)m_evRegNotification;
hEvents[1] = (HANDLE)m_evTermination;
if (!g_reg.m_regkeySnmp.GetSubKey(SZ_REGKEY_PARAMETERS, regkey))
return 0;
do
{
m_evRegNotification.SetEvent();
if (RegNotifyChangeKeyValue(
regkey.m_hkeyOpen,
TRUE,
REG_NOTIFY_CHANGE_LAST_SET | REG_NOTIFY_CHANGE_NAME,
(HANDLE)m_evRegNotification,
TRUE) == ERROR_SUCCESS)
{
if (regkey.GetValue(SZ_REGKEY_PARAMS_THRESHOLD, regval) &&
*(DWORD*)regval.m_pData == THROTTLE_TRIPPED)
PostMessage(WM_UIREQUEST, UICMD_ENABLE_RESET, TRUE);
else
PostMessage(WM_UIREQUEST, UICMD_ENABLE_RESET, FALSE);
}
} while(WaitForMultipleObjects(2, hEvents, FALSE, INFINITE) == WAIT_OBJECT_0);
regkey.Close();
return 0;
}
CTrapSettingsDlg::CTrapSettingsDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTrapSettingsDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTrapSettingsDlg)
m_bLimitMsgLength = FALSE;
//}}AFX_DATA_INIT
}
#define I_MAX_LONG 0x7fffffffL
#define I_MIN_TRAPCOUNT 2
#define I_MAX_TRAPCOUNT 9999999
#define I_MIN_SECONDS 1
#define I_MAX_SECONDS 9999999
#define I_MIN_MESSAGE_LENGTH 400
#define I_MAX_MESSAGE_LENGTH 0x7fff
SCODE CTrapSettingsDlg::GetMessageLength(LONG* pnChars)
{
CString sValue;
CButton* pbtnLimit = (CButton*)GetDlgItem(IDC_LIMITMSGLNGTH);
BOOL bLimitEnabled = (pbtnLimit->GetCheck() == 1) ? TRUE : FALSE;
m_edtMessageLength.GetWindowText(sValue);
SCODE sc;
LONG nChars = _ttol(sValue);
sc = AsciiToLong(sValue, &nChars);
if (FAILED(sc))
{
// They shouldn't have garbage in this edit control even if
// they haven't selected a message limit. Let the user fix it.
AfxMessageBox(IDS_ERR_SETTINGS_MESSAGELENGTH_NOT_INT);
m_edtMessageLength.SetFocus();
m_edtMessageLength.SetSel(0, -1);
return E_FAIL;
}
if (bLimitEnabled)
{
if (nChars < I_MIN_MESSAGE_LENGTH || nChars > I_MAX_MESSAGE_LENGTH)
{
if (pbtnLimit->GetCheck() == 1)
{
CString sError;
CString sRangeMessage;
sError.LoadString(IDS_SETTINGS_MESSAGE_LENGTH_RANGE);
GenerateRangeMessage(sRangeMessage, I_MIN_MESSAGE_LENGTH, I_MAX_MESSAGE_LENGTH);
sError += sRangeMessage;
AfxMessageBox(sError);
sValue.Format(_T("%u"),nChars);
m_edtMessageLength.SetWindowText(sValue);
m_edtMessageLength.SetFocus();
m_edtMessageLength.SetSel(0, -1);
return E_FAIL;
}
}
}
*pnChars = nChars;
return S_OK;
}
SCODE CTrapSettingsDlg::GetTrapsPerSecond(LONG* pnTraps, LONG* pnSeconds)
{
CString sSeconds;
CString sTraps;
CString sError;
CString sRangeMessage;
LONG nTraps;
LONG nSeconds;
SCODE sc;
// First make sure that the trap count and seconds fields don't have garbage in them.
// If a non-integer value is specified, force the user to fix it regardless of whether
// or not the throttle is enabled.
m_edtTrapCount.GetWindowText(sTraps);
sc = AsciiToLong(sTraps, &nTraps);
if (FAILED(sc))
{
AfxMessageBox(IDS_ERR_SETTINGS_TRAPCOUNT_NOT_INT);
m_edtTrapCount.SetFocus();
m_edtTrapCount.SetSel(0, -1);
return E_FAIL;
}
m_edtSeconds.GetWindowText(sSeconds);
sc = AsciiToLong(sSeconds, &nSeconds);
if (FAILED(sc))
{
AfxMessageBox(IDS_ERR_SETTINGS_TRAPSECONDS_NOT_INT);
m_edtSeconds.SetFocus();
m_edtSeconds.SetSel(0, -1);
return E_FAIL;
}
BOOL bThrottleEnabled;
if (GetCheckedRadioButton(IDC_RADIO_ENABLE, IDC_RADIO_DISABLE) == IDC_RADIO_ENABLE)
bThrottleEnabled = TRUE;
else
bThrottleEnabled = FALSE;
if (bThrottleEnabled)
{
if (nTraps < I_MIN_TRAPCOUNT || nTraps > I_MAX_TRAPCOUNT)
{
sError.LoadString(IDS_ERR_SETTINGS_TRAPCOUNT_RANGE);
GenerateRangeMessage(sRangeMessage, I_MIN_TRAPCOUNT, I_MAX_TRAPCOUNT);
sError += sRangeMessage;
AfxMessageBox(sError);
sTraps.Format(_T("%u"), nTraps);
m_edtTrapCount.SetWindowText(sTraps);
m_edtTrapCount.SetFocus();
m_edtTrapCount.SetSel(0, -1);
return E_FAIL;
}
if (nSeconds < I_MIN_SECONDS || nSeconds > I_MAX_SECONDS)
{
sError.LoadString(IDS_SETTINGS_TRAPSECONDS_RANGE);
GenerateRangeMessage(sRangeMessage, I_MIN_SECONDS, I_MAX_SECONDS);
sError += sRangeMessage;
AfxMessageBox(sError);
sSeconds.Format(_T("%u"),nSeconds);
m_edtSeconds.SetWindowText(sSeconds);
m_edtSeconds.SetFocus();
m_edtSeconds.SetSel(0, -1);
return E_FAIL;
}
}
*pnTraps = nTraps;
*pnSeconds = nSeconds;
return S_OK;
}
void CTrapSettingsDlg::TerminateBackgroundThread()
{
if (m_pthRegNotification)
{
m_evTermination.SetEvent();
WaitForSingleObject(m_pthRegNotification->m_hThread, INFINITE);
}
}
void CTrapSettingsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTrapSettingsDlg)
DDX_Control(pDX, IDC_STAT_TRAP_LENGTH, m_statTrapLength);
DDX_Control(pDX, IDC_EDIT_MESSAGELENGTH, m_edtMessageLength);
DDX_Control(pDX, IDC_EDIT_TRAP_SECONDS, m_edtSeconds);
DDX_Control(pDX, IDC_EDIT_TRAP_COUNT, m_edtTrapCount);
DDX_Control(pDX, IDC_MSGLENGTHSPN, m_spinMessageLength);
DDX_Control(pDX, IDC_BUTTON_RESET, m_btnResetThrottle);
DDX_Check(pDX, IDC_LIMITMSGLNGTH, m_bLimitMsgLength);
//}}AFX_DATA_MAP
CString sValue;
if (pDX->m_bSaveAndValidate) {
// Saving the value trapsize, seconds, and trapcount is handled by
// CTrapSettingsDlg::OnOK so that it can set the focus back to the
// offending item if the value is out of range. If the data transfer
// fails here, the focus is always set back to the dialog and not
// the offending item (is there a way around this?)
}
else {
m_spinMessageLength.SetRange(I_MIN_MESSAGE_LENGTH, I_MAX_MESSAGE_LENGTH);
m_spinMessageLength.SetPos(g_reg.m_params.m_trapsize.m_dwMaxTrapSize);
DecString(sValue, g_reg.m_params.m_throttle.m_nSeconds);
m_edtSeconds.SetWindowText(sValue);
DecString(sValue, g_reg.m_params.m_throttle.m_nTraps);
m_edtTrapCount.SetWindowText(sValue);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -