Leaked source code of windows server 2003
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.

1840 lines
56 KiB

  1. /*++
  2. Copyright (c) 1994-2000 Microsoft Corporation
  3. Module Name :
  4. app_pool_sheet.cpp
  5. Abstract:
  6. Application Pools Property Sheet and Pages
  7. Author:
  8. Sergei Antonov (sergeia)
  9. Project:
  10. Internet Services Manager
  11. Revision History:
  12. 11/16/2000 sergeia Initial creation
  13. --*/
  14. //
  15. // Include Files
  16. //
  17. #include "stdafx.h"
  18. #include "common.h"
  19. #include "inetprop.h"
  20. #include "InetMgrApp.h"
  21. #include "shts.h"
  22. #include "iisobj.h"
  23. #include "app_sheet.h"
  24. #include "app_pool_sheet.h"
  25. #ifdef _DEBUG
  26. #undef THIS_FILE
  27. static char BASED_CODE THIS_FILE[] = __FILE__;
  28. #endif
  29. #define new DEBUG_NEW
  30. #define TIMESPAN_MIN (int)1
  31. #define TIMESPAN_MAX (int)(4000000)
  32. #define REQUESTS_MIN (int)1
  33. #define REQUESTS_MAX (int)(4000000)
  34. #define VMEMORY_MIN (int)1
  35. #define VMEMORY_MAX (int)(2000000)
  36. #define UMEMORY_MIN (int)1
  37. #define UMEMORY_MAX (int)(2000000)
  38. #define TIMEOUT_MIN (int)1
  39. #define TIMEOUT_MAX (int)(4000000)
  40. #define QUEUESIZE_MIN (int)0
  41. #define QUEUESIZE_MAX (int)(65535)
  42. #define REFRESH_TIME_MIN (int)1
  43. #define REFRESH_TIME_MAX (int)(4000000)
  44. #define MAXPROCESSES_MIN (int)1
  45. #define MAXPROCESSES_MAX (int)(4000000)
  46. #define PING_INTERVAL_MIN (int)1
  47. #define PING_INTERVAL_MAX (int)(4000000)
  48. #define CRASHES_COUNT_MIN (int)1
  49. #define CRASHES_COUNT_MAX (int)(4000000)
  50. #define CHECK_INTERVAL_MIN (int)1
  51. #define CHECK_INTERVAL_MAX (int)(4000000)
  52. #define STARTUP_LIMIT_MIN (int)1
  53. #define STARTUP_LIMIT_MAX (int)(4000000)
  54. #define SHUTDOWN_LIMIT_MIN (int)1
  55. #define SHUTDOWN_LIMIT_MAX (int)(4000000)
  56. #define CPU_LIMIT_MIN (int)0
  57. #define CPU_LIMIT_MAX (int)100
  58. #define CPU_RESET_TIME_MIN (int)1
  59. #define CPU_RESET_TIME_MAX (int)1440
  60. #define IDENT_TYPE_LOCALSYSTEM 0
  61. #define IDENT_TYPE_LOCALSERVICE 1
  62. #define IDENT_TYPE_NETWORKSERVICE 2
  63. #define IDENT_TYPE_CONFIGURABLE 3
  64. #define PERIODIC_RESTART_TIME_DEF 120
  65. #define PERIODIC_RESTART_REQ_DEF 35000
  66. #define VMEMORY_DEF 500 // In MB
  67. #define UMEMORY_DEF 192 // In MB
  68. #define IDLE_TIMEOUT_DEF 20
  69. #define QUEUE_SIZE_DEF 2000
  70. #define CPU_USE_DEF 100
  71. #define CPU_RESET_TIME_DEF 5
  72. #define ACTION_INDEX_DEF 0
  73. #define MAX_PROCESSES_DEF 1
  74. #define PING_INTERVAL_DEF 240
  75. #define CRASHES_COUNT_DEF 5
  76. #define CHECK_INTERVAL_DEF 5
  77. #define STARTUP_LIMIT_DEF 90
  78. #define SHUTDOWN_LIMIT_DEF 90
  79. #define SLEEP_INTERVAL (500L)
  80. //
  81. // Maximum time to wait for service to attain desired state
  82. //
  83. #define MAX_SLEEP (180000) // For a service
  84. #define MAX_SLEEP_POOL ( 30000) // For an instance
  85. #define INIT_MEMBERS_DEF()\
  86. m_dwPeriodicRestartTime(PERIODIC_RESTART_TIME_DEF),\
  87. m_dwRestartRequestCount(PERIODIC_RESTART_REQ_DEF),\
  88. m_dwPeriodicRestartVMemory(0),\
  89. m_dwPeriodicRestartUMemory(0),\
  90. m_dwIdleTimeout(IDLE_TIMEOUT_DEF),\
  91. m_dwQueueSize(QUEUE_SIZE_DEF),\
  92. m_dwMaxCPU_Use(CPU_USE_DEF * 1000),\
  93. m_dwRefreshTime(0),\
  94. m_ActionIndex(ACTION_INDEX_DEF),\
  95. m_dwMaxProcesses(MAX_PROCESSES_DEF),\
  96. m_dwPingInterval(PING_INTERVAL_DEF),\
  97. m_dwCrashesCount(CRASHES_COUNT_DEF),\
  98. m_dwCheckInterval(CHECK_INTERVAL_DEF),\
  99. m_dwStartupLimit(STARTUP_LIMIT_DEF),\
  100. m_dwShutdownLimit(SHUTDOWN_LIMIT_DEF),\
  101. m_fDoEnablePing(TRUE),\
  102. m_fDoEnableRapidFail(TRUE),\
  103. m_dwIdentType(IDENT_TYPE_NETWORKSERVICE),\
  104. m_dwState(MD_APPPOOL_STATE_STOPPED)
  105. /////////////////////////////////////////////////////////////////////////////
  106. // CAppPoolProps implementation
  107. CAppPoolProps::CAppPoolProps(
  108. CComAuthInfo * pAuthInfo, LPCTSTR meta_path, BOOL fInherit
  109. )
  110. : CMetaProperties(pAuthInfo, meta_path),
  111. INIT_MEMBERS_DEF()
  112. {
  113. m_fInherit = fInherit;
  114. }
  115. CAppPoolProps::CAppPoolProps(
  116. CMetaInterface * pInterface, LPCTSTR meta_path, BOOL fInherit
  117. )
  118. : CMetaProperties(pInterface, meta_path),
  119. INIT_MEMBERS_DEF()
  120. {
  121. m_fInherit = fInherit;
  122. }
  123. CAppPoolProps::CAppPoolProps(
  124. CMetaKey * pKey, LPCTSTR meta_path, BOOL fInherit
  125. )
  126. : CMetaProperties(pKey, meta_path),
  127. INIT_MEMBERS_DEF()
  128. {
  129. m_fInherit = fInherit;
  130. }
  131. #define HANDLE_LOCAL_META_RECORD(id,v) \
  132. case id: \
  133. FetchMetaValue(pAllRecords, i, MP_V(v)); \
  134. v.m_fDirty = (pAllRecords[i].dwMDAttributes & METADATA_ISINHERITED) == 0; \
  135. break;
  136. void
  137. CAppPoolProps::ParseFields()
  138. {
  139. // m_AspMaxDiskTemplateCacheFiles = 0;
  140. if (!m_fInherit)
  141. {
  142. // If we want only data defined on this node, we will set dirty flag for these props
  143. BOOL f;
  144. BEGIN_PARSE_META_RECORDS(m_dwNumEntries, m_pbMDData)
  145. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_TIME, m_dwPeriodicRestartTime)
  146. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_SCHEDULE, m_RestartSchedule)
  147. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_REQUEST_COUNT, m_dwRestartRequestCount)
  148. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_MEMORY, m_dwPeriodicRestartVMemory)
  149. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_PRIVATE_MEMORY, m_dwPeriodicRestartUMemory)
  150. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_IDLE_TIMEOUT, m_dwIdleTimeout)
  151. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_UL_APPPOOL_QUEUE_LENGTH, m_dwQueueSize)
  152. HANDLE_LOCAL_META_RECORD(MD_CPU_RESET_INTERVAL, m_dwRefreshTime)
  153. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_MAX_PROCESS_COUNT, m_dwMaxProcesses)
  154. HANDLE_LOCAL_META_RECORD(MD_CPU_LIMIT, m_dwMaxCPU_Use)
  155. HANDLE_LOCAL_META_RECORD(MD_CPU_ACTION, m_ActionIndex)
  156. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_PINGING_ENABLED, m_fDoEnablePing)
  157. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_PING_INTERVAL, m_dwPingInterval)
  158. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_RAPID_FAIL_PROTECTION_ENABLED, m_fDoEnableRapidFail)
  159. HANDLE_LOCAL_META_RECORD(MD_RAPID_FAIL_PROTECTION_MAX_CRASHES, m_dwCrashesCount)
  160. HANDLE_LOCAL_META_RECORD(MD_RAPID_FAIL_PROTECTION_INTERVAL, m_dwCheckInterval)
  161. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_STARTUP_TIMELIMIT, m_dwStartupLimit)
  162. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_SHUTDOWN_TIMELIMIT, m_dwShutdownLimit)
  163. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_ORPHAN_PROCESSES_FOR_DEBUGGING, m_fDoEnableDebug)
  164. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_ORPHAN_ACTION_EXE, m_DebuggerFileName)
  165. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_ORPHAN_ACTION_PARAMS, m_DebuggerParams)
  166. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_IDENTITY_TYPE, m_dwIdentType)
  167. HANDLE_LOCAL_META_RECORD(MD_WAM_USER_NAME, m_strUserName)
  168. HANDLE_LOCAL_META_RECORD(MD_WAM_PWD, m_strUserPass)
  169. HANDLE_LOCAL_META_RECORD(MD_APPPOOL_STATE, m_dwState)
  170. HANDLE_LOCAL_META_RECORD(MD_WIN32_ERROR, m_dwWin32Error)
  171. END_PARSE_META_RECORDS
  172. }
  173. else
  174. {
  175. BEGIN_PARSE_META_RECORDS(m_dwNumEntries, m_pbMDData)
  176. HANDLE_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_TIME, m_dwPeriodicRestartTime)
  177. HANDLE_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_SCHEDULE, m_RestartSchedule)
  178. HANDLE_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_REQUEST_COUNT, m_dwRestartRequestCount)
  179. HANDLE_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_MEMORY, m_dwPeriodicRestartVMemory)
  180. HANDLE_META_RECORD(MD_APPPOOL_PERIODIC_RESTART_PRIVATE_MEMORY, m_dwPeriodicRestartUMemory)
  181. HANDLE_META_RECORD(MD_APPPOOL_IDLE_TIMEOUT, m_dwIdleTimeout)
  182. HANDLE_META_RECORD(MD_APPPOOL_UL_APPPOOL_QUEUE_LENGTH, m_dwQueueSize)
  183. HANDLE_META_RECORD(MD_CPU_RESET_INTERVAL, m_dwRefreshTime)
  184. HANDLE_META_RECORD(MD_APPPOOL_MAX_PROCESS_COUNT, m_dwMaxProcesses)
  185. HANDLE_META_RECORD(MD_CPU_LIMIT, m_dwMaxCPU_Use)
  186. HANDLE_META_RECORD(MD_CPU_ACTION, m_ActionIndex)
  187. HANDLE_META_RECORD(MD_APPPOOL_PINGING_ENABLED, m_fDoEnablePing)
  188. HANDLE_META_RECORD(MD_APPPOOL_PING_INTERVAL, m_dwPingInterval)
  189. HANDLE_META_RECORD(MD_APPPOOL_RAPID_FAIL_PROTECTION_ENABLED, m_fDoEnableRapidFail)
  190. HANDLE_META_RECORD(MD_RAPID_FAIL_PROTECTION_MAX_CRASHES, m_dwCrashesCount)
  191. HANDLE_META_RECORD(MD_RAPID_FAIL_PROTECTION_INTERVAL, m_dwCheckInterval)
  192. HANDLE_META_RECORD(MD_APPPOOL_STARTUP_TIMELIMIT, m_dwStartupLimit)
  193. HANDLE_META_RECORD(MD_APPPOOL_SHUTDOWN_TIMELIMIT, m_dwShutdownLimit)
  194. HANDLE_META_RECORD(MD_APPPOOL_ORPHAN_PROCESSES_FOR_DEBUGGING, m_fDoEnableDebug)
  195. HANDLE_META_RECORD(MD_APPPOOL_ORPHAN_ACTION_EXE, m_DebuggerFileName)
  196. HANDLE_META_RECORD(MD_APPPOOL_ORPHAN_ACTION_PARAMS, m_DebuggerParams)
  197. HANDLE_META_RECORD(MD_APPPOOL_IDENTITY_TYPE, m_dwIdentType)
  198. HANDLE_META_RECORD(MD_WAM_USER_NAME, m_strUserName)
  199. HANDLE_META_RECORD(MD_WAM_PWD, m_strUserPass)
  200. HANDLE_META_RECORD(MD_APPPOOL_STATE, m_dwState)
  201. HANDLE_META_RECORD(MD_WIN32_ERROR, m_dwWin32Error)
  202. END_PARSE_META_RECORDS
  203. }
  204. }
  205. /* virtual */
  206. HRESULT
  207. CAppPoolProps::WriteDirtyProps()
  208. /*++
  209. Routine Description:
  210. Write the dirty properties to the metabase
  211. Arguments:
  212. None
  213. Return Value:
  214. HRESULT
  215. --*/
  216. {
  217. CError err;
  218. BEGIN_META_WRITE()
  219. META_WRITE(MD_APPPOOL_PERIODIC_RESTART_TIME, m_dwPeriodicRestartTime)
  220. META_WRITE(MD_APPPOOL_PERIODIC_RESTART_SCHEDULE, m_RestartSchedule)
  221. META_WRITE(MD_APPPOOL_PERIODIC_RESTART_REQUEST_COUNT, m_dwRestartRequestCount)
  222. META_WRITE(MD_APPPOOL_PERIODIC_RESTART_MEMORY, m_dwPeriodicRestartVMemory)
  223. META_WRITE(MD_APPPOOL_PERIODIC_RESTART_PRIVATE_MEMORY, m_dwPeriodicRestartUMemory)
  224. META_WRITE(MD_APPPOOL_IDLE_TIMEOUT, m_dwIdleTimeout)
  225. META_WRITE(MD_APPPOOL_UL_APPPOOL_QUEUE_LENGTH, m_dwQueueSize)
  226. META_WRITE(MD_CPU_RESET_INTERVAL, m_dwRefreshTime)
  227. META_WRITE(MD_APPPOOL_MAX_PROCESS_COUNT, m_dwMaxProcesses)
  228. META_WRITE(MD_CPU_LIMIT, m_dwMaxCPU_Use)
  229. META_WRITE(MD_CPU_ACTION, m_ActionIndex)
  230. META_WRITE(MD_APPPOOL_PINGING_ENABLED, m_fDoEnablePing)
  231. META_WRITE(MD_APPPOOL_PING_INTERVAL, m_dwPingInterval)
  232. META_WRITE(MD_APPPOOL_RAPID_FAIL_PROTECTION_ENABLED, m_fDoEnableRapidFail)
  233. META_WRITE(MD_RAPID_FAIL_PROTECTION_MAX_CRASHES, m_dwCrashesCount)
  234. META_WRITE(MD_RAPID_FAIL_PROTECTION_INTERVAL, m_dwCheckInterval)
  235. META_WRITE(MD_APPPOOL_STARTUP_TIMELIMIT, m_dwStartupLimit)
  236. META_WRITE(MD_APPPOOL_SHUTDOWN_TIMELIMIT, m_dwShutdownLimit)
  237. META_WRITE(MD_APPPOOL_ORPHAN_PROCESSES_FOR_DEBUGGING, m_fDoEnableDebug)
  238. META_WRITE(MD_APPPOOL_ORPHAN_ACTION_EXE, m_DebuggerFileName)
  239. META_WRITE(MD_APPPOOL_ORPHAN_ACTION_PARAMS, m_DebuggerParams)
  240. META_WRITE(MD_APPPOOL_IDENTITY_TYPE, m_dwIdentType)
  241. META_WRITE(MD_WAM_USER_NAME, m_strUserName)
  242. META_WRITE(MD_WAM_PWD, m_strUserPass)
  243. END_META_WRITE(err);
  244. return err;
  245. }
  246. void
  247. CAppPoolProps::InitFromModel(CAppPoolProps& model)
  248. {
  249. m_dwPeriodicRestartTime = model.m_dwPeriodicRestartTime;
  250. m_dwRestartRequestCount = model.m_dwRestartRequestCount;
  251. m_dwPeriodicRestartVMemory = model.m_dwPeriodicRestartVMemory;
  252. m_dwPeriodicRestartUMemory = model.m_dwPeriodicRestartUMemory;
  253. m_RestartSchedule = model.m_RestartSchedule;
  254. m_dwIdleTimeout = model.m_dwIdleTimeout;
  255. m_dwQueueSize = model.m_dwQueueSize;
  256. m_dwMaxCPU_Use = model.m_dwMaxCPU_Use;
  257. m_dwRefreshTime = model.m_dwRefreshTime;
  258. m_ActionIndex = model.m_ActionIndex;
  259. m_dwMaxProcesses = model.m_dwMaxProcesses;
  260. m_fDoEnablePing = model.m_fDoEnablePing;
  261. m_dwPingInterval = model.m_dwPingInterval;
  262. m_fDoEnableRapidFail = model.m_fDoEnableRapidFail;
  263. m_dwCrashesCount = model.m_dwCrashesCount;
  264. m_dwCheckInterval = model.m_dwCheckInterval;
  265. m_dwStartupLimit = model.m_dwStartupLimit;
  266. m_dwShutdownLimit = model.m_dwShutdownLimit;
  267. m_fDoEnableDebug = model.m_fDoEnableDebug;
  268. m_DebuggerFileName = model.m_DebuggerFileName;
  269. m_DebuggerParams = model.m_DebuggerParams;
  270. m_dwIdentType = model.m_dwIdentType;
  271. m_strUserName = model.m_strUserName;
  272. m_strUserPass = model.m_strUserPass;
  273. }
  274. HRESULT
  275. CAppPoolProps::ChangeState(DWORD dwCommand)
  276. /*++
  277. Routine Description:
  278. Change the state of the pool
  279. Arguments:
  280. DWORD dwCommand : Command
  281. Return Value:
  282. HRESULT
  283. --*/
  284. {
  285. DWORD dwTargetState;
  286. DWORD dwPendingState;
  287. CError err;
  288. switch(dwCommand)
  289. {
  290. case MD_APPPOOL_COMMAND_STOP:
  291. dwTargetState = MD_APPPOOL_STATE_STOPPED;
  292. dwPendingState = MD_APPPOOL_STATE_STOPPING;
  293. break;
  294. case MD_APPPOOL_COMMAND_START:
  295. dwTargetState = MD_APPPOOL_STATE_STARTED;
  296. dwPendingState = MD_APPPOOL_STATE_STARTING;
  297. break;
  298. default:
  299. ASSERT_MSG("Invalid service state requested");
  300. err = ERROR_INVALID_PARAMETER;
  301. }
  302. err = OpenForWriting(FALSE);
  303. if (err.Succeeded())
  304. {
  305. m_dwWin32Error = 0;
  306. err = SetValue(MD_WIN32_ERROR, m_dwWin32Error);
  307. if (err.Succeeded())
  308. {
  309. err = SetValue(MD_APPPOOL_COMMAND, dwCommand);
  310. }
  311. Close();
  312. }
  313. if (err.Succeeded())
  314. {
  315. //
  316. // Wait for the service to attain desired state, timeout
  317. // after specified interval
  318. //
  319. DWORD dwSleepTotal = 0L;
  320. DWORD dwOldState = m_dwState;
  321. if (dwOldState == dwTargetState)
  322. {
  323. //
  324. // Current state matches desired
  325. // state already. ISM must be behind
  326. // the times.
  327. //
  328. return err;
  329. }
  330. while (dwSleepTotal < MAX_SLEEP_POOL)
  331. {
  332. err = LoadData();
  333. if (err.Failed())
  334. {
  335. break;
  336. }
  337. if ((m_dwState != dwPendingState && m_dwState != dwOldState)
  338. || m_dwWin32Error != ERROR_SUCCESS
  339. )
  340. {
  341. //
  342. // Done one way or another
  343. //
  344. if (m_dwState != dwTargetState)
  345. {
  346. //
  347. // Did not achieve desired result. Something went
  348. // wrong.
  349. //
  350. if (m_dwWin32Error)
  351. {
  352. err = m_dwWin32Error;
  353. }
  354. }
  355. break;
  356. }
  357. //
  358. // Still pending...
  359. //
  360. ::Sleep(SLEEP_INTERVAL);
  361. dwSleepTotal += SLEEP_INTERVAL;
  362. }
  363. if (dwSleepTotal >= MAX_SLEEP_POOL)
  364. {
  365. //
  366. // Timed out. If there is a real error in the metabase
  367. // use it, otherwise use a generic timeout error
  368. //
  369. // err = m_dwWin32Error;
  370. if (err.Succeeded())
  371. {
  372. err = ERROR_SERVICE_REQUEST_TIMEOUT;
  373. }
  374. }
  375. }
  376. return err;
  377. }
  378. /////////////////////////////////////////////////////////////////////////////////////////////////////
  379. IMPLEMENT_DYNAMIC(CAppPoolSheet, CInetPropertySheet)
  380. CAppPoolSheet::CAppPoolSheet(
  381. CComAuthInfo * pAuthInfo,
  382. LPCTSTR lpszMetaPath,
  383. CWnd * pParentWnd,
  384. LPARAM lParam,
  385. LPARAM lParamParent,
  386. UINT iSelectPage
  387. )
  388. : CInetPropertySheet(
  389. pAuthInfo, lpszMetaPath, pParentWnd, lParam, lParamParent, iSelectPage),
  390. m_pprops(NULL)
  391. {
  392. CString last;
  393. CMetabasePath::GetLastNodeName(lpszMetaPath, last);
  394. SetIsMasterInstance(last.CompareNoCase(SZ_MBN_APP_POOLS) == 0);
  395. }
  396. CAppPoolSheet::~CAppPoolSheet()
  397. {
  398. FreeConfigurationParameters();
  399. }
  400. HRESULT
  401. CAppPoolSheet::LoadConfigurationParameters()
  402. {
  403. //
  404. // Load base properties
  405. //
  406. CError err;
  407. if (m_pprops == NULL)
  408. {
  409. //
  410. // First call -- load values
  411. //
  412. m_pprops = new CAppPoolProps(QueryAuthInfo(), QueryMetaPath());
  413. if (!m_pprops)
  414. {
  415. TRACEEOLID("LoadConfigurationParameters: OOM");
  416. err = ERROR_NOT_ENOUGH_MEMORY;
  417. return err;
  418. }
  419. err = m_pprops->LoadData();
  420. if (IsMasterInstance())
  421. {
  422. CAppPoolsContainer * pObject = (CAppPoolsContainer *)GetParameter();
  423. }
  424. }
  425. return err;
  426. }
  427. void
  428. CAppPoolSheet::FreeConfigurationParameters()
  429. {
  430. CInetPropertySheet::FreeConfigurationParameters();
  431. delete m_pprops;
  432. }
  433. BEGIN_MESSAGE_MAP(CAppPoolSheet, CInetPropertySheet)
  434. //{{AFX_MSG_MAP(CAppPoolSheet)
  435. //}}AFX_MSG_MAP
  436. END_MESSAGE_MAP()
  437. //////////////////////////////////////////////////////////////////////////////
  438. IMPLEMENT_DYNCREATE(CAppPoolRecycle, CInetPropertyPage)
  439. CAppPoolRecycle::CAppPoolRecycle(CInetPropertySheet * pSheet)
  440. : CInetPropertyPage(CAppPoolRecycle::IDD, pSheet),
  441. m_fDoRestartOnTime(FALSE),
  442. m_dwPeriodicRestartTime(PERIODIC_RESTART_TIME_DEF),
  443. m_fDoRestartOnCount(FALSE),
  444. m_dwRestartRequestCount(PERIODIC_RESTART_REQ_DEF),
  445. m_fDoRestartOnSchedule(FALSE),
  446. m_fDoRestartOnVMemory(FALSE),
  447. m_fDoRestartOnUMemory(FALSE),
  448. m_dwPeriodicRestartVMemory(VMEMORY_DEF * 1024),
  449. m_dwPeriodicRestartUMemory(UMEMORY_DEF * 1024)
  450. {
  451. }
  452. CAppPoolRecycle::~CAppPoolRecycle()
  453. {
  454. }
  455. /* virtual */
  456. HRESULT
  457. CAppPoolRecycle::FetchLoadedValues()
  458. {
  459. CError err;
  460. BEGIN_META_INST_READ(CAppPoolSheet)
  461. FETCH_INST_DATA_FROM_SHEET(m_dwPeriodicRestartTime);
  462. FETCH_INST_DATA_FROM_SHEET(m_dwRestartRequestCount);
  463. FETCH_INST_DATA_FROM_SHEET(m_RestartSchedule);
  464. FETCH_INST_DATA_FROM_SHEET(m_dwPeriodicRestartVMemory);
  465. FETCH_INST_DATA_FROM_SHEET(m_dwPeriodicRestartUMemory);
  466. END_META_INST_READ(err)
  467. m_fDoRestartOnTime = m_dwPeriodicRestartTime != 0;
  468. if (!m_fDoRestartOnTime)
  469. {
  470. m_dwPeriodicRestartTime = PERIODIC_RESTART_TIME_DEF;
  471. }
  472. m_fDoRestartOnCount = m_dwRestartRequestCount != 0;
  473. if (!m_fDoRestartOnCount)
  474. {
  475. m_dwRestartRequestCount = PERIODIC_RESTART_REQ_DEF;
  476. }
  477. m_fDoRestartOnSchedule = m_RestartSchedule.GetCount() > 0;
  478. m_fDoRestartOnVMemory = m_dwPeriodicRestartVMemory != 0;
  479. if (!m_fDoRestartOnVMemory)
  480. {
  481. m_dwPeriodicRestartVMemoryDisplay = VMEMORY_DEF;
  482. }
  483. else
  484. {
  485. m_dwPeriodicRestartVMemoryDisplay = m_dwPeriodicRestartVMemory / 1024;
  486. }
  487. m_fDoRestartOnUMemory = m_dwPeriodicRestartUMemory != 0;
  488. if (!m_fDoRestartOnUMemory)
  489. {
  490. m_dwPeriodicRestartUMemoryDisplay = UMEMORY_DEF;
  491. }
  492. else
  493. {
  494. m_dwPeriodicRestartUMemoryDisplay = m_dwPeriodicRestartUMemory / 1024;
  495. }
  496. return err;
  497. }
  498. /* virtual */
  499. HRESULT
  500. CAppPoolRecycle::SaveInfo()
  501. {
  502. ASSERT(IsDirty());
  503. CError err;
  504. int count = m_lst_Schedule.GetCount();
  505. TCHAR buf[32];
  506. SYSTEMTIME tm;
  507. ::GetSystemTime(&tm);
  508. m_RestartSchedule.RemoveAll();
  509. if (m_fDoRestartOnSchedule)
  510. {
  511. CString buf;
  512. for (int i = 0; i < count; i++)
  513. {
  514. buf = (LPCTSTR)m_lst_Schedule.GetItemDataPtr(i);
  515. m_RestartSchedule.AddTail(buf);
  516. }
  517. }
  518. DWORD d;
  519. CStringListEx list;
  520. BEGIN_META_INST_WRITE(CAppPoolSheet)
  521. d = m_dwPeriodicRestartTime;
  522. if (!m_fDoRestartOnTime)
  523. m_dwPeriodicRestartTime = 0;
  524. STORE_INST_DATA_ON_SHEET(m_dwPeriodicRestartTime)
  525. m_dwPeriodicRestartTime = d;
  526. d = m_dwRestartRequestCount;
  527. if (!m_fDoRestartOnCount)
  528. m_dwRestartRequestCount = 0;
  529. STORE_INST_DATA_ON_SHEET(m_dwRestartRequestCount)
  530. m_dwRestartRequestCount = d;
  531. list = m_RestartSchedule;
  532. if (!m_fDoRestartOnSchedule)
  533. m_RestartSchedule.RemoveAll();
  534. STORE_INST_DATA_ON_SHEET(m_RestartSchedule)
  535. m_RestartSchedule = list;
  536. m_dwPeriodicRestartVMemory = m_dwPeriodicRestartVMemoryDisplay * 1024;
  537. if (!m_fDoRestartOnVMemory)
  538. m_dwPeriodicRestartVMemory = 0;
  539. STORE_INST_DATA_ON_SHEET(m_dwPeriodicRestartVMemory)
  540. m_dwPeriodicRestartUMemory = m_dwPeriodicRestartUMemoryDisplay * 1024;
  541. if (!m_fDoRestartOnUMemory)
  542. m_dwPeriodicRestartUMemory = 0;
  543. STORE_INST_DATA_ON_SHEET(m_dwPeriodicRestartUMemory)
  544. END_META_INST_WRITE(err)
  545. return err;
  546. }
  547. void
  548. CAppPoolRecycle::DoDataExchange(CDataExchange * pDX)
  549. {
  550. CInetPropertyPage::DoDataExchange(pDX);
  551. //{{AFX_DATA_MAP(CAppPoolRecycle)
  552. DDX_Check(pDX, IDC_RECYCLE_TIMESPAN, m_fDoRestartOnTime);
  553. DDX_Control(pDX, IDC_RECYCLE_TIMESPAN, m_bnt_DoRestartOnTime);
  554. // This Needs to come before DDX_Text which will try to put text big number into small number
  555. DDV_MinMaxBalloon(pDX, IDC_TIMESPAN, TIMESPAN_MIN, TIMESPAN_MAX);
  556. DDX_TextBalloon(pDX, IDC_TIMESPAN, m_dwPeriodicRestartTime);
  557. DDX_Control(pDX, IDC_TIMESPAN, m_Timespan);
  558. DDX_Control(pDX, IDC_TIMESPAN_SPIN, m_TimespanSpin);
  559. DDX_Check(pDX, IDC_RECYCLE_REQUESTS, m_fDoRestartOnCount);
  560. DDX_Control(pDX, IDC_RECYCLE_REQUESTS, m_btn_DoRestartOnCount);
  561. // This Needs to come before DDX_Text which will try to put text big number into small number
  562. DDV_MinMaxBalloon(pDX, IDC_REQUEST_LIMIT, REQUESTS_MIN, REQUESTS_MAX);
  563. DDX_TextBalloon(pDX, IDC_REQUEST_LIMIT, m_dwRestartRequestCount);
  564. DDX_Control(pDX, IDC_REQUEST_LIMIT, m_Requests);
  565. DDX_Control(pDX, IDC_REQUESTS_SPIN, m_RequestsSpin);
  566. DDX_Check(pDX, IDC_RECYCLE_TIMER, m_fDoRestartOnSchedule);
  567. DDX_Control(pDX, IDC_RECYCLE_TIMER, m_btn_DoRestartOnSchedule);
  568. DDX_Control(pDX, IDC_TIMES_LIST, m_lst_Schedule);
  569. DDX_Control(pDX, IDC_ADD_TIME, m_btn_Add);
  570. DDX_Control(pDX, IDC_DELETE_TIME, m_btn_Remove);
  571. DDX_Control(pDX, IDC_CHANGE_TIME, m_btn_Edit);
  572. DDX_Check(pDX, IDC_RECYCLE_VMEMORY, m_fDoRestartOnVMemory);
  573. DDX_Control(pDX, IDC_RECYCLE_VMEMORY, m_btn_DoRestartOnVMemory);
  574. // This Needs to come before DDX_Text which will try to put text big number into small number
  575. DDV_MinMaxBalloon(pDX, IDC_VMEMORY_LIMIT, VMEMORY_MIN, VMEMORY_MAX);
  576. DDX_TextBalloon(pDX, IDC_VMEMORY_LIMIT, m_dwPeriodicRestartVMemoryDisplay);
  577. DDX_Control(pDX, IDC_VMEMORY_LIMIT, m_VMemoryLimit);
  578. DDX_Control(pDX, IDC_VMEMORY_SPIN, m_VMemoryLimitSpin);
  579. DDX_Check(pDX, IDC_RECYCLE_UMEMORY, m_fDoRestartOnUMemory);
  580. DDX_Control(pDX, IDC_RECYCLE_UMEMORY, m_btn_DoRestartOnUMemory);
  581. // This Needs to come before DDX_Text which will try to put text big number into small number
  582. DDV_MinMaxBalloon(pDX, IDC_UMEMORY_LIMIT, UMEMORY_MIN, UMEMORY_MAX);
  583. DDX_TextBalloon(pDX, IDC_UMEMORY_LIMIT, m_dwPeriodicRestartUMemoryDisplay);
  584. DDX_Control(pDX, IDC_UMEMORY_LIMIT, m_UMemoryLimit);
  585. DDX_Control(pDX, IDC_UMEMORY_SPIN, m_UMemoryLimitSpin);
  586. //}}AFX_DATA_MAP
  587. }
  588. BEGIN_MESSAGE_MAP(CAppPoolRecycle, CInetPropertyPage)
  589. //{{AFX_MSG_MAP(CAppPoolRecycle)
  590. ON_WM_COMPAREITEM()
  591. ON_WM_MEASUREITEM()
  592. ON_WM_DRAWITEM()
  593. ON_BN_CLICKED(IDC_RECYCLE_TIMESPAN, OnDoRestartOnTime)
  594. ON_BN_CLICKED(IDC_RECYCLE_REQUESTS, OnDoRestartOnCount)
  595. ON_BN_CLICKED(IDC_RECYCLE_TIMER, OnDoRestartOnSchedule)
  596. ON_BN_CLICKED(IDC_RECYCLE_VMEMORY, OnDoRestartOnVMemory)
  597. ON_BN_CLICKED(IDC_RECYCLE_UMEMORY, OnDoRestartOnUMemory)
  598. ON_BN_CLICKED(IDC_ADD_TIME, OnAddTime)
  599. ON_BN_CLICKED(IDC_DELETE_TIME, OnDeleteTime)
  600. ON_BN_CLICKED(IDC_CHANGE_TIME, OnChangeTime)
  601. ON_EN_CHANGE(IDC_TIMESPAN, OnItemChanged)
  602. ON_EN_CHANGE(IDC_REQUEST_LIMIT, OnItemChanged)
  603. ON_EN_CHANGE(IDC_VMEMORY_LIMIT, OnItemChanged)
  604. ON_EN_CHANGE(IDC_UMEMORY_LIMIT, OnItemChanged)
  605. //}}AFX_MSG_MAP
  606. END_MESSAGE_MAP()
  607. BOOL
  608. CAppPoolRecycle::OnInitDialog()
  609. {
  610. UDACCEL toAcc[3] = {{1, 1}, {3, 5}, {6, 10}};
  611. CInetPropertyPage::OnInitDialog();
  612. SETUP_EDIT_SPIN(m_fDoRestartOnTime, m_Timespan, m_TimespanSpin,
  613. TIMESPAN_MIN, TIMESPAN_MAX, m_dwPeriodicRestartTime);
  614. SETUP_EDIT_SPIN(m_fDoRestartOnCount, m_Requests, m_RequestsSpin,
  615. REQUESTS_MIN, REQUESTS_MAX, m_dwRestartRequestCount);
  616. SETUP_EDIT_SPIN(m_fDoRestartOnVMemory, m_VMemoryLimit, m_VMemoryLimitSpin,
  617. VMEMORY_MIN, VMEMORY_MAX, m_dwPeriodicRestartVMemoryDisplay);
  618. SETUP_EDIT_SPIN(m_fDoRestartOnUMemory, m_UMemoryLimit, m_UMemoryLimitSpin,
  619. UMEMORY_MIN, UMEMORY_MAX, m_dwPeriodicRestartUMemoryDisplay);
  620. POSITION pos = m_RestartSchedule.GetHeadPosition();
  621. while (pos != NULL)
  622. {
  623. CString& str = m_RestartSchedule.GetNext(pos);
  624. m_lst_Schedule.AddString(str);
  625. }
  626. m_lst_Schedule.SetCurSel(0);
  627. SetControlsState();
  628. return TRUE;
  629. }
  630. void
  631. CAppPoolRecycle::SetControlsState()
  632. {
  633. m_Timespan.EnableWindow(m_fDoRestartOnTime);
  634. m_TimespanSpin.EnableWindow(m_fDoRestartOnTime);
  635. m_Requests.EnableWindow(m_fDoRestartOnCount);
  636. m_RequestsSpin.EnableWindow(m_fDoRestartOnCount);
  637. m_VMemoryLimit.EnableWindow(m_fDoRestartOnVMemory);
  638. m_VMemoryLimitSpin.EnableWindow(m_fDoRestartOnVMemory);
  639. m_UMemoryLimit.EnableWindow(m_fDoRestartOnUMemory);
  640. m_UMemoryLimitSpin.EnableWindow(m_fDoRestartOnUMemory);
  641. m_lst_Schedule.EnableWindow(m_fDoRestartOnSchedule);
  642. m_btn_Add.EnableWindow(m_fDoRestartOnSchedule);
  643. int idx = m_lst_Schedule.GetCurSel();
  644. m_btn_Remove.EnableWindow(m_fDoRestartOnSchedule && idx != LB_ERR);
  645. m_btn_Edit.EnableWindow(m_fDoRestartOnSchedule && idx != LB_ERR);
  646. }
  647. void
  648. CAppPoolRecycle::OnItemChanged()
  649. {
  650. SetModified(TRUE);
  651. }
  652. int
  653. CAppPoolRecycle::OnCompareItem(UINT nID, LPCOMPAREITEMSTRUCT cmpi)
  654. {
  655. if (nID == IDC_TIMES_LIST)
  656. {
  657. ASSERT(cmpi->CtlType == ODT_LISTBOX);
  658. LPCTSTR p1 = (LPCTSTR)cmpi->itemData1;
  659. LPCTSTR p2 = (LPCTSTR)cmpi->itemData2;
  660. return StrCmp(p1, p2);
  661. }
  662. ASSERT(FALSE);
  663. return 0;
  664. }
  665. void
  666. CAppPoolRecycle::OnMeasureItem(UINT nID, LPMEASUREITEMSTRUCT mi)
  667. {
  668. if (nID == IDC_TIMES_LIST)
  669. {
  670. HWND hwnd = ::GetDlgItem(m_hWnd, IDC_TIMES_LIST);
  671. HDC hdc = ::GetDC(hwnd);
  672. HFONT hFont = (HFONT)SendDlgItemMessage(IDC_TIMES_LIST, WM_GETFONT, 0, 0);
  673. HFONT hf = (HFONT)::SelectObject(hdc, hFont);
  674. TEXTMETRIC tm;
  675. ::GetTextMetrics(hdc, &tm);
  676. ::SelectObject(hdc, hf);
  677. ::ReleaseDC(hwnd, hdc);
  678. RECT rc;
  679. ::GetClientRect(hwnd, &rc);
  680. mi->itemHeight = tm.tmHeight;
  681. mi->itemWidth = rc.right - rc.left;
  682. }
  683. }
  684. void
  685. CAppPoolRecycle::OnDrawItem(UINT nID, LPDRAWITEMSTRUCT di)
  686. {
  687. if (nID == IDC_TIMES_LIST && di->itemID != -1)
  688. {
  689. LPCTSTR p = (LPCTSTR)di->itemData;
  690. HBRUSH hBrush;
  691. COLORREF prevText;
  692. COLORREF prevBk;
  693. switch (di->itemAction)
  694. {
  695. case ODA_SELECT:
  696. case ODA_DRAWENTIRE:
  697. if (di->itemState & ODS_SELECTED)
  698. {
  699. hBrush = ::CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT));
  700. prevText = ::SetTextColor(di->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
  701. prevBk = ::SetBkColor(di->hDC, GetSysColor(COLOR_HIGHLIGHT));
  702. }
  703. else
  704. {
  705. hBrush = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
  706. prevText = ::SetTextColor(di->hDC, GetSysColor(COLOR_WINDOWTEXT));
  707. prevBk = ::SetBkColor(di->hDC, GetSysColor(COLOR_WINDOW));
  708. }
  709. ::FillRect(di->hDC, &di->rcItem, hBrush);
  710. ::DrawText(di->hDC, p, -1, &di->rcItem, DT_LEFT | DT_VCENTER | DT_EXTERNALLEADING);
  711. ::SetTextColor(di->hDC, prevText);
  712. ::SetTextColor(di->hDC, prevBk);
  713. ::DeleteObject(hBrush);
  714. break;
  715. case ODA_FOCUS:
  716. break;
  717. }
  718. }
  719. }
  720. void
  721. CAppPoolRecycle::OnDoRestartOnTime()
  722. {
  723. m_fDoRestartOnTime = !m_fDoRestartOnTime;
  724. SetControlsState();
  725. SetModified(TRUE);
  726. }
  727. void
  728. CAppPoolRecycle::OnDoRestartOnCount()
  729. {
  730. m_fDoRestartOnCount = !m_fDoRestartOnCount;
  731. SetControlsState();
  732. SetModified(TRUE);
  733. }
  734. void
  735. CAppPoolRecycle::OnDoRestartOnSchedule()
  736. {
  737. m_fDoRestartOnSchedule = !m_fDoRestartOnSchedule;
  738. SetControlsState();
  739. SetModified(TRUE);
  740. }
  741. void
  742. CAppPoolRecycle::OnDoRestartOnVMemory()
  743. {
  744. m_fDoRestartOnVMemory = !m_fDoRestartOnVMemory;
  745. SetControlsState();
  746. SetModified(TRUE);
  747. }
  748. void
  749. CAppPoolRecycle::OnDoRestartOnUMemory()
  750. {
  751. m_fDoRestartOnUMemory = !m_fDoRestartOnUMemory;
  752. SetControlsState();
  753. SetModified(TRUE);
  754. }
  755. class CTimePickerDlg : public CDialog
  756. {
  757. DECLARE_DYNCREATE(CTimePickerDlg)
  758. public:
  759. CTimePickerDlg()
  760. : CDialog(CTimePickerDlg::IDD),
  761. m_TopLeft(0, 0)
  762. {
  763. }
  764. ~CTimePickerDlg()
  765. {
  766. }
  767. void SetTime(CTime& tm)
  768. {
  769. m_time = tm;
  770. }
  771. CTime& GetTime()
  772. {
  773. return m_time;
  774. }
  775. void SetPos(const CPoint& pt)
  776. {
  777. m_TopLeft = pt;
  778. }
  779. //
  780. // Dialog Data
  781. //
  782. protected:
  783. //{{AFX_DATA(CTimePickerDlg)
  784. enum {IDD = IDD_TIME_PICKER};
  785. CDateTimeCtrl m_Timer;
  786. CTime m_time;
  787. //}}AFX_DATA
  788. CPoint m_TopLeft;
  789. //{{AFX_MSG(CTimePickerDlg)
  790. BOOL OnInitDialog();
  791. //}}AFX_MSG
  792. DECLARE_MESSAGE_MAP()
  793. protected:
  794. //{{AFX_VIRTUAL(CTimePickerDlg)
  795. virtual void DoDataExchange(CDataExchange * pDX);
  796. //}}AFX_VIRTUAL
  797. };
  798. void
  799. CTimePickerDlg::DoDataExchange(CDataExchange * pDX)
  800. {
  801. CDialog::DoDataExchange(pDX);
  802. //{{AFX_DATA_MAP(CAppPoolRecycle)
  803. DDX_DateTimeCtrl(pDX, IDC_TIME_PICKER, m_time);
  804. DDX_Control(pDX, IDC_TIME_PICKER, m_Timer);
  805. //}}AFX_DATA_MAP
  806. }
  807. BEGIN_MESSAGE_MAP(CTimePickerDlg, CDialog)
  808. //{{AFX_MSG_MAP(CTimePickerDlg)
  809. //}}AFX_MSG_MAP
  810. END_MESSAGE_MAP()
  811. IMPLEMENT_DYNCREATE(CTimePickerDlg, CDialog)
  812. BOOL
  813. CTimePickerDlg::OnInitDialog()
  814. {
  815. CDialog::OnInitDialog();
  816. m_Timer.SetFormat(_T("HH:mm"));
  817. m_Timer.SetTime(&m_time);
  818. SetWindowPos(NULL, m_TopLeft.x, m_TopLeft.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
  819. return TRUE;
  820. }
  821. void
  822. CAppPoolRecycle::OnAddTime()
  823. {
  824. CTimePickerDlg dlg;
  825. RECT rc;
  826. m_btn_Add.GetWindowRect(&rc);
  827. dlg.SetPos(CPoint(rc.left, rc.bottom));
  828. dlg.SetTime(CTime::GetCurrentTime());
  829. if (dlg.DoModal() == IDOK)
  830. {
  831. int idx;
  832. TCHAR buf[6];
  833. CTime tm = dlg.GetTime();
  834. wsprintf(buf, _T("%02d:%02d"), tm.GetHour(), tm.GetMinute());
  835. if ((idx = m_lst_Schedule.FindString(-1, buf)) == LB_ERR)
  836. {
  837. idx = m_lst_Schedule.AddString(StrDup(buf));
  838. m_lst_Schedule.SetCurSel(idx);
  839. m_btn_Edit.EnableWindow(idx != LB_ERR);
  840. m_btn_Remove.EnableWindow(idx != LB_ERR);
  841. SetModified(idx != LB_ERR);
  842. }
  843. m_lst_Schedule.SetCurSel(idx);
  844. }
  845. }
  846. void
  847. CAppPoolRecycle::OnChangeTime()
  848. {
  849. CTimePickerDlg dlg;
  850. RECT rc;
  851. m_btn_Edit.GetWindowRect(&rc);
  852. dlg.SetPos(CPoint(rc.left, rc.bottom));
  853. int idx = m_lst_Schedule.GetCurSel();
  854. CString ts = (LPCTSTR)m_lst_Schedule.GetItemDataPtr(idx);
  855. // Looks like we have to init the struct properly
  856. SYSTEMTIME tm;
  857. ::GetSystemTime(&tm);
  858. int n = ts.Find(_T(':'));
  859. int len = ts.GetLength();
  860. tm.wMinute = (WORD)StrToInt(ts.Right(len - n - 1));
  861. tm.wHour = (WORD)StrToInt(ts.Left(n));
  862. tm.wSecond = 0;
  863. dlg.SetTime(CTime(tm));
  864. if (dlg.DoModal() == IDOK)
  865. {
  866. CTime time = dlg.GetTime();
  867. TCHAR buf[6];
  868. wsprintf(buf, _T("%02d:%02d"), time.GetHour(), time.GetMinute());
  869. int idx2;
  870. if ((idx2 = m_lst_Schedule.FindString(-1, buf)) == LB_ERR)
  871. {
  872. m_lst_Schedule.DeleteString(idx);
  873. idx2 = m_lst_Schedule.AddString(StrDup(buf));
  874. m_lst_Schedule.GetItemRect(idx2, &rc);
  875. m_lst_Schedule.InvalidateRect(&rc, TRUE);
  876. SetModified(TRUE);
  877. }
  878. m_lst_Schedule.SetCurSel(idx2);
  879. }
  880. }
  881. void
  882. CAppPoolRecycle::OnDeleteTime()
  883. {
  884. int idx = m_lst_Schedule.GetCurSel();
  885. int count;
  886. if (idx != LB_ERR)
  887. {
  888. m_lst_Schedule.DeleteString(idx);
  889. SetModified(TRUE);
  890. if ((count = m_lst_Schedule.GetCount()) == 0)
  891. {
  892. m_btn_Remove.EnableWindow(FALSE);
  893. m_btn_Edit.EnableWindow(FALSE);
  894. }
  895. else
  896. {
  897. m_lst_Schedule.SetCurSel(idx == count ? --idx : idx);
  898. }
  899. }
  900. }
  901. //////////////////////////////////////////////////////////////////////
  902. IMPLEMENT_DYNCREATE(CAppPoolPerf, CInetPropertyPage)
  903. CAppPoolPerf::CAppPoolPerf(CInetPropertySheet * pSheet)
  904. : CInetPropertyPage(CAppPoolPerf::IDD, pSheet),
  905. m_fDoIdleShutdown(FALSE),
  906. m_dwIdleTimeout(IDLE_TIMEOUT_DEF),
  907. m_fDoLimitQueue(FALSE),
  908. m_dwQueueSize(QUEUE_SIZE_DEF),
  909. m_fDoEnableCPUAccount(FALSE),
  910. m_dwMaxCPU_Use(CPU_USE_DEF * 1000),
  911. m_dwRefreshTime(0),
  912. m_ActionIndex(ACTION_INDEX_DEF),
  913. m_dwMaxProcesses(MAX_PROCESSES_DEF)
  914. {
  915. }
  916. CAppPoolPerf::~CAppPoolPerf()
  917. {
  918. }
  919. /* virtual */
  920. HRESULT
  921. CAppPoolPerf::FetchLoadedValues()
  922. {
  923. CError err;
  924. BEGIN_META_INST_READ(CAppPoolSheet)
  925. FETCH_INST_DATA_FROM_SHEET(m_dwIdleTimeout);
  926. FETCH_INST_DATA_FROM_SHEET(m_dwQueueSize);
  927. FETCH_INST_DATA_FROM_SHEET(m_dwMaxCPU_Use);
  928. FETCH_INST_DATA_FROM_SHEET(m_dwRefreshTime);
  929. FETCH_INST_DATA_FROM_SHEET(m_dwMaxProcesses);
  930. FETCH_INST_DATA_FROM_SHEET(m_ActionIndex);
  931. END_META_INST_READ(err)
  932. m_fDoIdleShutdown = m_dwIdleTimeout != 0;
  933. if (!m_fDoIdleShutdown)
  934. {
  935. m_dwIdleTimeout = IDLE_TIMEOUT_DEF;
  936. }
  937. m_fDoLimitQueue = m_dwQueueSize != (DWORD)65535;
  938. if (!m_fDoLimitQueue)
  939. {
  940. m_dwQueueSize = QUEUE_SIZE_DEF;
  941. }
  942. m_fDoEnableCPUAccount = m_dwMaxCPU_Use > 0 /*&& m_dwRefreshTime > 0*/;
  943. if (!m_fDoEnableCPUAccount)
  944. {
  945. m_dwMaxCPU_UseVisual = CPU_USE_DEF;
  946. m_dwRefreshTime = CPU_RESET_TIME_DEF;
  947. m_ActionIndex = ACTION_INDEX_DEF;
  948. }
  949. else
  950. {
  951. m_dwMaxCPU_UseVisual = m_dwMaxCPU_Use / 1000;
  952. }
  953. return err;
  954. }
  955. /* virtual */
  956. HRESULT
  957. CAppPoolPerf::SaveInfo()
  958. {
  959. ASSERT(IsDirty());
  960. CError err;
  961. m_dwMaxCPU_Use = m_dwMaxCPU_UseVisual * 1000;
  962. DWORD t = m_dwIdleTimeout;
  963. DWORD q = m_dwQueueSize;
  964. DWORD r = m_dwRefreshTime;
  965. BEGIN_META_INST_WRITE(CAppPoolSheet)
  966. if (!m_fDoIdleShutdown)
  967. {
  968. m_dwIdleTimeout = 0;
  969. }
  970. if (!m_fDoLimitQueue)
  971. {
  972. m_dwQueueSize = (DWORD)65535;
  973. }
  974. if (!m_fDoEnableCPUAccount)
  975. {
  976. // m_dwRefreshTime = 0;
  977. m_dwMaxCPU_Use = 0;
  978. }
  979. STORE_INST_DATA_ON_SHEET(m_dwQueueSize)
  980. STORE_INST_DATA_ON_SHEET(m_dwIdleTimeout)
  981. STORE_INST_DATA_ON_SHEET(m_dwRefreshTime)
  982. STORE_INST_DATA_ON_SHEET(m_dwMaxCPU_Use)
  983. STORE_INST_DATA_ON_SHEET(m_ActionIndex)
  984. STORE_INST_DATA_ON_SHEET(m_dwMaxProcesses)
  985. END_META_INST_WRITE(err)
  986. m_dwQueueSize = q;
  987. m_dwIdleTimeout = t;
  988. m_dwRefreshTime = r;
  989. return err;
  990. }
  991. void
  992. CAppPoolPerf::DoDataExchange(CDataExchange * pDX)
  993. {
  994. CInetPropertyPage::DoDataExchange(pDX);
  995. //{{AFX_DATA_MAP(CAppPoolRecycle)
  996. DDX_Check(pDX, IDC_PERF_IDLE_TIMEOUT, m_fDoIdleShutdown);
  997. DDX_Control(pDX, IDC_PERF_IDLE_TIMEOUT, m_bnt_DoIdleShutdown);
  998. // This Needs to come before DDX_Text which will try to put text big number into small number
  999. DDV_MinMaxBalloon(pDX, IDC_IDLETIME, TIMEOUT_MIN, TIMEOUT_MAX);
  1000. DDX_TextBalloon(pDX, IDC_IDLETIME, m_dwIdleTimeout);
  1001. DDX_Control(pDX, IDC_IDLETIME, m_IdleTimeout);
  1002. DDX_Control(pDX, IDC_IDLETIME_SPIN, m_IdleTimeoutSpin);
  1003. DDX_Check(pDX, IDC_LIMIT_QUEUE, m_fDoLimitQueue);
  1004. DDX_Control(pDX, IDC_LIMIT_QUEUE, m_btn_DoLimitQueue);
  1005. // This Needs to come before DDX_Text which will try to put text big number into small number
  1006. DDV_MinMaxBalloon(pDX, IDC_QUEUESIZE, QUEUESIZE_MIN, QUEUESIZE_MAX);
  1007. DDX_TextBalloon(pDX, IDC_QUEUESIZE, m_dwQueueSize);
  1008. DDX_Control(pDX, IDC_QUEUESIZE, m_QueueSize);
  1009. DDX_Control(pDX, IDC_QUEUESIZE_SPIN, m_QueueSizeSpin);
  1010. DDX_Check(pDX, IDC_ENABLE_CPU_ACCOUNTING, m_fDoEnableCPUAccount);
  1011. DDX_Control(pDX, IDC_ENABLE_CPU_ACCOUNTING, m_btn_DoEnableCPUAccount);
  1012. // This Needs to come before DDX_Text which will try to put text big number into small number
  1013. DDV_MinMaxBalloon(pDX, IDC_CPU_USE, CPU_LIMIT_MIN, CPU_LIMIT_MAX);
  1014. DDX_TextBalloon(pDX, IDC_CPU_USE, m_dwMaxCPU_UseVisual);
  1015. DDX_Control(pDX, IDC_CPU_USE, m_MaxCPU_Use);
  1016. DDX_Control(pDX, IDC_CPU_USE_SPIN, m_MaxCPU_UseSpin);
  1017. // This Needs to come before DDX_Text which will try to put text big number into small number
  1018. DDV_MinMaxBalloon(pDX, IDC_REFRESHTIME, CPU_RESET_TIME_MIN, CPU_RESET_TIME_MAX);
  1019. DDX_TextBalloon(pDX, IDC_REFRESHTIME, m_dwRefreshTime);
  1020. DDX_Control(pDX, IDC_REFRESHTIME, m_RefreshTime);
  1021. DDX_Control(pDX, IDC_REFRESHTIME_SPIN, m_RefreshTimeSpin);
  1022. DDX_Control(pDX, IDC_EXCEED_ACTION, m_Action);
  1023. DDX_CBIndex(pDX, IDC_EXCEED_ACTION, m_ActionIndex);
  1024. // This Needs to come before DDX_Text which will try to put text big number into small number
  1025. DDV_MinMaxBalloon(pDX, IDC_MAXPROCESSES, MAXPROCESSES_MIN, MAXPROCESSES_MAX);
  1026. DDX_TextBalloon(pDX, IDC_MAXPROCESSES, m_dwMaxProcesses);
  1027. DDX_Control(pDX, IDC_MAXPROCESSES, m_MaxProcesses);
  1028. DDX_Control(pDX, IDC_MAXPROCESSES_SPIN, m_MaxProcessesSpin);
  1029. //}}AFX_DATA_MAP
  1030. }
  1031. BEGIN_MESSAGE_MAP(CAppPoolPerf, CInetPropertyPage)
  1032. //{{AFX_MSG_MAP(CAppPoolRecycle)
  1033. ON_BN_CLICKED(IDC_PERF_IDLE_TIMEOUT, OnDoIdleShutdown)
  1034. ON_BN_CLICKED(IDC_LIMIT_QUEUE, OnDoLimitQueue)
  1035. ON_BN_CLICKED(IDC_ENABLE_CPU_ACCOUNTING, OnDoEnableCPUAccount)
  1036. ON_EN_CHANGE(IDC_IDLETIME, OnItemChanged)
  1037. ON_EN_CHANGE(IDC_QUEUESIZE, OnItemChanged)
  1038. ON_EN_CHANGE(IDC_CPU_USE, OnItemChanged)
  1039. ON_EN_CHANGE(IDC_REFRESHTIME, OnItemChanged)
  1040. ON_EN_CHANGE(IDC_MAXPROCESSES, OnItemChanged)
  1041. ON_CBN_SELCHANGE(IDC_EXCEED_ACTION, OnItemChanged)
  1042. //}}AFX_MSG_MAP
  1043. END_MESSAGE_MAP()
  1044. BOOL
  1045. CAppPoolPerf::OnInitDialog()
  1046. {
  1047. UDACCEL toAcc[3] = {{1, 1}, {3, 5}, {6, 10}};
  1048. CInetPropertyPage::OnInitDialog();
  1049. SETUP_EDIT_SPIN(m_fDoIdleShutdown, m_IdleTimeout, m_IdleTimeoutSpin,
  1050. TIMEOUT_MIN, TIMEOUT_MAX, m_dwIdleTimeout);
  1051. SETUP_EDIT_SPIN(m_fDoLimitQueue, m_QueueSize, m_QueueSizeSpin,
  1052. QUEUESIZE_MIN, QUEUESIZE_MAX, m_dwQueueSize);
  1053. SETUP_EDIT_SPIN(m_fDoEnableCPUAccount, m_MaxCPU_Use, m_MaxCPU_UseSpin,
  1054. CPU_LIMIT_MIN, CPU_LIMIT_MAX, m_dwMaxCPU_UseVisual);
  1055. SETUP_EDIT_SPIN(m_fDoEnableCPUAccount, m_RefreshTime, m_RefreshTimeSpin,
  1056. REFRESH_TIME_MIN, REFRESH_TIME_MAX, m_dwRefreshTime);
  1057. SETUP_SPIN(m_MaxProcessesSpin,
  1058. MAXPROCESSES_MIN, MAXPROCESSES_MAX, m_dwMaxProcesses);
  1059. CString str;
  1060. str.LoadString(IDS_NO_ACTION);
  1061. m_Action.AddString(str);
  1062. // str.LoadString(IDS_THROTTLE_BACK);
  1063. // m_Action.AddString(str);
  1064. // str.LoadString(IDS_TURN_ON_TRACING);
  1065. // m_Action.AddString(str);
  1066. str.LoadString(IDS_SHUTDOWN);
  1067. m_Action.AddString(str);
  1068. if (m_ActionIndex < 0 || m_ActionIndex > 1)
  1069. m_ActionIndex = ACTION_INDEX_DEF;
  1070. m_Action.SetCurSel(m_ActionIndex);
  1071. SetControlsState();
  1072. return TRUE;
  1073. }
  1074. void
  1075. CAppPoolPerf::OnDoIdleShutdown()
  1076. {
  1077. m_fDoIdleShutdown = !m_fDoIdleShutdown;
  1078. SetControlsState();
  1079. SetModified(TRUE);
  1080. }
  1081. void
  1082. CAppPoolPerf::OnDoLimitQueue()
  1083. {
  1084. m_fDoLimitQueue = !m_fDoLimitQueue;
  1085. SetControlsState();
  1086. SetModified(TRUE);
  1087. }
  1088. void
  1089. CAppPoolPerf::OnDoEnableCPUAccount()
  1090. {
  1091. m_fDoEnableCPUAccount = !m_fDoEnableCPUAccount;
  1092. SetControlsState();
  1093. SetModified(TRUE);
  1094. }
  1095. void
  1096. CAppPoolPerf::OnItemChanged()
  1097. {
  1098. SetModified(TRUE);
  1099. }
  1100. void
  1101. CAppPoolPerf::SetControlsState()
  1102. {
  1103. m_bnt_DoIdleShutdown.SetCheck(m_fDoIdleShutdown);
  1104. m_IdleTimeout.EnableWindow(m_fDoIdleShutdown);
  1105. m_IdleTimeoutSpin.EnableWindow(m_fDoIdleShutdown);
  1106. m_btn_DoLimitQueue.SetCheck(m_fDoLimitQueue);
  1107. m_QueueSize.EnableWindow(m_fDoLimitQueue);
  1108. m_QueueSizeSpin.EnableWindow(m_fDoLimitQueue);
  1109. m_btn_DoEnableCPUAccount.SetCheck(m_fDoEnableCPUAccount);
  1110. m_MaxCPU_Use.EnableWindow(m_fDoEnableCPUAccount);
  1111. m_MaxCPU_UseSpin.EnableWindow(m_fDoEnableCPUAccount);
  1112. m_RefreshTime.EnableWindow(m_fDoEnableCPUAccount);
  1113. m_RefreshTimeSpin.EnableWindow(m_fDoEnableCPUAccount);
  1114. m_Action.EnableWindow(m_fDoEnableCPUAccount);
  1115. }
  1116. /////////////////////////////////////////////////////////////////////////////////
  1117. IMPLEMENT_DYNCREATE(CAppPoolHealth, CInetPropertyPage)
  1118. CAppPoolHealth::CAppPoolHealth(CInetPropertySheet * pSheet)
  1119. : CInetPropertyPage(CAppPoolHealth::IDD, pSheet),
  1120. m_fDoEnablePing(TRUE),
  1121. m_dwPingInterval(PING_INTERVAL_DEF),
  1122. m_fDoEnableRapidFail(TRUE),
  1123. m_dwCrashesCount(CRASHES_COUNT_DEF),
  1124. m_dwCheckInterval(CHECK_INTERVAL_DEF),
  1125. m_dwStartupLimit(STARTUP_LIMIT_DEF),
  1126. m_dwShutdownLimit(SHUTDOWN_LIMIT_DEF)
  1127. {
  1128. }
  1129. CAppPoolHealth::~CAppPoolHealth()
  1130. {
  1131. }
  1132. /* virtual */
  1133. HRESULT
  1134. CAppPoolHealth::FetchLoadedValues()
  1135. {
  1136. CError err;
  1137. BEGIN_META_INST_READ(CAppPoolSheet)
  1138. FETCH_INST_DATA_FROM_SHEET(m_fDoEnablePing);
  1139. FETCH_INST_DATA_FROM_SHEET(m_dwPingInterval);
  1140. FETCH_INST_DATA_FROM_SHEET(m_fDoEnableRapidFail);
  1141. FETCH_INST_DATA_FROM_SHEET(m_dwCrashesCount);
  1142. FETCH_INST_DATA_FROM_SHEET(m_dwCheckInterval);
  1143. FETCH_INST_DATA_FROM_SHEET(m_dwStartupLimit);
  1144. FETCH_INST_DATA_FROM_SHEET(m_dwShutdownLimit);
  1145. END_META_INST_READ(err)
  1146. return err;
  1147. }
  1148. /* virtual */
  1149. HRESULT
  1150. CAppPoolHealth::SaveInfo()
  1151. {
  1152. ASSERT(IsDirty());
  1153. CError err;
  1154. BEGIN_META_INST_WRITE(CAppPoolSheet)
  1155. STORE_INST_DATA_ON_SHEET(m_fDoEnablePing);
  1156. STORE_INST_DATA_ON_SHEET(m_dwPingInterval);
  1157. STORE_INST_DATA_ON_SHEET(m_fDoEnableRapidFail);
  1158. STORE_INST_DATA_ON_SHEET(m_dwCrashesCount);
  1159. STORE_INST_DATA_ON_SHEET(m_dwCheckInterval);
  1160. STORE_INST_DATA_ON_SHEET(m_dwStartupLimit);
  1161. STORE_INST_DATA_ON_SHEET(m_dwShutdownLimit);
  1162. END_META_INST_WRITE(err)
  1163. return err;
  1164. }
  1165. void
  1166. CAppPoolHealth::DoDataExchange(CDataExchange * pDX)
  1167. {
  1168. CInetPropertyPage::DoDataExchange(pDX);
  1169. //{{AFX_DATA_MAP(CAppPoolHealth)
  1170. DDX_Check(pDX, IDC_ENABLE_PING, m_fDoEnablePing);
  1171. DDX_Control(pDX, IDC_ENABLE_PING, m_bnt_DoEnablePing);
  1172. // This Needs to come before DDX_Text which will try to put text big number into small number
  1173. DDV_MinMaxBalloon(pDX, IDC_PINGINTERVAL, PING_INTERVAL_MIN, PING_INTERVAL_MAX);
  1174. DDX_TextBalloon(pDX, IDC_PINGINTERVAL, m_dwPingInterval);
  1175. DDX_Control(pDX, IDC_PINGINTERVAL, m_PingInterval);
  1176. DDX_Control(pDX, IDC_PINGINTERVAL_SPIN, m_PingIntervalSpin);
  1177. DDX_Check(pDX, IDC_ENABLE_RAPID_FAIL, m_fDoEnableRapidFail);
  1178. DDX_Control(pDX, IDC_ENABLE_RAPID_FAIL, m_btn_DoEnableRapidFail);
  1179. // This Needs to come before DDX_Text which will try to put text big number into small number
  1180. DDV_MinMaxBalloon(pDX, IDC_CRASHES_COUNT, CRASHES_COUNT_MIN, CRASHES_COUNT_MAX);
  1181. DDX_TextBalloon(pDX, IDC_CRASHES_COUNT, m_dwCrashesCount);
  1182. DDX_Control(pDX, IDC_CRASHES_COUNT, m_CrashesCount);
  1183. DDX_Control(pDX, IDC_CRASHES_COUNT_SPIN, m_CrashesCountSpin);
  1184. // This Needs to come before DDX_Text which will try to put text big number into small number
  1185. DDV_MinMaxBalloon(pDX, IDC_CHECK_TIME, CHECK_INTERVAL_MIN, CHECK_INTERVAL_MAX);
  1186. DDX_TextBalloon(pDX, IDC_CHECK_TIME, m_dwCheckInterval);
  1187. DDX_Control(pDX, IDC_CHECK_TIME, m_CheckInterval);
  1188. DDX_Control(pDX, IDC_CHECK_TIME_SPIN, m_CheckIntervalSpin);
  1189. // This Needs to come before DDX_Text which will try to put text big number into small number
  1190. DDV_MinMaxBalloon(pDX, IDC_STARTUP_LIMIT, STARTUP_LIMIT_MIN, STARTUP_LIMIT_MAX);
  1191. DDX_TextBalloon(pDX, IDC_STARTUP_LIMIT, m_dwStartupLimit);
  1192. DDX_Control(pDX, IDC_STARTUP_LIMIT, m_StartupLimit);
  1193. DDX_Control(pDX, IDC_STARTUP_LIMIT_SPIN, m_StartupLimitSpin);
  1194. // This Needs to come before DDX_Text which will try to put text big number into small number
  1195. DDV_MinMaxBalloon(pDX, IDC_SHUTDOWN_LIMIT, SHUTDOWN_LIMIT_MIN, SHUTDOWN_LIMIT_MAX);
  1196. DDX_TextBalloon(pDX, IDC_SHUTDOWN_LIMIT, m_dwShutdownLimit);
  1197. DDX_Control(pDX, IDC_SHUTDOWN_LIMIT, m_ShutdownLimit);
  1198. DDX_Control(pDX, IDC_SHUTDOWN_LIMIT_SPIN, m_ShutdownLimitSpin);
  1199. //}}AFX_DATA_MAP
  1200. }
  1201. BEGIN_MESSAGE_MAP(CAppPoolHealth, CInetPropertyPage)
  1202. //{{AFX_MSG_MAP(CAppPoolHealth)
  1203. ON_BN_CLICKED(IDC_ENABLE_PING, OnDoEnablePinging)
  1204. ON_BN_CLICKED(IDC_ENABLE_RAPID_FAIL, OnDoEnableRapidFail)
  1205. ON_EN_CHANGE(IDC_PINGINTERVAL, OnItemChanged)
  1206. ON_EN_CHANGE(IDC_CRASHES_COUNT, OnItemChanged)
  1207. ON_EN_CHANGE(IDC_CHECK_TIME, OnItemChanged)
  1208. ON_EN_CHANGE(IDC_STARTUP_LIMIT, OnItemChanged)
  1209. ON_EN_CHANGE(IDC_SHUTDOWN_LIMIT, OnItemChanged)
  1210. //}}AFX_MSG_MAP
  1211. END_MESSAGE_MAP()
  1212. BOOL
  1213. CAppPoolHealth::OnInitDialog()
  1214. {
  1215. UDACCEL toAcc[3] = {{1, 1}, {3, 5}, {6, 10}};
  1216. CInetPropertyPage::OnInitDialog();
  1217. SETUP_EDIT_SPIN(m_fDoEnablePing, m_PingInterval, m_PingIntervalSpin,
  1218. PING_INTERVAL_MIN, PING_INTERVAL_MAX, m_dwPingInterval);
  1219. SETUP_EDIT_SPIN(m_fDoEnableRapidFail, m_CrashesCount, m_CrashesCountSpin,
  1220. CRASHES_COUNT_MIN, CRASHES_COUNT_MAX, m_dwCrashesCount);
  1221. SETUP_EDIT_SPIN(m_fDoEnableRapidFail, m_CheckInterval, m_CheckIntervalSpin,
  1222. CHECK_INTERVAL_MIN, CHECK_INTERVAL_MAX, m_dwCheckInterval);
  1223. SETUP_SPIN(m_StartupLimitSpin,
  1224. STARTUP_LIMIT_MIN, STARTUP_LIMIT_MAX, m_dwStartupLimit);
  1225. SETUP_SPIN(m_ShutdownLimitSpin,
  1226. SHUTDOWN_LIMIT_MIN, SHUTDOWN_LIMIT_MAX, m_dwShutdownLimit);
  1227. return TRUE;
  1228. }
  1229. void
  1230. CAppPoolHealth::OnDoEnablePinging()
  1231. {
  1232. m_fDoEnablePing = !m_fDoEnablePing;
  1233. m_bnt_DoEnablePing.SetCheck(m_fDoEnablePing);
  1234. m_PingInterval.EnableWindow(m_fDoEnablePing);
  1235. m_PingIntervalSpin.EnableWindow(m_fDoEnablePing);
  1236. SetModified(TRUE);
  1237. }
  1238. void
  1239. CAppPoolHealth::OnDoEnableRapidFail()
  1240. {
  1241. m_fDoEnableRapidFail = !m_fDoEnableRapidFail;
  1242. m_btn_DoEnableRapidFail.SetCheck(m_fDoEnableRapidFail);
  1243. m_CrashesCount.EnableWindow(m_fDoEnableRapidFail);
  1244. m_CrashesCountSpin.EnableWindow(m_fDoEnableRapidFail);
  1245. m_CheckInterval.EnableWindow(m_fDoEnableRapidFail);
  1246. m_CheckIntervalSpin.EnableWindow(m_fDoEnableRapidFail);
  1247. SetModified(TRUE);
  1248. }
  1249. void
  1250. CAppPoolHealth::OnItemChanged()
  1251. {
  1252. SetModified(TRUE);
  1253. }
  1254. ///////////////////////////////////////////////////////////////////////////////////////////
  1255. #if 0
  1256. IMPLEMENT_DYNCREATE(CAppPoolDebug, CInetPropertyPage)
  1257. CAppPoolDebug::CAppPoolDebug(CInetPropertySheet * pSheet)
  1258. : CInetPropertyPage(CAppPoolDebug::IDD, pSheet),
  1259. m_fDoEnableDebug(TRUE)
  1260. {
  1261. }
  1262. CAppPoolDebug::~CAppPoolDebug()
  1263. {
  1264. }
  1265. /* virtual */
  1266. HRESULT
  1267. CAppPoolDebug::FetchLoadedValues()
  1268. {
  1269. CError err;
  1270. BEGIN_META_INST_READ(CAppPoolSheet)
  1271. FETCH_INST_DATA_FROM_SHEET(m_fDoEnableDebug);
  1272. FETCH_INST_DATA_FROM_SHEET(m_DebuggerFileName);
  1273. FETCH_INST_DATA_FROM_SHEET(m_DebuggerParams);
  1274. END_META_INST_READ(err)
  1275. return err;
  1276. }
  1277. /* virtual */
  1278. HRESULT
  1279. CAppPoolDebug::SaveInfo()
  1280. {
  1281. ASSERT(IsDirty());
  1282. CError err;
  1283. BEGIN_META_INST_WRITE(CAppPoolSheet)
  1284. STORE_INST_DATA_ON_SHEET(m_fDoEnableDebug);
  1285. STORE_INST_DATA_ON_SHEET(m_DebuggerFileName);
  1286. STORE_INST_DATA_ON_SHEET(m_DebuggerParams);
  1287. END_META_INST_WRITE(err)
  1288. return err;
  1289. }
  1290. void
  1291. CAppPoolDebug::DoDataExchange(CDataExchange * pDX)
  1292. {
  1293. CInetPropertyPage::DoDataExchange(pDX);
  1294. //{{AFX_DATA_MAP(CAppPoolHealth)
  1295. DDX_Check(pDX, IDC_ENABLE_DEBUG, m_fDoEnableDebug);
  1296. DDX_Control(pDX, IDC_ENABLE_DEBUG, m_bnt_DoEnableDebug);
  1297. DDX_Control(pDX, IDC_FILE_NAME, m_FileName);
  1298. DDX_Control(pDX, IDC_BROWSE, m_Browse);
  1299. DDX_Text(pDX, IDC_PARAMETERS, m_DebuggerParams);
  1300. DDX_Control(pDX, IDC_PARAMETERS, m_Params);
  1301. //}}AFX_DATA_MAP
  1302. DDX_Text(pDX, IDC_FILE_NAME, m_DebuggerFileName);
  1303. if (pDX->m_bSaveAndValidate && m_fDoEnableDebug)
  1304. {
  1305. DDV_FilePath(pDX, m_DebuggerFileName, GetSheet()->IsLocal());
  1306. }
  1307. }
  1308. BEGIN_MESSAGE_MAP(CAppPoolDebug, CInetPropertyPage)
  1309. //{{AFX_MSG_MAP(CAppPoolHealth)
  1310. ON_BN_CLICKED(IDC_ENABLE_DEBUG, OnDoEnableDebug)
  1311. ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
  1312. ON_EN_CHANGE(IDC_FILE_NAME, OnItemChanged)
  1313. ON_EN_CHANGE(IDC_PARAMETERS, OnItemChanged)
  1314. //}}AFX_MSG_MAP
  1315. END_MESSAGE_MAP()
  1316. BOOL
  1317. CAppPoolDebug::OnInitDialog()
  1318. {
  1319. CInetPropertyPage::OnInitDialog();
  1320. if (m_DebuggerFileName.IsEmpty())
  1321. m_fDoEnableDebug = FALSE;
  1322. SetControlState();
  1323. #ifdef SUPPORT_SLASH_SLASH_QUESTIONMARK_SLASH_TYPE_PATHS
  1324. LimitInputPath(CONTROL_HWND(IDC_FILE_NAME),TRUE);
  1325. #else
  1326. LimitInputPath(CONTROL_HWND(IDC_FILE_NAME),FALSE);
  1327. #endif
  1328. return TRUE;
  1329. }
  1330. void
  1331. CAppPoolDebug::SetControlState()
  1332. {
  1333. m_bnt_DoEnableDebug.SetCheck(m_fDoEnableDebug);
  1334. m_FileName.EnableWindow(m_fDoEnableDebug);
  1335. m_Browse.EnableWindow(GetSheet()->IsLocal() && m_fDoEnableDebug);
  1336. m_Params.EnableWindow(m_fDoEnableDebug);
  1337. }
  1338. void
  1339. CAppPoolDebug::OnItemChanged()
  1340. {
  1341. SetModified(TRUE);
  1342. }
  1343. void
  1344. CAppPoolDebug::OnDoEnableDebug()
  1345. {
  1346. m_fDoEnableDebug = !m_fDoEnableDebug;
  1347. SetControlState();
  1348. SetModified(TRUE);
  1349. }
  1350. void
  1351. CAppPoolDebug::OnBrowse()
  1352. {
  1353. CString mask((LPCTSTR)IDS_DEBUG_EXEC_MASK);
  1354. //
  1355. // CODEWORK: Derive a class from CFileDialog that allows
  1356. // the setting of the initial path
  1357. //
  1358. //CString strPath;
  1359. //m_edit_Executable.GetWindowText(strPath);
  1360. CFileDialog dlgBrowse(
  1361. TRUE,
  1362. NULL,
  1363. NULL,
  1364. OFN_HIDEREADONLY,
  1365. mask,
  1366. this
  1367. );
  1368. // Disable hook to get Windows 2000 style dialog
  1369. dlgBrowse.m_ofn.Flags &= ~(OFN_ENABLEHOOK);
  1370. dlgBrowse.m_ofn.Flags |= OFN_DONTADDTORECENT|OFN_FILEMUSTEXIST;
  1371. if (dlgBrowse.DoModal() == IDOK)
  1372. {
  1373. m_FileName.SetWindowText(dlgBrowse.GetPathName());
  1374. }
  1375. OnItemChanged();
  1376. }
  1377. #endif
  1378. /////////////////////////////////////////////////////////////////////////////////////
  1379. #define LOCAL_SYSTEM_IDX 2
  1380. #define LOCAL_SERVICE_IDX 1
  1381. #define NETWORK_SERVICE_IDX 0
  1382. IMPLEMENT_DYNCREATE(CAppPoolIdent, CInetPropertyPage)
  1383. CAppPoolIdent::CAppPoolIdent(CInetPropertySheet * pSheet)
  1384. : CInetPropertyPage(CAppPoolIdent::IDD, pSheet),
  1385. m_fPredefined(FALSE)
  1386. {
  1387. }
  1388. CAppPoolIdent::~CAppPoolIdent()
  1389. {
  1390. }
  1391. /* virtual */
  1392. HRESULT
  1393. CAppPoolIdent::FetchLoadedValues()
  1394. {
  1395. CError err;
  1396. BEGIN_META_INST_READ(CAppPoolSheet)
  1397. FETCH_INST_DATA_FROM_SHEET(m_dwIdentType);
  1398. FETCH_INST_DATA_FROM_SHEET(m_strUserName);
  1399. FETCH_INST_DATA_FROM_SHEET_PASSWORD(m_strUserPass);
  1400. END_META_INST_READ(err)
  1401. m_fPredefined = m_dwIdentType != IDENT_TYPE_CONFIGURABLE;
  1402. switch (m_dwIdentType)
  1403. {
  1404. case IDENT_TYPE_LOCALSYSTEM:
  1405. m_PredefIndex = LOCAL_SYSTEM_IDX;
  1406. break;
  1407. case IDENT_TYPE_LOCALSERVICE:
  1408. m_PredefIndex = LOCAL_SERVICE_IDX;
  1409. break;
  1410. case IDENT_TYPE_NETWORKSERVICE:
  1411. m_PredefIndex = NETWORK_SERVICE_IDX;
  1412. break;
  1413. default:
  1414. m_PredefIndex = -1;
  1415. break;
  1416. }
  1417. return err;
  1418. }
  1419. /* virtual */
  1420. HRESULT
  1421. CAppPoolIdent::SaveInfo()
  1422. {
  1423. ASSERT(IsDirty());
  1424. CError err;
  1425. BEGIN_META_INST_WRITE(CAppPoolSheet)
  1426. if (m_fPredefined)
  1427. {
  1428. switch (m_PredefIndex)
  1429. {
  1430. case LOCAL_SYSTEM_IDX:
  1431. m_dwIdentType = IDENT_TYPE_LOCALSYSTEM;
  1432. break;
  1433. case LOCAL_SERVICE_IDX:
  1434. m_dwIdentType = IDENT_TYPE_LOCALSERVICE;
  1435. break;
  1436. case NETWORK_SERVICE_IDX:
  1437. m_dwIdentType = IDENT_TYPE_NETWORKSERVICE;
  1438. break;
  1439. default:
  1440. break;
  1441. }
  1442. }
  1443. else
  1444. {
  1445. m_dwIdentType = IDENT_TYPE_CONFIGURABLE;
  1446. STORE_INST_DATA_ON_SHEET(m_strUserName);
  1447. STORE_INST_DATA_ON_SHEET(m_strUserPass);
  1448. }
  1449. STORE_INST_DATA_ON_SHEET(m_dwIdentType);
  1450. END_META_INST_WRITE(err)
  1451. return err;
  1452. }
  1453. void
  1454. CAppPoolIdent::SetControlState()
  1455. {
  1456. m_bnt_Predefined.SetCheck(m_fPredefined);
  1457. m_bnt_Configurable.SetCheck(!m_fPredefined);
  1458. m_PredefList.EnableWindow(m_fPredefined);
  1459. m_UserName.EnableWindow(!m_fPredefined);
  1460. m_UserPass.EnableWindow(!m_fPredefined);
  1461. m_Browse.EnableWindow(!m_fPredefined);
  1462. }
  1463. void
  1464. CAppPoolIdent::DoDataExchange(CDataExchange * pDX)
  1465. {
  1466. CInetPropertyPage::DoDataExchange(pDX);
  1467. //{{AFX_DATA_MAP(CAppPoolIdent)
  1468. DDX_Control(pDX, IDC_PREDEFINED, m_bnt_Predefined);
  1469. DDX_Control(pDX, IDC_CONFIGURABLE, m_bnt_Configurable);
  1470. DDX_CBIndex(pDX, IDC_SYSTEM_ACCOUNTS, m_PredefIndex);
  1471. DDX_Control(pDX, IDC_SYSTEM_ACCOUNTS, m_PredefList);
  1472. DDX_Text(pDX, IDC_USER_NAME, m_strUserName);
  1473. DDX_Control(pDX, IDC_USER_NAME, m_UserName);
  1474. DDX_Control(pDX, IDC_BROWSE, m_Browse);
  1475. //DDX_Password(pDX, IDC_USER_PASS, m_strUserPass, _T("***********"));
  1476. DDX_Password_SecuredString(pDX, IDC_USER_PASS, m_strUserPass, _T("***********"));
  1477. DDX_Control(pDX, IDC_USER_PASS, m_UserPass);
  1478. //}}AFX_DATA_MAP
  1479. if (pDX->m_bSaveAndValidate
  1480. && m_fPredefined
  1481. && m_PredefIndex == LOCAL_SYSTEM_IDX
  1482. && !m_bAssCovered
  1483. )
  1484. {
  1485. if (IsDirty())
  1486. {
  1487. if (!NoYesMessageBox(IDS_SYSIDENT_CONFIRM))
  1488. {
  1489. m_PredefList.SetFocus();
  1490. pDX->Fail();
  1491. }
  1492. m_bAssCovered = TRUE;
  1493. }
  1494. }
  1495. }
  1496. BEGIN_MESSAGE_MAP(CAppPoolIdent, CInetPropertyPage)
  1497. //{{AFX_MSG_MAP(CAppPoolIdent)
  1498. ON_BN_CLICKED(IDC_PREDEFINED, OnPredefined)
  1499. ON_BN_CLICKED(IDC_CONFIGURABLE, OnPredefined)
  1500. ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
  1501. ON_EN_CHANGE(IDC_USER_NAME, OnItemChanged)
  1502. ON_EN_CHANGE(IDC_USER_PASS, OnItemChanged)
  1503. ON_CBN_SELCHANGE(IDC_SYSTEM_ACCOUNTS, OnSysAccountChanged)
  1504. //}}AFX_MSG_MAP
  1505. END_MESSAGE_MAP()
  1506. BOOL
  1507. CAppPoolIdent::OnInitDialog()
  1508. {
  1509. CInetPropertyPage::OnInitDialog();
  1510. CString buf;
  1511. buf.LoadString(IDS_NETSERVICE);
  1512. m_PredefList.AddString(buf);
  1513. buf.LoadString(IDS_LOCALSERVICE);
  1514. m_PredefList.AddString(buf);
  1515. buf.LoadString(IDS_LOCALSYSTEM);
  1516. m_PredefList.AddString(buf);
  1517. if (!m_fPredefined)
  1518. {
  1519. m_PredefIndex = 0;
  1520. }
  1521. m_PredefList.SetCurSel(m_PredefIndex);
  1522. SetControlState();
  1523. m_bAssCovered = FALSE;
  1524. return TRUE;
  1525. }
  1526. void
  1527. CAppPoolIdent::OnPredefined()
  1528. {
  1529. m_fPredefined = !m_fPredefined;
  1530. SetControlState();
  1531. SetModified(TRUE);
  1532. }
  1533. void
  1534. CAppPoolIdent::OnBrowse()
  1535. {
  1536. // User browser like in other places
  1537. CString user;
  1538. if (GetIUsrAccount(user))
  1539. {
  1540. if (user.CompareNoCase(m_strUserName) != 0)
  1541. {
  1542. m_strUserPass.Empty();
  1543. }
  1544. m_strUserName = user;
  1545. SetModified(TRUE);
  1546. UpdateData(FALSE);
  1547. }
  1548. }
  1549. void
  1550. CAppPoolIdent::OnItemChanged()
  1551. {
  1552. SetModified(TRUE);
  1553. }
  1554. void
  1555. CAppPoolIdent::OnSysAccountChanged()
  1556. {
  1557. SetModified(TRUE);
  1558. }
  1559. #if 0
  1560. HRESULT
  1561. CAppPoolCache::FetchLoadedValues()
  1562. {
  1563. CError err;
  1564. BEGIN_META_INST_READ(CAppPoolSheet)
  1565. FETCH_INST_DATA_FROM_SHEET(m_ScriptEngCacheMax);
  1566. FETCH_INST_DATA_FROM_SHEET(m_NoCache);
  1567. FETCH_INST_DATA_FROM_SHEET(m_LimCache);
  1568. FETCH_INST_DATA_FROM_SHEET(m_UnlimCache);
  1569. FETCH_INST_DATA_FROM_SHEET(m_LimDiskCache);
  1570. FETCH_INST_DATA_FROM_SHEET(m_LimCacheMemSize);
  1571. FETCH_INST_DATA_FROM_SHEET(m_LimCacheDiskSize);
  1572. FETCH_INST_DATA_FROM_SHEET(m_DiskCacheDir);
  1573. END_META_INST_READ(err)
  1574. return err;
  1575. }
  1576. HRESULT
  1577. CAppPoolCache::SaveInfo()
  1578. {
  1579. ASSERT(IsDirty());
  1580. CError err;
  1581. BEGIN_META_INST_WRITE(CAppPoolSheet)
  1582. STORE_INST_DATA_ON_SHEET(m_ScriptEngCacheMax)
  1583. STORE_INST_DATA_ON_SHEET(m_NoCache);
  1584. STORE_INST_DATA_ON_SHEET(m_LimCache);
  1585. STORE_INST_DATA_ON_SHEET(m_UnlimCache);
  1586. STORE_INST_DATA_ON_SHEET(m_LimDiskCache);
  1587. STORE_INST_DATA_ON_SHEET(m_LimCacheMemSize);
  1588. STORE_INST_DATA_ON_SHEET(m_LimCacheDiskSize);
  1589. STORE_INST_DATA_ON_SHEET(m_DiskCacheDir);
  1590. END_META_INST_WRITE(err)
  1591. return err;
  1592. }
  1593. HRESULT
  1594. CPoolProcessOpt::FetchLoadedValues()
  1595. {
  1596. CError err;
  1597. BEGIN_META_INST_READ(CAppPoolSheet)
  1598. FETCH_INST_DATA_FROM_SHEET(m_LogFailures);
  1599. FETCH_INST_DATA_FROM_SHEET(m_DebugExcept);
  1600. FETCH_INST_DATA_FROM_SHEET(m_CgiTimeout);
  1601. FETCH_INST_DATA_FROM_SHEET(m_HTMLFallback);
  1602. END_META_INST_READ(err)
  1603. return err;
  1604. }
  1605. HRESULT
  1606. CPoolProcessOpt::SaveInfo()
  1607. {
  1608. ASSERT(IsDirty());
  1609. CError err;
  1610. BEGIN_META_INST_WRITE(CAppPoolSheet)
  1611. STORE_INST_DATA_ON_SHEET(m_LogFailures);
  1612. STORE_INST_DATA_ON_SHEET(m_DebugExcept);
  1613. STORE_INST_DATA_ON_SHEET(m_CgiTimeout);
  1614. STORE_INST_DATA_ON_SHEET(m_HTMLFallback);
  1615. END_META_INST_WRITE(err)
  1616. return err;
  1617. }
  1618. #endif