// 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()