/*++ Copyright (C) 1998-1999 Microsoft Corporation Module Name: alrtactp.cpp Abstract: Implementation of the alerts action property page. --*/ #include "stdafx.h" #include #include #include "smcfgmsg.h" #include "globals.h" #include "smlogs.h" #include "smalrtq.h" #include "alrtcmdd.h" #include "AlrtActP.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif USE_HANDLE_MACROS("SMLOGCFG(alrtactp.cpp)"); static ULONG s_aulHelpIds[] = { IDC_ACTION_APPLOG_CHK, IDH_ACTION_APPLOG_CHK, IDC_ACTION_NETMSG_CHK, IDH_ACTION_NETMSG_CHK, IDC_ACTION_NETMSG_NAME_EDIT, IDH_ACTION_NETMSG_NAME_EDIT, IDC_ACTION_EXECUTE_CHK, IDH_ACTION_EXECUTE_CHK, IDC_ACTION_EXECUTE_EDIT, IDH_ACTION_EXECUTE_EDIT, IDC_ACTION_EXECUTE_BROWSE_BTN, IDH_ACTION_EXECUTE_BROWSE_BTN, IDC_ACTION_CMD_ARGS_BTN, IDH_ACTION_CMD_ARGS_BTN, IDC_ACTION_START_LOG_CHK, IDH_ACTION_START_LOG_CHK, IDC_ACTION_START_LOG_COMBO, IDH_ACTION_START_LOG_COMBO, IDC_ACTION_CMD_ARGS_DISPLAY, IDH_ACTION_CMD_ARGS_DISPLAY, 0,0 }; ///////////////////////////////////////////////////////////////////////////// // CAlertActionProp property page IMPLEMENT_DYNCREATE(CAlertActionProp, CSmPropertyPage) CAlertActionProp::CAlertActionProp(MMC_COOKIE mmcCookie, LONG_PTR hConsole) : CSmPropertyPage(CAlertActionProp::IDD, hConsole) { //::OutputDebugStringA("\nCAlertActionProp::CAlertActionProp"); // init variables from arg list m_pAlertQuery = reinterpret_cast (mmcCookie); // init AFX data InitAfxDataItems(); // init other member variables m_pAlertInfo = NULL; } CAlertActionProp::CAlertActionProp() : CSmPropertyPage(CAlertActionProp::IDD) { ASSERT (FALSE); // the constructor w/ args should be used instead // init variables from arg list m_pAlertQuery = NULL; // init AFX data InitAfxDataItems(); // init other member variables m_pAlertInfo = NULL; } CAlertActionProp::~CAlertActionProp() { if (m_pAlertInfo != NULL) delete m_pAlertInfo; } void CAlertActionProp::InitAfxDataItems () { //{{AFX_DATA_INIT(CAlertActionProp) m_Action_bLogEvent = TRUE; m_Action_bExecCmd = FALSE; m_Action_bSendNetMsg = FALSE; m_Action_bStartLog = FALSE; m_Action_strCmdPath = _T(""); m_Action_strNetName = _T(""); m_CmdArg_bAlertName = FALSE; m_CmdArg_bDateTime = FALSE; m_CmdArg_bLimitValue = FALSE; m_CmdArg_bCounterPath = FALSE; m_CmdArg_bSingleArg = FALSE; m_CmdArg_bMeasuredValue = FALSE; m_CmdArg_bUserText = FALSE; m_CmdArg_strUserText = _T(""); m_nCurLogSel = LB_ERR; //}}AFX_DATA_INIT } void CAlertActionProp::DoDataExchange(CDataExchange* pDX) { AFX_MANAGE_STATE(AfxGetStaticModuleState( )); CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAlertActionProp) DDX_Control(pDX, IDC_ACTION_START_LOG_COMBO, m_pLogCombo); DDX_Check(pDX, IDC_ACTION_APPLOG_CHK, m_Action_bLogEvent); DDX_Check(pDX, IDC_ACTION_EXECUTE_CHK, m_Action_bExecCmd); DDX_Check(pDX, IDC_ACTION_NETMSG_CHK, m_Action_bSendNetMsg); DDX_Check(pDX, IDC_ACTION_START_LOG_CHK, m_Action_bStartLog); DDX_CBIndex(pDX, IDC_ACTION_START_LOG_COMBO, m_nCurLogSel); DDX_Text(pDX, IDC_ACTION_EXECUTE_EDIT, m_Action_strCmdPath); DDV_MaxChars(pDX, m_Action_strCmdPath, MAX_PATH ); DDX_Text(pDX, IDC_ACTION_NETMSG_NAME_EDIT, m_Action_strNetName); DDV_MaxChars(pDX, m_Action_strNetName, MAX_PATH ); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAlertActionProp, CSmPropertyPage) //{{AFX_MSG_MAP(CAlertActionProp) ON_WM_DESTROY() ON_BN_CLICKED(IDC_ACTION_EXECUTE_BROWSE_BTN, OnActionExecuteBrowseBtn) ON_BN_CLICKED(IDC_ACTION_APPLOG_CHK, OnActionApplogChk) ON_BN_CLICKED(IDC_ACTION_NETMSG_CHK, OnActionNetmsgChk) ON_BN_CLICKED(IDC_ACTION_EXECUTE_CHK, OnActionExecuteChk) ON_BN_CLICKED(IDC_ACTION_CMD_ARGS_BTN, OnActionCmdArgsBtn) ON_BN_CLICKED(IDC_ACTION_START_LOG_CHK, OnActionStartLogChk) ON_EN_CHANGE(IDC_ACTION_NETMSG_NAME_EDIT, OnNetNameTextEditChange) ON_EN_CHANGE(IDC_ACTION_EXECUTE_EDIT, OnCmdPathTextEditChange) ON_CBN_SELENDOK(IDC_ACTION_START_LOG_COMBO, OnSelendokStartLogCombo) //}}AFX_MSG_MAP END_MESSAGE_MAP() BOOL CAlertActionProp::SetControlState() { // Net Message items (GetDlgItem(IDC_ACTION_NETMSG_NAME_EDIT))->EnableWindow(m_Action_bSendNetMsg); // command line items (GetDlgItem(IDC_ACTION_EXECUTE_EDIT))->EnableWindow(m_Action_bExecCmd); (GetDlgItem(IDC_ACTION_EXECUTE_BROWSE_BTN))->EnableWindow(m_Action_bExecCmd); (GetDlgItem(IDC_ACTION_CMD_ARGS_BTN))->EnableWindow(m_Action_bExecCmd); (GetDlgItem(IDC_ACTION_CMD_ARGS_CAPTION))->EnableWindow(m_Action_bExecCmd); (GetDlgItem(IDC_ACTION_CMD_ARGS_DISPLAY))->EnableWindow(m_Action_bExecCmd); // perf data Log entries (GetDlgItem(IDC_ACTION_START_LOG_COMBO))->EnableWindow(m_Action_bStartLog); return TRUE; } BOOL CAlertActionProp::LoadLogQueries ( DWORD dwLogType ) { DWORD dwStatus = ERROR_SUCCESS; DWORD dwQueryIndex = 0; LONG lEnumStatus = ERROR_SUCCESS; WCHAR szQueryName[MAX_PATH]; DWORD dwQueryNameSize = MAX_PATH; LPTSTR szCollectionName = NULL; UINT uiCollectionNameLen = 0; FILETIME ftLastWritten; HKEY hKeyQuery; HKEY hKeyLogService; dwStatus = RegOpenKeyExW ( HKEY_LOCAL_MACHINE, // handle of open key L"System\\CurrentControlSet\\Services\\Sysmonlog\\Log Queries", // address of name of subkey to open 0L, KEY_READ, // reserved REGSAM samDesired, // security access mask &hKeyLogService); if (dwStatus != ERROR_SUCCESS) return FALSE; // Load all queries for the specified registry key. // Enumerate the log names and create a new log object // for each one found. while ((lEnumStatus = RegEnumKeyEx (hKeyLogService, dwQueryIndex, szQueryName, &dwQueryNameSize, NULL, NULL, NULL, &ftLastWritten)) == ERROR_SUCCESS) { // open the query specified dwStatus = RegOpenKeyExW ( hKeyLogService, szQueryName, 0, KEY_READ, &hKeyQuery); if ( ERROR_SUCCESS == dwStatus ) { // create a new object and add it to the query list // Determine the log type. DWORD dwType = 0; DWORD dwBufferSize = sizeof(DWORD); DWORD dwRegValue; dwType = 0; dwStatus = RegQueryValueExW ( hKeyQuery, L"Log Type", NULL, &dwType, (LPBYTE)&dwRegValue, &dwBufferSize ); if ( ( ERROR_SUCCESS == dwStatus ) && ( dwLogType == dwRegValue ) ) { // Query key is Guid if written by post Win2000 snapin. // Query key is name if written by Win2000 snapin. dwStatus = SmReadRegistryIndirectStringValue ( hKeyQuery, L"Collection Name", NULL, &szCollectionName, &uiCollectionNameLen ); ASSERT ( MAX_PATH >= uiCollectionNameLen ); if ( ERROR_SUCCESS == dwStatus && NULL != szCollectionName ) { if ( 0 < lstrlen ( szCollectionName ) && ( MAX_PATH > lstrlen ( szCollectionName ) ) ) { lstrcpy ( szQueryName, szCollectionName ); } G_FREE ( szCollectionName ); szCollectionName = NULL; } // add this to the combo box m_pLogCombo.AddString (szQueryName); } RegCloseKey (hKeyQuery); } // set up for the next item in the list dwQueryNameSize = sizeof (szQueryName) / sizeof (szQueryName[0]); dwQueryIndex++; memset (szQueryName, 0, sizeof (szQueryName)); } RegCloseKey (hKeyLogService); return TRUE; } BOOL CAlertActionProp::IsValidLocalData() { BOOL bActionSet = FALSE; INT iPrevLength = 0; BOOL bUpdateNetNameUI = FALSE; ResourceStateManager rsm; if (m_Action_bLogEvent) { bActionSet = TRUE; } // assumes UpdateData has been called // Trim text fields before validating. iPrevLength = m_Action_strCmdPath.GetLength(); m_Action_strCmdPath.TrimLeft(); m_Action_strCmdPath.TrimRight(); if ( iPrevLength != m_Action_strCmdPath.GetLength() ) { SetDlgItemText ( IDC_ACTION_EXECUTE_EDIT, m_Action_strCmdPath ); } iPrevLength = m_Action_strNetName.GetLength(); m_Action_strNetName.TrimLeft(); m_Action_strNetName.TrimRight(); if ( iPrevLength != m_Action_strNetName.GetLength() ) { bUpdateNetNameUI = TRUE; } if (m_Action_bSendNetMsg) { // make sure a net name has been entered while ( _T('\\') == m_Action_strNetName[0] ) { // NetMessageBufferSend does not understand machine names preceded by "\\" m_Action_strNetName = m_Action_strNetName.Right( m_Action_strNetName.GetLength() - 1 ); bUpdateNetNameUI = TRUE; } if (m_Action_strNetName.GetLength() == 0) { CString strMessage; strMessage.LoadString ( IDS_ACTION_ERR_NONETNAME ); MessageBox ( strMessage, m_pAlertQuery->GetLogName(), MB_OK | MB_ICONERROR); (GetDlgItem(IDC_ACTION_NETMSG_NAME_EDIT))->SetFocus(); return FALSE; } bActionSet = TRUE; } if ( bUpdateNetNameUI ) { SetDlgItemText ( IDC_ACTION_NETMSG_NAME_EDIT, m_Action_strNetName ); } if (m_Action_bExecCmd) { // make sure a command file has been entered if (m_Action_strCmdPath.GetLength() == 0) { CString strMessage; strMessage.LoadString ( IDS_ACTION_ERR_NOCMDFILE ); MessageBox ( strMessage, m_pAlertQuery->GetLogName(), MB_OK | MB_ICONERROR); (GetDlgItem(IDC_ACTION_EXECUTE_EDIT))->SetFocus(); return FALSE; } // If on local machine, make sure the command file exists. if ( m_pAlertQuery->GetLogService()->IsLocalMachine() ) { DWORD dwStatus; dwStatus = IsCommandFilePathValid ( m_Action_strCmdPath ); if ( ERROR_SUCCESS != dwStatus ) { CString strMessage; FormatSmLogCfgMessage ( strMessage, m_hModule, dwStatus ); MessageBox ( strMessage, m_pAlertQuery->GetLogName(), MB_OK | MB_ICONERROR); GetDlgItem ( IDC_ACTION_EXECUTE_EDIT )->SetFocus(); return FALSE; } } bActionSet = TRUE; } if (m_Action_bStartLog ) { // make sure a log has been selected if (m_pLogCombo.GetCurSel() == CB_ERR) { CString strMessage; strMessage.LoadString ( IDS_ACTION_ERR_NOLOGNAME ); MessageBox ( strMessage, m_pAlertQuery->GetLogName(), MB_OK | MB_ICONERROR); m_pLogCombo.SetFocus(); return FALSE; } bActionSet = TRUE; } if (!bActionSet ) { // make sure some action has been selected CString strMessage; strMessage.LoadString ( IDS_ACTION_ERR_NOACTION ); MessageBox ( strMessage, m_pAlertQuery->GetLogName(), MB_OK | MB_ICONERROR); return FALSE; } return bActionSet; } void CAlertActionProp::UpdateCmdActionBox () { UpdateData(TRUE); SetControlState(); SetModifiedPage(TRUE); } ///////////////////////////////////////////////////////////////////////////// // CAlertActionProp message handlers BOOL CAlertActionProp::OnSetActive() { BOOL bReturn = TRUE; bReturn = CSmPropertyPage::OnSetActive(); if ( bReturn ) { m_pAlertQuery->GetPropPageSharedData ( &m_SharedData ); } return bReturn; } BOOL CAlertActionProp::OnKillActive() { BOOL bContinue = TRUE; ResourceStateManager rsm; // Parent class OnKillActive calls UpdateData(TRUE) bContinue = CPropertyPage::OnKillActive(); if ( bContinue ) { bContinue = IsValidData(m_pAlertQuery, VALIDATE_FOCUS ); if ( bContinue ) { // Save property page shared data. m_pAlertQuery->SetPropPageSharedData ( &m_SharedData ); } } if ( bContinue ) { SetIsActive ( FALSE ); } return bContinue; } BOOL CAlertActionProp::OnApply() { DWORD dwFlags = 0; DWORD dwBufferSize = sizeof(ALERT_ACTION_INFO); LPTSTR szNextString; INT nCurLogSel = CB_ERR; BOOL bContinue = TRUE; ResourceStateManager rsm; // get current settings bContinue = UpdateData(TRUE); if ( bContinue ) { bContinue = IsValidData( m_pAlertQuery, VALIDATE_APPLY ); } if ( bContinue ) { bContinue = SampleTimeIsLessThanSessionTime ( m_pAlertQuery ); } // Write the data to the query. if ( bContinue ) { dwFlags |= (m_Action_bLogEvent ? ALRT_ACTION_LOG_EVENT : 0); dwFlags |= (m_Action_bExecCmd ? ALRT_ACTION_EXEC_CMD : 0); dwFlags |= (m_Action_bSendNetMsg ? ALRT_ACTION_SEND_MSG : 0); dwFlags |= (m_Action_bStartLog ? ALRT_ACTION_START_LOG : 0); if (m_Action_bSendNetMsg) { dwBufferSize += (m_Action_strNetName.GetLength() + 1) * sizeof (WCHAR); } if (m_Action_bExecCmd) { dwBufferSize += (m_Action_strCmdPath.GetLength() + 1) * sizeof (WCHAR); dwBufferSize += (m_CmdArg_strUserText .GetLength() + 1) * sizeof (WCHAR); dwFlags |= (m_CmdArg_bAlertName ? ALRT_CMD_LINE_A_NAME : 0); dwFlags |= (m_CmdArg_bDateTime ? ALRT_CMD_LINE_D_TIME : 0); dwFlags |= (m_CmdArg_bLimitValue ? ALRT_CMD_LINE_L_VAL : 0); dwFlags |= (m_CmdArg_bCounterPath ? ALRT_CMD_LINE_C_NAME : 0); dwFlags |= (m_CmdArg_bSingleArg ? ALRT_CMD_LINE_SINGLE : 0); dwFlags |= (m_CmdArg_bMeasuredValue ? ALRT_CMD_LINE_M_VAL : 0); dwFlags |= (m_CmdArg_bUserText ? ALRT_CMD_LINE_U_TEXT : 0); } if (m_Action_bStartLog) { nCurLogSel = m_pLogCombo.GetCurSel(); if (nCurLogSel != CB_ERR) { dwBufferSize += (m_pLogCombo.GetLBTextLen(nCurLogSel) + 1) * sizeof(WCHAR); } } if (m_pAlertInfo != NULL) delete (m_pAlertInfo); MFC_TRY m_pAlertInfo = (PALERT_ACTION_INFO) new CHAR[dwBufferSize]; MFC_CATCH_MINIMUM if (m_pAlertInfo != NULL) { m_pAlertInfo->dwSize = dwBufferSize; m_pAlertInfo->dwActionFlags = dwFlags; szNextString = (LPTSTR)&m_pAlertInfo[1]; if ((m_Action_bSendNetMsg) && (m_Action_strNetName.GetLength() > 0)) { m_pAlertInfo->szNetName = szNextString; lstrcpyW(m_pAlertInfo->szNetName, (LPCWSTR)m_Action_strNetName); szNextString += m_Action_strNetName.GetLength() + 1; } else { m_pAlertInfo->szNetName = NULL; } if (m_Action_bExecCmd) { if (m_Action_strCmdPath.GetLength() > 0) { m_pAlertInfo->szCmdFilePath = szNextString; lstrcpyW (m_pAlertInfo->szCmdFilePath, (LPCWSTR)m_Action_strCmdPath); szNextString += m_Action_strCmdPath.GetLength() + 1; } else { m_pAlertInfo->szCmdFilePath = NULL; } if (m_CmdArg_strUserText.GetLength() > 0) { m_pAlertInfo->szUserText = szNextString; lstrcpyW (m_pAlertInfo->szUserText, (LPCWSTR)m_CmdArg_strUserText); szNextString += m_CmdArg_strUserText.GetLength() + 1; } else { m_pAlertInfo->szUserText = NULL; } } else { m_pAlertInfo->szCmdFilePath = NULL; m_pAlertInfo->szUserText = NULL; } if ((m_Action_bStartLog) && (nCurLogSel != CB_ERR)) { // get log name m_pAlertInfo->szLogName = szNextString; // for now m_pLogCombo.GetLBText(nCurLogSel, szNextString); } else { m_pAlertInfo->szLogName = NULL; } } if ( bContinue ) { bContinue = Apply(m_pAlertQuery); } bContinue = CPropertyPage::OnApply(); if ( bContinue ) { bContinue = ( ERROR_SUCCESS == m_pAlertQuery->SetActionInfo ( m_pAlertInfo ) ); } if ( bContinue ) { // Save property page shared data. m_pAlertQuery->UpdatePropPageSharedData(); bContinue = UpdateService( m_pAlertQuery, FALSE ); } } return bContinue; } void CAlertActionProp::OnCancel() { CPropertyPage::OnCancel(); } void CAlertActionProp::OnActionCmdArgsBtn() { DWORD dwStatus = ERROR_SUCCESS; CAlertCommandArgsDlg dlgCmdArgs; INT_PTR iResult; dlgCmdArgs.SetAlertActionPage( this ); dwStatus = m_pAlertQuery->GetLogName ( dlgCmdArgs.m_strAlertName ); if ( ERROR_SUCCESS == dwStatus ) { MFC_TRY dlgCmdArgs.m_CmdArg_bAlertName = m_CmdArg_bAlertName; dlgCmdArgs.m_CmdArg_bDateTime = m_CmdArg_bDateTime; dlgCmdArgs.m_CmdArg_bLimitValue = m_CmdArg_bLimitValue; dlgCmdArgs.m_CmdArg_bCounterPath = m_CmdArg_bCounterPath; dlgCmdArgs.m_CmdArg_bSingleArg = m_CmdArg_bSingleArg; dlgCmdArgs.m_CmdArg_bMeasuredValue = m_CmdArg_bMeasuredValue; dlgCmdArgs.m_CmdArg_bUserText = m_CmdArg_bUserText; dlgCmdArgs.m_CmdArg_strUserText = m_CmdArg_strUserText; iResult = dlgCmdArgs.DoModal(); if ( IDOK == iResult ) { if (dlgCmdArgs.m_CmdArg_bAlertName != m_CmdArg_bAlertName ) { m_CmdArg_bAlertName = dlgCmdArgs.m_CmdArg_bAlertName; SetModifiedPage ( TRUE ); } if (dlgCmdArgs.m_CmdArg_bDateTime != m_CmdArg_bDateTime ) { m_CmdArg_bDateTime = dlgCmdArgs.m_CmdArg_bDateTime; SetModifiedPage ( TRUE ); } if (dlgCmdArgs.m_CmdArg_bLimitValue != m_CmdArg_bLimitValue ) { m_CmdArg_bLimitValue = dlgCmdArgs.m_CmdArg_bLimitValue; SetModifiedPage ( TRUE ); } if (dlgCmdArgs.m_CmdArg_bCounterPath != m_CmdArg_bCounterPath ) { m_CmdArg_bCounterPath = dlgCmdArgs.m_CmdArg_bCounterPath; SetModifiedPage ( TRUE ); } if (dlgCmdArgs.m_CmdArg_bSingleArg != m_CmdArg_bSingleArg ) { m_CmdArg_bSingleArg = dlgCmdArgs.m_CmdArg_bSingleArg; SetModifiedPage ( TRUE ); } if (dlgCmdArgs.m_CmdArg_bMeasuredValue != m_CmdArg_bMeasuredValue ) { m_CmdArg_bMeasuredValue = dlgCmdArgs.m_CmdArg_bMeasuredValue; SetModifiedPage ( TRUE ); } if (dlgCmdArgs.m_CmdArg_bUserText != m_CmdArg_bUserText ) { m_CmdArg_bUserText = dlgCmdArgs.m_CmdArg_bUserText; SetModifiedPage ( TRUE ); } if ( 0 != dlgCmdArgs.m_CmdArg_strUserText.CompareNoCase( m_CmdArg_strUserText ) ) { m_CmdArg_strUserText = dlgCmdArgs.m_CmdArg_strUserText; SetModifiedPage ( TRUE ); } m_strCmdArgsExample = dlgCmdArgs.m_strSampleArgList; SetDlgItemText (IDC_ACTION_CMD_ARGS_DISPLAY, m_strCmdArgsExample); // Clear the selection ((CEdit*)GetDlgItem( IDC_ACTION_CMD_ARGS_DISPLAY ))->SetSel ( -1, FALSE ); } MFC_CATCH_DWSTATUS } if ( ERROR_SUCCESS != dwStatus ) { CString strSysMessage; CString strMessage; MFC_TRY // TODO: Use static string for message in order to display in low memory situations. strMessage.LoadString ( IDS_ERRMSG_GENERAL ); FormatSystemMessage ( dwStatus, strSysMessage ); strMessage += strSysMessage; MessageBox ( strMessage, m_pAlertQuery->GetLogName(), MB_OK | MB_ICONERROR); MFC_CATCH_MINIMUM (GetDlgItem(IDC_ACTION_CMD_ARGS_BTN))->SetFocus(); } return; } void CAlertActionProp::OnSelendokStartLogCombo() { INT nSel; nSel = m_pLogCombo.GetCurSel(); if ( nSel != m_nCurLogSel && LB_ERR != nSel ) { UpdateData ( TRUE ); SetModifiedPage ( TRUE ); } } void CAlertActionProp::OnActionExecuteBrowseBtn() { CString strCmdPath; UpdateData (TRUE); // to get the current filename strCmdPath = m_Action_strCmdPath; if ( IDOK == BrowseCommandFilename ( this, strCmdPath )) { // Update the fields with the new information if ( strCmdPath != m_Action_strCmdPath ) { m_Action_strCmdPath = strCmdPath; SetModifiedPage(); UpdateData(FALSE); } } // else ignore if they canceled out } BOOL CAlertActionProp::OnInitDialog() { INT nSelLog; DWORD dwInfoBufSize = 0; ResourceStateManager rsm; // Parent OnInitDialog calls UpdateData to initialize combo members. CSmPropertyPage::OnInitDialog(); SetHelpIds ( (DWORD*)&s_aulHelpIds ); // load service name combo box LoadLogQueries (SLQ_COUNTER_LOG); LoadLogQueries (SLQ_TRACE_LOG); if (m_pAlertInfo == NULL) { // get alert query info from alert class // get initial size by passing asking to fill a 0 len buffer m_pAlertQuery->GetActionInfo (m_pAlertInfo, &dwInfoBufSize); ASSERT (dwInfoBufSize > 0); // or something is wierd MFC_TRY; m_pAlertInfo = (PALERT_ACTION_INFO) new UCHAR [dwInfoBufSize]; MFC_CATCH_MINIMUM; ASSERT (m_pAlertInfo != NULL); if ( NULL != m_pAlertInfo ) { memset (m_pAlertInfo, 0, dwInfoBufSize); // init new buffer if (!m_pAlertQuery->GetActionInfo (m_pAlertInfo, &dwInfoBufSize)) { // then free the info block and use the defaults delete m_pAlertInfo; m_pAlertInfo = NULL; } } } if (m_pAlertInfo != NULL) { // then initialize using the settings passed in m_Action_bLogEvent = ((m_pAlertInfo->dwActionFlags & ALRT_ACTION_LOG_EVENT) != 0); m_Action_bSendNetMsg = ((m_pAlertInfo->dwActionFlags & ALRT_ACTION_SEND_MSG) != 0); if (m_pAlertInfo->szNetName != NULL) { m_Action_strNetName = m_pAlertInfo->szNetName; } else { m_Action_strNetName.Empty(); } m_Action_bExecCmd = ((m_pAlertInfo->dwActionFlags & ALRT_ACTION_EXEC_CMD) != 0); if (m_pAlertInfo->szCmdFilePath != NULL) { m_Action_strCmdPath = m_pAlertInfo->szCmdFilePath; } else { m_Action_strCmdPath.Empty(); } if ( m_Action_bExecCmd ) { m_CmdArg_bAlertName = ((m_pAlertInfo->dwActionFlags & ALRT_CMD_LINE_A_NAME) != 0); m_CmdArg_bDateTime = ((m_pAlertInfo->dwActionFlags & ALRT_CMD_LINE_D_TIME) != 0); m_CmdArg_bLimitValue = ((m_pAlertInfo->dwActionFlags & ALRT_CMD_LINE_L_VAL) != 0); m_CmdArg_bCounterPath = ((m_pAlertInfo->dwActionFlags & ALRT_CMD_LINE_C_NAME) != 0); m_CmdArg_bSingleArg = ((m_pAlertInfo->dwActionFlags & ALRT_CMD_LINE_SINGLE) != 0); m_CmdArg_bMeasuredValue = ((m_pAlertInfo->dwActionFlags & ALRT_CMD_LINE_M_VAL) != 0); m_CmdArg_bUserText = ((m_pAlertInfo->dwActionFlags & ALRT_CMD_LINE_U_TEXT) != 0); } else { m_CmdArg_bAlertName = TRUE; m_CmdArg_bDateTime = TRUE; m_CmdArg_bLimitValue = TRUE; m_CmdArg_bCounterPath = TRUE; m_CmdArg_bSingleArg = TRUE; m_CmdArg_bMeasuredValue = TRUE; m_CmdArg_bUserText = FALSE; } if (m_pAlertInfo->szUserText != NULL) { m_CmdArg_strUserText = m_pAlertInfo->szUserText; } m_Action_bStartLog = ((m_pAlertInfo->dwActionFlags & ALRT_ACTION_START_LOG) != 0); if (m_pAlertInfo->szLogName != NULL) { nSelLog = m_pLogCombo.FindString (-1, m_pAlertInfo->szLogName); if (nSelLog != CB_ERR) { m_pLogCombo.SetCurSel (nSelLog); m_nCurLogSel = nSelLog; } } } else { // initialize using the default values as defined // in the constructor } MakeSampleArgList ( m_strCmdArgsExample, m_CmdArg_bSingleArg, m_CmdArg_bAlertName, m_CmdArg_bDateTime, m_CmdArg_bCounterPath, m_CmdArg_bMeasuredValue, m_CmdArg_bLimitValue, m_CmdArg_bUserText, m_CmdArg_strUserText ); SetDlgItemText (IDC_ACTION_CMD_ARGS_DISPLAY, m_strCmdArgsExample); // Clear the selection ((CEdit*)GetDlgItem( IDC_ACTION_CMD_ARGS_DISPLAY ))->SetSel ( -1, FALSE ); // Call UpdateData again, after loading data. UpdateData ( FALSE ); SetControlState(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CAlertActionProp::OnActionApplogChk() { UpdateData(TRUE); SetControlState(); SetModifiedPage(TRUE); } void CAlertActionProp::OnActionNetmsgChk() { UpdateData(TRUE); SetControlState(); SetModifiedPage(TRUE); } void CAlertActionProp::OnActionExecuteChk() { UpdateData(TRUE); SetControlState(); SetModifiedPage(TRUE); } void CAlertActionProp::OnActionStartLogChk() { UpdateCmdActionBox (); } void CAlertActionProp::OnCmdPathTextEditChange() { CString strOldText; // When the user hits OK in the folder browse dialog, // the folder name might not have changed. strOldText = m_Action_strCmdPath; UpdateData( TRUE ); if ( 0 != strOldText.Compare ( m_Action_strCmdPath ) ) { SetModifiedPage(TRUE); } } void CAlertActionProp::OnNetNameTextEditChange() { CString strOldText; // When the user hits OK in the folder browse dialog, // the folder name might not have changed. strOldText = m_Action_strNetName; UpdateData( TRUE ); if ( 0 != strOldText.Compare ( m_Action_strNetName ) ) { SetModifiedPage(TRUE); } } DWORD CAlertActionProp::MakeSampleArgList ( CString& rstrResult, const BOOL bSingleArg, const BOOL bAlertName, const BOOL bDateTime, const BOOL bCounterPath, const BOOL bMeasuredValue, const BOOL bLimitValue, const BOOL bUserText, const CString& rstrUserText ) { DWORD dwStatus = ERROR_SUCCESS; CString strDelim1; CString strDelim2; BOOL bFirstArgDone = FALSE; CString strSampleString; CString strTimeString; CString strTemp; ResourceStateManager rsm; rstrResult.Empty(); // clear the old path MFC_TRY if ( bSingleArg ) { // then args are comma delimited strDelim1 = L","; strDelim2.Empty(); } else { // for multiple args, they are enclosed in double quotes // and space delimited strDelim1 = L" \""; strDelim2 = L"\""; } if ( bAlertName ) { if (bFirstArgDone) { strSampleString += strDelim1; // add leading delimiter } else { strSampleString += L"\""; // add leading quote bFirstArgDone = TRUE; } strSampleString += m_pAlertQuery->GetLogName(); strSampleString += strDelim2; } if ( bDateTime ) { if (bFirstArgDone) { strSampleString += strDelim1; // add leading delimiter } else { strSampleString += L"\""; // add leading quote bFirstArgDone = TRUE; } MakeTimeString(&strTimeString); strSampleString += strTimeString; strSampleString += strDelim2; } if ( bCounterPath ) { strTemp.LoadString ( IDS_SAMPLE_CMD_PATH ); if (bFirstArgDone) { strSampleString += strDelim1; // add leading delimiter } else { strSampleString += L"\""; // add leading quote bFirstArgDone = TRUE; } strSampleString += strTemp; strSampleString += strDelim2; } if ( bMeasuredValue ) { strTemp.LoadString ( IDS_SAMPLE_CMD_MEAS_VAL ); if (bFirstArgDone) { strSampleString += strDelim1; // add leading delimiter } else { strSampleString += L"\""; // add leading quote bFirstArgDone = TRUE; } strSampleString += strTemp; strSampleString += strDelim2; } if ( bLimitValue ) { strTemp.LoadString ( IDS_SAMPLE_CMD_LIMIT_VAL ); if (bFirstArgDone) { strSampleString += strDelim1; // add leading delimiter } else { strSampleString += L"\""; // add leading quote bFirstArgDone = TRUE; } strSampleString += strTemp; strSampleString += strDelim2; } if ( bUserText ) { if (bFirstArgDone) { strSampleString += strDelim1; // add leading delimiter } else { strSampleString += L"\""; // add leading quote bFirstArgDone = TRUE; } strSampleString += rstrUserText; strSampleString += strDelim2; } if ( bFirstArgDone && bSingleArg ) { // add closing quote if there's at least 1 arg in the command line strSampleString += L"\""; } rstrResult = strSampleString; MFC_CATCH_DWSTATUS return dwStatus; } void CAlertActionProp::MakeTimeString(CString *pTimeString) { SYSTEMTIME st; pTimeString->Empty(); GetLocalTime(&st); // Build string pTimeString->Format (L"%2.2d/%2.2d/%2.2d-%2.2d:%2.2d:%2.2d.%3.3d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); }