/*++ Copyright (c) 1994-2001 Microsoft Corporation Module Name : app_sheet.cpp Abstract: Application property sheet implementation Author: Sergei Antonov (sergeia) Project: Internet Services Manager Revision History: --*/ #include "stdafx.h" #include "common.h" #include "resource.h" #include "inetmgrapp.h" #include "inetprop.h" #include "shts.h" #include "w3sht.h" #include "app_sheet.h" #include // Defaults and ranges for properties #define SESSION_TIMEOUT_MIN 1 #define SESSION_TIMEOUT_MAX 2000000000 #define SCRIPT_TIMEOUT_MIN 1 #define SCRIPT_TIMEOUT_MAX 2000000000 #define SCRIPT_ENG_MIN 0 #define SCRIPT_ENG_MAX 2000000000 #define WINHELP_NUMBER_BASE 0x20000 extern CInetmgrApp theApp; HRESULT AppConfigSheet(CIISMBNode * pNode,CIISMBNode * pNodeParent, LPCTSTR metapath, CWnd * pParent) { if (pNode == NULL) { return E_POINTER; } CError err; do { CAppPropSheet * pSheet = new CAppPropSheet( pNode->QueryAuthInfo(), metapath, pParent, (LPARAM)pNode, (LPARAM)pNodeParent, NULL ); CString caption; caption.LoadString(IDS_APPSHEET_TITLE); pSheet->SetTitle(caption); // Hide Apply button for modal dialog pSheet->m_psh.dwFlags |= PSH_NOAPPLYNOW; BOOL fCompatMode = FALSE; BOOL bShowCache = FALSE; if (pSheet->QueryMajorVersion() >= 6) { CError err; CString svc, inst; CMetabasePath::GetServicePath(metapath, svc, NULL); CMetaKey mk(pSheet->QueryAuthInfo(), svc, METADATA_PERMISSION_READ); err = mk.QueryResult(); if (err.Succeeded()) { err = mk.QueryValue(MD_GLOBAL_STANDARD_APP_MODE_ENABLED, fCompatMode); } } else { fCompatMode = TRUE; } if (fCompatMode) { if (CMetabasePath::IsMasterInstance(metapath)) { bShowCache = TRUE; } else { CMetaKey mk(pSheet->QueryAuthInfo(), metapath, METADATA_PERMISSION_READ); err = mk.QueryResult(); DWORD isol = 0; if (err.Succeeded()) { err = mk.QueryValue(MD_APP_ISOLATED, isol); } bShowCache = isol == eAppRunOutProcIsolated; } } else { bShowCache = CMetabasePath::IsMasterInstance(metapath); } CPropertyPage * pPage; if (pSheet->QueryMajorVersion() < 6) { pPage = new CAppMappingPage_iis5(pSheet); } else { pPage = new CAppMappingPage(pSheet); } if (pPage == NULL) { err = ERROR_NOT_ENOUGH_MEMORY; break; } pSheet->AddPage(pPage); pPage = new CAspMainPage(pSheet); if (pPage == NULL) { err = ERROR_NOT_ENOUGH_MEMORY; break; } pSheet->AddPage(pPage); pPage = new CAspDebug(pSheet); if (pPage == NULL) { err = ERROR_NOT_ENOUGH_MEMORY; break; } pSheet->AddPage(pPage); if (bShowCache) { if (pSheet->QueryMajorVersion() == 5 && pSheet->QueryMinorVersion() == 0) { pPage = new CAppCache_iis5(pSheet); } else { pPage = new CAppCache(pSheet); } if (pPage == NULL) { err = ERROR_NOT_ENOUGH_MEMORY; break; } pSheet->AddPage(pPage); } CThemeContextActivator activator(theApp.GetFusionInitHandle()); err = pSheet->DoModal() == IDOK ? S_OK : S_FALSE; // pSheet->Release(); } while (FALSE); return err; } _Mapping::_Mapping(const CString& buf) { int len = buf.GetLength(); int pos = buf.Find(_T(',')); ASSERT(pos != -1); ext = buf.Left(pos); int pos1 = buf.Find(_T(','), ++pos); ASSERT(pos1 != -1); path = buf.Mid(pos, pos1 - pos); pos = pos1; pos1 = buf.Find(_T(','), ++pos); if (pos1 == -1) { flags = StrToInt(buf.Right(len - pos)); } else { flags = StrToInt(buf.Mid(pos, pos1 - pos)); verbs = buf.Right(len - pos1 - 1); } } LPCTSTR _Mapping::ToString(CString& buf) const { TCHAR num[12]; buf = ext; buf += _T(","); buf += path; buf += _T(","); wsprintf(num, _T("%u"), flags); buf += num; if (!verbs.IsEmpty()) { buf += _T(","); buf += verbs; } return buf; } void CApplicationProps::LoadInitialMappings(CStringListEx& list) { m_initData.assign(list.GetCount(), CString(_T(""))); CString buf; POSITION p = list.GetHeadPosition(); while (p != NULL) { buf = list.GetNext(p); m_initData.push_back(buf); } } inline bool eq_nocase(CString& str1, CString& str2) { return str1.CompareNoCase(str2) == 0; } struct less_nocase : public std::less { bool operator()(const CString& str1, const CString& str2) const { return StrCmpI(str1, str2) < 0; } }; BOOL CApplicationProps::InitialDataChanged(CStringListEx& list) { std::vector newData; newData.assign(list.GetCount(), CString(_T(""))); POSITION pos = list.GetHeadPosition(); while (pos != NULL) { CString data = list.GetNext(pos); newData.push_back(data); } std::sort(m_initData.begin(), m_initData.end(), less_nocase()); std::sort(newData.begin(), newData.end(), less_nocase()); return !std::equal(newData.begin(), newData.end(), m_initData.begin(), eq_nocase); } CApplicationProps::CApplicationProps( CComAuthInfo * pAuthInfo, LPCTSTR meta_path, BOOL fInherit ) : CMetaProperties(pAuthInfo, meta_path) { m_fInherit = fInherit; } CApplicationProps::CApplicationProps( CMetaInterface * pInterface, LPCTSTR meta_path, BOOL fInherit ) : CMetaProperties(pInterface, meta_path) { m_fInherit = fInherit; } CApplicationProps::CApplicationProps( CMetaKey * pKey, LPCTSTR meta_path, BOOL fInherit ) : CMetaProperties(pKey, meta_path) { m_fInherit = fInherit; } #define CACHE_SIZE_UNDEFINED 0xfffffffe void CApplicationProps::ParseFields() { HRESULT hr = S_OK; MP_DWORD asp_scriptfilecachesize = CACHE_SIZE_UNDEFINED; m_AspMaxDiskTemplateCacheFiles = 0; BEGIN_PARSE_META_RECORDS(m_dwNumEntries, m_pbMDData) HANDLE_META_RECORD(MD_APP_ISOLATED, m_AppIsolated) HANDLE_META_RECORD(MD_ASP_ALLOWSESSIONSTATE, m_EnableSession) HANDLE_META_RECORD(MD_ASP_BUFFERINGON, m_EnableBuffering) HANDLE_META_RECORD(MD_ASP_ENABLEPARENTPATHS, m_EnableParents) HANDLE_META_RECORD(MD_ASP_SESSIONTIMEOUT, m_SessionTimeout) HANDLE_META_RECORD(MD_ASP_SCRIPTTIMEOUT, m_ScriptTimeout) HANDLE_META_RECORD(MD_ASP_SCRIPTLANGUAGE, m_Languages) HANDLE_META_RECORD(MD_ASP_SERVICE_FLAGS, m_AspServiceFlag) HANDLE_META_RECORD(MD_ASP_SERVICE_SXS_NAME, m_AspSxsName) HANDLE_META_RECORD(MD_CACHE_EXTENSIONS, m_CacheISAPI) HANDLE_INHERITED_META_RECORD(MD_SCRIPT_MAPS, m_strlMappings, m_fMappingsInherited) HANDLE_META_RECORD(MD_ASP_ENABLESERVERDEBUG, m_ServerDebug) HANDLE_META_RECORD(MD_ASP_ENABLECLIENTDEBUG, m_ClientDebug) HANDLE_META_RECORD(MD_ASP_SCRIPTERRORSSENTTOBROWSER, m_SendAspError) HANDLE_META_RECORD(MD_ASP_SCRIPTERRORMESSAGE, m_DefaultError) HANDLE_META_RECORD(MD_ASP_SCRIPTENGINECACHEMAX, m_ScriptEngCacheMax) HANDLE_META_RECORD(MD_ASP_SCRIPTFILECACHESIZE, asp_scriptfilecachesize) HANDLE_META_RECORD(MD_ASP_DISKTEMPLATECACHEDIRECTORY, m_DiskCacheDir) HANDLE_META_RECORD(MD_ASP_MAXDISKTEMPLATECACHEFILES, m_AspMaxDiskTemplateCacheFiles) END_PARSE_META_RECORDS LoadVersion(); LoadInitialMappings(MP_V(m_strlMappings)); do { m_NoCache = m_UnlimCache = m_LimCache = FALSE; if (MajorVersion() == 5 && MinorVersion() == 0) { m_AspScriptFileCacheSize = asp_scriptfilecachesize == CACHE_SIZE_UNDEFINED ? 0 : asp_scriptfilecachesize; if (m_AspScriptFileCacheSize == 0) { m_NoCache = TRUE; } else if (m_AspScriptFileCacheSize == 0xFFFFFFFF) { m_UnlimCache = TRUE; } else { m_LimCache = TRUE; } } else { if (MP_V(m_DiskCacheDir).IsEmpty()) { m_DiskCacheDir = _T("%windir%\\system32\\inetsrv\\ASP Compiled Templates"); } m_AspScriptFileCacheSize = asp_scriptfilecachesize; m_LimCacheMemSize = 120; m_LimCacheDiskSize = 1000; if (m_AspMaxDiskTemplateCacheFiles == 0 && m_AspScriptFileCacheSize == 0) { m_NoCache = TRUE; } else if (m_AspScriptFileCacheSize == -1) { m_UnlimCache = TRUE; } else if (m_AspMaxDiskTemplateCacheFiles == -1) { m_LimCache = TRUE; m_LimDiskCache = FALSE; m_LimCacheMemSize = m_AspScriptFileCacheSize; } else { m_LimCache = TRUE; m_LimDiskCache = TRUE; m_LimCacheMemSize = m_AspScriptFileCacheSize; m_LimCacheDiskSize = m_AspMaxDiskTemplateCacheFiles; } } } while (FALSE); } HRESULT CApplicationProps::WriteDirtyProps() { CError err; BEGIN_META_WRITE() META_WRITE(MD_ASP_ALLOWSESSIONSTATE, m_EnableSession) META_WRITE(MD_ASP_BUFFERINGON, m_EnableBuffering) META_WRITE(MD_ASP_ENABLEPARENTPATHS, m_EnableParents) META_WRITE(MD_ASP_SESSIONTIMEOUT, m_SessionTimeout) META_WRITE(MD_ASP_SCRIPTTIMEOUT, m_ScriptTimeout) META_WRITE(MD_ASP_SCRIPTLANGUAGE, m_Languages) META_WRITE(MD_ASP_ENABLESERVERDEBUG, m_ServerDebug) META_WRITE(MD_ASP_ENABLECLIENTDEBUG, m_ClientDebug) META_WRITE(MD_ASP_SCRIPTERRORSSENTTOBROWSER, m_SendAspError) META_WRITE(MD_ASP_SCRIPTERRORMESSAGE, m_DefaultError) META_WRITE(MD_CACHE_EXTENSIONS, m_CacheISAPI) META_WRITE(MD_ASP_SCRIPTENGINECACHEMAX, m_ScriptEngCacheMax) if (MajorVersion() == 5 && MinorVersion() == 0) { if (m_NoCache) { m_AspScriptFileCacheSize = 0; } else if (m_UnlimCache) { m_AspScriptFileCacheSize = -1; } META_WRITE(MD_ASP_SCRIPTFILECACHESIZE, m_AspScriptFileCacheSize) } else { META_WRITE(MD_ASP_DISKTEMPLATECACHEDIRECTORY, m_DiskCacheDir) if (m_NoCache) { m_AspScriptFileCacheSize = 0; m_AspMaxDiskTemplateCacheFiles = 0; } else if (m_UnlimCache) { m_AspScriptFileCacheSize = -1; } else if (m_LimCache) { m_AspScriptFileCacheSize = m_LimCacheMemSize; if (m_LimDiskCache) { m_AspMaxDiskTemplateCacheFiles = m_LimCacheDiskSize; } else { m_AspMaxDiskTemplateCacheFiles = -1; } } else { ASSERT(FALSE); } META_WRITE(MD_ASP_MAXDISKTEMPLATECACHEFILES, m_AspMaxDiskTemplateCacheFiles) META_WRITE(MD_ASP_SCRIPTFILECACHESIZE, m_AspScriptFileCacheSize) } if (MajorVersion() >= 6) { META_WRITE(MD_ASP_SERVICE_FLAGS, m_AspServiceFlag) META_WRITE(MD_ASP_SERVICE_SXS_NAME, m_AspSxsName) } // Process mappings if (MP_V(m_strlMappings).IsEmpty()) { // User must be wants to inherit scriptmaps from the parent if (!m_fMappingsInherited) { FlagPropertyForDeletion(MD_SCRIPT_MAPS); } } else if ( MP_V(m_strlMappings).GetCount() != m_initData.size() || InitialDataChanged(MP_V(m_strlMappings)) ) { META_WRITE(MD_SCRIPT_MAPS, m_strlMappings) m_fMappingsInherited = FALSE; } END_META_WRITE(err); m_Dirty = err.Succeeded(); return err; } HRESULT CApplicationProps::LoadVersion() { CString info; CMetabasePath::GetServiceInfoPath(_T(""), info); CServerCapabilities sc(this, info); HRESULT hr = sc.LoadData(); if (SUCCEEDED(hr)) { DWORD dwVersion = sc.QueryMajorVersion(); if (dwVersion) { m_dwVersion = dwVersion | (sc.QueryMinorVersion() << SIZE_IN_BITS(WORD)); } } return hr; } ///////////////////////////////////////////////////////////////////////////////////////////////////// IMPLEMENT_DYNAMIC(CAppPropSheet, CInetPropertySheet) CAppPropSheet::CAppPropSheet( CComAuthInfo * pAuthInfo, LPCTSTR lpszMetaPath, CWnd * pParentWnd, LPARAM lParam, LPARAM lParamParent, UINT iSelectPage ) : CInetPropertySheet( pAuthInfo, lpszMetaPath, pParentWnd, lParam, lParamParent, iSelectPage), m_pprops(NULL) { } CAppPropSheet::~CAppPropSheet() { FreeConfigurationParameters(); } HRESULT CAppPropSheet::LoadConfigurationParameters() { // // Load base properties // CError err; if (m_pprops == NULL) { // // First call -- load values // m_pprops = new CApplicationProps(QueryAuthInfo(), QueryMetaPath()); if (!m_pprops) { TRACEEOLID("LoadConfigurationParameters: OOM"); err = ERROR_NOT_ENOUGH_MEMORY; return err; } err = m_pprops->LoadData(); } return err; } void CAppPropSheet::FreeConfigurationParameters() { CInetPropertySheet::FreeConfigurationParameters(); delete m_pprops; } BEGIN_MESSAGE_MAP(CAppPropSheet, CInetPropertySheet) //{{AFX_MSG_MAP(CAppPoolSheet) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////// IMPLEMENT_DYNCREATE(CAspMainPage, CInetPropertyPage) CAspMainPage::CAspMainPage(CInetPropertySheet * pSheet) : CInetPropertyPage(CAspMainPage::IDD, pSheet) { #if 0 // hack to have new struct size with old MFC and new NT 5.0 headers ZeroMemory(&m_psp_ex, sizeof(PROPSHEETPAGE)); memcpy(&m_psp_ex, &m_psp, m_psp.dwSize); m_psp_ex.dwSize = sizeof(PROPSHEETPAGE); #endif } CAspMainPage::~CAspMainPage() { m_AspEnableSxs = FALSE; } /* virtual */ HRESULT CAspMainPage::FetchLoadedValues() { CError err; BEGIN_META_INST_READ(CAppPropSheet) FETCH_INST_DATA_FROM_SHEET(m_EnableSession); FETCH_INST_DATA_FROM_SHEET(m_EnableBuffering); FETCH_INST_DATA_FROM_SHEET(m_EnableParents); FETCH_INST_DATA_FROM_SHEET(m_SessionTimeout); FETCH_INST_DATA_FROM_SHEET(m_ScriptTimeout); FETCH_INST_DATA_FROM_SHEET(m_Languages); FETCH_INST_DATA_FROM_SHEET(m_AspServiceFlag); FETCH_INST_DATA_FROM_SHEET(m_AspSxsName); END_META_INST_READ(err) if (GetSheet()->QueryMajorVersion() >= 6) { m_AspEnableSxs = 0 != (m_AspServiceFlag & 2); } return err; } /* virtual */ HRESULT CAspMainPage::SaveInfo() { ASSERT(IsDirty()); CError err; if (m_AspEnableSxs) m_AspServiceFlag |= 2; else m_AspServiceFlag &= ~2; BEGIN_META_INST_WRITE(CAppPropSheet) STORE_INST_DATA_ON_SHEET(m_EnableSession) STORE_INST_DATA_ON_SHEET(m_EnableBuffering) STORE_INST_DATA_ON_SHEET(m_EnableParents) STORE_INST_DATA_ON_SHEET(m_SessionTimeout) STORE_INST_DATA_ON_SHEET(m_ScriptTimeout) STORE_INST_DATA_ON_SHEET(m_Languages) if (GetSheet()->QueryMajorVersion() >= 6) { STORE_INST_DATA_ON_SHEET(m_AspServiceFlag) STORE_INST_DATA_ON_SHEET(m_AspSxsName) } END_META_INST_WRITE(err) return err; } void CAspMainPage::DoDataExchange(CDataExchange * pDX) { CInetPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAspMainPage) DDX_Check(pDX, IDC_ENABLE_SESSION, m_EnableSession); DDX_Check(pDX, IDC_ENABLE_BUFFERING, m_EnableBuffering); DDX_Check(pDX, IDC_ENABLE_PARENTS, m_EnableParents); // This Needs to come before DDX_Text which will try to put text big number into small number DDV_MinMaxBalloon(pDX, IDC_SESSION_TIMEOUT, SESSION_TIMEOUT_MIN, SESSION_TIMEOUT_MAX); DDX_TextBalloon(pDX, IDC_SESSION_TIMEOUT, m_SessionTimeout); // This Needs to come before DDX_Text which will try to put text big number into small number DDV_MinMaxBalloon(pDX, IDC_SCRIPT_TIMEOUT, SCRIPT_TIMEOUT_MIN, SCRIPT_TIMEOUT_MAX); DDX_TextBalloon(pDX, IDC_SCRIPT_TIMEOUT, m_ScriptTimeout); DDX_Text(pDX, IDC_LANGUAGES, m_Languages); DDX_Check(pDX, IDC_ENABLE_SXS, m_AspEnableSxs); DDX_Control(pDX, IDC_LANGUAGES, m_LanguagesCtrl); //}}AFX_DATA_MAP DDX_Text(pDX, IDC_MANIFEST, m_AspSxsName); if (pDX->m_bSaveAndValidate) { if (m_AspEnableSxs) { DDV_MinMaxChars(pDX, m_AspSxsName, 0, MAX_PATH); if ( !PathIsValid(m_AspSxsName,FALSE) || !PathIsFileSpec(m_AspSxsName) || m_AspSxsName.FindOneOf(_T(" *?/\\<>:|\"")) != -1 ) { DDV_ShowBalloonAndFail(pDX, IDS_INVALID_MANIFEST_NAME); } } } } ////////////////////////////////////////////////////// BEGIN_MESSAGE_MAP(CAspMainPage, CInetPropertyPage) //{{AFX_MSG_MAP(CAspMainPage) ON_BN_CLICKED(IDC_ENABLE_SESSION, OnItemChanged) ON_BN_CLICKED(IDC_ENABLE_SXS, OnSxs) //}}AFX_MSG_MAP END_MESSAGE_MAP() BOOL CAspMainPage::OnInitDialog() { UDACCEL toAcc[3] = {{1, 1}, {3, 5}, {6, 10}}; CInetPropertyPage::OnInitDialog(); ASSERT(NULL != GetDlgItem(IDC_TIMEOUT_SPIN)); SendDlgItemMessage(IDC_TIMEOUT_SPIN,UDM_SETRANGE32, SESSION_TIMEOUT_MIN, SESSION_TIMEOUT_MAX); SendDlgItemMessage(IDC_TIMEOUT_SPIN, UDM_SETPOS32, 0, m_SessionTimeout); SendDlgItemMessage(IDC_TIMEOUT_SPIN, UDM_SETACCEL, 3, (LPARAM)toAcc); ASSERT(NULL != GetDlgItem(IDC_ASPTIMEOUT_SPIN)); SendDlgItemMessage(IDC_ASPTIMEOUT_SPIN, UDM_SETRANGE32, SCRIPT_TIMEOUT_MIN, SCRIPT_TIMEOUT_MAX); SendDlgItemMessage(IDC_ASPTIMEOUT_SPIN, UDM_SETPOS32, 0, m_ScriptTimeout); SendDlgItemMessage(IDC_ASPTIMEOUT_SPIN, UDM_SETACCEL, 3, (LPARAM)toAcc); GetDlgItem(IDC_ENABLE_SXS)->EnableWindow(GetSheet()->QueryMajorVersion() >= 6); SetControlsState(); OnItemChanged(); return FALSE; } void CAspMainPage::OnItemChanged() { BOOL bEnable = SendDlgItemMessage(IDC_ENABLE_SESSION, BM_GETCHECK, 0, 0); ::EnableWindow(CONTROL_HWND(IDC_SESSION_TIMEOUT), bEnable); ::EnableWindow(CONTROL_HWND(IDC_TIMEOUT_SPIN), bEnable); SetModified(TRUE); } void CAspMainPage::OnSxs() { m_AspEnableSxs = !m_AspEnableSxs; SetControlsState(); SetModified(TRUE); } void CAspMainPage::SetControlsState() { GetDlgItem(IDC_MANIFEST_STATIC)->EnableWindow(m_AspEnableSxs); GetDlgItem(IDC_MANIFEST)->EnableWindow(m_AspEnableSxs); } ///////////////////////////////////////////////////////////////////////////// #define EXT_WIDTH 58 #define PATH_WIDTH 204 #define EXCLUSIONS_WIDTH 72 static int CALLBACK SortCallback(LPARAM lp1, LPARAM lp2, LPARAM parSort) { Mapping * pm1 = (Mapping *)lp1; ATLASSERT(pm1 != NULL); Mapping * pm2 = (Mapping *)lp2; ATLASSERT(pm2 != NULL); short order = (short)HIWORD(parSort) > 0 ? 1 : -1; int col = (int)LOWORD(parSort); int res = 0; switch (col) { case 0: res = pm1->ext.CompareNoCase(pm2->ext); break; case 1: res = pm1->path.CompareNoCase(pm2->path); break; case 2: res = pm1->verbs.CompareNoCase(pm2->verbs); break; } return order * res; } BOOL SortMappings(CListCtrl& list, int col, int order) { return list.SortItems(SortCallback, MAKELPARAM((WORD)col, (WORD)order)); } CAppMappingPageBase::CAppMappingPageBase(DWORD id, CInetPropertySheet * pSheet) : CInetPropertyPage(id, pSheet) { } CAppMappingPageBase::~CAppMappingPageBase() { } HRESULT CAppMappingPageBase::FetchLoadedValues() { CError err; BEGIN_META_INST_READ(CAppPropSheet) FETCH_INST_DATA_FROM_SHEET(m_CacheISAPI); FETCH_INST_DATA_FROM_SHEET(m_strlMappings); END_META_INST_READ(err) return err; } HRESULT CAppMappingPageBase::SaveInfo() { ASSERT(IsDirty()); CError err; BEGIN_META_INST_WRITE(CAppPropSheet) STORE_INST_DATA_ON_SHEET(m_CacheISAPI) STORE_INST_DATA_ON_SHEET(m_strlMappings) END_META_INST_WRITE(err) return err; } void CAppMappingPageBase::RemoveSelected(CListCtrl& lst) { int sel = -1; int count = lst.GetItemCount(); for (int i = 0; i < count;) { // We are scanning list looking for selected item, when found we are deleting it, // decrementing count and do not advance index, because now index points // to next item. It should work for any combination of selections in // multiselection list UINT state = lst.GetItemState(i, LVIS_SELECTED); if ((state & LVIS_SELECTED) != 0) { Mapping * p = (Mapping *)lst.GetItemData(i); delete p; if (sel == -1) { sel = i; } lst.DeleteItem(i); count--; continue; } i++; } count = lst.GetItemCount(); if (sel == count) { sel--; } lst.SetItemState(sel, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); } void CAppMappingPageBase::SetControlsState() { int sel_count = m_list.GetSelectedCount(); ::EnableWindow(CONTROL_HWND(IDC_EDIT), sel_count == 1); ::EnableWindow(CONTROL_HWND(IDC_REMOVE), sel_count > 0); } void CAppMappingPageBase::DoDataExchange(CDataExchange * pDX) { CInetPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAppMappingPageBase) DDX_Check(pDX, IDC_CACHE_ISAPI, m_CacheISAPI); DDX_Control(pDX, IDC_LIST, m_list); //}}AFX_DATA_MAP if (pDX->m_bSaveAndValidate) { int count = m_list.GetItemCount(); m_strlMappings.RemoveAll(); for (int i = 0; i < count; i++) { Mapping * p = (Mapping *)m_list.GetItemData(i); CString buf; p->ToString(buf); m_strlMappings.AddTail(buf); } } } BEGIN_MESSAGE_MAP(CAppMappingPageBase, CInetPropertyPage) //{{AFX_MSG_MAP(CAppMappingPageBase) ON_BN_CLICKED(IDC_ADD, OnAdd) ON_BN_CLICKED(IDC_EDIT, OnEdit) ON_BN_CLICKED(IDC_REMOVE, OnRemove) ON_BN_CLICKED(IDC_CACHE_ISAPI, OnDlgItemChanged) //}}AFX_MSG_MAP END_MESSAGE_MAP() BOOL CAppMappingPageBase::OnInitDialog() { CInetPropertyPage::OnInitDialog(); DWORD dwStyle = m_list.GetExtendedStyle(); m_list.SetExtendedStyle( dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP | LVS_EX_LABELTIP); CString str; str.LoadString(IDS_EXTENSION); m_list.InsertColumn(COL_EXTENSION, str, LVCFMT_LEFT, EXT_WIDTH, 0); str.LoadString(IDS_EXECUTABLE_PATH); m_list.InsertColumn(COL_PATH, str, LVCFMT_LEFT, PATH_WIDTH, 1); str.LoadString(IDS_VERBS); m_list.InsertColumn(COL_EXCLUSIONS, str, LVCFMT_LEFT, EXCLUSIONS_WIDTH, 2); CString all_verbs; all_verbs.LoadString(IDS_ALL); POSITION pos = m_strlMappings.GetHeadPosition(); int idx = 0; while (pos != NULL) { str = m_strlMappings.GetNext(pos); Mapping * p = new Mapping(str); if (p == NULL) break; if (StrCmp(p->ext, _T("*")) != 0 || GetSheet()->QueryMajorVersion() < 6) { VERIFY(-1 != m_list.InsertItem(idx, p->ext)); VERIFY(m_list.SetItemData(idx, (LPARAM)p)); VERIFY(m_list.SetItemText(idx, COL_PATH, p->path)); VERIFY(m_list.SetItemText(idx, COL_EXCLUSIONS, p->verbs.IsEmpty() ? all_verbs : p->verbs)); idx++; } else { delete p; } } CString remainder; CMetabasePath::GetRootPath(QueryMetaPath(), str, &remainder); ::EnableWindow(CONTROL_HWND(IDC_CACHE_ISAPI), remainder.IsEmpty()); int count = m_list.GetItemCount(); m_sortCol = 0; m_sortOrder = 1; if (count > 0) { SortMappings(m_list, m_sortCol, m_sortOrder); m_list.SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); } SetControlsState(); return FALSE; } BOOL CAppMappingPageBase::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { ASSERT(pResult != NULL); NMHDR* pNMHDR = (NMHDR*)lParam; // We are looking only for events from the listview control here. // This is the only way to catch notification, MFC screens // all this stuff out. if (pNMHDR->idFrom == IDC_LIST) { BOOL processed = FALSE; switch (pNMHDR->code) { case NM_DBLCLK: processed = OnDblClickList(pNMHDR, pResult); break; case LVN_ITEMCHANGED: processed = OnItemChanged(pNMHDR, pResult); break; case LVN_KEYDOWN: processed = OnKeyDown(pNMHDR, pResult); break; case LVN_COLUMNCLICK: processed = OnColumnClick(pNMHDR, pResult); break; default: break; } if (processed) return TRUE; } return CInetPropertyPage::OnNotify(wParam, lParam, pResult); } void CAppMappingPageBase::OnAdd() { CEditMap dlg(this); dlg.m_new = TRUE; dlg.m_flags = MD_SCRIPTMAPFLAG_SCRIPT | MD_SCRIPTMAPFLAG_CHECK_PATH_INFO; dlg.m_pMaps = &m_list; dlg.m_bIsLocal = GetSheet()->IsLocal(); dlg.m_has_global_interceptor = GetSheet()->QueryMajorVersion() >= 6; if (dlg.DoModal() == IDOK) { CString all_verbs; VERIFY(all_verbs.LoadString(IDS_ALL)); Mapping * pmap = new Mapping; pmap->ext = dlg.m_ext; pmap->path = dlg.m_exec; pmap->verbs = dlg.m_verbs; pmap->flags = dlg.m_flags; int count = m_list.GetItemCount(); VERIFY(-1 != m_list.InsertItem(count, pmap->ext)); VERIFY(m_list.SetItemData(count, (LPARAM)pmap)); VERIFY(m_list.SetItemText(count, COL_PATH, pmap->path)); VERIFY(m_list.SetItemText(count, COL_EXCLUSIONS, dlg.m_verbs[0] == 0 ? all_verbs : dlg.m_verbs)); // Now unselect all items and select the new one for (int i = 0; i < count; i++) { m_list.SetItemState(i, 0, LVIS_SELECTED | LVIS_FOCUSED); } m_list.SetItemState(count, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); SetModified(TRUE); SetControlsState(); SortMappings(m_list, m_sortCol, m_sortOrder); } } void CAppMappingPageBase::OnEdit() { int idx = m_list.GetNextItem(-1, LVNI_SELECTED); if (LB_ERR != idx) { CEditMap dlg(this); dlg.m_new = FALSE; dlg.m_pMaps = &m_list; dlg.m_bIsLocal = GetSheet()->IsLocal(); dlg.m_has_global_interceptor = GetSheet()->QueryMajorVersion() >= 6; Mapping * pmap = (Mapping *)m_list.GetItemData(idx); ASSERT(pmap != NULL); dlg.m_ext = pmap->ext; dlg.m_exec = pmap->path; dlg.m_verbs = pmap->verbs; dlg.m_flags = pmap->flags; if (dlg.DoModal() == IDOK) { CString all_verbs; all_verbs.LoadString(IDS_ALL); pmap->ext = dlg.m_ext; pmap->path = dlg.m_exec; pmap->verbs = dlg.m_verbs; pmap->flags = dlg.m_flags; VERIFY(m_list.SetItemData(idx, (LPARAM)pmap)); VERIFY(m_list.SetItemText(idx, COL_PATH, pmap->path)); VERIFY(m_list.SetItemText(idx, COL_EXCLUSIONS, dlg.m_verbs[0] == 0 ? all_verbs : dlg.m_verbs)); SetModified(TRUE); SetControlsState(); SortMappings(m_list, m_sortCol, m_sortOrder); } } } void CAppMappingPageBase::OnRemove() { if (IDYES == AfxMessageBox(IDS_CONFIRM_REMOVE_MAP, MB_YESNO)) { RemoveSelected(m_list); SetModified(TRUE); SetControlsState(); ::SetFocus(CONTROL_HWND(m_list.GetItemCount() <= 0 ? IDC_ADD : IDC_REMOVE)); } } BOOL CAppMappingPageBase::OnDblClickList(NMHDR* pNMHDR, LRESULT* pResult) { if (m_list.GetItemCount() > 0) { OnEdit(); } *pResult = TRUE; return *pResult; } BOOL CAppMappingPageBase::OnItemChanged(NMHDR* pNMHDR, LRESULT* pResult) { SetControlsState(); SetModified(TRUE); *pResult = TRUE; return *pResult; } void CAppMappingPageBase::OnDlgItemChanged() { SetControlsState(); SetModified(TRUE); } BOOL CAppMappingPageBase::OnKeyDown(NMHDR* pNMHDR, LRESULT* pResult) { NMLVKEYDOWN * pKD = (NMLVKEYDOWN *)pNMHDR; if (pKD->wVKey == VK_DELETE) { if (::IsWindowEnabled(CONTROL_HWND(IDC_REMOVE))) { OnRemove(); *pResult = TRUE; } } else if (pKD->wVKey == VK_INSERT) { OnAdd(); *pResult = TRUE; } else if (pKD->wVKey == VK_RETURN) { short state = GetKeyState(VK_MENU); if ((0x8000 & state) != 0) { if (::IsWindowEnabled(CONTROL_HWND(IDC_EDIT))) { OnEdit(); *pResult = TRUE; } } } else { *pResult = FALSE; } return *pResult; } BOOL CAppMappingPageBase::OnColumnClick(NMHDR* pNMHDR, LRESULT* pResult) { LPNMLISTVIEW plv = (LPNMLISTVIEW)pNMHDR; if (m_sortCol == plv->iSubItem) { m_sortOrder = -m_sortOrder; } else { m_sortCol = plv->iSubItem; } SortMappings(m_list, m_sortCol, m_sortOrder); *pResult = FALSE; return *pResult; } ///////////////////////////////////////////////////// BOOL CEditMapBase::OnInitDialog() { m_file_exists = ((m_flags & MD_SCRIPTMAPFLAG_CHECK_PATH_INFO) != 0); CDialog::OnInitDialog(); m_exec_init = m_exec; ::EnableWindow(CONTROL_HWND(IDC_BUTTON_BROWSE), m_bIsLocal); return FALSE; } static int ExtractPath(LPCTSTR cmd_line, CString& path) { int rc = 0; LPTSTR pbuf = (LPTSTR)_alloca(sizeof(TCHAR) * lstrlen(cmd_line) + sizeof(TCHAR)); if (pbuf != NULL) { LPTSTR start = pbuf; _tcscpy(pbuf, cmd_line); if (*pbuf == _T('"')) { LPTSTR end = StrChr(++start, _T('"')); if (end == NULL) { // Wrong format, closing quotation mark is not set rc = IDS_ERR_PATH_NO_CLOSING_QUOTE; // Return part of the path up to first space PathRemoveArgs(pbuf); } else { ++end; *end = 0; PathUnquoteSpaces(pbuf); start = pbuf; } } else { PathRemoveArgs(pbuf); } if (rc == 0) { path = pbuf; } } return rc; } void CEditMapBase::DoDataExchange(CDataExchange * pDX) { BOOL bHasSpaces = FALSE; DDX_Text(pDX, IDC_EXECUTABLE, m_exec); if (pDX->m_bSaveAndValidate) { int rc = 0; CString path, csPathMunged; // check if entered path contains spaces... bHasSpaces = (_tcschr(m_exec, _T(' ')) != NULL); if (bHasSpaces) { // // This could either be: // 1. c:\program files\myfile.exe // 2. c:\program files\myfile.exe %1 // 3. c:\program files\myfilethatdoesntexist.exe // 4. c:\program files\myfilethatdoesntexist.exe %1 // if it has spaces then we have to require that it // contain quotation marks if (_tcschr(m_exec, _T('"')) != NULL) { // we found a quote! // proceed } else { // contains spaces but no quotes, show the error msg and bail! DDV_ShowBalloonAndFail(pDX, IDS_ERR_PATH_HAS_SPACES_REQUIRE_QUOTES); } } rc = ExtractPath(m_exec, path); if (rc != 0) { DDV_ShowBalloonAndFail(pDX, rc); } if (m_exec.CompareNoCase(m_exec_init) != 0 && m_star_maps && m_pMaps != NULL) { LVFINDINFO fi; fi.flags = LVFI_STRING; fi.vkDirection = VK_DOWN; fi.psz = m_exec; int idx = m_pMaps->FindItem(&fi, -1); if (idx != -1) { DDV_ShowBalloonAndFail(pDX, IDS_ERR_USEDPATH); } } csPathMunged = path; #ifdef SUPPORT_SLASH_SLASH_QUESTIONMARK_SLASH_TYPE_PATHS GetSpecialPathRealPath(0,path,csPathMunged); #endif DDV_FilePath(pDX, csPathMunged, m_bIsLocal); if (PathIsUNC(csPathMunged)) { DDV_ShowBalloonAndFail(pDX, IDS_ERR_NOUNC); } if (m_bIsLocal) { if (PathIsNetworkPath(csPathMunged)) { DDV_ShowBalloonAndFail(pDX, IDS_ERR_NOREMOTE); } if (PathIsDirectory(csPathMunged)) { DDV_ShowBalloonAndFail(pDX, IDS_ERR_FILENOTEXISTS); } } } DDX_Check(pDX, IDC_FILE_EXISTS, m_file_exists); if (pDX->m_bSaveAndValidate) { if (m_file_exists) { m_flags |= MD_SCRIPTMAPFLAG_CHECK_PATH_INFO; } else { m_flags &= ~MD_SCRIPTMAPFLAG_CHECK_PATH_INFO; } } } BOOL CEditMapBase::SetControlsState() { BOOL bRes = ::GetWindowTextLength(CONTROL_HWND(IDC_EXECUTABLE)) > 0; ::EnableWindow(CONTROL_HWND(IDOK), bRes); return bRes; } BEGIN_MESSAGE_MAP(CEditMapBase, CDialog) //{{AFX_MSG_MAP(CEditMapBase) ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse) ON_EN_CHANGE(IDC_EXECUTABLE, OnExecutableChanged) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CEditMapBase::OnButtonBrowse() { ASSERT(m_bIsLocal); CString mask((LPCTSTR) m_IDS_BROWSE_BUTTON_MASK); //#if 0 TCHAR buf[MAX_PATH]; _tcscpy(buf, _T("")); for (int i = 0; i < mask.GetLength(); i++) { if (mask.GetAt(i) == _T('|')) mask.SetAt(i, 0); } OPENFILENAME ofn = {0}; ZeroMemory(&ofn, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); //ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; ofn.hwndOwner = m_hWnd; ofn.lpstrFilter = mask; ofn.lpstrFile = buf; //ofn.lpstrInitialDir = buf2; ofn.nMaxFile = MAX_PATH; ofn.Flags |= OFN_DONTADDTORECENT |OFN_HIDEREADONLY |OFN_ENABLESIZING |OFN_EXPLORER |OFN_FILEMUSTEXIST |OFN_NONETWORKBUTTON; CThemeContextActivator activator(theApp.GetFusionInitHandle()); if (GetOpenFileName(&ofn)) { ::SetWindowText(CONTROL_HWND(IDC_EXECUTABLE), ofn.lpstrFile); OnExecutableChanged(); } else { // Failure if (CommDlgExtendedError() != 0) { DebugTrace(_T("GetOpenFileName failed, 0x%08lx\n"),CommDlgExtendedError()); } } #if 0 //#else 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; INT_PTR rc = dlgBrowse.DoModal(); if (rc == IDOK) { ::SetWindowText(CONTROL_HWND(IDC_EXECUTABLE), dlgBrowse.GetPathName()); OnExecutableChanged(); } else if (rc == IDCANCEL) { DWORD err = CommDlgExtendedError(); } #endif } void CEditMapBase::OnExecutableChanged() { SetControlsState(); } ///=================== BOOL CEditMap::OnInitDialog() { m_verbs_index = m_verbs.IsEmpty() ? 0 : 1; m_script_engine = ((m_flags & MD_SCRIPTMAPFLAG_SCRIPT) != 0); CEditMapBase::OnInitDialog(); SetControlsState(); return FALSE; } void CEditMap::DoDataExchange(CDataExchange * pDX) { CEditMapBase::DoDataExchange(pDX); DDX_Text(pDX, IDC_EXTENSION, m_ext); if (pDX->m_bSaveAndValidate && m_new) { CString ext = m_ext; ext.TrimLeft(); ext.TrimRight(); if (0 == ext.Compare(_T("."))) { DDV_ShowBalloonAndFail(pDX, IDS_ERR_BADEXT); } if (0 == ext.GetLength()) { DDV_ShowBalloonAndFail(pDX, IDS_ERR_BADEXT); } if (ext.ReverseFind(_T('.')) > 0) { DDV_ShowBalloonAndFail(pDX, IDS_ERR_BADEXT); } size_t n, len = ext.GetLength(); if ((n = _tcscspn(ext, _T(",\"| /\\:?<>"))) < len) { DDV_ShowBalloonAndFail(pDX, IDS_ERR_BADEXT); } if (m_has_global_interceptor) { if (ext.GetAt(0) == _T('*') || ext.Compare(_T(".*")) == 0) { // Change it later to more explicit message DDV_ShowBalloonAndFail(pDX, IDS_ERR_BADEXT); } else if (ext.Find(_T('*')) != -1) { DDV_ShowBalloonAndFail(pDX, IDS_ERR_BADEXT); } } else if (ext.Find(_T('*')) != -1) { DDV_ShowBalloonAndFail(pDX, IDS_ERR_BADEXT); } if (ext.GetAt(0) == _T('*')) ext = ext.Left(1); else if (ext.Compare(_T(".*")) == 0) ext = _T("*"); else if (ext.GetAt(0) != _T('.')) ext = _T('.') + ext; if (ext.GetAt(0) != _T('.') && ext.Find(_T('*')) > 1) { DDV_ShowBalloonAndFail(pDX, IDS_ERR_BADEXT); } LVFINDINFO fi; fi.flags = LVFI_STRING; fi.vkDirection = VK_DOWN; fi.psz = ext; if (m_pMaps->FindItem(&fi) != -1) { DDV_ShowBalloonAndFail(pDX, IDS_ERR_USEDEXT); } m_ext = ext; } DDX_Radio(pDX, IDC_ALL_VERBS, m_verbs_index); DDX_Text(pDX, IDC_VERBS, m_verbs); if (pDX->m_bSaveAndValidate) { if (m_verbs_index > 0) { DDV_MinMaxChars(pDX, m_verbs, 1, MAX_PATH); } else { m_verbs.Empty(); } } DDX_Check(pDX, IDC_SCRIPT_ENGINE, m_script_engine); if (pDX->m_bSaveAndValidate) { if (m_script_engine) m_flags |= MD_SCRIPTMAPFLAG_SCRIPT; else m_flags &= ~MD_SCRIPTMAPFLAG_SCRIPT; } } BOOL CEditMap::SetControlsState() { BOOL bRes = CEditMapBase::SetControlsState(); BOOL lim_verbs = ((CButton*)GetDlgItem(IDC_LIMIT_VERBS))->GetCheck() == BST_CHECKED; ::EnableWindow(CONTROL_HWND(IDC_VERBS), lim_verbs); ::EnableWindow(CONTROL_HWND(IDC_EXTENSION), m_new); if (bRes) { bRes = GetDlgItem(IDC_EXTENSION)->GetWindowTextLength() > 0; if (lim_verbs) { bRes = GetDlgItem(IDC_VERBS)->GetWindowTextLength() > 0; } ::EnableWindow(CONTROL_HWND(IDOK), bRes); } return bRes; } BEGIN_MESSAGE_MAP(CEditMap, CEditMapBase) //{{AFX_MSG_MAP(CEditMapBase) ON_EN_CHANGE(IDC_EXTENSION, OnExtChanged) ON_BN_CLICKED(IDC_HELPBTN, OnHelp) ON_BN_CLICKED(IDC_ALL_VERBS, OnVerbs) ON_BN_CLICKED(IDC_LIMIT_VERBS, OnVerbs) ON_EN_CHANGE(IDC_VERBS, OnVerbsChanged) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CEditMap::OnExtChanged() { SetControlsState(); } void CEditMap::OnVerbs() { SetControlsState(); } void CEditMap::OnVerbsChanged() { SetControlsState(); } void CEditMap::OnHelp() { ::WinHelp(m_hWnd, theApp.m_pszHelpFilePath, HELP_CONTEXT, CEditMap::IDD + WINHELP_NUMBER_BASE); } BEGIN_MESSAGE_MAP(CEditStarMap, CEditMapBase) ON_BN_CLICKED(IDC_HELPBTN, OnHelp) END_MESSAGE_MAP() void CEditStarMap::OnHelp() { ::WinHelp(m_hWnd, theApp.m_pszHelpFilePath, HELP_CONTEXT, CEditStarMap::IDD + WINHELP_NUMBER_BASE); } ///===================== BOOL CAppMappingPage::OnInitDialog() { BOOL bres = CAppMappingPageBase::OnInitDialog(); DWORD dwStyle = m_list_exe.GetExtendedStyle(); m_list_exe.SetExtendedStyle( dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_LABELTIP); RECT rc; m_list_exe.GetClientRect(&rc); CString buf; buf.LoadString(IDS_EXECUTABLE_PATH); VERIFY(-1 != m_list_exe.InsertColumn(0, buf, LVCFMT_LEFT, rc.right - rc.left)); POSITION pos = m_strlMappings.GetHeadPosition(); int idx = 0; while (pos != NULL) { buf = m_strlMappings.GetNext(pos); Mapping * p = new Mapping(buf); if (p == NULL) break; if (StrCmp(p->ext, _T("*")) == 0) { VERIFY(-1 != m_list_exe.InsertItem(idx, p->path)); VERIFY(m_list_exe.SetItemData(idx, (LPARAM)p)); idx++; } else { delete p; } } if (idx > 0) { m_list_exe.SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); } SetControlsState(); return bres; } void CAppMappingPage::DoDataExchange(CDataExchange * pDX) { CAppMappingPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAppMappingPageBase) DDX_Check(pDX, IDC_CACHE_ISAPI, m_CacheISAPI); DDX_Control(pDX, IDC_LIST_EXE, m_list_exe); //}}AFX_DATA_MAP if (pDX->m_bSaveAndValidate) { int count = m_list_exe.GetItemCount(); for (int i = 0; i < count; i++) { Mapping * p = (Mapping *)m_list_exe.GetItemData(i); CString buf; p->ToString(buf); m_strlMappings.AddTail(buf); } } } void CAppMappingPage::SetControlsState() { CAppMappingPageBase::SetControlsState(); int count = m_list_exe.GetItemCount(); int sel_count = m_list_exe.GetSelectedCount(); int sel = m_list_exe.GetNextItem(-1, LVNI_SELECTED); BOOL bEnableUp = sel > 0 && sel_count == 1; BOOL bEnableDown = sel >= 0 && sel_count == 1 && sel < count - 1; ::EnableWindow(CONTROL_HWND(IDC_EDIT_EXE), sel_count == 1); ::EnableWindow(CONTROL_HWND(IDC_REMOVE_EXE), sel_count > 0); ::EnableWindow(CONTROL_HWND(IDC_MOVE_UP), bEnableUp); ::EnableWindow(CONTROL_HWND(IDC_MOVE_DOWN), bEnableDown); } void CAppMappingPage::MoveItem(CListCtrl& lst, int from, int to) { Mapping * pFrom = (Mapping *)lst.GetItemData(from); Mapping * pTo = (Mapping *)lst.GetItemData(to); lst.SetItemText(from, 0, pTo->path); lst.SetItemData(from, (DWORD_PTR)pTo); lst.SetItemState(from, 0, LVIS_SELECTED | LVIS_FOCUSED); lst.SetItemText(to, 0, pFrom->path); lst.SetItemData(to, (DWORD_PTR)pFrom); lst.SetItemState(to, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); } BOOL CAppMappingPage::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { ASSERT(pResult != NULL); NMHDR* pNMHDR = (NMHDR*)lParam; // We are looking only for events from the starmaps listview control here. // This is the only way to catch notification, MFC screens // all this stuff out. if (pNMHDR->idFrom == IDC_LIST_EXE) { BOOL processed = FALSE; switch (pNMHDR->code) { case NM_DBLCLK: processed = OnDblClickListExe(pNMHDR, pResult); break; case LVN_ITEMCHANGED: processed = OnItemChangedExe(pNMHDR, pResult); break; case LVN_KEYDOWN: processed = OnKeyDownExe(pNMHDR, pResult); break; default: break; } if (processed) return TRUE; } return CAppMappingPageBase::OnNotify(wParam, lParam, pResult); } BEGIN_MESSAGE_MAP(CAppMappingPage, CAppMappingPageBase) ON_BN_CLICKED(IDC_INSERT, OnInsert) ON_BN_CLICKED(IDC_EDIT_EXE, OnEditExe) ON_BN_CLICKED(IDC_REMOVE_EXE, OnRemoveExe) ON_BN_CLICKED(IDC_MOVE_UP, OnMoveUp) ON_BN_CLICKED(IDC_MOVE_DOWN, OnMoveDown) END_MESSAGE_MAP() void CAppMappingPage::OnInsert() { CEditStarMap dlg(this); dlg.m_new = TRUE; dlg.m_flags = MD_SCRIPTMAPFLAG_CHECK_PATH_INFO; dlg.m_pMaps = &m_list_exe; dlg.m_bIsLocal = GetSheet()->IsLocal(); if (dlg.DoModal() == IDOK) { CString all_verbs; VERIFY(all_verbs.LoadString(IDS_ALL)); Mapping * pmap = new Mapping; pmap->ext = _T("*"); pmap->path = dlg.m_exec; pmap->verbs = all_verbs; pmap->flags = dlg.m_flags; int count = m_list_exe.GetItemCount(); VERIFY(-1 != m_list_exe.InsertItem(count, pmap->path)); m_list_exe.SetItemData(count, (DWORD_PTR)pmap); // Now unselect all items and select the new one for (int i = 0; i < count; i++) { m_list_exe.SetItemState(i, 0, LVIS_SELECTED | LVIS_FOCUSED); } m_list_exe.SetItemState(count, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); SetModified(TRUE); SetControlsState(); } } void CAppMappingPage::OnRemoveExe() { if (IDYES == AfxMessageBox(IDS_CONFIRM_REMOVE_MAP, MB_YESNO)) { RemoveSelected(m_list_exe); SetModified(TRUE); SetControlsState(); ::SetFocus(CONTROL_HWND(m_list_exe.GetItemCount() <= 0 ? IDC_INSERT : IDC_REMOVE_EXE)); } } void CAppMappingPage::OnEditExe() { int idx = m_list_exe.GetNextItem(-1, LVNI_SELECTED); if (idx != -1) { CEditStarMap dlg(this); dlg.m_new = FALSE; dlg.m_pMaps = &m_list_exe; dlg.m_bIsLocal = GetSheet()->IsLocal(); Mapping * p = (Mapping *)m_list_exe.GetItemData(idx); ASSERT(p != NULL); dlg.m_exec = p->path; dlg.m_flags = p->flags; if (dlg.DoModal() == IDOK) { p->path = dlg.m_exec; p->flags = dlg.m_flags; VERIFY(m_list_exe.SetItemText(idx, 0, dlg.m_exec)); SetModified(TRUE); } } } void CAppMappingPage::OnMoveUp() { int from = m_list_exe.GetNextItem(-1, LVNI_SELECTED); MoveItem(m_list_exe, from, from - 1); SetControlsState(); SetModified(TRUE); ::SetFocus(CONTROL_HWND( ::IsWindowEnabled(CONTROL_HWND(IDC_MOVE_UP)) ? IDC_MOVE_UP : IDC_MOVE_DOWN)); } void CAppMappingPage::OnMoveDown() { int from = m_list_exe.GetNextItem(-1, LVNI_SELECTED); MoveItem(m_list_exe, from, from + 1); SetControlsState(); SetModified(TRUE); ::SetFocus(CONTROL_HWND( ::IsWindowEnabled(CONTROL_HWND(IDC_MOVE_DOWN)) ? IDC_MOVE_DOWN : IDC_MOVE_UP)); } BOOL CAppMappingPage::OnDblClickListExe(NMHDR* pNMHDR, LRESULT* pResult) { if (m_list_exe.GetItemCount() > 0) { OnEditExe(); } *pResult = TRUE; return *pResult; } BOOL CAppMappingPage::OnItemChangedExe(NMHDR* pNMHDR, LRESULT* pResult) { SetControlsState(); *pResult = TRUE; return *pResult; } BOOL CAppMappingPage::OnKeyDownExe(NMHDR* pNMHDR, LRESULT* pResult) { NMLVKEYDOWN * pKD = (NMLVKEYDOWN *)pNMHDR; if (pKD->wVKey == VK_DOWN) { short state = GetKeyState(VK_CONTROL); if ((0x8000 & state) != 0) { if (::IsWindowEnabled(CONTROL_HWND(IDC_MOVE_DOWN))) { OnMoveDown(); *pResult = TRUE; } } } else if (pKD->wVKey == VK_UP) { short state = GetKeyState(VK_CONTROL); if ((0x8000 & state) != 0) { if (::IsWindowEnabled(CONTROL_HWND(IDC_MOVE_UP))) { OnMoveUp(); *pResult = TRUE; } } } else if (pKD->wVKey == VK_DELETE) { if (::IsWindowEnabled(CONTROL_HWND(IDC_REMOVE_EXE))) { OnRemoveExe(); *pResult = TRUE; } } else if (pKD->wVKey == VK_INSERT) { OnInsert(); *pResult = TRUE; } else if (pKD->wVKey == VK_RETURN) { short state = GetKeyState(VK_MENU); if ((0x8000 & state) != 0) { if (::IsWindowEnabled(CONTROL_HWND(IDC_EDIT_EXE))) { OnEditExe(); *pResult = TRUE; } } } else { *pResult = FALSE; } return *pResult; } ////////////////////////// BEGIN_MESSAGE_MAP(CAppMappingPage_iis5, CAppMappingPageBase) END_MESSAGE_MAP() ////////////////////////// CAppCacheBase::CAppCacheBase(DWORD id, CInetPropertySheet * pSheet) : CInetPropertyPage(id, pSheet) { } CAppCacheBase::~CAppCacheBase() { } BOOL CAppCacheBase::OnInitDialog() { UDACCEL toAcc[3] = {{1, 1}, {3, 5}, {6, 10}}; CInetPropertyPage::OnInitDialog(); SETUP_SPIN(m_ScriptEngCacheMaxSpin, 0, 2000000000, m_ScriptEngCacheMax); return FALSE; } void CAppCacheBase::DoDataExchange(CDataExchange * pDX) { CInetPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAppCache) if (pDX->m_bSaveAndValidate) { // This Needs to come before DDX_Text which will try to put text big number into small number DDV_MinMaxBalloon(pDX, IDC_ENGINES, SCRIPT_ENG_MIN, SCRIPT_ENG_MAX); } DDX_TextBalloon(pDX, IDC_ENGINES, m_ScriptEngCacheMax); DDX_Control(pDX, IDC_ENG_CACHED_SPIN, m_ScriptEngCacheMaxSpin); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAppCacheBase, CInetPropertyPage) ON_EN_CHANGE(IDC_ENGINES, OnItemChanged) END_MESSAGE_MAP() void CAppCacheBase::SetControlsState() { ((CButton *)GetDlgItem(IDC_NO_CACHE))->SetCheck(m_NoCache ? BST_CHECKED : BST_UNCHECKED); ((CButton *)GetDlgItem(IDC_UNLIMITED_CACHE))->SetCheck(m_UnlimCache ? BST_CHECKED : BST_UNCHECKED); ((CButton *)GetDlgItem(IDC_LIMITED_CACHE))->SetCheck(m_LimCache ? BST_CHECKED : BST_UNCHECKED); } void CAppCacheBase::OnItemChanged() { SetControlsState(); SetModified(TRUE); } /////////////////////////////////////////// CAppCache::CAppCache(CInetPropertySheet * pSheet) : CAppCacheBase(CAppCache::IDD, pSheet) { } CAppCache::~CAppCache() { } HRESULT CAppCache::FetchLoadedValues() { CError err; BEGIN_META_INST_READ(CAppPropSheet) 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 CAppCache::SaveInfo() { ASSERT(IsDirty()); CError err; BEGIN_META_INST_WRITE(CAppPropSheet) 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; } void CAppCache::DoDataExchange(CDataExchange * pDX) { CAppCacheBase::DoDataExchange(pDX); if (pDX->m_bSaveAndValidate) { // This Needs to come before DDX_Text which will try to put text big number into small number DDV_MinMaxBalloon(pDX, IDC_CACHE_SIZE_EDIT, 0, 2000000000); } DDX_TextBalloon(pDX, IDC_CACHE_SIZE_EDIT, m_LimCacheMemSize); if (pDX->m_bSaveAndValidate) { // This Needs to come before DDX_Text which will try to put text big number into small number DDV_MinMaxBalloon(pDX, IDC_DISK_UNLIM_EDIT, 0, 2000000000); } DDX_TextBalloon(pDX, IDC_DISK_UNLIM_EDIT, m_LimCacheDiskSize); DDX_Text(pDX, IDC_CACHE_PATH, m_DiskCacheDir); DDV_FolderPath(pDX, m_DiskCacheDir, GetSheet()->IsLocal()); DDX_Control(pDX, IDC_CACHE_SIZE_SPIN, m_LimCacheMemSizeSpin); DDX_Control(pDX, IDC_DISK_UNLIM_SPIN, m_LimCacheDiskSizeSpin); } void CAppCache::SetControlsState() { CAppCacheBase::SetControlsState(); // Edit control left to limited cache button ::EnableWindow(CONTROL_HWND(IDC_CACHE_SIZE_EDIT), m_LimCache); ::EnableWindow(CONTROL_HWND(IDC_CACHE_SIZE_SPIN), m_LimCache); // Two radio buttons under limited cache button ::EnableWindow(CONTROL_HWND(IDC_CACHE_UNLIMITED_DISK), m_LimCache); ::EnableWindow(CONTROL_HWND(IDC_CACHE_LIMITED_DISK), m_LimCache); // Edit control for limited disk cache button ::EnableWindow(CONTROL_HWND(IDC_DISK_UNLIM_EDIT), m_LimCache && m_LimDiskCache); ::EnableWindow(CONTROL_HWND(IDC_DISK_UNLIM_SPIN), m_LimCache && m_LimDiskCache); } BOOL CAppCache::OnInitDialog() { UDACCEL toAcc[3] = {{1, 1}, {3, 5}, {6, 10}}; CAppCacheBase::OnInitDialog(); ((CButton *)GetDlgItem(IDC_CACHE_UNLIMITED_DISK))->SetCheck(!m_LimDiskCache ? BST_CHECKED : BST_UNCHECKED); ((CButton *)GetDlgItem(IDC_CACHE_LIMITED_DISK))->SetCheck(m_LimDiskCache ? BST_CHECKED : BST_UNCHECKED); ::EnableWindow(CONTROL_HWND(IDC_BROWSE), GetSheet()->IsLocal()); SETUP_SPIN(m_LimCacheMemSizeSpin, 0, 2000000000, m_LimCacheMemSize); SETUP_SPIN(m_LimCacheDiskSizeSpin, 0, 2000000000, m_LimCacheDiskSize); SetControlsState(); #ifdef SUPPORT_SLASH_SLASH_QUESTIONMARK_SLASH_TYPE_PATHS LimitInputPath(CONTROL_HWND(IDC_CACHE_PATH),TRUE); #else LimitInputPath(CONTROL_HWND(IDC_CACHE_PATH),FALSE); #endif return FALSE; } BEGIN_MESSAGE_MAP(CAppCache, CAppCacheBase) ON_BN_CLICKED(IDC_NO_CACHE, OnNoCache) ON_BN_CLICKED(IDC_UNLIMITED_CACHE, OnUnlimitedCache) ON_BN_CLICKED(IDC_LIMITED_CACHE, OnLimitedCache) ON_BN_CLICKED(IDC_CACHE_UNLIMITED_DISK, OnUnlimitedDiskCache) ON_BN_CLICKED(IDC_CACHE_LIMITED_DISK, OnLimitedDiskCache) ON_EN_CHANGE(IDC_CACHE_PATH, OnItemChanged) ON_EN_CHANGE(IDC_DISK_UNLIM_EDIT, OnItemChanged) ON_EN_CHANGE(IDC_CACHE_SIZE_EDIT, OnItemChanged) ON_BN_CLICKED(IDC_BROWSE, OnBrowse) END_MESSAGE_MAP() //void //CAppCache::OnItemChanged() //{ // SetControlsState(); // SetModified(TRUE); //} // void CAppCache::OnNoCache() { m_NoCache = TRUE; m_UnlimCache = FALSE; m_LimCache = FALSE; SetControlsState(); SetModified(TRUE); } void CAppCache::OnUnlimitedCache() { m_NoCache = FALSE; m_UnlimCache = TRUE; m_LimCache = FALSE; SetControlsState(); SetModified(TRUE); } void CAppCache::OnLimitedCache() { m_NoCache = FALSE; m_UnlimCache = FALSE; m_LimCache = TRUE; SetControlsState(); SetModified(TRUE); } void CAppCache::OnLimitedDiskCache() { m_LimDiskCache = TRUE; SetControlsState(); SetModified(TRUE); } void CAppCache::OnUnlimitedDiskCache() { m_LimDiskCache = FALSE; SetControlsState(); SetModified(TRUE); } static int CALLBACK FileChooserCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) { CAppCache * pThis = (CAppCache *)lpData; ASSERT(pThis != NULL); return pThis->BrowseForFolderCallback(hwnd, uMsg, lParam); } int CAppCache::BrowseForFolderCallback(HWND hwnd, UINT uMsg, LPARAM lParam) { switch (uMsg) { case BFFM_INITIALIZED: ASSERT(m_pPathTemp != NULL); if (::PathIsNetworkPath(m_pPathTemp)) return 0; while (!::PathIsDirectory(m_pPathTemp)) { if (0 == ::PathRemoveFileSpec(m_pPathTemp) && !::PathIsRoot(m_pPathTemp)) { return 0; } DWORD attr = GetFileAttributes(m_pPathTemp); if ((attr & FILE_ATTRIBUTE_READONLY) == 0) break; } ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)m_pPathTemp); break; case BFFM_SELCHANGED: { LPITEMIDLIST pidl = (LPITEMIDLIST)lParam; TCHAR path[MAX_PATH]; if (SHGetPathFromIDList(pidl, path)) { ::SendMessage(hwnd, BFFM_ENABLEOK, 0, !PathIsNetworkPath(path)); } } break; case BFFM_VALIDATEFAILED: break; } return 0; } void CAppCache::OnBrowse() { BOOL bRes = FALSE; HRESULT hr; CString str; GetDlgItem(IDC_CACHE_PATH)->GetWindowText(str); if (SUCCEEDED(hr = CoInitialize(NULL))) { LPITEMIDLIST pidl = NULL; if (SUCCEEDED(SHGetFolderLocation(NULL, CSIDL_DRIVES, NULL, 0, &pidl))) { LPITEMIDLIST pidList = NULL; BROWSEINFO bi; TCHAR buf[MAX_PATH] = {0}; ZeroMemory(&bi, sizeof(bi)); int drive = PathGetDriveNumber(str); if (GetDriveType(PathBuildRoot(buf, drive)) == DRIVE_FIXED) { StrCpy(buf, str); } bi.hwndOwner = m_hWnd; bi.pidlRoot = pidl; bi.pszDisplayName = m_pPathTemp = buf; bi.ulFlags |= BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS; bi.lpfn = FileChooserCallback; bi.lParam = (LPARAM)this; pidList = SHBrowseForFolder(&bi); if ( pidList != NULL && SHGetPathFromIDList(pidList, buf) ) { str = buf; bRes = TRUE; } IMalloc * pMalloc; VERIFY(SUCCEEDED(SHGetMalloc(&pMalloc))); if (pidl != NULL) pMalloc->Free(pidl); pMalloc->Release(); } CoUninitialize(); } if (bRes) { GetDlgItem(IDC_CACHE_PATH)->SetWindowText(str); SetModified(TRUE); SetControlsState(); } } //////////////////////////////////////////// CAppCache_iis5::CAppCache_iis5(CInetPropertySheet * pSheet) : CAppCacheBase(CAppCache_iis5::IDD, pSheet) { } CAppCache_iis5::~CAppCache_iis5() { } HRESULT CAppCache_iis5::FetchLoadedValues() { CError err; BEGIN_META_INST_READ(CAppPropSheet) 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_AspScriptFileCacheSize); END_META_INST_READ(err) return err; } HRESULT CAppCache_iis5::SaveInfo() { ASSERT(IsDirty()); CError err; BEGIN_META_INST_WRITE(CAppPropSheet) 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_AspScriptFileCacheSize); END_META_INST_WRITE(err) return err; } void CAppCache_iis5::DoDataExchange(CDataExchange * pDX) { CAppCacheBase::DoDataExchange(pDX); if (m_LimCache) { // This Needs to come before DDX_Text which will try to put text big number into small number DDV_MinMaxBalloon(pDX, IDC_CACHE_SIZE_EDIT, 0, 2000000000); DDX_TextBalloon(pDX, IDC_CACHE_SIZE_EDIT, m_AspScriptFileCacheSize); } DDX_Control(pDX, IDC_CACHE_SIZE_SPIN, m_AspScriptFileCacheSizeSpin); } void CAppCache_iis5::SetControlsState() { CAppCacheBase::SetControlsState(); // Edit control left to limited cache button ::EnableWindow(CONTROL_HWND(IDC_CACHE_SIZE_EDIT), m_LimCache); ::EnableWindow(CONTROL_HWND(IDC_CACHE_SIZE_SPIN), m_LimCache); } BOOL CAppCache_iis5::OnInitDialog() { UDACCEL toAcc[3] = {{1, 1}, {3, 5}, {6, 10}}; CAppCacheBase::OnInitDialog(); if (!m_LimCache) { SetDlgItemInt(IDC_CACHE_SIZE_EDIT, 250, FALSE); } SETUP_SPIN(m_AspScriptFileCacheSizeSpin, 0, 2000000000, m_AspScriptFileCacheSize); SetControlsState(); return FALSE; } BEGIN_MESSAGE_MAP(CAppCache_iis5, CAppCacheBase) ON_BN_CLICKED(IDC_NO_CACHE, OnNoCache) ON_BN_CLICKED(IDC_UNLIMITED_CACHE, OnUnlimitedCache) ON_BN_CLICKED(IDC_LIMITED_CACHE, OnLimitedCache) ON_EN_CHANGE(IDC_CACHE_SIZE_EDIT, OnItemChanged) END_MESSAGE_MAP() void CAppCache_iis5::OnItemChanged() { SetControlsState(); SetModified(TRUE); } void CAppCache_iis5::OnNoCache() { m_NoCache = TRUE; m_UnlimCache = FALSE; m_LimCache = FALSE; SetControlsState(); SetModified(TRUE); } void CAppCache_iis5::OnUnlimitedCache() { m_NoCache = FALSE; m_UnlimCache = TRUE; m_LimCache = FALSE; SetControlsState(); SetModified(TRUE); } void CAppCache_iis5::OnLimitedCache() { m_NoCache = FALSE; m_UnlimCache = FALSE; m_LimCache = TRUE; SetControlsState(); SetModified(TRUE); } //////////////////////////////////////////////////// IMPLEMENT_DYNCREATE(CAspDebug, CInetPropertyPage) CAspDebug::CAspDebug(CInetPropertySheet * pSheet) : CInetPropertyPage(CAspDebug::IDD, pSheet) { #if 0 // hack to have new struct size with old MFC and new NT 5.0 headers ZeroMemory(&m_psp_ex, sizeof(PROPSHEETPAGE)); memcpy(&m_psp_ex, &m_psp, m_psp.dwSize); m_psp_ex.dwSize = sizeof(PROPSHEETPAGE); #endif } CAspDebug::~CAspDebug() { } HRESULT CAspDebug::FetchLoadedValues() { CError err; BEGIN_META_INST_READ(CAppPropSheet) FETCH_INST_DATA_FROM_SHEET(m_ServerDebug); FETCH_INST_DATA_FROM_SHEET(m_ClientDebug); FETCH_INST_DATA_FROM_SHEET(m_SendAspError); FETCH_INST_DATA_FROM_SHEET(m_DefaultError); END_META_INST_READ(err) return err; } /* virtual */ HRESULT CAspDebug::SaveInfo() { ASSERT(IsDirty()); CError err; BEGIN_META_INST_WRITE(CAppPropSheet) STORE_INST_DATA_ON_SHEET(m_ServerDebug); STORE_INST_DATA_ON_SHEET(m_ClientDebug); STORE_INST_DATA_ON_SHEET(m_SendAspError); STORE_INST_DATA_ON_SHEET(m_DefaultError); END_META_INST_WRITE(err) return err; } void CAspDebug::DoDataExchange(CDataExchange * pDX) { CInetPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAspMainPage) DDX_Check(pDX, IDC_SERVER_DEBUG, m_ServerDebug); DDX_Check(pDX, IDC_CLIENT_DEBUG, m_ClientDebug); DDX_Text(pDX, IDC_DEFAULT_ERROR, m_DefaultError); //}}AFX_DATA_MAP } ////////////////////////////////////////////////////// BEGIN_MESSAGE_MAP(CAspDebug, CInetPropertyPage) //{{AFX_MSG_MAP(CAspDebug) ON_BN_CLICKED(IDC_SERVER_DEBUG, OnItemChanged) ON_BN_CLICKED(IDC_CLIENT_DEBUG, OnItemChanged) ON_BN_CLICKED(IDC_SEND_DETAILED_ERROR, OnChangedError) ON_BN_CLICKED(IDC_SEND_DEF_ERROR, OnChangedError) ON_EN_CHANGE(IDC_DEFAULT_ERROR, OnItemChanged) //}}AFX_MSG_MAP END_MESSAGE_MAP() BOOL CAspDebug::OnInitDialog() { CInetPropertyPage::OnInitDialog(); ((CButton *)GetDlgItem( m_SendAspError ? IDC_SEND_DETAILED_ERROR : IDC_SEND_DEF_ERROR))->SetCheck(BST_CHECKED); ::EnableWindow(CONTROL_HWND(IDC_DEFAULT_ERROR), !m_SendAspError); return FALSE; } void CAspDebug::OnItemChanged() { SetModified(TRUE); } void CAspDebug::OnChangedError() { m_SendAspError = ((CButton *)GetDlgItem(IDC_SEND_DETAILED_ERROR))->GetCheck() == BST_CHECKED; ::EnableWindow(CONTROL_HWND(IDC_DEFAULT_ERROR), !m_SendAspError); SetModified(TRUE); }