//*********************************************************************** // 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); } } BEGIN_MESSAGE_MAP(CTrapSettingsDlg, CDialog) //{{AFX_MSG_MAP(CTrapSettingsDlg) ON_BN_CLICKED(IDC_LIMITMSGLNGTH, OnLimitMessageLength) ON_BN_CLICKED(IDC_RADIO_DISABLE, OnRadioDisable) ON_BN_CLICKED(IDC_RADIO_ENABLE, OnRadioEable) ON_BN_CLICKED(IDC_BUTTON_RESET, OnButtonReset) ON_COMMAND(ID_HELP, OnHelp) ON_WM_HELPINFO() ON_WM_CONTEXTMENU() ON_WM_CLOSE() ON_MESSAGE(WM_UIREQUEST, OnUIRequest) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTrapSettingsDlg message handlers LRESULT CTrapSettingsDlg::OnUIRequest(WPARAM cmd, LPARAM lParam) { switch(cmd) { case UICMD_ENABLE_RESET: m_btnResetThrottle.EnableWindow((BOOL)lParam); break; default: break; } return (LRESULT)0; } void CTrapSettingsDlg::OnLimitMessageLength() { // The LimitMsgLength checkbox was clicked. // Enable/disable the edit control. // Get the controls. CButton* pbtnLimitBox = (CButton*) GetDlgItem(IDC_LIMITMSGLNGTH); CButton *pRadio1 = (CButton*)GetDlgItem(IDC_RADIO1); CButton *pRadio2 = (CButton*)GetDlgItem(IDC_RADIO2); // It's checked; enable if (pbtnLimitBox->GetCheck() == 1) { m_edtMessageLength.EnableWindow(); pRadio1->EnableWindow(); pRadio2->EnableWindow(); GetDlgItem(IDC_STATIC_BYTES)->EnableWindow(); m_statTrapLength.EnableWindow(); } // Disable else { m_edtMessageLength.EnableWindow(FALSE); pRadio1->EnableWindow(FALSE); pRadio2->EnableWindow(FALSE); GetDlgItem(IDC_STATIC_BYTES)->EnableWindow(FALSE); m_statTrapLength.EnableWindow(FALSE); } } BOOL CTrapSettingsDlg::OnInitDialog() { CDialog::OnInitDialog(); CButton *pRadio1 = (CButton*)GetDlgItem(IDC_RADIO1); CButton *pRadio2 = (CButton*)GetDlgItem(IDC_RADIO2); m_statTrapLength.EnableWindow(m_bLimitMsgLength); m_edtMessageLength.EnableWindow(m_bLimitMsgLength); if (m_bLimitMsgLength) { pRadio1->EnableWindow(); pRadio2->EnableWindow(); GetDlgItem(IDC_STATIC_BYTES)->EnableWindow(); } // Disable else { pRadio1->EnableWindow(FALSE); pRadio2->EnableWindow(FALSE); GetDlgItem(IDC_STATIC_BYTES)->EnableWindow(FALSE); } if (m_bTrimMessagesFirst) CheckRadioButton(IDC_RADIO1, IDC_RADIO2, IDC_RADIO2); else CheckRadioButton(IDC_RADIO1, IDC_RADIO2, IDC_RADIO1); if (m_bThrottleEnabled) CheckRadioButton(IDC_RADIO_ENABLE, IDC_RADIO_DISABLE, IDC_RADIO_ENABLE); else CheckRadioButton(IDC_RADIO_ENABLE, IDC_RADIO_DISABLE, IDC_RADIO_DISABLE); EnableThrottleWindows(m_bThrottleEnabled); m_pthRegNotification = AfxBeginThread((AFX_THREADPROC)_thrRun, this); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CTrapSettingsDlg::OnOK() { LONG nchMessageLength; LONG nTraps; LONG nSeconds; SCODE sc = GetMessageLength(&nchMessageLength); if (FAILED(sc)) { return; } sc = GetTrapsPerSecond(&nTraps, &nSeconds); if (FAILED(sc)) { return; } // Pull various values off of the dialog and store them into member variables. // Note that there are other member variables that are set directly // as a response to user input. //=========================================================================== m_bTrimMessagesFirst = (GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO2) == IDC_RADIO2); m_bThrottleEnabled = (GetCheckedRadioButton(IDC_RADIO_ENABLE, IDC_RADIO_DISABLE) == IDC_RADIO_ENABLE); if (g_reg.m_params.m_trapsize.m_dwMaxTrapSize != (DWORD) nchMessageLength) { g_reg.SetDirty(TRUE); g_reg.m_params.m_trapsize.m_dwMaxTrapSize = nchMessageLength; } if(g_reg.m_params.m_throttle.m_nSeconds != nSeconds) { g_reg.SetDirty(TRUE); g_reg.m_params.m_throttle.m_nSeconds = nSeconds; } if (g_reg.m_params.m_throttle.m_nTraps != nTraps) { g_reg.SetDirty(TRUE); g_reg.m_params.m_throttle.m_nTraps = nTraps; } TerminateBackgroundThread(); CDialog::OnOK(); } BOOL CTrapSettingsDlg::EditSettings() { m_bLimitMsgLength = g_reg.m_params.m_trapsize.m_bTrimFlag; m_bTrimMessagesFirst = g_reg.m_params.m_trapsize.m_bTrimMessages; m_bThrottleEnabled = g_reg.m_params.m_throttle.m_bIsEnabled; // Save the data. if (DoModal() == IDOK) { if (BOOLS_ARE_DIFFERENT(g_reg.m_params.m_trapsize.m_bTrimFlag, m_bLimitMsgLength)) { g_reg.m_params.m_trapsize.m_bTrimFlag = m_bLimitMsgLength; g_reg.SetDirty(TRUE); } if (BOOLS_ARE_DIFFERENT(g_reg.m_params.m_trapsize.m_bTrimMessages, m_bTrimMessagesFirst)) { g_reg.m_params.m_trapsize.m_bTrimMessages = m_bTrimMessagesFirst; g_reg.SetDirty(TRUE); } if (BOOLS_ARE_DIFFERENT(g_reg.m_params.m_throttle.m_bIsEnabled, m_bThrottleEnabled)) { g_reg.m_params.m_throttle.m_bIsEnabled = m_bThrottleEnabled; g_reg.SetDirty(TRUE); } return TRUE; } else { return FALSE; } } void CTrapSettingsDlg::OnRadioDisable() { EnableThrottleWindows(FALSE); } void CTrapSettingsDlg::OnRadioEable() { EnableThrottleWindows(TRUE); } void CTrapSettingsDlg::EnableThrottleWindows(BOOL bEnableThrottle) { m_edtSeconds.EnableWindow(bEnableThrottle); GetDlgItem(IDC_STATIC_MSG)->EnableWindow(bEnableThrottle); GetDlgItem(IDC_STATIC_NTRAPS)->EnableWindow(bEnableThrottle); GetDlgItem(IDC_STATIC_INTERVAL)->EnableWindow(bEnableThrottle); m_edtTrapCount.EnableWindow(bEnableThrottle); } //**************************************************************** // CTrapSettingsDlg::OnButtonReset // // Reset the extension agent so that it starts sending traps again. // The extension agent will stop sending traps if the throttle limit // is exceeded (more than x number of traps per second are set). // // Parameters: // None. // // Returns. // Nothing. // //***************************************************************** void CTrapSettingsDlg::OnButtonReset() { if (SUCCEEDED(g_reg.m_params.ResetExtensionAgent())) { m_btnResetThrottle.EnableWindow(FALSE); } } BOOL CTrapSettingsDlg::OnHelpInfo(HELPINFO *pHelpInfo) { if (pHelpInfo->iContextType == HELPINFO_WINDOW && pHelpInfo->iCtrlId != IDC_STATIC_MSG && pHelpInfo->iCtrlId != IDC_STATIC_BYTES) { ::WinHelp ((HWND)pHelpInfo->hItemHandle, AfxGetApp()->m_pszHelpFilePath, HELP_WM_HELP, (ULONG_PTR)g_aHelpIDs_IDD_SETTINGSDLG); } return TRUE; } void CTrapSettingsDlg::OnContextMenu(CWnd* pWnd, CPoint point) { if (this == pWnd) return; ::WinHelp (pWnd->m_hWnd, AfxGetApp()->m_pszHelpFilePath, HELP_CONTEXTMENU, (ULONG_PTR)g_aHelpIDs_IDD_SETTINGSDLG); } void CTrapSettingsDlg::OnClose() { TerminateBackgroundThread(); CDialog::OnClose(); } void CTrapSettingsDlg::OnCancel() { TerminateBackgroundThread(); CDialog::OnCancel(); }