1633 lines
48 KiB
C++
1633 lines
48 KiB
C++
/*++
|
|
|
|
Copyright (c) 1994-2000 Microsoft Corporation
|
|
|
|
Module Name :
|
|
app_pool_sheet.cpp
|
|
|
|
Abstract:
|
|
Application Pools Property Sheet and Pages
|
|
|
|
Author:
|
|
Sergei Antonov (sergeia)
|
|
|
|
Project:
|
|
Internet Services Manager
|
|
|
|
Revision History:
|
|
11/16/2000 sergeia Initial creation
|
|
|
|
--*/
|
|
|
|
//
|
|
// Include Files
|
|
//
|
|
#include "stdafx.h"
|
|
#include "common.h"
|
|
#include "inetprop.h"
|
|
#include "InetMgrApp.h"
|
|
#include "shts.h"
|
|
#include "iisobj.h"
|
|
#include "app_pool_sheet.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
#define new DEBUG_NEW
|
|
|
|
#define TIMESPAN_MIN (int)1
|
|
#define TIMESPAN_MAX (int)(4000000)
|
|
#define REQUESTS_MIN (int)1
|
|
#define REQUESTS_MAX (int)(4000000)
|
|
#define MEMORY_MIN (int)1
|
|
#define MEMORY_MAX (int)(4000000)
|
|
#define TIMEOUT_MIN (int)1
|
|
#define TIMEOUT_MAX (int)(4000000)
|
|
#define QUEUESIZE_MIN (int)0
|
|
#define QUEUESIZE_MAX (int)(4000000)
|
|
#define REFRESH_TIME_MIN (int)1
|
|
#define REFRESH_TIME_MAX (int)(4000000)
|
|
#define MAXPROCESSES_MIN (int)1
|
|
#define MAXPROCESSES_MAX (int)(4000000)
|
|
#define PING_INTERVAL_MIN (int)1
|
|
#define PING_INTERVAL_MAX (int)(4000000)
|
|
#define CRASHES_COUNT_MIN (int)1
|
|
#define CRASHES_COUNT_MAX (int)(4000000)
|
|
#define CHECK_INTERVAL_MIN (int)1
|
|
#define CHECK_INTERVAL_MAX (int)(4000000)
|
|
#define STARTUP_LIMIT_MIN (int)1
|
|
#define STARTUP_LIMIT_MAX (int)(4000000)
|
|
#define SHUTDOWN_LIMIT_MIN (int)1
|
|
#define SHUTDOWN_LIMIT_MAX (int)(4000000)
|
|
#define CPU_LIMIT_MIN (int)0
|
|
#define CPU_LIMIT_MAX (int)100
|
|
#define CPU_RESET_TIME_MIN (int)0
|
|
#define CPU_RESET_TIME_MAX (int)60
|
|
|
|
#define IDENT_TYPE_LOCALSYSTEM 0
|
|
#define IDENT_TYPE_LOCALSERVICE 1
|
|
#define IDENT_TYPE_NETWORKSERVICE 2
|
|
#define IDENT_TYPE_CONFIGURABLE 3
|
|
|
|
#define PERIODIC_RESTART_TIME_DEF 60
|
|
#define PERIODIC_RESTART_REQ_DEF 10000
|
|
#define MEMORY_DEF 1 // In MB
|
|
#define IDLE_TIMEOUT_DEF 10
|
|
#define QUEUE_SIZE_DEF 3000
|
|
#define CPU_USE_DEF 10000
|
|
#define CPU_RESET_TIME_DEF 5
|
|
#define ACTION_INDEX_DEF IDENT_TYPE_NETWORKSERVICE
|
|
#define MAX_PROCESSES_DEF 1
|
|
#define PING_INTERVAL_DEF 120
|
|
#define CRASHES_COUNT_DEF 5
|
|
#define CHECK_INTERVAL_DEF 10
|
|
#define STARTUP_LIMIT_DEF 30
|
|
#define SHUTDOWN_LIMIT_DEF 60
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAppPoolProps implementation
|
|
|
|
CAppPoolProps::CAppPoolProps(
|
|
CComAuthInfo * pAuthInfo, LPCTSTR meta_path
|
|
)
|
|
: CMetaProperties(pAuthInfo, meta_path)
|
|
{
|
|
InitDefaults();
|
|
}
|
|
|
|
CAppPoolProps::CAppPoolProps(
|
|
CMetaInterface * pInterface, LPCTSTR meta_path
|
|
)
|
|
: CMetaProperties(pInterface, meta_path)
|
|
{
|
|
InitDefaults();
|
|
}
|
|
|
|
CAppPoolProps::CAppPoolProps(
|
|
CMetaKey * pKey, LPCTSTR meta_path
|
|
)
|
|
: CMetaProperties(pKey, meta_path)
|
|
{
|
|
InitDefaults();
|
|
}
|
|
|
|
void
|
|
CAppPoolProps::ParseFields()
|
|
{
|
|
BEGIN_PARSE_META_RECORDS(m_dwNumEntries, m_pbMDData)
|
|
HANDLE_META_RECORD(MD_APPPOOL_FRIENDLY_NAME, m_strFriendlyName)
|
|
HANDLE_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_TIME, m_dwPeriodicRestartTime)
|
|
HANDLE_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_SCHEDULE, m_RestartSchedule)
|
|
HANDLE_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_REQUEST_COUNT, m_dwRestartRequestCount)
|
|
HANDLE_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_MEMORY, m_dwPeriodicRestartMemory)
|
|
|
|
HANDLE_META_RECORD(MD_APPPOOL_IDLE_TIMEOUT, m_dwIdleTimeout)
|
|
HANDLE_META_RECORD(MD_APPPOOL_UL_APPPOOL_QUEUE_LENGTH, m_dwQueueSize)
|
|
HANDLE_META_RECORD(MD_CPU_RESET_INTERVAL, m_dwRefreshTime)
|
|
HANDLE_META_RECORD(MD_APPPOOL_MAX_PROCESS_COUNT, m_dwMaxProcesses)
|
|
HANDLE_META_RECORD(MD_CPU_LIMIT, m_dwMaxCPU_Use)
|
|
HANDLE_META_RECORD(MD_CPU_ACTION, m_ActionIndex)
|
|
|
|
HANDLE_META_RECORD(MD_APPPOOL_PINGING_ENABLED, m_fDoEnablePing)
|
|
HANDLE_META_RECORD(MD_APPPOOL_PING_INTERVAL, m_dwPingInterval)
|
|
HANDLE_META_RECORD(MD_APPPOOL_RAPID_FAIL_PROTECTION_ENABLED, m_fDoEnableRapidFail)
|
|
HANDLE_META_RECORD(MD_RAPID_FAIL_PROTECTION_MAX_CRASHES, m_dwCrashesCount)
|
|
HANDLE_META_RECORD(MD_RAPID_FAIL_PROTECTION_INTERVAL, m_dwCheckInterval)
|
|
HANDLE_META_RECORD(MD_APPPOOL_STARTUP_TIMELIMIT, m_dwStartupLimit)
|
|
HANDLE_META_RECORD(MD_APPPOOL_SHUTDOWN_TIMELIMIT, m_dwShutdownLimit)
|
|
|
|
HANDLE_META_RECORD(MD_APPPOOL_ORPHAN_PROCESSES_FOR_DEBUGGING, m_fDoEnableDebug)
|
|
HANDLE_META_RECORD(MD_APPPOOL_ORPHAN_ACTION, m_DebuggerFileName)
|
|
|
|
HANDLE_META_RECORD(MD_APPPOOL_IDENTITY_TYPE, m_dwIdentType)
|
|
HANDLE_META_RECORD(MD_WAM_USER_NAME, m_strUserName)
|
|
HANDLE_META_RECORD(MD_WAM_PWD, m_strUserPass)
|
|
END_PARSE_META_RECORDS
|
|
}
|
|
|
|
/* virtual */
|
|
HRESULT
|
|
CAppPoolProps::WriteDirtyProps()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Write the dirty properties to the metabase
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
HRESULT
|
|
|
|
--*/
|
|
{
|
|
CError err;
|
|
BEGIN_META_WRITE()
|
|
META_WRITE(MD_APPPOOL_FRIENDLY_NAME, m_strFriendlyName)
|
|
META_WRITE(MD_APPPOOL_PERIODIC_RESTART_TIME, m_dwPeriodicRestartTime)
|
|
META_WRITE(MD_APPPOOL_PERIODIC_RESTART_SCHEDULE, m_RestartSchedule)
|
|
META_WRITE(MD_APPPOOL_PERIODIC_RESTART_REQUEST_COUNT, m_dwRestartRequestCount)
|
|
META_WRITE(MD_APPPOOL_PERIODIC_RESTART_MEMORY, m_dwPeriodicRestartMemory)
|
|
|
|
META_WRITE(MD_APPPOOL_IDLE_TIMEOUT, m_dwIdleTimeout)
|
|
META_WRITE(MD_APPPOOL_UL_APPPOOL_QUEUE_LENGTH, m_dwQueueSize)
|
|
META_WRITE(MD_CPU_RESET_INTERVAL, m_dwRefreshTime)
|
|
META_WRITE(MD_APPPOOL_MAX_PROCESS_COUNT, m_dwMaxProcesses)
|
|
META_WRITE(MD_CPU_LIMIT, m_dwMaxCPU_Use)
|
|
META_WRITE(MD_CPU_ACTION, m_ActionIndex)
|
|
|
|
META_WRITE(MD_APPPOOL_PINGING_ENABLED, m_fDoEnablePing)
|
|
META_WRITE(MD_APPPOOL_PING_INTERVAL, m_dwPingInterval)
|
|
META_WRITE(MD_APPPOOL_RAPID_FAIL_PROTECTION_ENABLED, m_fDoEnableRapidFail)
|
|
META_WRITE(MD_RAPID_FAIL_PROTECTION_MAX_CRASHES, m_dwCrashesCount)
|
|
META_WRITE(MD_RAPID_FAIL_PROTECTION_INTERVAL, m_dwCheckInterval)
|
|
META_WRITE(MD_APPPOOL_STARTUP_TIMELIMIT, m_dwStartupLimit)
|
|
META_WRITE(MD_APPPOOL_SHUTDOWN_TIMELIMIT, m_dwShutdownLimit)
|
|
META_WRITE(MD_APPPOOL_ORPHAN_PROCESSES_FOR_DEBUGGING, m_fDoEnableDebug)
|
|
META_WRITE(MD_APPPOOL_ORPHAN_ACTION, m_DebuggerFileName)
|
|
META_WRITE(MD_APPPOOL_IDENTITY_TYPE, m_dwIdentType)
|
|
META_WRITE(MD_WAM_USER_NAME, m_strUserName)
|
|
META_WRITE(MD_WAM_PWD, m_strUserPass)
|
|
END_META_WRITE(err);
|
|
|
|
return err;
|
|
}
|
|
|
|
void
|
|
CAppPoolProps::InitDefaults()
|
|
{
|
|
m_dwPeriodicRestartTime = PERIODIC_RESTART_TIME_DEF;
|
|
m_dwRestartRequestCount = PERIODIC_RESTART_REQ_DEF;
|
|
m_dwPeriodicRestartMemory = 0; //???
|
|
m_dwIdleTimeout = IDLE_TIMEOUT_DEF;
|
|
m_dwQueueSize = QUEUE_SIZE_DEF;
|
|
m_dwMaxCPU_Use = CPU_USE_DEF;
|
|
m_dwRefreshTime = CPU_RESET_TIME_DEF;
|
|
m_ActionIndex = ACTION_INDEX_DEF;
|
|
m_dwMaxProcesses = MAX_PROCESSES_DEF;
|
|
m_fDoEnablePing = TRUE;
|
|
m_dwPingInterval = PING_INTERVAL_DEF;
|
|
m_fDoEnableRapidFail = TRUE;
|
|
m_dwCrashesCount = CRASHES_COUNT_DEF;
|
|
m_dwCheckInterval = CHECK_INTERVAL_DEF;
|
|
m_dwStartupLimit = STARTUP_LIMIT_DEF;
|
|
m_dwShutdownLimit = SHUTDOWN_LIMIT_DEF;
|
|
m_fDoEnableDebug = FALSE;
|
|
m_dwIdentType = IDENT_TYPE_LOCALSYSTEM;
|
|
}
|
|
|
|
void
|
|
CAppPoolProps::InitFromModel(CAppPoolProps& model)
|
|
{
|
|
m_dwPeriodicRestartTime = model.m_dwPeriodicRestartTime;
|
|
m_dwRestartRequestCount = model.m_dwRestartRequestCount;
|
|
m_dwPeriodicRestartMemory = model.m_dwPeriodicRestartMemory;
|
|
m_RestartSchedule = model.m_RestartSchedule;
|
|
m_dwIdleTimeout = model.m_dwIdleTimeout;
|
|
m_dwQueueSize = model.m_dwQueueSize;
|
|
m_dwMaxCPU_Use = model.m_dwMaxCPU_Use;
|
|
m_dwRefreshTime = model.m_dwRefreshTime;
|
|
m_ActionIndex = model.m_ActionIndex;
|
|
m_dwMaxProcesses = model.m_dwMaxProcesses;
|
|
m_fDoEnablePing = model.m_fDoEnablePing;
|
|
m_dwPingInterval = model.m_dwPingInterval;
|
|
m_fDoEnableRapidFail = model.m_fDoEnableRapidFail;
|
|
m_dwCrashesCount = model.m_dwCrashesCount;
|
|
m_dwCheckInterval = model.m_dwCheckInterval;
|
|
m_dwStartupLimit = model.m_dwStartupLimit;
|
|
m_dwShutdownLimit = model.m_dwShutdownLimit;
|
|
m_fDoEnableDebug = model.m_fDoEnableDebug;
|
|
m_DebuggerFileName = model.m_DebuggerFileName;
|
|
m_dwIdentType = model.m_dwIdentType;
|
|
m_strUserName = model.m_strUserName;
|
|
m_strUserPass = model.m_strUserPass;
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
IMPLEMENT_DYNAMIC(CAppPoolSheet, CInetPropertySheet)
|
|
|
|
CAppPoolSheet::CAppPoolSheet(
|
|
CComAuthInfo * pAuthInfo,
|
|
LPCTSTR lpszMetaPath,
|
|
CWnd * pParentWnd,
|
|
LPARAM lParam,
|
|
LONG_PTR handle,
|
|
UINT iSelectPage
|
|
)
|
|
: CInetPropertySheet(
|
|
pAuthInfo, lpszMetaPath, pParentWnd, lParam, handle, iSelectPage),
|
|
m_pprops(NULL)
|
|
{
|
|
CString last;
|
|
CMetabasePath::GetLastNodeName(lpszMetaPath, last);
|
|
SetIsMasterInstance(last.CompareNoCase(SZ_MBN_APP_POOLS) == 0);
|
|
}
|
|
|
|
CAppPoolSheet::~CAppPoolSheet()
|
|
{
|
|
FreeConfigurationParameters();
|
|
}
|
|
|
|
HRESULT
|
|
CAppPoolSheet::LoadConfigurationParameters()
|
|
{
|
|
//
|
|
// Load base properties
|
|
//
|
|
CError err;
|
|
|
|
if (m_pprops == NULL)
|
|
{
|
|
//
|
|
// First call -- load values
|
|
//
|
|
m_pprops = new CAppPoolProps(QueryAuthInfo(), QueryMetaPath());
|
|
if (!m_pprops)
|
|
{
|
|
TRACEEOLID("LoadConfigurationParameters: OOM");
|
|
err = ERROR_NOT_ENOUGH_MEMORY;
|
|
return err;
|
|
}
|
|
err = m_pprops->LoadData();
|
|
if (IsMasterInstance())
|
|
{
|
|
CAppPoolsContainer * pObject = (CAppPoolsContainer *)GetParameter();
|
|
m_pprops->m_strFriendlyName = pObject->QueryDisplayName();
|
|
}
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
void
|
|
CAppPoolSheet::FreeConfigurationParameters()
|
|
{
|
|
CInetPropertySheet::FreeConfigurationParameters();
|
|
delete m_pprops;
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CAppPoolSheet, CInetPropertySheet)
|
|
//{{AFX_MSG_MAP(CAppPoolSheet)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
|
|
IMPLEMENT_DYNCREATE(CAppPoolGeneral, CInetPropertyPage)
|
|
|
|
CAppPoolGeneral::CAppPoolGeneral(CInetPropertySheet * pSheet)
|
|
: CInetPropertyPage(CAppPoolGeneral::IDD, pSheet)
|
|
{
|
|
}
|
|
|
|
CAppPoolGeneral::~CAppPoolGeneral()
|
|
{
|
|
}
|
|
|
|
/* virtual */
|
|
HRESULT
|
|
CAppPoolGeneral::FetchLoadedValues()
|
|
{
|
|
CError err;
|
|
|
|
BEGIN_META_INST_READ(CAppPoolSheet)
|
|
FETCH_INST_DATA_FROM_SHEET(m_strFriendlyName);
|
|
FETCH_INST_DATA_FROM_SHEET(m_strTemplateName);
|
|
END_META_INST_READ(err)
|
|
|
|
if (IsMasterInstance())
|
|
{
|
|
m_fUseTemplate = FALSE;
|
|
}
|
|
else
|
|
{
|
|
m_fUseTemplate = !m_strTemplateName.IsEmpty();
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
/* virtual */
|
|
HRESULT
|
|
CAppPoolGeneral::SaveInfo()
|
|
{
|
|
ASSERT(IsDirty());
|
|
CError err;
|
|
|
|
if (m_fUseTemplate)
|
|
{
|
|
m_Templates.GetLBText(m_TemplateIndex, m_strTemplateName);
|
|
}
|
|
else
|
|
{
|
|
m_strTemplateName.Empty();
|
|
}
|
|
BEGIN_META_INST_WRITE(CAppPoolSheet)
|
|
STORE_INST_DATA_ON_SHEET(m_strTemplateName)
|
|
if (!IsMasterInstance())
|
|
{
|
|
STORE_INST_DATA_ON_SHEET(m_strFriendlyName)
|
|
}
|
|
END_META_INST_WRITE(err)
|
|
|
|
return err;
|
|
}
|
|
|
|
void
|
|
CAppPoolGeneral::DoDataExchange(CDataExchange * pDX)
|
|
{
|
|
CInetPropertyPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAppPoolGeneral)
|
|
DDX_Control(pDX, IDC_FRIENDLY_NAME, m_edit_FriendlyName);
|
|
DDX_Text(pDX, IDC_FRIENDLY_NAME, m_strFriendlyName);
|
|
DDX_Control(pDX, IDC_USE_TEMPLATE, m_btn_UseTemplate);
|
|
DDX_Control(pDX, IDC_USE_CUSTOM, m_btn_UseCustom);
|
|
DDX_Control(pDX, IDC_TEMPLATE_LIST, m_Templates);
|
|
DDX_CBIndex(pDX, IDC_TEMPLATE_LIST, m_TemplateIndex);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CAppPoolGeneral, CInetPropertyPage)
|
|
//{{AFX_MSG_MAP(CAppPoolGeneral)
|
|
ON_BN_CLICKED(IDC_USE_TEMPLATE, OnUseTemplate)
|
|
ON_BN_CLICKED(IDC_USE_CUSTOM, OnUseCustom)
|
|
ON_EN_CHANGE(IDC_FRIENDLY_NAME, OnItemChanged)
|
|
ON_CBN_SELCHANGE(IDC_TEMPLATE_LIST, OnItemChanged)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL
|
|
CAppPoolGeneral::OnInitDialog()
|
|
{
|
|
CInetPropertyPage::OnInitDialog();
|
|
|
|
m_edit_FriendlyName.EnableWindow(!IsMasterInstance());
|
|
m_btn_UseTemplate.EnableWindow(!IsMasterInstance());
|
|
m_Templates.EnableWindow(m_fUseTemplate);
|
|
if (m_fUseTemplate)
|
|
{
|
|
int idx = m_Templates.FindStringExact(-1, m_strTemplateName);
|
|
if (CB_ERR != idx)
|
|
{
|
|
m_Templates.SetCurSel(idx);
|
|
}
|
|
else
|
|
{
|
|
ASSERT(FALSE); // TODO: should we switch off the flag?
|
|
}
|
|
}
|
|
m_btn_UseTemplate.SetCheck(m_fUseTemplate);
|
|
m_btn_UseCustom.SetCheck(!m_fUseTemplate);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void
|
|
CAppPoolGeneral::OnUseTemplate()
|
|
{
|
|
m_fUseTemplate = m_btn_UseTemplate.GetCheck();
|
|
m_btn_UseTemplate.SetCheck(m_fUseTemplate);
|
|
m_btn_UseCustom.SetCheck(!m_fUseTemplate);
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
void
|
|
CAppPoolGeneral::OnUseCustom()
|
|
{
|
|
m_fUseTemplate = m_btn_UseCustom.GetCheck();
|
|
m_btn_UseTemplate.SetCheck(m_fUseTemplate);
|
|
m_btn_UseCustom.SetCheck(m_fUseTemplate);
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
void
|
|
CAppPoolGeneral::OnItemChanged()
|
|
{
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
IMPLEMENT_DYNCREATE(CAppPoolRecycle, CInetPropertyPage)
|
|
|
|
CAppPoolRecycle::CAppPoolRecycle(CInetPropertySheet * pSheet)
|
|
: CInetPropertyPage(CAppPoolRecycle::IDD, pSheet),
|
|
m_fDoRestartOnTime(FALSE),
|
|
m_fDoRestartOnCount(FALSE),
|
|
m_fDoRestartOnSchedule(FALSE),
|
|
m_fDoRestartOnMemory(FALSE)
|
|
{
|
|
m_dwPeriodicRestartMemory = 0;
|
|
}
|
|
|
|
CAppPoolRecycle::~CAppPoolRecycle()
|
|
{
|
|
}
|
|
|
|
/* virtual */
|
|
HRESULT
|
|
CAppPoolRecycle::FetchLoadedValues()
|
|
{
|
|
CError err;
|
|
|
|
BEGIN_META_INST_READ(CAppPoolSheet)
|
|
FETCH_INST_DATA_FROM_SHEET(m_dwPeriodicRestartTime);
|
|
FETCH_INST_DATA_FROM_SHEET(m_dwRestartRequestCount);
|
|
FETCH_INST_DATA_FROM_SHEET(m_RestartSchedule);
|
|
FETCH_INST_DATA_FROM_SHEET(m_dwPeriodicRestartMemory);
|
|
END_META_INST_READ(err)
|
|
|
|
m_fDoRestartOnTime = m_dwPeriodicRestartTime != 0;
|
|
if (!m_fDoRestartOnTime)
|
|
{
|
|
m_dwPeriodicRestartTime = PERIODIC_RESTART_TIME_DEF;
|
|
}
|
|
m_fDoRestartOnCount = m_dwRestartRequestCount != 0;
|
|
if (!m_fDoRestartOnCount)
|
|
{
|
|
m_dwRestartRequestCount = PERIODIC_RESTART_REQ_DEF;
|
|
}
|
|
m_fDoRestartOnSchedule = m_RestartSchedule.GetCount() > 0;
|
|
m_fDoRestartOnMemory = m_dwPeriodicRestartMemory != 0;
|
|
if (!m_fDoRestartOnMemory)
|
|
{
|
|
m_dwPeriodicRestartMemoryDisplay = MEMORY_DEF;
|
|
}
|
|
else
|
|
{
|
|
m_dwPeriodicRestartMemoryDisplay = m_dwPeriodicRestartMemory / 1024;
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
/* virtual */
|
|
HRESULT
|
|
CAppPoolRecycle::SaveInfo()
|
|
{
|
|
ASSERT(IsDirty());
|
|
CError err;
|
|
|
|
int count = m_lst_Schedule.GetCount();
|
|
TCHAR buf[32];
|
|
SYSTEMTIME tm;
|
|
::GetSystemTime(&tm);
|
|
m_RestartSchedule.RemoveAll();
|
|
if (m_fDoRestartOnSchedule)
|
|
{
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
DWORD data = (DWORD)m_lst_Schedule.GetItemData(i);
|
|
tm.wMinute = LOWORD(data);
|
|
tm.wHour = HIWORD(data);
|
|
::GetTimeFormat(LOCALE_SYSTEM_DEFAULT,
|
|
TIME_NOSECONDS | TIME_FORCE24HOURFORMAT,
|
|
&tm, _T("hh':'mm"), buf, 32);
|
|
m_RestartSchedule.AddTail(buf);
|
|
}
|
|
}
|
|
DWORD d;
|
|
CStringListEx list;
|
|
BEGIN_META_INST_WRITE(CAppPoolSheet)
|
|
d = m_dwPeriodicRestartTime;
|
|
if (!m_fDoRestartOnTime)
|
|
m_dwPeriodicRestartTime = 0;
|
|
STORE_INST_DATA_ON_SHEET(m_dwPeriodicRestartTime)
|
|
m_dwPeriodicRestartTime = d;
|
|
d = m_dwRestartRequestCount;
|
|
if (!m_fDoRestartOnCount)
|
|
m_dwRestartRequestCount = 0;
|
|
STORE_INST_DATA_ON_SHEET(m_dwRestartRequestCount)
|
|
m_dwRestartRequestCount = d;
|
|
list = m_RestartSchedule;
|
|
if (!m_fDoRestartOnSchedule)
|
|
m_RestartSchedule.RemoveAll();
|
|
STORE_INST_DATA_ON_SHEET(m_RestartSchedule)
|
|
m_RestartSchedule = list;
|
|
m_dwPeriodicRestartMemory = m_dwPeriodicRestartMemoryDisplay * 1024;
|
|
if (!m_fDoRestartOnMemory)
|
|
m_dwPeriodicRestartMemory = 0;
|
|
STORE_INST_DATA_ON_SHEET(m_dwPeriodicRestartMemory)
|
|
END_META_INST_WRITE(err)
|
|
|
|
return err;
|
|
}
|
|
|
|
void
|
|
CAppPoolRecycle::DoDataExchange(CDataExchange * pDX)
|
|
{
|
|
CInetPropertyPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAppPoolRecycle)
|
|
DDX_Check(pDX, IDC_RECYCLE_TIMESPAN, m_fDoRestartOnTime);
|
|
DDX_Control(pDX, IDC_RECYCLE_TIMESPAN, m_bnt_DoRestartOnTime);
|
|
DDX_Text(pDX, IDC_TIMESPAN, m_dwPeriodicRestartTime);
|
|
DDV_MinMaxInt(pDX, m_dwPeriodicRestartTime, TIMESPAN_MIN, TIMESPAN_MAX);
|
|
DDX_Control(pDX, IDC_TIMESPAN, m_Timespan);
|
|
DDX_Control(pDX, IDC_TIMESPAN_SPIN, m_TimespanSpin);
|
|
DDX_Check(pDX, IDC_RECYCLE_REQUESTS, m_fDoRestartOnCount);
|
|
DDX_Control(pDX, IDC_RECYCLE_REQUESTS, m_btn_DoRestartOnCount);
|
|
DDX_Text(pDX, IDC_REQUEST_LIMIT, m_dwRestartRequestCount);
|
|
DDV_MinMaxInt(pDX, m_dwRestartRequestCount, REQUESTS_MIN, REQUESTS_MAX);
|
|
DDX_Control(pDX, IDC_REQUEST_LIMIT, m_Requests);
|
|
DDX_Control(pDX, IDC_REQUESTS_SPIN, m_RequestsSpin);
|
|
DDX_Check(pDX, IDC_RECYCLE_TIMER, m_fDoRestartOnSchedule);
|
|
DDX_Control(pDX, IDC_RECYCLE_TIMER, m_btn_DoRestartOnSchedule);
|
|
DDX_Control(pDX, IDC_TIMES_LIST, m_lst_Schedule);
|
|
DDX_Control(pDX, IDC_ADD_TIME, m_btn_Add);
|
|
DDX_Control(pDX, IDC_DELETE_TIME, m_btn_Remove);
|
|
DDX_Control(pDX, IDC_CHANGE_TIME, m_btn_Edit);
|
|
DDX_Check(pDX, IDC_RECYCLE_MEMORY, m_fDoRestartOnMemory);
|
|
DDX_Control(pDX, IDC_RECYCLE_MEMORY, m_btn_DoRestartOnMemory);
|
|
DDX_Text(pDX, IDC_MEMORY_LIMIT, m_dwPeriodicRestartMemoryDisplay);
|
|
DDV_MinMaxInt(pDX, m_dwPeriodicRestartMemoryDisplay, MEMORY_MIN, MEMORY_MAX);
|
|
DDX_Control(pDX, IDC_MEMORY_LIMIT, m_MemoryLimit);
|
|
DDX_Control(pDX, IDC_MEMORY_SPIN, m_MemoryLimitSpin);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CAppPoolRecycle, CInetPropertyPage)
|
|
//{{AFX_MSG_MAP(CAppPoolRecycle)
|
|
ON_WM_COMPAREITEM()
|
|
ON_WM_MEASUREITEM()
|
|
ON_WM_DRAWITEM()
|
|
ON_BN_CLICKED(IDC_RECYCLE_TIMESPAN, OnDoRestartOnTime)
|
|
ON_BN_CLICKED(IDC_RECYCLE_REQUESTS, OnDoRestartOnCount)
|
|
ON_BN_CLICKED(IDC_RECYCLE_TIMER, OnDoRestartOnSchedule)
|
|
ON_BN_CLICKED(IDC_RECYCLE_MEMORY, OnDoRestartOnMemory)
|
|
ON_BN_CLICKED(IDC_ADD_TIME, OnAddTime)
|
|
ON_BN_CLICKED(IDC_DELETE_TIME, OnDeleteTime)
|
|
ON_BN_CLICKED(IDC_CHANGE_TIME, OnChangeTime)
|
|
ON_EN_CHANGE(IDC_TIMESPAN, OnItemChanged)
|
|
ON_EN_CHANGE(IDC_REQUEST_LIMIT, OnItemChanged)
|
|
ON_EN_CHANGE(IDC_MEMORY_LIMIT, OnItemChanged)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL
|
|
CAppPoolRecycle::OnInitDialog()
|
|
{
|
|
UDACCEL toAcc[3] = {{1, 1}, {3, 5}, {6, 10}};
|
|
|
|
CInetPropertyPage::OnInitDialog();
|
|
|
|
m_Timespan.EnableWindow(m_fDoRestartOnTime);
|
|
m_TimespanSpin.EnableWindow(m_fDoRestartOnTime);
|
|
m_TimespanSpin.SetRange32(TIMESPAN_MIN,TIMESPAN_MAX);
|
|
m_TimespanSpin.SetPos(m_dwPeriodicRestartTime);
|
|
m_TimespanSpin.SetAccel(3, toAcc);
|
|
// SETUP_EDIT_SPIN(m_fDoRestartOnTime, m_Timespan, m_TimespanSpin,
|
|
// TIMESPAN_MIN, TIMESPAN_MAX, m_dwPeriodicRestartTime);
|
|
SETUP_EDIT_SPIN(m_fDoRestartOnCount, m_Requests, m_RequestsSpin,
|
|
REQUESTS_MIN, REQUESTS_MAX, m_dwRestartRequestCount);
|
|
SETUP_EDIT_SPIN(m_fDoRestartOnMemory, m_MemoryLimit, m_MemoryLimitSpin,
|
|
MEMORY_MIN, MEMORY_MAX, m_dwPeriodicRestartMemoryDisplay);
|
|
|
|
POSITION pos = m_RestartSchedule.GetHeadPosition();
|
|
while (pos != NULL)
|
|
{
|
|
CString& str = m_RestartSchedule.GetNext(pos);
|
|
int n = str.Find(_T(':'));
|
|
int len = str.GetLength();
|
|
WORD h = (WORD)StrToInt(str.Left(n));
|
|
WORD m = (WORD)StrToInt(str.Right(len - n - 1));
|
|
m_lst_Schedule.AddString((LPCTSTR)UIntToPtr(MAKELONG(m, h)));
|
|
}
|
|
m_lst_Schedule.SetCurSel(0);
|
|
|
|
SetControlsState();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void
|
|
CAppPoolRecycle::SetControlsState()
|
|
{
|
|
m_Timespan.EnableWindow(m_fDoRestartOnTime);
|
|
m_TimespanSpin.EnableWindow(m_fDoRestartOnTime);
|
|
|
|
m_Requests.EnableWindow(m_fDoRestartOnCount);
|
|
m_RequestsSpin.EnableWindow(m_fDoRestartOnCount);
|
|
|
|
m_MemoryLimit.EnableWindow(m_fDoRestartOnMemory);
|
|
m_MemoryLimitSpin.EnableWindow(m_fDoRestartOnMemory);
|
|
|
|
m_lst_Schedule.EnableWindow(m_fDoRestartOnSchedule);
|
|
m_btn_Add.EnableWindow(m_fDoRestartOnSchedule);
|
|
int idx = m_lst_Schedule.GetCurSel();
|
|
m_btn_Remove.EnableWindow(m_fDoRestartOnSchedule && idx != LB_ERR);
|
|
m_btn_Edit.EnableWindow(m_fDoRestartOnSchedule && idx != LB_ERR);
|
|
}
|
|
|
|
void
|
|
CAppPoolRecycle::OnItemChanged()
|
|
{
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
int
|
|
CAppPoolRecycle::OnCompareItem(UINT nID, LPCOMPAREITEMSTRUCT cmpi)
|
|
{
|
|
if (nID == IDC_TIMES_LIST)
|
|
{
|
|
ASSERT(cmpi->CtlType == ODT_LISTBOX);
|
|
if (cmpi->itemData1 > cmpi->itemData2)
|
|
return 1;
|
|
else if (cmpi->itemData1 == cmpi->itemData2)
|
|
return 0;
|
|
else
|
|
return -1;
|
|
}
|
|
ASSERT(FALSE);
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
CAppPoolRecycle::OnMeasureItem(UINT nID, LPMEASUREITEMSTRUCT mi)
|
|
{
|
|
if (nID == IDC_TIMES_LIST)
|
|
{
|
|
HWND hwnd = ::GetDlgItem(m_hWnd, IDC_TIMES_LIST);
|
|
HDC hdc = ::GetDC(hwnd);
|
|
HFONT hFont = (HFONT)SendDlgItemMessage(IDC_TIMES_LIST, WM_GETFONT, 0, 0);
|
|
HFONT hf = (HFONT)::SelectObject(hdc, hFont);
|
|
TEXTMETRIC tm;
|
|
::GetTextMetrics(hdc, &tm);
|
|
::SelectObject(hdc, hf);
|
|
::ReleaseDC(hwnd, hdc);
|
|
RECT rc;
|
|
::GetClientRect(hwnd, &rc);
|
|
mi->itemHeight = tm.tmHeight;
|
|
mi->itemWidth = rc.right - rc.left;
|
|
}
|
|
}
|
|
|
|
void
|
|
CAppPoolRecycle::OnDrawItem(UINT nID, LPDRAWITEMSTRUCT di)
|
|
{
|
|
if (nID == IDC_TIMES_LIST && di->itemID != -1)
|
|
{
|
|
SYSTEMTIME tm;
|
|
::GetSystemTime(&tm);
|
|
tm.wMinute = LOWORD(di->itemData);
|
|
tm.wHour = HIWORD(di->itemData);
|
|
TCHAR buf[32];
|
|
TCHAR fmt[] = _T("HH:mm");
|
|
::GetTimeFormat(NULL /*LOCALE_SYSTEM_DEFAULT*/, TIME_NOSECONDS, &tm, fmt, buf, 32);
|
|
|
|
HBRUSH hBrush;
|
|
COLORREF prevText;
|
|
COLORREF prevBk;
|
|
switch (di->itemAction)
|
|
{
|
|
case ODA_SELECT:
|
|
case ODA_DRAWENTIRE:
|
|
if (di->itemState & ODS_SELECTED)
|
|
{
|
|
hBrush = ::CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT));
|
|
prevText = ::SetTextColor(di->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
|
|
prevBk = ::SetBkColor(di->hDC, GetSysColor(COLOR_HIGHLIGHT));
|
|
}
|
|
else
|
|
{
|
|
hBrush = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
|
|
prevText = ::SetTextColor(di->hDC, GetSysColor(COLOR_WINDOWTEXT));
|
|
prevBk = ::SetBkColor(di->hDC, GetSysColor(COLOR_WINDOW));
|
|
}
|
|
::FillRect(di->hDC, &di->rcItem, hBrush);
|
|
::DrawText(di->hDC, buf, -1, &di->rcItem, DT_LEFT | DT_VCENTER | DT_EXTERNALLEADING);
|
|
::SetTextColor(di->hDC, prevText);
|
|
::SetTextColor(di->hDC, prevBk);
|
|
::DeleteObject(hBrush);
|
|
break;
|
|
|
|
case ODA_FOCUS:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
CAppPoolRecycle::OnDoRestartOnTime()
|
|
{
|
|
m_fDoRestartOnTime = !m_fDoRestartOnTime;
|
|
SetControlsState();
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
void
|
|
CAppPoolRecycle::OnDoRestartOnCount()
|
|
{
|
|
m_fDoRestartOnCount = !m_fDoRestartOnCount;
|
|
SetControlsState();
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
void
|
|
CAppPoolRecycle::OnDoRestartOnSchedule()
|
|
{
|
|
m_fDoRestartOnSchedule = !m_fDoRestartOnSchedule;
|
|
SetControlsState();
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
void
|
|
CAppPoolRecycle::OnDoRestartOnMemory()
|
|
{
|
|
m_fDoRestartOnMemory = !m_fDoRestartOnMemory;
|
|
SetControlsState();
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
class CTimePickerDlg : public CDialog
|
|
{
|
|
DECLARE_DYNCREATE(CTimePickerDlg)
|
|
|
|
public:
|
|
CTimePickerDlg()
|
|
: CDialog(CTimePickerDlg::IDD),
|
|
m_TopLeft(0, 0)
|
|
{
|
|
}
|
|
~CTimePickerDlg()
|
|
{
|
|
}
|
|
void SetTime(CTime& tm)
|
|
{
|
|
m_time = tm;
|
|
}
|
|
CTime& GetTime()
|
|
{
|
|
return m_time;
|
|
}
|
|
void SetPos(const CPoint& pt)
|
|
{
|
|
m_TopLeft = pt;
|
|
}
|
|
|
|
//
|
|
// Dialog Data
|
|
//
|
|
protected:
|
|
//{{AFX_DATA(CTimePickerDlg)
|
|
enum {IDD = IDD_TIME_PICKER};
|
|
CDateTimeCtrl m_Timer;
|
|
CTime m_time;
|
|
//}}AFX_DATA
|
|
CPoint m_TopLeft;
|
|
|
|
//{{AFX_MSG(CTimePickerDlg)
|
|
BOOL OnInitDialog();
|
|
//}}AFX_MSG
|
|
DECLARE_MESSAGE_MAP()
|
|
|
|
protected:
|
|
//{{AFX_VIRTUAL(CTimePickerDlg)
|
|
virtual void DoDataExchange(CDataExchange * pDX);
|
|
//}}AFX_VIRTUAL
|
|
};
|
|
|
|
void
|
|
CTimePickerDlg::DoDataExchange(CDataExchange * pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAppPoolRecycle)
|
|
DDX_DateTimeCtrl(pDX, IDC_TIME_PICKER, m_time);
|
|
DDX_Control(pDX, IDC_TIME_PICKER, m_Timer);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CTimePickerDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CTimePickerDlg)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
IMPLEMENT_DYNCREATE(CTimePickerDlg, CDialog)
|
|
|
|
BOOL
|
|
CTimePickerDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
m_Timer.SetFormat(_T("HH:mm"));
|
|
m_Timer.SetTime(&m_time);
|
|
SetWindowPos(NULL, m_TopLeft.x, m_TopLeft.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void
|
|
CAppPoolRecycle::OnAddTime()
|
|
{
|
|
CTimePickerDlg dlg;
|
|
RECT rc;
|
|
m_btn_Add.GetWindowRect(&rc);
|
|
dlg.SetPos(CPoint(rc.left, rc.bottom));
|
|
dlg.SetTime(CTime::GetCurrentTime());
|
|
if (dlg.DoModal() == IDOK)
|
|
{
|
|
int idx;
|
|
CTime tm = dlg.GetTime();
|
|
LONG_PTR l = (LONG_PTR)MAKELONG(tm.GetMinute(), tm.GetHour());
|
|
if ((idx = m_lst_Schedule.FindString(-1, (LPCTSTR)l)) == LB_ERR)
|
|
{
|
|
idx = m_lst_Schedule.AddString((LPCTSTR)l);
|
|
m_lst_Schedule.SetCurSel(idx);
|
|
m_btn_Edit.EnableWindow(idx != LB_ERR);
|
|
m_btn_Remove.EnableWindow(idx != LB_ERR);
|
|
}
|
|
else
|
|
m_lst_Schedule.SetCurSel(idx);
|
|
SetModified(TRUE);
|
|
}
|
|
}
|
|
|
|
void
|
|
CAppPoolRecycle::OnChangeTime()
|
|
{
|
|
CTimePickerDlg dlg;
|
|
RECT rc;
|
|
m_btn_Edit.GetWindowRect(&rc);
|
|
dlg.SetPos(CPoint(rc.left, rc.bottom));
|
|
int idx = m_lst_Schedule.GetCurSel();
|
|
LONG l = (LONG)m_lst_Schedule.GetItemData(idx);
|
|
// Looks like we have to init the struct properly
|
|
SYSTEMTIME tm;
|
|
::GetSystemTime(&tm);
|
|
tm.wMinute = LOWORD(l);
|
|
tm.wHour = HIWORD(l);
|
|
tm.wSecond = 0;
|
|
dlg.SetTime(CTime(tm));
|
|
if (dlg.DoModal() == IDOK)
|
|
{
|
|
CTime t = dlg.GetTime();
|
|
LONG_PTR ll = (LONG_PTR)MAKELONG(t.GetMinute(), t.GetHour());
|
|
m_lst_Schedule.SetItemData(idx, ll);
|
|
m_lst_Schedule.GetItemRect(idx, &rc);
|
|
m_lst_Schedule.InvalidateRect(&rc, TRUE);
|
|
SetModified(TRUE);
|
|
}
|
|
}
|
|
|
|
void
|
|
CAppPoolRecycle::OnDeleteTime()
|
|
{
|
|
int idx = m_lst_Schedule.GetCurSel();
|
|
int count;
|
|
if (idx != LB_ERR)
|
|
{
|
|
m_lst_Schedule.DeleteString(idx);
|
|
SetModified(TRUE);
|
|
if ((count = m_lst_Schedule.GetCount()) == 0)
|
|
{
|
|
m_btn_Remove.EnableWindow(FALSE);
|
|
m_btn_Edit.EnableWindow(FALSE);
|
|
}
|
|
else
|
|
{
|
|
m_lst_Schedule.SetCurSel(idx == count ? --idx : idx);
|
|
}
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
IMPLEMENT_DYNCREATE(CAppPoolPerf, CInetPropertyPage)
|
|
|
|
CAppPoolPerf::CAppPoolPerf(CInetPropertySheet * pSheet)
|
|
: CInetPropertyPage(CAppPoolPerf::IDD, pSheet),
|
|
m_fDoIdleShutdown(FALSE),
|
|
m_dwIdleTimeout(IDLE_TIMEOUT_DEF),
|
|
m_fDoLimitQueue(FALSE),
|
|
m_dwQueueSize(QUEUE_SIZE_DEF),
|
|
m_fDoEnableCPUAccount(FALSE),
|
|
m_dwMaxCPU_Use(CPU_USE_DEF),
|
|
m_dwRefreshTime(CPU_RESET_TIME_DEF),
|
|
m_ActionIndex(ACTION_INDEX_DEF),
|
|
m_dwMaxProcesses(MAX_PROCESSES_DEF)
|
|
{
|
|
}
|
|
|
|
CAppPoolPerf::~CAppPoolPerf()
|
|
{
|
|
}
|
|
|
|
/* virtual */
|
|
HRESULT
|
|
CAppPoolPerf::FetchLoadedValues()
|
|
{
|
|
CError err;
|
|
|
|
BEGIN_META_INST_READ(CAppPoolSheet)
|
|
FETCH_INST_DATA_FROM_SHEET(m_dwIdleTimeout);
|
|
FETCH_INST_DATA_FROM_SHEET(m_dwQueueSize);
|
|
FETCH_INST_DATA_FROM_SHEET(m_dwMaxCPU_Use);
|
|
FETCH_INST_DATA_FROM_SHEET(m_dwRefreshTime);
|
|
FETCH_INST_DATA_FROM_SHEET(m_dwMaxProcesses);
|
|
FETCH_INST_DATA_FROM_SHEET(m_ActionIndex);
|
|
END_META_INST_READ(err)
|
|
|
|
m_dwMaxCPU_UseVisual = m_dwMaxCPU_Use / 1000;
|
|
|
|
m_fDoIdleShutdown = m_dwIdleTimeout != 0;
|
|
if (!m_fDoIdleShutdown)
|
|
{
|
|
m_dwIdleTimeout = IDLE_TIMEOUT_DEF;
|
|
}
|
|
m_fDoLimitQueue = m_dwQueueSize != 0;
|
|
if (!m_fDoLimitQueue)
|
|
{
|
|
m_dwQueueSize = QUEUE_SIZE_DEF;
|
|
}
|
|
m_fDoEnableCPUAccount = m_dwRefreshTime > 0;
|
|
if (!m_fDoEnableCPUAccount)
|
|
{
|
|
m_dwMaxCPU_UseVisual = CPU_USE_DEF;
|
|
m_dwRefreshTime = CPU_RESET_TIME_DEF;
|
|
m_ActionIndex = ACTION_INDEX_DEF;
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
/* virtual */
|
|
HRESULT
|
|
CAppPoolPerf::SaveInfo()
|
|
{
|
|
ASSERT(IsDirty());
|
|
CError err;
|
|
|
|
m_dwMaxCPU_Use = m_dwMaxCPU_UseVisual * 1000;
|
|
|
|
BEGIN_META_INST_WRITE(CAppPoolSheet)
|
|
if (!m_fDoIdleShutdown)
|
|
m_dwIdleTimeout = 0;
|
|
if (!m_fDoLimitQueue)
|
|
m_dwQueueSize = 0;
|
|
if (!m_fDoEnableCPUAccount)
|
|
{
|
|
m_dwRefreshTime = 0;
|
|
m_dwMaxCPU_Use = 0;
|
|
// m_ActionIndex = -1;
|
|
}
|
|
STORE_INST_DATA_ON_SHEET(m_dwQueueSize)
|
|
STORE_INST_DATA_ON_SHEET(m_dwIdleTimeout)
|
|
STORE_INST_DATA_ON_SHEET(m_dwRefreshTime)
|
|
STORE_INST_DATA_ON_SHEET(m_dwMaxCPU_Use)
|
|
STORE_INST_DATA_ON_SHEET(m_ActionIndex)
|
|
STORE_INST_DATA_ON_SHEET(m_dwMaxProcesses)
|
|
END_META_INST_WRITE(err)
|
|
|
|
return err;
|
|
}
|
|
|
|
void
|
|
CAppPoolPerf::DoDataExchange(CDataExchange * pDX)
|
|
{
|
|
CInetPropertyPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAppPoolRecycle)
|
|
DDX_Check(pDX, IDC_PERF_IDLE_TIMEOUT, m_fDoIdleShutdown);
|
|
DDX_Control(pDX, IDC_PERF_IDLE_TIMEOUT, m_bnt_DoIdleShutdown);
|
|
DDX_Text(pDX, IDC_IDLETIME, m_dwIdleTimeout);
|
|
DDV_MinMaxInt(pDX, m_dwIdleTimeout, TIMEOUT_MIN, TIMEOUT_MAX);
|
|
DDX_Control(pDX, IDC_IDLETIME, m_IdleTimeout);
|
|
DDX_Control(pDX, IDC_IDLETIME_SPIN, m_IdleTimeoutSpin);
|
|
|
|
DDX_Check(pDX, IDC_LIMIT_QUEUE, m_fDoLimitQueue);
|
|
DDX_Control(pDX, IDC_LIMIT_QUEUE, m_btn_DoLimitQueue);
|
|
DDX_Text(pDX, IDC_QUEUESIZE, m_dwQueueSize);
|
|
DDV_MinMaxInt(pDX, m_dwQueueSize, QUEUESIZE_MIN, QUEUESIZE_MAX);
|
|
DDX_Control(pDX, IDC_QUEUESIZE, m_QueueSize);
|
|
DDX_Control(pDX, IDC_QUEUESIZE_SPIN, m_QueueSizeSpin);
|
|
|
|
DDX_Check(pDX, IDC_ENABLE_CPU_ACCOUNTING, m_fDoEnableCPUAccount);
|
|
DDX_Control(pDX, IDC_ENABLE_CPU_ACCOUNTING, m_btn_DoEnableCPUAccount);
|
|
DDX_Text(pDX, IDC_CPU_USE, m_dwMaxCPU_UseVisual);
|
|
DDV_MinMaxInt(pDX, m_dwMaxCPU_UseVisual, CPU_LIMIT_MIN, CPU_LIMIT_MAX);
|
|
DDX_Control(pDX, IDC_CPU_USE, m_MaxCPU_Use);
|
|
DDX_Control(pDX, IDC_CPU_USE_SPIN, m_MaxCPU_UseSpin);
|
|
DDX_Text(pDX, IDC_REFRESHTIME, m_dwRefreshTime);
|
|
DDV_MinMaxInt(pDX, m_dwRefreshTime, CPU_RESET_TIME_MIN, CPU_RESET_TIME_MAX);
|
|
DDX_Control(pDX, IDC_REFRESHTIME, m_RefreshTime);
|
|
DDX_Control(pDX, IDC_REFRESHTIME_SPIN, m_RefreshTimeSpin);
|
|
DDX_Control(pDX, IDC_EXCEED_ACTION, m_Action);
|
|
DDX_CBIndex(pDX, IDC_EXCEED_ACTION, m_ActionIndex);
|
|
|
|
DDX_Text(pDX, IDC_MAXPROCESSES, m_dwMaxProcesses);
|
|
DDV_MinMaxInt(pDX, m_dwMaxProcesses, MAXPROCESSES_MIN, MAXPROCESSES_MAX);
|
|
DDX_Control(pDX, IDC_MAXPROCESSES, m_MaxProcesses);
|
|
DDX_Control(pDX, IDC_MAXPROCESSES_SPIN, m_MaxProcessesSpin);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CAppPoolPerf, CInetPropertyPage)
|
|
//{{AFX_MSG_MAP(CAppPoolRecycle)
|
|
ON_BN_CLICKED(IDC_PERF_IDLE_TIMEOUT, OnDoIdleShutdown)
|
|
ON_BN_CLICKED(IDC_LIMIT_QUEUE, OnDoLimitQueue)
|
|
ON_BN_CLICKED(IDC_ENABLE_CPU_ACCOUNTING, OnDoEnableCPUAccount)
|
|
ON_EN_CHANGE(IDC_IDLETIME, OnItemChanged)
|
|
ON_EN_CHANGE(IDC_QUEUESIZE, OnItemChanged)
|
|
ON_EN_CHANGE(IDC_CPU_USE, OnItemChanged)
|
|
ON_EN_CHANGE(IDC_REFRESHTIME, OnItemChanged)
|
|
ON_EN_CHANGE(IDC_MAXPROCESSES, OnItemChanged)
|
|
ON_CBN_SELCHANGE(IDC_EXCEED_ACTION, OnItemChanged)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL
|
|
CAppPoolPerf::OnInitDialog()
|
|
{
|
|
UDACCEL toAcc[3] = {{1, 1}, {3, 5}, {6, 10}};
|
|
|
|
CInetPropertyPage::OnInitDialog();
|
|
|
|
SETUP_EDIT_SPIN(m_fDoIdleShutdown, m_IdleTimeout, m_IdleTimeoutSpin,
|
|
TIMEOUT_MIN, TIMEOUT_MAX, m_dwIdleTimeout);
|
|
SETUP_EDIT_SPIN(m_fDoLimitQueue, m_QueueSize, m_QueueSizeSpin,
|
|
QUEUESIZE_MIN, QUEUESIZE_MAX, m_dwQueueSize);
|
|
m_dwMaxCPU_UseVisual = m_dwMaxCPU_Use / 1000;
|
|
SETUP_EDIT_SPIN(m_fDoEnableCPUAccount, m_MaxCPU_Use, m_MaxCPU_UseSpin,
|
|
CPU_LIMIT_MIN, CPU_LIMIT_MAX, m_dwMaxCPU_UseVisual);
|
|
SETUP_EDIT_SPIN(m_fDoEnableCPUAccount, m_RefreshTime, m_RefreshTimeSpin,
|
|
REFRESH_TIME_MIN, REFRESH_TIME_MAX, m_dwRefreshTime);
|
|
SETUP_SPIN(m_MaxProcessesSpin,
|
|
MAXPROCESSES_MIN, MAXPROCESSES_MAX, m_dwMaxProcesses);
|
|
|
|
CString str;
|
|
str.LoadString(IDS_NO_ACTION);
|
|
m_Action.AddString(str);
|
|
// str.LoadString(IDS_THROTTLE_BACK);
|
|
// m_Action.AddString(str);
|
|
str.LoadString(IDS_TURN_ON_TRACING);
|
|
m_Action.AddString(str);
|
|
str.LoadString(IDS_SHUTDOWN);
|
|
m_Action.AddString(str);
|
|
if (m_ActionIndex < 0 || m_ActionIndex > 3)
|
|
m_ActionIndex = ACTION_INDEX_DEF;
|
|
m_Action.SetCurSel(m_ActionIndex);
|
|
|
|
SetControlsState();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void
|
|
CAppPoolPerf::OnDoIdleShutdown()
|
|
{
|
|
m_fDoIdleShutdown = !m_fDoIdleShutdown;
|
|
SetControlsState();
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
void
|
|
CAppPoolPerf::OnDoLimitQueue()
|
|
{
|
|
m_fDoLimitQueue = !m_fDoLimitQueue;
|
|
SetControlsState();
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
void
|
|
CAppPoolPerf::OnDoEnableCPUAccount()
|
|
{
|
|
m_fDoEnableCPUAccount = !m_fDoEnableCPUAccount;
|
|
SetControlsState();
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
void
|
|
CAppPoolPerf::OnItemChanged()
|
|
{
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
void
|
|
CAppPoolPerf::SetControlsState()
|
|
{
|
|
m_bnt_DoIdleShutdown.SetCheck(m_fDoIdleShutdown);
|
|
m_IdleTimeout.EnableWindow(m_fDoIdleShutdown);
|
|
m_IdleTimeoutSpin.EnableWindow(m_fDoIdleShutdown);
|
|
|
|
m_btn_DoLimitQueue.SetCheck(m_fDoLimitQueue);
|
|
m_QueueSize.EnableWindow(m_fDoLimitQueue);
|
|
m_QueueSizeSpin.EnableWindow(m_fDoLimitQueue);
|
|
|
|
m_btn_DoEnableCPUAccount.SetCheck(m_fDoEnableCPUAccount);
|
|
m_MaxCPU_Use.EnableWindow(m_fDoEnableCPUAccount);
|
|
m_MaxCPU_UseSpin.EnableWindow(m_fDoEnableCPUAccount);
|
|
m_RefreshTime.EnableWindow(m_fDoEnableCPUAccount);
|
|
m_RefreshTimeSpin.EnableWindow(m_fDoEnableCPUAccount);
|
|
m_Action.EnableWindow(m_fDoEnableCPUAccount);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
IMPLEMENT_DYNCREATE(CAppPoolHealth, CInetPropertyPage)
|
|
|
|
CAppPoolHealth::CAppPoolHealth(CInetPropertySheet * pSheet)
|
|
: CInetPropertyPage(CAppPoolHealth::IDD, pSheet),
|
|
m_fDoEnablePing(FALSE),
|
|
m_dwPingInterval(PING_INTERVAL_DEF),
|
|
m_fDoEnableRapidFail(FALSE),
|
|
m_dwCrashesCount(CRASHES_COUNT_DEF),
|
|
m_dwCheckInterval(CHECK_INTERVAL_DEF),
|
|
m_dwStartupLimit(STARTUP_LIMIT_DEF),
|
|
m_dwShutdownLimit(SHUTDOWN_LIMIT_DEF)
|
|
{
|
|
}
|
|
|
|
CAppPoolHealth::~CAppPoolHealth()
|
|
{
|
|
}
|
|
|
|
/* virtual */
|
|
HRESULT
|
|
CAppPoolHealth::FetchLoadedValues()
|
|
{
|
|
CError err;
|
|
|
|
BEGIN_META_INST_READ(CAppPoolSheet)
|
|
FETCH_INST_DATA_FROM_SHEET(m_fDoEnablePing);
|
|
FETCH_INST_DATA_FROM_SHEET(m_dwPingInterval);
|
|
FETCH_INST_DATA_FROM_SHEET(m_fDoEnableRapidFail);
|
|
FETCH_INST_DATA_FROM_SHEET(m_dwCrashesCount);
|
|
FETCH_INST_DATA_FROM_SHEET(m_dwCheckInterval);
|
|
FETCH_INST_DATA_FROM_SHEET(m_dwStartupLimit);
|
|
FETCH_INST_DATA_FROM_SHEET(m_dwShutdownLimit);
|
|
END_META_INST_READ(err)
|
|
|
|
return err;
|
|
}
|
|
|
|
/* virtual */
|
|
HRESULT
|
|
CAppPoolHealth::SaveInfo()
|
|
{
|
|
ASSERT(IsDirty());
|
|
CError err;
|
|
|
|
BEGIN_META_INST_WRITE(CAppPoolSheet)
|
|
STORE_INST_DATA_ON_SHEET(m_fDoEnablePing);
|
|
STORE_INST_DATA_ON_SHEET(m_dwPingInterval);
|
|
STORE_INST_DATA_ON_SHEET(m_fDoEnableRapidFail);
|
|
STORE_INST_DATA_ON_SHEET(m_dwCrashesCount);
|
|
STORE_INST_DATA_ON_SHEET(m_dwCheckInterval);
|
|
STORE_INST_DATA_ON_SHEET(m_dwStartupLimit);
|
|
STORE_INST_DATA_ON_SHEET(m_dwShutdownLimit);
|
|
END_META_INST_WRITE(err)
|
|
|
|
return err;
|
|
}
|
|
|
|
void
|
|
CAppPoolHealth::DoDataExchange(CDataExchange * pDX)
|
|
{
|
|
CInetPropertyPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAppPoolHealth)
|
|
DDX_Check(pDX, IDC_ENABLE_PING, m_fDoEnablePing);
|
|
DDX_Control(pDX, IDC_ENABLE_PING, m_bnt_DoEnablePing);
|
|
DDX_Text(pDX, IDC_PINGINTERVAL, m_dwPingInterval);
|
|
DDV_MinMaxInt(pDX, m_dwPingInterval, PING_INTERVAL_MIN, PING_INTERVAL_MAX);
|
|
DDX_Control(pDX, IDC_PINGINTERVAL, m_PingInterval);
|
|
DDX_Control(pDX, IDC_PINGINTERVAL_SPIN, m_PingIntervalSpin);
|
|
|
|
DDX_Check(pDX, IDC_ENABLE_RAPID_FAIL, m_fDoEnableRapidFail);
|
|
DDX_Control(pDX, IDC_ENABLE_RAPID_FAIL, m_btn_DoEnableRapidFail);
|
|
DDX_Text(pDX, IDC_CRASHES_COUNT, m_dwCrashesCount);
|
|
DDV_MinMaxInt(pDX, m_dwCrashesCount, CRASHES_COUNT_MIN, CRASHES_COUNT_MAX);
|
|
DDX_Control(pDX, IDC_CRASHES_COUNT, m_CrashesCount);
|
|
DDX_Control(pDX, IDC_CRASHES_COUNT_SPIN, m_CrashesCountSpin);
|
|
DDX_Text(pDX, IDC_CHECK_TIME, m_dwCheckInterval);
|
|
DDV_MinMaxInt(pDX, m_dwCheckInterval, CHECK_INTERVAL_MIN, CHECK_INTERVAL_MAX);
|
|
DDX_Control(pDX, IDC_CHECK_TIME, m_CheckInterval);
|
|
DDX_Control(pDX, IDC_CHECK_TIME_SPIN, m_CheckIntervalSpin);
|
|
|
|
DDX_Text(pDX, IDC_STARTUP_LIMIT, m_dwStartupLimit);
|
|
DDV_MinMaxInt(pDX, m_dwStartupLimit, STARTUP_LIMIT_MIN, STARTUP_LIMIT_MAX);
|
|
DDX_Control(pDX, IDC_STARTUP_LIMIT, m_StartupLimit);
|
|
DDX_Control(pDX, IDC_STARTUP_LIMIT_SPIN, m_StartupLimitSpin);
|
|
|
|
DDX_Text(pDX, IDC_SHUTDOWN_LIMIT, m_dwShutdownLimit);
|
|
DDV_MinMaxInt(pDX, m_dwShutdownLimit, SHUTDOWN_LIMIT_MIN, SHUTDOWN_LIMIT_MAX);
|
|
DDX_Control(pDX, IDC_SHUTDOWN_LIMIT, m_ShutdownLimit);
|
|
DDX_Control(pDX, IDC_SHUTDOWN_LIMIT_SPIN, m_ShutdownLimitSpin);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CAppPoolHealth, CInetPropertyPage)
|
|
//{{AFX_MSG_MAP(CAppPoolHealth)
|
|
ON_BN_CLICKED(IDC_ENABLE_PING, OnDoEnablePinging)
|
|
ON_BN_CLICKED(IDC_ENABLE_RAPID_FAIL, OnDoEnableRapidFail)
|
|
ON_EN_CHANGE(IDC_PINGINTERVAL, OnItemChanged)
|
|
ON_EN_CHANGE(IDC_CRASHES_COUNT, OnItemChanged)
|
|
ON_EN_CHANGE(IDC_CHECK_TIME, OnItemChanged)
|
|
ON_EN_CHANGE(IDC_STARTUP_LIMIT, OnItemChanged)
|
|
ON_EN_CHANGE(IDC_SHUTDOWN_LIMIT, OnItemChanged)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL
|
|
CAppPoolHealth::OnInitDialog()
|
|
{
|
|
UDACCEL toAcc[3] = {{1, 1}, {3, 5}, {6, 10}};
|
|
|
|
CInetPropertyPage::OnInitDialog();
|
|
|
|
SETUP_EDIT_SPIN(m_fDoEnablePing, m_PingInterval, m_PingIntervalSpin,
|
|
PING_INTERVAL_MIN, PING_INTERVAL_MAX, m_dwPingInterval);
|
|
SETUP_EDIT_SPIN(m_fDoEnableRapidFail, m_CrashesCount, m_CrashesCountSpin,
|
|
CRASHES_COUNT_MIN, CRASHES_COUNT_MAX, m_dwCrashesCount);
|
|
SETUP_EDIT_SPIN(m_fDoEnableRapidFail, m_CheckInterval, m_CheckIntervalSpin,
|
|
CHECK_INTERVAL_MIN, CHECK_INTERVAL_MAX, m_dwCheckInterval);
|
|
SETUP_SPIN(m_StartupLimitSpin,
|
|
STARTUP_LIMIT_MIN, STARTUP_LIMIT_MAX, m_dwStartupLimit);
|
|
SETUP_SPIN(m_ShutdownLimitSpin,
|
|
SHUTDOWN_LIMIT_MIN, SHUTDOWN_LIMIT_MAX, m_dwShutdownLimit);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void
|
|
CAppPoolHealth::OnDoEnablePinging()
|
|
{
|
|
m_fDoEnablePing = !m_fDoEnablePing;
|
|
m_bnt_DoEnablePing.SetCheck(m_fDoEnablePing);
|
|
m_PingInterval.EnableWindow(m_fDoEnablePing);
|
|
m_PingIntervalSpin.EnableWindow(m_fDoEnablePing);
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
void
|
|
CAppPoolHealth::OnDoEnableRapidFail()
|
|
{
|
|
m_fDoEnableRapidFail = !m_fDoEnableRapidFail;
|
|
m_btn_DoEnableRapidFail.SetCheck(m_fDoEnableRapidFail);
|
|
m_CrashesCount.EnableWindow(m_fDoEnableRapidFail);
|
|
m_CrashesCountSpin.EnableWindow(m_fDoEnableRapidFail);
|
|
m_CheckInterval.EnableWindow(m_fDoEnableRapidFail);
|
|
m_CheckIntervalSpin.EnableWindow(m_fDoEnableRapidFail);
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
void
|
|
CAppPoolHealth::OnItemChanged()
|
|
{
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
IMPLEMENT_DYNCREATE(CAppPoolDebug, CInetPropertyPage)
|
|
|
|
CAppPoolDebug::CAppPoolDebug(CInetPropertySheet * pSheet)
|
|
: CInetPropertyPage(CAppPoolDebug::IDD, pSheet),
|
|
m_fDoEnableDebug(TRUE)
|
|
{
|
|
}
|
|
|
|
CAppPoolDebug::~CAppPoolDebug()
|
|
{
|
|
}
|
|
|
|
/* virtual */
|
|
HRESULT
|
|
CAppPoolDebug::FetchLoadedValues()
|
|
{
|
|
CError err;
|
|
|
|
BEGIN_META_INST_READ(CAppPoolSheet)
|
|
FETCH_INST_DATA_FROM_SHEET(m_fDoEnableDebug);
|
|
FETCH_INST_DATA_FROM_SHEET(m_DebuggerFileName);
|
|
END_META_INST_READ(err)
|
|
|
|
return err;
|
|
}
|
|
|
|
/* virtual */
|
|
HRESULT
|
|
CAppPoolDebug::SaveInfo()
|
|
{
|
|
ASSERT(IsDirty());
|
|
CError err;
|
|
|
|
BEGIN_META_INST_WRITE(CAppPoolSheet)
|
|
STORE_INST_DATA_ON_SHEET(m_fDoEnableDebug);
|
|
STORE_INST_DATA_ON_SHEET(m_DebuggerFileName);
|
|
END_META_INST_WRITE(err)
|
|
|
|
return err;
|
|
}
|
|
|
|
void
|
|
CAppPoolDebug::DoDataExchange(CDataExchange * pDX)
|
|
{
|
|
CInetPropertyPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAppPoolHealth)
|
|
DDX_Check(pDX, IDC_ENABLE_DEBUG, m_fDoEnableDebug);
|
|
DDX_Control(pDX, IDC_ENABLE_DEBUG, m_bnt_DoEnableDebug);
|
|
DDX_Text(pDX, IDC_FILE_NAME, m_DebuggerFileName);
|
|
DDX_Control(pDX, IDC_FILE_NAME, m_FileName);
|
|
DDX_Control(pDX, IDC_BROWSE, m_Browse);
|
|
//}}AFX_DATA_MAP
|
|
if (pDX->m_bSaveAndValidate)
|
|
{
|
|
CError err;
|
|
if (!PathIsValid(m_DebuggerFileName))
|
|
{
|
|
::AfxMessageBox(IDS_ERR_BAD_PATH);
|
|
pDX->PrepareEditCtrl(IDC_FILE_NAME);
|
|
pDX->Fail();
|
|
}
|
|
else if (GetSheet()->IsLocal())
|
|
{
|
|
if (!PathFileExists(m_DebuggerFileName))
|
|
{
|
|
err = ERROR_FILE_NOT_FOUND;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CAppPoolDebug, CInetPropertyPage)
|
|
//{{AFX_MSG_MAP(CAppPoolHealth)
|
|
ON_BN_CLICKED(IDC_ENABLE_DEBUG, OnDoEnableDebug)
|
|
ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
|
|
ON_EN_CHANGE(IDC_FILE_NAME, OnItemChanged)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL
|
|
CAppPoolDebug::OnInitDialog()
|
|
{
|
|
CInetPropertyPage::OnInitDialog();
|
|
|
|
if (m_DebuggerFileName.IsEmpty())
|
|
m_fDoEnableDebug = FALSE;
|
|
|
|
SetControlState();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void
|
|
CAppPoolDebug::SetControlState()
|
|
{
|
|
m_bnt_DoEnableDebug.SetCheck(m_fDoEnableDebug);
|
|
m_FileName.EnableWindow(m_fDoEnableDebug);
|
|
m_Browse.EnableWindow(m_fDoEnableDebug);
|
|
}
|
|
|
|
void
|
|
CAppPoolDebug::OnItemChanged()
|
|
{
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
void
|
|
CAppPoolDebug::OnDoEnableDebug()
|
|
{
|
|
m_fDoEnableDebug = !m_fDoEnableDebug;
|
|
m_bnt_DoEnableDebug.SetCheck(m_fDoEnableDebug);
|
|
m_FileName.EnableWindow(m_fDoEnableDebug);
|
|
m_Browse.EnableWindow(m_fDoEnableDebug);
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
void
|
|
CAppPoolDebug::OnBrowse()
|
|
{
|
|
CString mask((LPCTSTR)IDS_DEBUG_EXEC_MASK);
|
|
|
|
//
|
|
// CODEWORK: Derive a class from CFileDialog that allows
|
|
// the setting of the initial path
|
|
//
|
|
|
|
//CString strPath;
|
|
//m_edit_Executable.GetWindowText(strPath);
|
|
|
|
CFileDialog dlgBrowse(
|
|
TRUE,
|
|
NULL,
|
|
NULL,
|
|
OFN_HIDEREADONLY,
|
|
mask,
|
|
this
|
|
);
|
|
// Disable hook to get Windows 2000 style dialog
|
|
dlgBrowse.m_ofn.Flags &= ~(OFN_ENABLEHOOK);
|
|
dlgBrowse.m_ofn.Flags |= OFN_DONTADDTORECENT|OFN_FILEMUSTEXIST;
|
|
|
|
if (dlgBrowse.DoModal() == IDOK)
|
|
{
|
|
m_FileName.SetWindowText(dlgBrowse.GetPathName());
|
|
}
|
|
|
|
OnItemChanged();
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
IMPLEMENT_DYNCREATE(CAppPoolIdent, CInetPropertyPage)
|
|
|
|
CAppPoolIdent::CAppPoolIdent(CInetPropertySheet * pSheet)
|
|
: CInetPropertyPage(CAppPoolIdent::IDD, pSheet),
|
|
m_fPredefined(FALSE)
|
|
{
|
|
}
|
|
|
|
CAppPoolIdent::~CAppPoolIdent()
|
|
{
|
|
}
|
|
|
|
/* virtual */
|
|
HRESULT
|
|
CAppPoolIdent::FetchLoadedValues()
|
|
{
|
|
CError err;
|
|
|
|
BEGIN_META_INST_READ(CAppPoolSheet)
|
|
FETCH_INST_DATA_FROM_SHEET(m_dwIdentType);
|
|
FETCH_INST_DATA_FROM_SHEET(m_strUserName);
|
|
FETCH_INST_DATA_FROM_SHEET(m_strUserPass);
|
|
END_META_INST_READ(err)
|
|
|
|
m_fPredefined = m_dwIdentType != IDENT_TYPE_CONFIGURABLE;
|
|
switch (m_dwIdentType)
|
|
{
|
|
case IDENT_TYPE_LOCALSYSTEM:
|
|
m_PredefIndex = 0;
|
|
break;
|
|
case IDENT_TYPE_LOCALSERVICE:
|
|
m_PredefIndex = 1;
|
|
break;
|
|
case IDENT_TYPE_NETWORKSERVICE:
|
|
m_PredefIndex = 2;
|
|
break;
|
|
default:
|
|
m_PredefIndex = -1;
|
|
break;
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
/* virtual */
|
|
HRESULT
|
|
CAppPoolIdent::SaveInfo()
|
|
{
|
|
ASSERT(IsDirty());
|
|
CError err;
|
|
|
|
BEGIN_META_INST_WRITE(CAppPoolSheet)
|
|
if (m_fPredefined)
|
|
{
|
|
m_dwIdentType = m_PredefIndex;
|
|
}
|
|
else
|
|
{
|
|
m_dwIdentType = IDENT_TYPE_CONFIGURABLE;
|
|
STORE_INST_DATA_ON_SHEET(m_strUserName);
|
|
STORE_INST_DATA_ON_SHEET(m_strUserPass);
|
|
}
|
|
STORE_INST_DATA_ON_SHEET(m_dwIdentType);
|
|
END_META_INST_WRITE(err)
|
|
|
|
return err;
|
|
}
|
|
|
|
void
|
|
CAppPoolIdent::SetControlState()
|
|
{
|
|
m_bnt_Predefined.SetCheck(m_fPredefined);
|
|
m_bnt_Configurable.SetCheck(!m_fPredefined);
|
|
m_PredefList.EnableWindow(m_fPredefined);
|
|
m_UserName.EnableWindow(!m_fPredefined);
|
|
m_UserPass.EnableWindow(!m_fPredefined);
|
|
m_Browse.EnableWindow(!m_fPredefined);
|
|
}
|
|
|
|
void
|
|
CAppPoolIdent::DoDataExchange(CDataExchange * pDX)
|
|
{
|
|
CInetPropertyPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAppPoolIdent)
|
|
DDX_Control(pDX, IDC_PREDEFINED, m_bnt_Predefined);
|
|
DDX_Control(pDX, IDC_CONFIGURABLE, m_bnt_Configurable);
|
|
DDX_CBIndex(pDX, IDC_SYSTEM_ACCOUNTS, m_PredefIndex);
|
|
DDX_Control(pDX, IDC_SYSTEM_ACCOUNTS, m_PredefList);
|
|
DDX_Text(pDX, IDC_USER_NAME, m_strUserName);
|
|
DDX_Control(pDX, IDC_USER_NAME, m_UserName);
|
|
DDX_Control(pDX, IDC_BROWSE, m_Browse);
|
|
DDX_Text(pDX, IDC_USER_PASS, m_strUserPass);
|
|
DDX_Control(pDX, IDC_USER_PASS, m_UserPass);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CAppPoolIdent, CInetPropertyPage)
|
|
//{{AFX_MSG_MAP(CAppPoolIdent)
|
|
ON_BN_CLICKED(IDC_PREDEFINED, OnPredefined)
|
|
ON_BN_CLICKED(IDC_CONFIGURABLE, OnPredefined)
|
|
ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
|
|
ON_EN_CHANGE(IDC_USER_NAME, OnItemChanged)
|
|
ON_EN_CHANGE(IDC_USER_PASS, OnItemChanged)
|
|
ON_CBN_SELCHANGE(IDC_SYSTEM_ACCOUNTS, OnItemChanged)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL
|
|
CAppPoolIdent::OnInitDialog()
|
|
{
|
|
CInetPropertyPage::OnInitDialog();
|
|
|
|
CString buf;
|
|
buf.LoadString(IDS_LOCALSYSTEM);
|
|
m_PredefList.AddString(buf);
|
|
buf.LoadString(IDS_LOCALSERVICE);
|
|
m_PredefList.AddString(buf);
|
|
buf.LoadString(IDS_NETSERVICE);
|
|
m_PredefList.AddString(buf);
|
|
if (!m_fPredefined)
|
|
{
|
|
m_PredefIndex = 0;
|
|
}
|
|
m_PredefList.SetCurSel(m_PredefIndex);
|
|
|
|
SetControlState();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void
|
|
CAppPoolIdent::OnPredefined()
|
|
{
|
|
m_fPredefined = !m_fPredefined;
|
|
SetControlState();
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
void
|
|
CAppPoolIdent::OnBrowse()
|
|
{
|
|
// User browser like in other places
|
|
CString user;
|
|
if (GetIUsrAccount(user))
|
|
{
|
|
if (user.CompareNoCase(m_strUserName) != 0)
|
|
{
|
|
m_strUserPass.Empty();
|
|
}
|
|
m_strUserName = user;
|
|
UpdateData(FALSE);
|
|
}
|
|
}
|
|
|
|
void
|
|
CAppPoolIdent::OnItemChanged()
|
|
{
|
|
SetModified(TRUE);
|
|
}
|