461 lines
13 KiB
C++
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()
|
|
|
|
|