/*++ Copyright (c) 1994-2000 Microsoft Corporation Module Name : perform.cpp Abstract: WWW Performance Property Page Author: Ronald Meijer (ronaldm) Sergei Antonov (sergeia) Project: Internet Services Manager Revision History: 11/29/2000 sergeia Changed for IIS6. Removed excessive commenting --*/ // // Include Files // #include "stdafx.h" #include "resource.h" #include "common.h" #include "inetmgrapp.h" #include "inetprop.h" #include "shts.h" #include "w3sht.h" #include "supdlgs.h" #include "perform.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif #define CONNECTIONS_MIN 0 #define CONNECTIONS_MAX 2000000000 IMPLEMENT_DYNCREATE(CW3PerfPage, CInetPropertyPage) /* static */ void CW3PerfPage::ParseMaxNetworkUse( DWORD& dwMaxBandwidth, DWORD& dwMaxBandwidthDisplay, BOOL& fLimitBandwidth ) { // // Special case: If dwMaxBandwidth is 0(an invalid value), the // value likely could not be inherited from the root (the user // is an operator and can't see the properties there). Adjust // the value to a possibly misleading value. // if (dwMaxBandwidth == 0L) { TRACEEOLID("Adjusting invalid bandwidth throttling value -- " "are you an operator?"); dwMaxBandwidth = INFINITE_BANDWIDTH; } fLimitBandwidth = (dwMaxBandwidth != INFINITE_BANDWIDTH); dwMaxBandwidthDisplay = fLimitBandwidth ? (dwMaxBandwidth / KILOBYTE) : (DEF_BANDWIDTH / KILOBYTE); } CW3PerfPage::CW3PerfPage( IN CInetPropertySheet * pSheet ) : CInetPropertyPage(CW3PerfPage::IDD, pSheet) { #ifdef _DEBUG afxMemDF |= checkAlwaysMemDF; #endif // _DEBUG m_nUnlimited = RADIO_LIMITED; m_nMaxConnections = 50; m_nVisibleMaxConnections = 50; } CW3PerfPage::~CW3PerfPage() { } void CW3PerfPage::DoDataExchange( IN CDataExchange * pDX ) /*++ Routine Description: Initialise/Store control data Arguments: CDataExchange * pDX - DDX/DDV control structure Return Value: None --*/ { CInetPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CW3PerfPage) DDX_Check(pDX, IDC_CHECK_LIMIT_NETWORK_USE, m_fLimitBandwidth); DDX_Control(pDX, IDC_CHECK_LIMIT_NETWORK_USE, m_LimitBandwidth); DDX_Control(pDX, IDC_MAX_BANDWIDTH, m_MaxBandwidth); DDX_Control(pDX, IDC_MAX_BANDWIDTH_SPIN, m_MaxBandwidthSpin); DDX_Control(pDX, IDC_STATIC_MAX_NETWORK_USE, m_MaxBandwidthTxt); DDX_Control(pDX, IDC_STATIC_PSHED_REQUIRED, m_static_PSHED_Required); DDX_Control(pDX, IDC_STATIC_CONN, m_WebServiceConnGrp); DDX_Control(pDX, IDC_RADIO_UNLIMITED, m_radio_Unlimited); DDX_Control(pDX, IDC_RADIO_LIMITED, m_radio_Limited); DDX_Radio(pDX, IDC_RADIO_UNLIMITED, m_nUnlimited); DDX_Control(pDX, IDC_EDIT_MAX_CONNECTIONS, m_edit_MaxConnections); DDX_Control(pDX, IDC_SPIN_MAX_CONNECTIONS, m_MaxConnectionsSpin); //}}AFX_DATA_MAP if (pDX->m_bSaveAndValidate && m_fLimitBandwidth) { // This Needs to come before DDX_Text which will try to put text big number into small number DDV_MinMaxBalloon(pDX, IDC_MAX_BANDWIDTH, BANDWIDTH_MIN, BANDWIDTH_MAX); } DDX_TextBalloon(pDX, IDC_MAX_BANDWIDTH, m_dwMaxBandwidthDisplay); if (IsMasterInstance() || GetSheet()->QueryMajorVersion() >= 6) { if (m_nUnlimited != 0) { // This Needs to come before DDX_Text which will try to put text big number into small number DDV_MinMaxBalloon(pDX, IDC_EDIT_MAX_CONNECTIONS, CONNECTIONS_MIN, CONNECTIONS_MAX); } if (!pDX->m_bSaveAndValidate || !m_fUnlimitedConnections ) { DDX_Text(pDX, IDC_EDIT_MAX_CONNECTIONS, m_nVisibleMaxConnections); } } } // // Message Map // BEGIN_MESSAGE_MAP(CW3PerfPage, CInetPropertyPage) //{{AFX_MSG_MAP(CW3PerfPage) ON_BN_CLICKED(IDC_CHECK_LIMIT_NETWORK_USE, OnCheckLimitNetworkUse) ON_BN_CLICKED(IDC_RADIO_LIMITED, OnRadioLimited) ON_BN_CLICKED(IDC_RADIO_UNLIMITED, OnRadioUnlimited) //}}AFX_MSG_MAP ON_EN_CHANGE(IDC_EDIT_MAX_CONNECTIONS, OnItemChanged) ON_EN_CHANGE(IDC_MAX_BANDWIDTH, OnItemChanged) END_MESSAGE_MAP() BOOL CW3PerfPage::SetControlStates() /*++ Routine Description: Set control states depending on contents of the dialog Arguments: None Return Value: TRUE if the 'limit network use' is on. --*/ { BOOL fLimitOn = FALSE; if (::IsWindow(m_LimitBandwidth.m_hWnd)) { fLimitOn = m_LimitBandwidth.GetCheck() > 0 && HasBwThrottling() && HasAdminAccess(); m_static_PSHED_Required.ShowWindow(fLimitOn && fLimitOn != m_fLimitBandwidthInitial ? SW_SHOW : SW_HIDE); m_MaxBandwidthTxt.EnableWindow(fLimitOn); m_MaxBandwidth.EnableWindow(fLimitOn); m_MaxBandwidthSpin.EnableWindow(fLimitOn); ::EnableWindow(CONTROL_HWND(IDC_STATIC_KBS), fLimitOn); } if (::IsWindow(m_edit_MaxConnections.m_hWnd)) { m_edit_MaxConnections.EnableWindow(!m_fUnlimitedConnections); m_MaxConnectionsSpin.EnableWindow(!m_fUnlimitedConnections); } return fLimitOn; } /* virtual */ HRESULT CW3PerfPage::FetchLoadedValues() /*++ Routine Description: Move configuration data from sheet to dialog controls Arguments: None Return Value: HRESULT --*/ { CError err; BEGIN_META_INST_READ(CW3Sheet) FETCH_INST_DATA_FROM_SHEET(m_nMaxConnections); FETCH_INST_DATA_FROM_SHEET(m_dwMaxBandwidth); ParseMaxNetworkUse( m_dwMaxBandwidth, m_dwMaxBandwidthDisplay, m_fLimitBandwidth ); m_fUnlimitedConnections = ((ULONG)(LONG)m_nMaxConnections >= UNLIMITED_CONNECTIONS); // // Set the visible max connections edit field, which // may start out with a default value // m_nVisibleMaxConnections = m_fUnlimitedConnections ? INITIAL_MAX_CONNECTIONS : m_nMaxConnections; // // Set radio value // m_nUnlimited = m_fUnlimitedConnections ? RADIO_UNLIMITED : RADIO_LIMITED; END_META_INST_READ(err) m_fLimitBandwidthInitial = m_fLimitBandwidth; return err; } /* virtual */ HRESULT CW3PerfPage::SaveInfo() /*++ Routine Description: Save the information on this property page Arguments: None Return Value: Error return code --*/ { ASSERT(IsDirty()); TRACEEOLID("Saving W3 performance page now..."); CError err; BuildMaxNetworkUse( m_dwMaxBandwidth, m_dwMaxBandwidthDisplay, m_fLimitBandwidth ); m_nMaxConnections = m_fUnlimitedConnections ? UNLIMITED_CONNECTIONS : m_nVisibleMaxConnections; BeginWaitCursor(); BEGIN_META_INST_WRITE(CW3Sheet) STORE_INST_DATA_ON_SHEET(m_dwMaxBandwidth); STORE_INST_DATA_ON_SHEET(m_nMaxConnections); END_META_INST_WRITE(err) EndWaitCursor(); m_fLimitBandwidthInitial = m_fLimitBandwidth; return err; } // // Message Handlers // // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< BOOL CW3PerfPage::OnSetActive() { return CInetPropertyPage::OnSetActive(); } void CW3PerfPage::OnItemChanged() { SetControlStates(); SetModified(TRUE); } void CW3PerfPage::OnRadioLimited() /*++ Routine Description: 'limited' radio button handler Arguments: None Return Value: None --*/ { m_fUnlimitedConnections = FALSE; SetControlStates(); m_edit_MaxConnections.SetSel(0,-1); m_edit_MaxConnections.SetFocus(); OnItemChanged(); } void CW3PerfPage::OnRadioUnlimited() /*++ Routine Description: 'unlimited' radio button handler Arguments: None Return Value: None --*/ { m_fUnlimitedConnections = TRUE; OnItemChanged(); } void CW3PerfPage::OnCheckLimitNetworkUse() /*++ Routine Description: The "limit network use" checkbox has been clicked Enable/disable the "max bandwidth" controls. Arguments: None Return Value: None --*/ { if (SetControlStates()) { m_MaxBandwidth.SetSel(0, -1); m_MaxBandwidth.SetFocus(); } OnItemChanged(); } BOOL CW3PerfPage::OnInitDialog() { UDACCEL toAcc[3] = {{1, 1}, {3, 5}, {6, 10}}; CInetPropertyPage::OnInitDialog(); m_LimitBandwidth.EnableWindow( HasBwThrottling() && HasAdminAccess()); m_static_PSHED_Required.ShowWindow(SW_HIDE); if (!IsMasterInstance() && GetSheet()->QueryMajorVersion() <= 5) { m_WebServiceConnGrp.ShowWindow(SW_HIDE); m_radio_Unlimited.ShowWindow(SW_HIDE); m_radio_Limited.ShowWindow(SW_HIDE); m_edit_MaxConnections.ShowWindow(SW_HIDE); m_MaxConnectionsSpin.ShowWindow(SW_HIDE); } else { SETUP_SPIN(m_MaxConnectionsSpin, CONNECTIONS_MIN, CONNECTIONS_MAX, m_nMaxConnections); if (IsMasterInstance()) { CString buf; buf.LoadString(IDS_PERF_MASTER_BANDWIDTH); GetDlgItem(IDC_CHECK_LIMIT_NETWORK_USE)->SetWindowText(buf); } } SETUP_EDIT_SPIN(m_fLimitBandwidth, m_MaxBandwidth, m_MaxBandwidthSpin, BANDWIDTH_MIN, BANDWIDTH_MAX, m_dwMaxBandwidthDisplay); SetControlStates(); return TRUE; }