windows-nt/Source/XPSP1/NT/admin/snapin/smonlog/smlogcfg/alrtactp.cpp

965 lines
31 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (C) 1998-1999 Microsoft Corporation
Module Name:
alrtactp.cpp
Abstract:
Implementation of the alerts action property page.
--*/
#include "stdafx.h"
#include <assert.h>
#include <common.h>
#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 <CSmAlertQuery *>(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);
}