You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1841 lines
56 KiB
1841 lines
56 KiB
/*++
|
|
|
|
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_sheet.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 VMEMORY_MIN (int)1
|
|
#define VMEMORY_MAX (int)(2000000)
|
|
#define UMEMORY_MIN (int)1
|
|
#define UMEMORY_MAX (int)(2000000)
|
|
#define TIMEOUT_MIN (int)1
|
|
#define TIMEOUT_MAX (int)(4000000)
|
|
#define QUEUESIZE_MIN (int)0
|
|
#define QUEUESIZE_MAX (int)(65535)
|
|
#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)1
|
|
#define CPU_RESET_TIME_MAX (int)1440
|
|
|
|
#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 120
|
|
#define PERIODIC_RESTART_REQ_DEF 35000
|
|
#define VMEMORY_DEF 500 // In MB
|
|
#define UMEMORY_DEF 192 // In MB
|
|
#define IDLE_TIMEOUT_DEF 20
|
|
#define QUEUE_SIZE_DEF 2000
|
|
#define CPU_USE_DEF 100
|
|
#define CPU_RESET_TIME_DEF 5
|
|
#define ACTION_INDEX_DEF 0
|
|
#define MAX_PROCESSES_DEF 1
|
|
#define PING_INTERVAL_DEF 240
|
|
#define CRASHES_COUNT_DEF 5
|
|
#define CHECK_INTERVAL_DEF 5
|
|
#define STARTUP_LIMIT_DEF 90
|
|
#define SHUTDOWN_LIMIT_DEF 90
|
|
|
|
#define SLEEP_INTERVAL (500L)
|
|
//
|
|
// Maximum time to wait for service to attain desired state
|
|
//
|
|
#define MAX_SLEEP (180000) // For a service
|
|
#define MAX_SLEEP_POOL ( 30000) // For an instance
|
|
|
|
#define INIT_MEMBERS_DEF()\
|
|
m_dwPeriodicRestartTime(PERIODIC_RESTART_TIME_DEF),\
|
|
m_dwRestartRequestCount(PERIODIC_RESTART_REQ_DEF),\
|
|
m_dwPeriodicRestartVMemory(0),\
|
|
m_dwPeriodicRestartUMemory(0),\
|
|
m_dwIdleTimeout(IDLE_TIMEOUT_DEF),\
|
|
m_dwQueueSize(QUEUE_SIZE_DEF),\
|
|
m_dwMaxCPU_Use(CPU_USE_DEF * 1000),\
|
|
m_dwRefreshTime(0),\
|
|
m_ActionIndex(ACTION_INDEX_DEF),\
|
|
m_dwMaxProcesses(MAX_PROCESSES_DEF),\
|
|
m_dwPingInterval(PING_INTERVAL_DEF),\
|
|
m_dwCrashesCount(CRASHES_COUNT_DEF),\
|
|
m_dwCheckInterval(CHECK_INTERVAL_DEF),\
|
|
m_dwStartupLimit(STARTUP_LIMIT_DEF),\
|
|
m_dwShutdownLimit(SHUTDOWN_LIMIT_DEF),\
|
|
m_fDoEnablePing(TRUE),\
|
|
m_fDoEnableRapidFail(TRUE),\
|
|
m_dwIdentType(IDENT_TYPE_NETWORKSERVICE),\
|
|
m_dwState(MD_APPPOOL_STATE_STOPPED)
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAppPoolProps implementation
|
|
|
|
CAppPoolProps::CAppPoolProps(
|
|
CComAuthInfo * pAuthInfo, LPCTSTR meta_path, BOOL fInherit
|
|
)
|
|
: CMetaProperties(pAuthInfo, meta_path),
|
|
INIT_MEMBERS_DEF()
|
|
{
|
|
m_fInherit = fInherit;
|
|
}
|
|
|
|
CAppPoolProps::CAppPoolProps(
|
|
CMetaInterface * pInterface, LPCTSTR meta_path, BOOL fInherit
|
|
)
|
|
: CMetaProperties(pInterface, meta_path),
|
|
INIT_MEMBERS_DEF()
|
|
{
|
|
m_fInherit = fInherit;
|
|
}
|
|
|
|
CAppPoolProps::CAppPoolProps(
|
|
CMetaKey * pKey, LPCTSTR meta_path, BOOL fInherit
|
|
)
|
|
: CMetaProperties(pKey, meta_path),
|
|
INIT_MEMBERS_DEF()
|
|
{
|
|
m_fInherit = fInherit;
|
|
}
|
|
|
|
#define HANDLE_LOCAL_META_RECORD(id,v) \
|
|
case id: \
|
|
FetchMetaValue(pAllRecords, i, MP_V(v)); \
|
|
v.m_fDirty = (pAllRecords[i].dwMDAttributes & METADATA_ISINHERITED) == 0; \
|
|
break;
|
|
|
|
void
|
|
CAppPoolProps::ParseFields()
|
|
{
|
|
// m_AspMaxDiskTemplateCacheFiles = 0;
|
|
if (!m_fInherit)
|
|
{
|
|
// If we want only data defined on this node, we will set dirty flag for these props
|
|
BOOL f;
|
|
BEGIN_PARSE_META_RECORDS(m_dwNumEntries, m_pbMDData)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_TIME, m_dwPeriodicRestartTime)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_SCHEDULE, m_RestartSchedule)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_REQUEST_COUNT, m_dwRestartRequestCount)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_MEMORY, m_dwPeriodicRestartVMemory)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_PRIVATE_MEMORY, m_dwPeriodicRestartUMemory)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_IDLE_TIMEOUT, m_dwIdleTimeout)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_UL_APPPOOL_QUEUE_LENGTH, m_dwQueueSize)
|
|
HANDLE_LOCAL_META_RECORD(MD_CPU_RESET_INTERVAL, m_dwRefreshTime)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_MAX_PROCESS_COUNT, m_dwMaxProcesses)
|
|
HANDLE_LOCAL_META_RECORD(MD_CPU_LIMIT, m_dwMaxCPU_Use)
|
|
HANDLE_LOCAL_META_RECORD(MD_CPU_ACTION, m_ActionIndex)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_PINGING_ENABLED, m_fDoEnablePing)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_PING_INTERVAL, m_dwPingInterval)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_RAPID_FAIL_PROTECTION_ENABLED, m_fDoEnableRapidFail)
|
|
HANDLE_LOCAL_META_RECORD(MD_RAPID_FAIL_PROTECTION_MAX_CRASHES, m_dwCrashesCount)
|
|
HANDLE_LOCAL_META_RECORD(MD_RAPID_FAIL_PROTECTION_INTERVAL, m_dwCheckInterval)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_STARTUP_TIMELIMIT, m_dwStartupLimit)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_SHUTDOWN_TIMELIMIT, m_dwShutdownLimit)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_ORPHAN_PROCESSES_FOR_DEBUGGING, m_fDoEnableDebug)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_ORPHAN_ACTION_EXE, m_DebuggerFileName)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_ORPHAN_ACTION_PARAMS, m_DebuggerParams)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_IDENTITY_TYPE, m_dwIdentType)
|
|
HANDLE_LOCAL_META_RECORD(MD_WAM_USER_NAME, m_strUserName)
|
|
HANDLE_LOCAL_META_RECORD(MD_WAM_PWD, m_strUserPass)
|
|
HANDLE_LOCAL_META_RECORD(MD_APPPOOL_STATE, m_dwState)
|
|
HANDLE_LOCAL_META_RECORD(MD_WIN32_ERROR, m_dwWin32Error)
|
|
END_PARSE_META_RECORDS
|
|
}
|
|
else
|
|
{
|
|
BEGIN_PARSE_META_RECORDS(m_dwNumEntries, m_pbMDData)
|
|
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_dwPeriodicRestartVMemory)
|
|
HANDLE_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_PRIVATE_MEMORY, m_dwPeriodicRestartUMemory)
|
|
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_EXE, m_DebuggerFileName)
|
|
HANDLE_META_RECORD(MD_APPPOOL_ORPHAN_ACTION_PARAMS, m_DebuggerParams)
|
|
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)
|
|
HANDLE_META_RECORD(MD_APPPOOL_STATE, m_dwState)
|
|
HANDLE_META_RECORD(MD_WIN32_ERROR, m_dwWin32Error)
|
|
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_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_dwPeriodicRestartVMemory)
|
|
META_WRITE(MD_APPPOOL_PERIODIC_RESTART_PRIVATE_MEMORY, m_dwPeriodicRestartUMemory)
|
|
|
|
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_EXE, m_DebuggerFileName)
|
|
META_WRITE(MD_APPPOOL_ORPHAN_ACTION_PARAMS, m_DebuggerParams)
|
|
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::InitFromModel(CAppPoolProps& model)
|
|
{
|
|
m_dwPeriodicRestartTime = model.m_dwPeriodicRestartTime;
|
|
m_dwRestartRequestCount = model.m_dwRestartRequestCount;
|
|
m_dwPeriodicRestartVMemory = model.m_dwPeriodicRestartVMemory;
|
|
m_dwPeriodicRestartUMemory = model.m_dwPeriodicRestartUMemory;
|
|
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_DebuggerParams = model.m_DebuggerParams;
|
|
m_dwIdentType = model.m_dwIdentType;
|
|
m_strUserName = model.m_strUserName;
|
|
m_strUserPass = model.m_strUserPass;
|
|
}
|
|
|
|
HRESULT
|
|
CAppPoolProps::ChangeState(DWORD dwCommand)
|
|
/*++
|
|
|
|
Routine Description:
|
|
Change the state of the pool
|
|
|
|
Arguments:
|
|
DWORD dwCommand : Command
|
|
|
|
Return Value:
|
|
HRESULT
|
|
|
|
--*/
|
|
{
|
|
DWORD dwTargetState;
|
|
DWORD dwPendingState;
|
|
CError err;
|
|
|
|
switch(dwCommand)
|
|
{
|
|
case MD_APPPOOL_COMMAND_STOP:
|
|
dwTargetState = MD_APPPOOL_STATE_STOPPED;
|
|
dwPendingState = MD_APPPOOL_STATE_STOPPING;
|
|
break;
|
|
|
|
case MD_APPPOOL_COMMAND_START:
|
|
dwTargetState = MD_APPPOOL_STATE_STARTED;
|
|
dwPendingState = MD_APPPOOL_STATE_STARTING;
|
|
break;
|
|
|
|
default:
|
|
ASSERT_MSG("Invalid service state requested");
|
|
err = ERROR_INVALID_PARAMETER;
|
|
}
|
|
|
|
err = OpenForWriting(FALSE);
|
|
if (err.Succeeded())
|
|
{
|
|
m_dwWin32Error = 0;
|
|
err = SetValue(MD_WIN32_ERROR, m_dwWin32Error);
|
|
if (err.Succeeded())
|
|
{
|
|
err = SetValue(MD_APPPOOL_COMMAND, dwCommand);
|
|
}
|
|
Close();
|
|
}
|
|
|
|
if (err.Succeeded())
|
|
{
|
|
//
|
|
// Wait for the service to attain desired state, timeout
|
|
// after specified interval
|
|
//
|
|
DWORD dwSleepTotal = 0L;
|
|
DWORD dwOldState = m_dwState;
|
|
|
|
if (dwOldState == dwTargetState)
|
|
{
|
|
//
|
|
// Current state matches desired
|
|
// state already. ISM must be behind
|
|
// the times.
|
|
//
|
|
return err;
|
|
}
|
|
|
|
while (dwSleepTotal < MAX_SLEEP_POOL)
|
|
{
|
|
err = LoadData();
|
|
|
|
if (err.Failed())
|
|
{
|
|
break;
|
|
}
|
|
|
|
if ((m_dwState != dwPendingState && m_dwState != dwOldState)
|
|
|| m_dwWin32Error != ERROR_SUCCESS
|
|
)
|
|
{
|
|
//
|
|
// Done one way or another
|
|
//
|
|
if (m_dwState != dwTargetState)
|
|
{
|
|
//
|
|
// Did not achieve desired result. Something went
|
|
// wrong.
|
|
//
|
|
if (m_dwWin32Error)
|
|
{
|
|
err = m_dwWin32Error;
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Still pending...
|
|
//
|
|
::Sleep(SLEEP_INTERVAL);
|
|
|
|
dwSleepTotal += SLEEP_INTERVAL;
|
|
}
|
|
|
|
if (dwSleepTotal >= MAX_SLEEP_POOL)
|
|
{
|
|
//
|
|
// Timed out. If there is a real error in the metabase
|
|
// use it, otherwise use a generic timeout error
|
|
//
|
|
// err = m_dwWin32Error;
|
|
|
|
if (err.Succeeded())
|
|
{
|
|
err = ERROR_SERVICE_REQUEST_TIMEOUT;
|
|
}
|
|
}
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
IMPLEMENT_DYNAMIC(CAppPoolSheet, CInetPropertySheet)
|
|
|
|
CAppPoolSheet::CAppPoolSheet(
|
|
CComAuthInfo * pAuthInfo,
|
|
LPCTSTR lpszMetaPath,
|
|
CWnd * pParentWnd,
|
|
LPARAM lParam,
|
|
LPARAM lParamParent,
|
|
UINT iSelectPage
|
|
)
|
|
: CInetPropertySheet(
|
|
pAuthInfo, lpszMetaPath, pParentWnd, lParam, lParamParent, 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();
|
|
}
|
|
}
|
|
|
|
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(CAppPoolRecycle, CInetPropertyPage)
|
|
|
|
CAppPoolRecycle::CAppPoolRecycle(CInetPropertySheet * pSheet)
|
|
: CInetPropertyPage(CAppPoolRecycle::IDD, pSheet),
|
|
m_fDoRestartOnTime(FALSE),
|
|
m_dwPeriodicRestartTime(PERIODIC_RESTART_TIME_DEF),
|
|
m_fDoRestartOnCount(FALSE),
|
|
m_dwRestartRequestCount(PERIODIC_RESTART_REQ_DEF),
|
|
m_fDoRestartOnSchedule(FALSE),
|
|
m_fDoRestartOnVMemory(FALSE),
|
|
m_fDoRestartOnUMemory(FALSE),
|
|
m_dwPeriodicRestartVMemory(VMEMORY_DEF * 1024),
|
|
m_dwPeriodicRestartUMemory(UMEMORY_DEF * 1024)
|
|
{
|
|
}
|
|
|
|
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_dwPeriodicRestartVMemory);
|
|
FETCH_INST_DATA_FROM_SHEET(m_dwPeriodicRestartUMemory);
|
|
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_fDoRestartOnVMemory = m_dwPeriodicRestartVMemory != 0;
|
|
if (!m_fDoRestartOnVMemory)
|
|
{
|
|
m_dwPeriodicRestartVMemoryDisplay = VMEMORY_DEF;
|
|
}
|
|
else
|
|
{
|
|
m_dwPeriodicRestartVMemoryDisplay = m_dwPeriodicRestartVMemory / 1024;
|
|
}
|
|
m_fDoRestartOnUMemory = m_dwPeriodicRestartUMemory != 0;
|
|
if (!m_fDoRestartOnUMemory)
|
|
{
|
|
m_dwPeriodicRestartUMemoryDisplay = UMEMORY_DEF;
|
|
}
|
|
else
|
|
{
|
|
m_dwPeriodicRestartUMemoryDisplay = m_dwPeriodicRestartUMemory / 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)
|
|
{
|
|
CString buf;
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
buf = (LPCTSTR)m_lst_Schedule.GetItemDataPtr(i);
|
|
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_dwPeriodicRestartVMemory = m_dwPeriodicRestartVMemoryDisplay * 1024;
|
|
if (!m_fDoRestartOnVMemory)
|
|
m_dwPeriodicRestartVMemory = 0;
|
|
STORE_INST_DATA_ON_SHEET(m_dwPeriodicRestartVMemory)
|
|
m_dwPeriodicRestartUMemory = m_dwPeriodicRestartUMemoryDisplay * 1024;
|
|
if (!m_fDoRestartOnUMemory)
|
|
m_dwPeriodicRestartUMemory = 0;
|
|
STORE_INST_DATA_ON_SHEET(m_dwPeriodicRestartUMemory)
|
|
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);
|
|
// This Needs to come before DDX_Text which will try to put text big number into small number
|
|
DDV_MinMaxBalloon(pDX, IDC_TIMESPAN, TIMESPAN_MIN, TIMESPAN_MAX);
|
|
DDX_TextBalloon(pDX, IDC_TIMESPAN, m_dwPeriodicRestartTime);
|
|
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);
|
|
// This Needs to come before DDX_Text which will try to put text big number into small number
|
|
DDV_MinMaxBalloon(pDX, IDC_REQUEST_LIMIT, REQUESTS_MIN, REQUESTS_MAX);
|
|
DDX_TextBalloon(pDX, IDC_REQUEST_LIMIT, m_dwRestartRequestCount);
|
|
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_VMEMORY, m_fDoRestartOnVMemory);
|
|
DDX_Control(pDX, IDC_RECYCLE_VMEMORY, m_btn_DoRestartOnVMemory);
|
|
// This Needs to come before DDX_Text which will try to put text big number into small number
|
|
DDV_MinMaxBalloon(pDX, IDC_VMEMORY_LIMIT, VMEMORY_MIN, VMEMORY_MAX);
|
|
DDX_TextBalloon(pDX, IDC_VMEMORY_LIMIT, m_dwPeriodicRestartVMemoryDisplay);
|
|
DDX_Control(pDX, IDC_VMEMORY_LIMIT, m_VMemoryLimit);
|
|
DDX_Control(pDX, IDC_VMEMORY_SPIN, m_VMemoryLimitSpin);
|
|
|
|
DDX_Check(pDX, IDC_RECYCLE_UMEMORY, m_fDoRestartOnUMemory);
|
|
DDX_Control(pDX, IDC_RECYCLE_UMEMORY, m_btn_DoRestartOnUMemory);
|
|
// This Needs to come before DDX_Text which will try to put text big number into small number
|
|
DDV_MinMaxBalloon(pDX, IDC_UMEMORY_LIMIT, UMEMORY_MIN, UMEMORY_MAX);
|
|
DDX_TextBalloon(pDX, IDC_UMEMORY_LIMIT, m_dwPeriodicRestartUMemoryDisplay);
|
|
DDX_Control(pDX, IDC_UMEMORY_LIMIT, m_UMemoryLimit);
|
|
DDX_Control(pDX, IDC_UMEMORY_SPIN, m_UMemoryLimitSpin);
|
|
//}}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_VMEMORY, OnDoRestartOnVMemory)
|
|
ON_BN_CLICKED(IDC_RECYCLE_UMEMORY, OnDoRestartOnUMemory)
|
|
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_VMEMORY_LIMIT, OnItemChanged)
|
|
ON_EN_CHANGE(IDC_UMEMORY_LIMIT, OnItemChanged)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL
|
|
CAppPoolRecycle::OnInitDialog()
|
|
{
|
|
UDACCEL toAcc[3] = {{1, 1}, {3, 5}, {6, 10}};
|
|
|
|
CInetPropertyPage::OnInitDialog();
|
|
|
|
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_fDoRestartOnVMemory, m_VMemoryLimit, m_VMemoryLimitSpin,
|
|
VMEMORY_MIN, VMEMORY_MAX, m_dwPeriodicRestartVMemoryDisplay);
|
|
SETUP_EDIT_SPIN(m_fDoRestartOnUMemory, m_UMemoryLimit, m_UMemoryLimitSpin,
|
|
UMEMORY_MIN, UMEMORY_MAX, m_dwPeriodicRestartUMemoryDisplay);
|
|
|
|
POSITION pos = m_RestartSchedule.GetHeadPosition();
|
|
while (pos != NULL)
|
|
{
|
|
CString& str = m_RestartSchedule.GetNext(pos);
|
|
m_lst_Schedule.AddString(str);
|
|
}
|
|
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_VMemoryLimit.EnableWindow(m_fDoRestartOnVMemory);
|
|
m_VMemoryLimitSpin.EnableWindow(m_fDoRestartOnVMemory);
|
|
|
|
m_UMemoryLimit.EnableWindow(m_fDoRestartOnUMemory);
|
|
m_UMemoryLimitSpin.EnableWindow(m_fDoRestartOnUMemory);
|
|
|
|
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);
|
|
LPCTSTR p1 = (LPCTSTR)cmpi->itemData1;
|
|
LPCTSTR p2 = (LPCTSTR)cmpi->itemData2;
|
|
return StrCmp(p1, p2);
|
|
}
|
|
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)
|
|
{
|
|
LPCTSTR p = (LPCTSTR)di->itemData;
|
|
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, p, -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::OnDoRestartOnVMemory()
|
|
{
|
|
m_fDoRestartOnVMemory = !m_fDoRestartOnVMemory;
|
|
SetControlsState();
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
void
|
|
CAppPoolRecycle::OnDoRestartOnUMemory()
|
|
{
|
|
m_fDoRestartOnUMemory = !m_fDoRestartOnUMemory;
|
|
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;
|
|
TCHAR buf[6];
|
|
CTime tm = dlg.GetTime();
|
|
wsprintf(buf, _T("%02d:%02d"), tm.GetHour(), tm.GetMinute());
|
|
if ((idx = m_lst_Schedule.FindString(-1, buf)) == LB_ERR)
|
|
{
|
|
idx = m_lst_Schedule.AddString(StrDup(buf));
|
|
m_lst_Schedule.SetCurSel(idx);
|
|
m_btn_Edit.EnableWindow(idx != LB_ERR);
|
|
m_btn_Remove.EnableWindow(idx != LB_ERR);
|
|
SetModified(idx != LB_ERR);
|
|
}
|
|
m_lst_Schedule.SetCurSel(idx);
|
|
}
|
|
}
|
|
|
|
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();
|
|
CString ts = (LPCTSTR)m_lst_Schedule.GetItemDataPtr(idx);
|
|
// Looks like we have to init the struct properly
|
|
SYSTEMTIME tm;
|
|
::GetSystemTime(&tm);
|
|
int n = ts.Find(_T(':'));
|
|
int len = ts.GetLength();
|
|
tm.wMinute = (WORD)StrToInt(ts.Right(len - n - 1));
|
|
tm.wHour = (WORD)StrToInt(ts.Left(n));
|
|
tm.wSecond = 0;
|
|
dlg.SetTime(CTime(tm));
|
|
if (dlg.DoModal() == IDOK)
|
|
{
|
|
CTime time = dlg.GetTime();
|
|
TCHAR buf[6];
|
|
wsprintf(buf, _T("%02d:%02d"), time.GetHour(), time.GetMinute());
|
|
int idx2;
|
|
if ((idx2 = m_lst_Schedule.FindString(-1, buf)) == LB_ERR)
|
|
{
|
|
m_lst_Schedule.DeleteString(idx);
|
|
idx2 = m_lst_Schedule.AddString(StrDup(buf));
|
|
m_lst_Schedule.GetItemRect(idx2, &rc);
|
|
m_lst_Schedule.InvalidateRect(&rc, TRUE);
|
|
SetModified(TRUE);
|
|
}
|
|
m_lst_Schedule.SetCurSel(idx2);
|
|
}
|
|
}
|
|
|
|
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 * 1000),
|
|
m_dwRefreshTime(0),
|
|
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_fDoIdleShutdown = m_dwIdleTimeout != 0;
|
|
if (!m_fDoIdleShutdown)
|
|
{
|
|
m_dwIdleTimeout = IDLE_TIMEOUT_DEF;
|
|
}
|
|
m_fDoLimitQueue = m_dwQueueSize != (DWORD)65535;
|
|
if (!m_fDoLimitQueue)
|
|
{
|
|
m_dwQueueSize = QUEUE_SIZE_DEF;
|
|
}
|
|
m_fDoEnableCPUAccount = m_dwMaxCPU_Use > 0 /*&& m_dwRefreshTime > 0*/;
|
|
if (!m_fDoEnableCPUAccount)
|
|
{
|
|
m_dwMaxCPU_UseVisual = CPU_USE_DEF;
|
|
m_dwRefreshTime = CPU_RESET_TIME_DEF;
|
|
m_ActionIndex = ACTION_INDEX_DEF;
|
|
}
|
|
else
|
|
{
|
|
m_dwMaxCPU_UseVisual = m_dwMaxCPU_Use / 1000;
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
/* virtual */
|
|
HRESULT
|
|
CAppPoolPerf::SaveInfo()
|
|
{
|
|
ASSERT(IsDirty());
|
|
CError err;
|
|
|
|
m_dwMaxCPU_Use = m_dwMaxCPU_UseVisual * 1000;
|
|
|
|
DWORD t = m_dwIdleTimeout;
|
|
DWORD q = m_dwQueueSize;
|
|
DWORD r = m_dwRefreshTime;
|
|
|
|
BEGIN_META_INST_WRITE(CAppPoolSheet)
|
|
if (!m_fDoIdleShutdown)
|
|
{
|
|
m_dwIdleTimeout = 0;
|
|
}
|
|
if (!m_fDoLimitQueue)
|
|
{
|
|
m_dwQueueSize = (DWORD)65535;
|
|
}
|
|
if (!m_fDoEnableCPUAccount)
|
|
{
|
|
// m_dwRefreshTime = 0;
|
|
m_dwMaxCPU_Use = 0;
|
|
}
|
|
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)
|
|
|
|
m_dwQueueSize = q;
|
|
m_dwIdleTimeout = t;
|
|
m_dwRefreshTime = r;
|
|
|
|
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);
|
|
// This Needs to come before DDX_Text which will try to put text big number into small number
|
|
DDV_MinMaxBalloon(pDX, IDC_IDLETIME, TIMEOUT_MIN, TIMEOUT_MAX);
|
|
DDX_TextBalloon(pDX, IDC_IDLETIME, m_dwIdleTimeout);
|
|
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);
|
|
// This Needs to come before DDX_Text which will try to put text big number into small number
|
|
DDV_MinMaxBalloon(pDX, IDC_QUEUESIZE, QUEUESIZE_MIN, QUEUESIZE_MAX);
|
|
DDX_TextBalloon(pDX, IDC_QUEUESIZE, m_dwQueueSize);
|
|
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);
|
|
// This Needs to come before DDX_Text which will try to put text big number into small number
|
|
DDV_MinMaxBalloon(pDX, IDC_CPU_USE, CPU_LIMIT_MIN, CPU_LIMIT_MAX);
|
|
DDX_TextBalloon(pDX, IDC_CPU_USE, m_dwMaxCPU_UseVisual);
|
|
DDX_Control(pDX, IDC_CPU_USE, m_MaxCPU_Use);
|
|
DDX_Control(pDX, IDC_CPU_USE_SPIN, m_MaxCPU_UseSpin);
|
|
// This Needs to come before DDX_Text which will try to put text big number into small number
|
|
DDV_MinMaxBalloon(pDX, IDC_REFRESHTIME, CPU_RESET_TIME_MIN, CPU_RESET_TIME_MAX);
|
|
DDX_TextBalloon(pDX, IDC_REFRESHTIME, m_dwRefreshTime);
|
|
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);
|
|
|
|
// This Needs to come before DDX_Text which will try to put text big number into small number
|
|
DDV_MinMaxBalloon(pDX, IDC_MAXPROCESSES, MAXPROCESSES_MIN, MAXPROCESSES_MAX);
|
|
DDX_TextBalloon(pDX, IDC_MAXPROCESSES, m_dwMaxProcesses);
|
|
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);
|
|
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 > 1)
|
|
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(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)
|
|
{
|
|
}
|
|
|
|
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);
|
|
// This Needs to come before DDX_Text which will try to put text big number into small number
|
|
DDV_MinMaxBalloon(pDX, IDC_PINGINTERVAL, PING_INTERVAL_MIN, PING_INTERVAL_MAX);
|
|
DDX_TextBalloon(pDX, IDC_PINGINTERVAL, m_dwPingInterval);
|
|
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);
|
|
// This Needs to come before DDX_Text which will try to put text big number into small number
|
|
DDV_MinMaxBalloon(pDX, IDC_CRASHES_COUNT, CRASHES_COUNT_MIN, CRASHES_COUNT_MAX);
|
|
DDX_TextBalloon(pDX, IDC_CRASHES_COUNT, m_dwCrashesCount);
|
|
DDX_Control(pDX, IDC_CRASHES_COUNT, m_CrashesCount);
|
|
DDX_Control(pDX, IDC_CRASHES_COUNT_SPIN, m_CrashesCountSpin);
|
|
// This Needs to come before DDX_Text which will try to put text big number into small number
|
|
DDV_MinMaxBalloon(pDX, IDC_CHECK_TIME, CHECK_INTERVAL_MIN, CHECK_INTERVAL_MAX);
|
|
DDX_TextBalloon(pDX, IDC_CHECK_TIME, m_dwCheckInterval);
|
|
DDX_Control(pDX, IDC_CHECK_TIME, m_CheckInterval);
|
|
DDX_Control(pDX, IDC_CHECK_TIME_SPIN, m_CheckIntervalSpin);
|
|
|
|
// This Needs to come before DDX_Text which will try to put text big number into small number
|
|
DDV_MinMaxBalloon(pDX, IDC_STARTUP_LIMIT, STARTUP_LIMIT_MIN, STARTUP_LIMIT_MAX);
|
|
DDX_TextBalloon(pDX, IDC_STARTUP_LIMIT, m_dwStartupLimit);
|
|
DDX_Control(pDX, IDC_STARTUP_LIMIT, m_StartupLimit);
|
|
DDX_Control(pDX, IDC_STARTUP_LIMIT_SPIN, m_StartupLimitSpin);
|
|
|
|
// This Needs to come before DDX_Text which will try to put text big number into small number
|
|
DDV_MinMaxBalloon(pDX, IDC_SHUTDOWN_LIMIT, SHUTDOWN_LIMIT_MIN, SHUTDOWN_LIMIT_MAX);
|
|
DDX_TextBalloon(pDX, IDC_SHUTDOWN_LIMIT, m_dwShutdownLimit);
|
|
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);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
#if 0
|
|
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);
|
|
FETCH_INST_DATA_FROM_SHEET(m_DebuggerParams);
|
|
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);
|
|
STORE_INST_DATA_ON_SHEET(m_DebuggerParams);
|
|
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_Control(pDX, IDC_FILE_NAME, m_FileName);
|
|
DDX_Control(pDX, IDC_BROWSE, m_Browse);
|
|
DDX_Text(pDX, IDC_PARAMETERS, m_DebuggerParams);
|
|
DDX_Control(pDX, IDC_PARAMETERS, m_Params);
|
|
//}}AFX_DATA_MAP
|
|
DDX_Text(pDX, IDC_FILE_NAME, m_DebuggerFileName);
|
|
if (pDX->m_bSaveAndValidate && m_fDoEnableDebug)
|
|
{
|
|
DDV_FilePath(pDX, m_DebuggerFileName, GetSheet()->IsLocal());
|
|
}
|
|
}
|
|
|
|
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)
|
|
ON_EN_CHANGE(IDC_PARAMETERS, OnItemChanged)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL
|
|
CAppPoolDebug::OnInitDialog()
|
|
{
|
|
CInetPropertyPage::OnInitDialog();
|
|
|
|
if (m_DebuggerFileName.IsEmpty())
|
|
m_fDoEnableDebug = FALSE;
|
|
|
|
SetControlState();
|
|
#ifdef SUPPORT_SLASH_SLASH_QUESTIONMARK_SLASH_TYPE_PATHS
|
|
LimitInputPath(CONTROL_HWND(IDC_FILE_NAME),TRUE);
|
|
#else
|
|
LimitInputPath(CONTROL_HWND(IDC_FILE_NAME),FALSE);
|
|
#endif
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void
|
|
CAppPoolDebug::SetControlState()
|
|
{
|
|
m_bnt_DoEnableDebug.SetCheck(m_fDoEnableDebug);
|
|
m_FileName.EnableWindow(m_fDoEnableDebug);
|
|
m_Browse.EnableWindow(GetSheet()->IsLocal() && m_fDoEnableDebug);
|
|
m_Params.EnableWindow(m_fDoEnableDebug);
|
|
}
|
|
|
|
void
|
|
CAppPoolDebug::OnItemChanged()
|
|
{
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
void
|
|
CAppPoolDebug::OnDoEnableDebug()
|
|
{
|
|
m_fDoEnableDebug = !m_fDoEnableDebug;
|
|
SetControlState();
|
|
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();
|
|
}
|
|
#endif
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#define LOCAL_SYSTEM_IDX 2
|
|
#define LOCAL_SERVICE_IDX 1
|
|
#define NETWORK_SERVICE_IDX 0
|
|
|
|
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_PASSWORD(m_strUserPass);
|
|
END_META_INST_READ(err)
|
|
|
|
m_fPredefined = m_dwIdentType != IDENT_TYPE_CONFIGURABLE;
|
|
switch (m_dwIdentType)
|
|
{
|
|
case IDENT_TYPE_LOCALSYSTEM:
|
|
m_PredefIndex = LOCAL_SYSTEM_IDX;
|
|
break;
|
|
case IDENT_TYPE_LOCALSERVICE:
|
|
m_PredefIndex = LOCAL_SERVICE_IDX;
|
|
break;
|
|
case IDENT_TYPE_NETWORKSERVICE:
|
|
m_PredefIndex = NETWORK_SERVICE_IDX;
|
|
break;
|
|
default:
|
|
m_PredefIndex = -1;
|
|
break;
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
/* virtual */
|
|
HRESULT
|
|
CAppPoolIdent::SaveInfo()
|
|
{
|
|
ASSERT(IsDirty());
|
|
CError err;
|
|
|
|
BEGIN_META_INST_WRITE(CAppPoolSheet)
|
|
if (m_fPredefined)
|
|
{
|
|
switch (m_PredefIndex)
|
|
{
|
|
case LOCAL_SYSTEM_IDX:
|
|
m_dwIdentType = IDENT_TYPE_LOCALSYSTEM;
|
|
break;
|
|
case LOCAL_SERVICE_IDX:
|
|
m_dwIdentType = IDENT_TYPE_LOCALSERVICE;
|
|
break;
|
|
case NETWORK_SERVICE_IDX:
|
|
m_dwIdentType = IDENT_TYPE_NETWORKSERVICE;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
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_Password(pDX, IDC_USER_PASS, m_strUserPass, _T("***********"));
|
|
DDX_Password_SecuredString(pDX, IDC_USER_PASS, m_strUserPass, _T("***********"));
|
|
DDX_Control(pDX, IDC_USER_PASS, m_UserPass);
|
|
//}}AFX_DATA_MAP
|
|
if (pDX->m_bSaveAndValidate
|
|
&& m_fPredefined
|
|
&& m_PredefIndex == LOCAL_SYSTEM_IDX
|
|
&& !m_bAssCovered
|
|
)
|
|
{
|
|
if (IsDirty())
|
|
{
|
|
if (!NoYesMessageBox(IDS_SYSIDENT_CONFIRM))
|
|
{
|
|
m_PredefList.SetFocus();
|
|
pDX->Fail();
|
|
}
|
|
m_bAssCovered = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
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, OnSysAccountChanged)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL
|
|
CAppPoolIdent::OnInitDialog()
|
|
{
|
|
CInetPropertyPage::OnInitDialog();
|
|
|
|
CString buf;
|
|
buf.LoadString(IDS_NETSERVICE);
|
|
m_PredefList.AddString(buf);
|
|
buf.LoadString(IDS_LOCALSERVICE);
|
|
m_PredefList.AddString(buf);
|
|
buf.LoadString(IDS_LOCALSYSTEM);
|
|
m_PredefList.AddString(buf);
|
|
if (!m_fPredefined)
|
|
{
|
|
m_PredefIndex = 0;
|
|
}
|
|
m_PredefList.SetCurSel(m_PredefIndex);
|
|
|
|
SetControlState();
|
|
m_bAssCovered = FALSE;
|
|
|
|
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;
|
|
SetModified(TRUE);
|
|
UpdateData(FALSE);
|
|
}
|
|
}
|
|
|
|
void
|
|
CAppPoolIdent::OnItemChanged()
|
|
{
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
void
|
|
CAppPoolIdent::OnSysAccountChanged()
|
|
{
|
|
SetModified(TRUE);
|
|
}
|
|
#if 0
|
|
HRESULT
|
|
CAppPoolCache::FetchLoadedValues()
|
|
{
|
|
CError err;
|
|
|
|
BEGIN_META_INST_READ(CAppPoolSheet)
|
|
FETCH_INST_DATA_FROM_SHEET(m_ScriptEngCacheMax);
|
|
FETCH_INST_DATA_FROM_SHEET(m_NoCache);
|
|
FETCH_INST_DATA_FROM_SHEET(m_LimCache);
|
|
FETCH_INST_DATA_FROM_SHEET(m_UnlimCache);
|
|
FETCH_INST_DATA_FROM_SHEET(m_LimDiskCache);
|
|
FETCH_INST_DATA_FROM_SHEET(m_LimCacheMemSize);
|
|
FETCH_INST_DATA_FROM_SHEET(m_LimCacheDiskSize);
|
|
FETCH_INST_DATA_FROM_SHEET(m_DiskCacheDir);
|
|
END_META_INST_READ(err)
|
|
|
|
return err;
|
|
}
|
|
|
|
HRESULT
|
|
CAppPoolCache::SaveInfo()
|
|
{
|
|
ASSERT(IsDirty());
|
|
CError err;
|
|
|
|
BEGIN_META_INST_WRITE(CAppPoolSheet)
|
|
STORE_INST_DATA_ON_SHEET(m_ScriptEngCacheMax)
|
|
STORE_INST_DATA_ON_SHEET(m_NoCache);
|
|
STORE_INST_DATA_ON_SHEET(m_LimCache);
|
|
STORE_INST_DATA_ON_SHEET(m_UnlimCache);
|
|
STORE_INST_DATA_ON_SHEET(m_LimDiskCache);
|
|
STORE_INST_DATA_ON_SHEET(m_LimCacheMemSize);
|
|
STORE_INST_DATA_ON_SHEET(m_LimCacheDiskSize);
|
|
STORE_INST_DATA_ON_SHEET(m_DiskCacheDir);
|
|
END_META_INST_WRITE(err)
|
|
|
|
return err;
|
|
}
|
|
|
|
HRESULT
|
|
CPoolProcessOpt::FetchLoadedValues()
|
|
{
|
|
CError err;
|
|
|
|
BEGIN_META_INST_READ(CAppPoolSheet)
|
|
FETCH_INST_DATA_FROM_SHEET(m_LogFailures);
|
|
FETCH_INST_DATA_FROM_SHEET(m_DebugExcept);
|
|
FETCH_INST_DATA_FROM_SHEET(m_CgiTimeout);
|
|
FETCH_INST_DATA_FROM_SHEET(m_HTMLFallback);
|
|
END_META_INST_READ(err)
|
|
|
|
return err;
|
|
}
|
|
|
|
HRESULT
|
|
CPoolProcessOpt::SaveInfo()
|
|
{
|
|
ASSERT(IsDirty());
|
|
CError err;
|
|
|
|
BEGIN_META_INST_WRITE(CAppPoolSheet)
|
|
STORE_INST_DATA_ON_SHEET(m_LogFailures);
|
|
STORE_INST_DATA_ON_SHEET(m_DebugExcept);
|
|
STORE_INST_DATA_ON_SHEET(m_CgiTimeout);
|
|
STORE_INST_DATA_ON_SHEET(m_HTMLFallback);
|
|
END_META_INST_WRITE(err)
|
|
|
|
return err;
|
|
}
|
|
#endif
|