Windows-Server-2003/admin/snapin/filemgmt/svcprop3.cpp

461 lines
13 KiB
C++

// svcprop3.cpp : implementation file
//
#include "stdafx.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
const UINT rgidComboFailureAction[cActionsMax] =
{
IDC_COMBO_FIRST_ATTEMPT,
IDC_COMBO_SECOND_ATTEMPT,
IDC_COMBO_SUBSEQUENT_ATTEMPTS,
};
const TStringParamEntry rgzspeRecoveryAction[] =
{
{ IDS_SVC_RECOVERY_NOACTION, SC_ACTION_NONE },
{ IDS_SVC_RECOVERY_RESTARTSERVICE, SC_ACTION_RESTART },
{ IDS_SVC_RECOVERY_RUNFILE, SC_ACTION_RUN_COMMAND },
{ IDS_SVC_RECOVERY_REBOOTCOMPUTER, SC_ACTION_REBOOT },
{ 0, 0 }
};
// Group of control Ids to restart service
const UINT rgzidRestartService[] =
{
// IDC_GROUP_RESTARTSERVICE,
IDC_STATIC_RESTARTSERVICE,
IDC_STATIC_RESTARTSERVICE_3,
IDC_EDIT_SERVICE_RESTART_DELAY,
0
};
const UINT rgzidRunFile[] =
{
IDC_STATIC_RUNFILE_1,
IDC_STATIC_RUNFILE_2,
IDC_STATIC_RUNFILE_3,
IDC_EDIT_RUNFILE_FILENAME,
IDC_BUTTON_BROWSE,
IDC_EDIT_RUNFILE_PARAMETERS,
IDC_CHECK_APPEND_ABENDNO,
0
};
const UINT rgzidRebootComputer[] =
{
IDC_BUTTON_REBOOT_COMPUTER,
0
};
/////////////////////////////////////////////////////////////////////////////
// CServicePageRecovery property page
IMPLEMENT_DYNCREATE(CServicePageRecovery, CPropertyPage)
CServicePageRecovery::CServicePageRecovery() : CPropertyPage(CServicePageRecovery::IDD)
, m_pData( NULL ) // 581167-2002/03/07-JonN initialize m_pData
{
//{{AFX_DATA_INIT(CServicePageRecovery)
m_strRunFileCommand = _T("");
m_strRunFileParam = _T("");
m_fAppendAbendCount = FALSE;
//}}AFX_DATA_INIT
}
CServicePageRecovery::~CServicePageRecovery()
{
}
void CServicePageRecovery::DoDataExchange(CDataExchange* pDX)
{
// ISSUE-2002/03/07-JonN should handle these better
Assert(m_pData != NULL);
Assert(m_pData->m_SFA.cActions >= cActionsMax);
Assert(m_pData->m_SFA.lpsaActions != NULL);
if (m_pData->m_SFA.lpsaActions == NULL) // Temporary checking for safety
return;
if (!pDX->m_bSaveAndValidate)
{
//
// Initialize data from m_pData into UI
//
for (INT i = 0; i < cActionsMax; i++)
{
// Fill each combobox with the list of failure/actions
// and select the right failure/action
HWND hwndCombo = HGetDlgItem(m_hWnd, rgidComboFailureAction[i]);
ComboBox_FlushContent(hwndCombo);
(void)ComboBox_FFill(
hwndCombo,
IN rgzspeRecoveryAction,
m_pData->m_SFA.lpsaActions[i].Type);
} // for
Service_SplitCommandLine(
IN m_pData->m_strRunFileCommand,
OUT &m_strRunFileCommand,
OUT &m_strRunFileParam,
OUT &m_fAppendAbendCount);
} // if
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CServicePageRecovery)
DDX_Text(pDX, IDC_EDIT_RUNFILE_FILENAME, m_strRunFileCommand);
DDX_Text(pDX, IDC_EDIT_RUNFILE_PARAMETERS, m_strRunFileParam);
DDX_Check(pDX, IDC_CHECK_APPEND_ABENDNO, m_fAppendAbendCount);
//}}AFX_DATA_MAP
(void) SendDlgItemMessage(IDC_EDIT_SERVICE_RESET_ABEND_COUNT, EM_LIMITTEXT, 4);
(void) SendDlgItemMessage(IDC_EDIT_SERVICE_RESTART_DELAY, EM_LIMITTEXT, 4);
DDX_Text(pDX, IDC_EDIT_SERVICE_RESET_ABEND_COUNT, m_pData->m_daysDisplayAbendCount);
DDX_Text(pDX, IDC_EDIT_SERVICE_RESTART_DELAY, m_pData->m_minDisplayRestartService);
if (pDX->m_bSaveAndValidate)
{
TrimString(m_strRunFileCommand);
TrimString(m_strRunFileParam);
Service_UnSplitCommandLine(
OUT &m_pData->m_strRunFileCommand,
IN m_strRunFileCommand,
IN m_strRunFileParam);
if (m_fAppendAbendCount)
m_pData->m_strRunFileCommand += szAbend;
} // if
} // CServicePageRecovery::DoDataExchange()
BEGIN_MESSAGE_MAP(CServicePageRecovery, CPropertyPage)
//{{AFX_MSG_MAP(CServicePageRecovery)
ON_CBN_SELCHANGE(IDC_COMBO_FIRST_ATTEMPT, OnSelchangeComboFirstAttempt)
ON_CBN_SELCHANGE(IDC_COMBO_SECOND_ATTEMPT, OnSelchangeComboSecondAttempt)
ON_CBN_SELCHANGE(IDC_COMBO_SUBSEQUENT_ATTEMPTS, OnSelchangeComboSubsequentAttempts)
ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse)
ON_BN_CLICKED(IDC_BUTTON_REBOOT_COMPUTER, OnButtonRebootComputer)
ON_BN_CLICKED(IDC_CHECK_APPEND_ABENDNO, OnCheckAppendAbendno)
ON_EN_CHANGE(IDC_EDIT_RUNFILE_FILENAME, OnChangeEditRunfileFilename)
ON_EN_CHANGE(IDC_EDIT_RUNFILE_PARAMETERS, OnChangeEditRunfileParameters)
ON_EN_CHANGE(IDC_EDIT_SERVICE_RESET_ABEND_COUNT, OnChangeEditServiceResetAbendCount)
ON_EN_CHANGE(IDC_EDIT_SERVICE_RESTART_DELAY, OnChangeEditServiceRestartDelay)
ON_MESSAGE(WM_HELP, OnHelp)
ON_MESSAGE(WM_CONTEXTMENU, OnContextHelp)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CServicePageRecovery message handlers
BOOL CServicePageRecovery::OnInitDialog()
{
CPropertyPage::OnInitDialog();
UpdateUI();
return TRUE;
} // CServicePageRecovery::OnInitDialog()
void CServicePageRecovery::UpdateUI()
{
// ISSUE-2002/03/07-JonN should handle these better
Assert(m_pData->m_SFA.cActions >= cActionsMax);
Assert(m_pData->m_SFA.lpsaActions != NULL);
// Get the failure/action code of each combobox
for (INT i = 0; i < cActionsMax; i++)
{
m_pData->m_SFA.lpsaActions[i].Type = (SC_ACTION_TYPE)ComboBox_GetSelectedItemData(
HGetDlgItem(m_hWnd, rgidComboFailureAction[i]));
Assert((int)m_pData->m_SFA.lpsaActions[i].Type != CB_ERR);
} // for
// The idea here is to enable/disable controls
// depending on the chosen failure/action from
// the comboboxes.
BOOL fFound = FALSE;
(void)m_pData->GetDelayForActionType(SC_ACTION_RESTART, OUT &fFound);
EnableDlgItemGroup(m_hWnd, rgzidRestartService, fFound);
(void)m_pData->GetDelayForActionType(SC_ACTION_RUN_COMMAND, OUT &fFound);
EnableDlgItemGroup(m_hWnd, rgzidRunFile, fFound);
(void)m_pData->GetDelayForActionType(SC_ACTION_REBOOT, OUT &fFound);
EnableDlgItemGroup(m_hWnd, rgzidRebootComputer, fFound);
//
// JonN 9/4/01 463674
// Services targeted to another computer: Service_ Properties->Recovery->Browse: Path...
//
if (!m_pData->m_strMachineName.IsEmpty())
{
GetDlgItem(IDC_BUTTON_BROWSE)->EnableWindow(FALSE);
}
}
// ISSUE-2002/03/18-JonN We probably only need one MarkDirtyActionType method
void CServicePageRecovery::OnSelchangeComboFirstAttempt()
{
UpdateUI();
SetModified();
m_pData->SetDirty(CServicePropertyData::mskfDirtyActionType);
}
void CServicePageRecovery::OnSelchangeComboSecondAttempt()
{
UpdateUI();
SetModified();
m_pData->SetDirty(CServicePropertyData::mskfDirtyActionType);
}
void CServicePageRecovery::OnSelchangeComboSubsequentAttempts()
{
UpdateUI();
SetModified();
m_pData->SetDirty(CServicePropertyData::mskfDirtyActionType);
}
void CServicePageRecovery::OnButtonBrowse()
{
TCHAR szFileName[MAX_PATH];
szFileName[0] = 0;
if (UiGetFileName(m_hWnd,
OUT szFileName,
LENGTH(szFileName)))
{
SetDlgItemText(IDC_EDIT_RUNFILE_FILENAME, szFileName);
SetModified();
}
}
void CServicePageRecovery::OnButtonRebootComputer()
{
Assert(m_pData != NULL);
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CServiceDlgRebootComputer dlg(this);
dlg.m_pData = m_pData;
CThemeContextActivator activator;
if (dlg.DoModal() == IDOK)
{
// The user has modified some data
SetModified();
}
}
// ISSUE-2002/03/18-JonN We probably only need one MarkDirtySFA method
/////////////////////////////////////////////////////////////////////
// "Reset 'Fail Count' after %d days"
void CServicePageRecovery::OnChangeEditServiceResetAbendCount()
{
SetModified();
m_pData->SetDirty(CServicePropertyData::mskfDirtySFA);
}
/////////////////////////////////////////////////////////////////////
// "Restart service in %d minutes"
void CServicePageRecovery::OnChangeEditServiceRestartDelay()
{
SetModified();
m_pData->SetDirty(CServicePropertyData::mskfDirtySFA);
}
// ISSUE-2002/03/18-JonN We probably only need one MarkDirtyRunFile method
/////////////////////////////////////////////////////////////////////
// "Run %s file"
void CServicePageRecovery::OnChangeEditRunfileFilename()
{
SetModified();
m_pData->SetDirty(CServicePropertyData::mskfDirtyRunFile);
}
void CServicePageRecovery::OnChangeEditRunfileParameters()
{
SetModified();
m_pData->SetDirty(CServicePropertyData::mskfDirtyRunFile);
}
void CServicePageRecovery::OnCheckAppendAbendno()
{
SetModified();
m_pData->SetDirty(CServicePropertyData::mskfDirtyRunFile);
}
/////////////////////////////////////////////////////////////////////
// Help
BOOL CServicePageRecovery::OnHelp(WPARAM /*wParam*/, LPARAM lParam)
{
return DoHelp(lParam, HELP_DIALOG_TOPIC(IDD_PROPPAGE_SERVICE_RECOVERY));
}
BOOL CServicePageRecovery::OnContextHelp(WPARAM wParam, LPARAM /*lParam*/)
{
return DoContextHelp(wParam, HELP_DIALOG_TOPIC(IDD_PROPPAGE_SERVICE_RECOVERY));
}
/////////////////////////////////////////////////////////////////////////////
// CServicePageRecovery2 property page
// JonN 4/20/01 348163
IMPLEMENT_DYNCREATE(CServicePageRecovery2, CPropertyPage)
CServicePageRecovery2::CServicePageRecovery2() : CPropertyPage(CServicePageRecovery2::IDD)
, m_pData( NULL ) // 581167-2002/03/07-JonN should initialize m_pData
{
//{{AFX_DATA_INIT(CServicePageRecovery2)
//}}AFX_DATA_INIT
}
CServicePageRecovery2::~CServicePageRecovery2()
{
}
BEGIN_MESSAGE_MAP(CServicePageRecovery2, CPropertyPage)
//{{AFX_MSG_MAP(CServicePageRecovery2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CServiceDlgRebootComputer dialog
CServiceDlgRebootComputer::CServiceDlgRebootComputer(CWnd* pParent /*=NULL*/)
: CDialog(CServiceDlgRebootComputer::IDD, pParent)
, m_pData( NULL ) // 581167-2002/03/07-JonN should initialize m_pData
{
//{{AFX_DATA_INIT(CServiceDlgRebootComputer)
m_uDelayRebootComputer = 0;
m_fRebootMessage = FALSE;
//}}AFX_DATA_INIT
}
void CServiceDlgRebootComputer::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CServiceDlgRebootComputer)
DDX_Text(pDX, IDC_EDIT_REBOOT_COMPUTER_DELAY, m_uDelayRebootComputer);
DDV_MinMaxUInt(pDX, m_uDelayRebootComputer, 0, 100000);
DDX_Check(pDX, IDC_REBOOT_MESSAGE_CHECKBOX, m_fRebootMessage);
DDX_Text(pDX, IDC_EDIT_REBOOT_MESSAGE, m_strRebootMessage);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CServiceDlgRebootComputer, CDialog)
//{{AFX_MSG_MAP(CServiceDlgRebootComputer)
ON_BN_CLICKED(IDC_REBOOT_MESSAGE_CHECKBOX, OnCheckboxClicked)
ON_EN_CHANGE(IDC_EDIT_REBOOT_MESSAGE, OnChangeEditRebootMessage)
ON_MESSAGE(WM_HELP, OnHelp)
ON_MESSAGE(WM_CONTEXTMENU, OnContextHelp)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CServiceDlgRebootComputer::OnInitDialog()
{
// ISSUE-2002/03/18-JonN handle null m_pData
Assert(m_pData != NULL);
m_uDelayRebootComputer = m_pData->m_minDisplayRebootComputer;
m_strRebootMessage = m_pData->m_strRebootMessage;
TrimString(m_strRebootMessage);
m_fRebootMessage = !m_strRebootMessage.IsEmpty();
CDialog::OnInitDialog();
if (m_strRebootMessage.IsEmpty())
{
// Load a default message
if (NULL != m_pData)
{
TCHAR szName[MAX_COMPUTERNAME_LENGTH + 1];
LPCTSTR pszTargetMachine = L"";
if ( !m_pData->m_strMachineName.IsEmpty() )
{
pszTargetMachine = m_pData->m_strMachineName;
}
else
{
// JonN 11/21/00 PREFIX 226771
DWORD dwSize = sizeof(szName)/sizeof(TCHAR);
::ZeroMemory( szName, sizeof(szName) );
VERIFY( ::GetComputerName(szName, &dwSize) );
pszTargetMachine = szName;
}
m_strRebootMessage.FormatMessage(
IDS_SVC_REBOOT_MESSAGE_DEFAULT,
m_pData->m_strServiceDisplayName,
pszTargetMachine );
}
else
{
ASSERT(FALSE);
}
}
return TRUE;
}
void CServiceDlgRebootComputer::OnCheckboxClicked()
{
if ( IsDlgButtonChecked(IDC_REBOOT_MESSAGE_CHECKBOX) )
{
SetDlgItemText(IDC_EDIT_REBOOT_MESSAGE, m_strRebootMessage);
}
else
{
CString strTemp;
GetDlgItemText(IDC_EDIT_REBOOT_MESSAGE, OUT strTemp);
if (!strTemp.IsEmpty())
m_strRebootMessage = strTemp;
SetDlgItemText(IDC_EDIT_REBOOT_MESSAGE, _T(""));
}
}
void CServiceDlgRebootComputer::OnChangeEditRebootMessage()
{
LRESULT cch = SendDlgItemMessage(IDC_EDIT_REBOOT_MESSAGE, WM_GETTEXTLENGTH);
if ( (cch==0) != !IsDlgButtonChecked(IDC_REBOOT_MESSAGE_CHECKBOX) )
CheckDlgButton(IDC_REBOOT_MESSAGE_CHECKBOX, (cch!=0));
}
BOOL CServiceDlgRebootComputer::OnHelp(WPARAM /*wParam*/, LPARAM lParam)
{
return DoHelp(lParam, HELP_DIALOG_TOPIC(IDD_SERVICE_REBOOT_COMPUTER));
}
BOOL CServiceDlgRebootComputer::OnContextHelp(WPARAM wParam, LPARAM /*lParam*/)
{
return DoContextHelp(wParam, HELP_DIALOG_TOPIC(IDD_SERVICE_REBOOT_COMPUTER));
}
void CServiceDlgRebootComputer::OnOK()
{
if (!UpdateData())
{
return;
}
Assert(m_pData != NULL);
if (m_uDelayRebootComputer != m_pData->m_minDisplayRebootComputer)
{
m_pData->m_minDisplayRebootComputer = m_uDelayRebootComputer;
m_pData->SetDirty(CServicePropertyData::mskfDirtyRebootMessage);
}
if (!m_fRebootMessage)
{
// No reboot message
m_strRebootMessage.Empty();
}
else
{
TrimString(m_strRebootMessage);
}
if (m_strRebootMessage != m_pData->m_strRebootMessage)
{
m_pData->m_strRebootMessage = m_strRebootMessage;
m_pData->SetDirty(CServicePropertyData::mskfDirtyRebootMessage);
}
EndDialog(IDOK);
} // CServiceDlgRebootComputer::OnOK()