/*++ Copyright (c) 1994-2000 Microsoft Corporation Module Name : app_app_pool.cpp Abstract: Add new IIS Application Pool node Author: Sergei Antonov (sergeia) Project: Internet Services Manager Revision History: 12/26/2000 sergeia Initial creation --*/ #include "stdafx.h" #include "common.h" #include "resource.h" #include "inetprop.h" #include "InetMgrApp.h" #include "iisobj.h" #include "add_app_pool.h" #include "shts.h" #include "app_sheet.h" #include "app_pool_sheet.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif #define new DEBUG_NEW extern CInetmgrApp theApp; CAddAppPoolDlg::CAddAppPoolDlg( CAppPoolsContainer * pCont, CPoolList * pools, CWnd * pParent) : CDialog(CAddAppPoolDlg::IDD, pParent), m_pCont(pCont), m_pool_list(pools), m_fUseMaster(TRUE) { } CAddAppPoolDlg::~CAddAppPoolDlg() { } void CAddAppPoolDlg::DoDataExchange(CDataExchange * pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAddAppPoolDlg) DDX_Control(pDX, IDC_EDIT_POOL_ID, m_edit_PoolId); DDX_Control(pDX, IDC_USE_MASTER, m_button_UseMaster); DDX_Control(pDX, IDC_USE_POOL, m_button_UsePool); DDX_Control(pDX, IDC_POOLS, m_combo_Pool); DDX_CBIndex(pDX, IDC_POOLS, m_PoolIdx); //}}AFX_DATA_MAP DDX_Text(pDX, IDC_EDIT_POOL_ID, m_strPoolId); if (pDX->m_bSaveAndValidate) { TCHAR bad_chars[] = _T("\\/"); if (m_strPoolId.GetLength() != _tcscspn(m_strPoolId, bad_chars)) { DDV_ShowBalloonAndFail(pDX, IDS_ERR_INVALID_POOLID_CHARS); } // bug:629607 don't do this check htere // check that pool id is unique //if (!IsUniqueId(m_strPoolId)){DDV_ShowBalloonAndFail(pDX, IDS_ERR_DUP_POOLID);} } } void CAddAppPoolDlg::OnOK() { if (UpdateData(TRUE)) { // bug:629607 do this check htere if (!IsUniqueId(m_strPoolId,TRUE)) { //::AfxMessageBox(IDS_ERR_DUP_POOLID,MB_ICONEXCLAMATION); DoHelpMessageBox(m_hWnd,IDS_ERR_DUP_POOLID, MB_APPLMODAL | MB_OK | MB_ICONEXCLAMATION, 0); } else { CDialog::OnOK(); } } } // // Message Map // BEGIN_MESSAGE_MAP(CAddAppPoolDlg, CDialog) //{{AFX_MSG_MAP(CAddAppPoolDlg) ON_BN_CLICKED(IDC_USE_MASTER, OnButtonUseMaster) ON_BN_CLICKED(IDC_USE_POOL, OnButtonUsePool) ON_BN_CLICKED(ID_HELP, OnHelp) ON_EN_CHANGE(IDC_EDIT_POOL_ID, OnItemChanged) ON_CBN_SELCHANGE(IDC_POOLS, OnItemChanged) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CAddAppPoolDlg::OnItemChanged() { SetControlStates(); } void CAddAppPoolDlg::OnButtonUseMaster() { m_fUseMaster = TRUE; SetControlStates(); } void CAddAppPoolDlg::OnButtonUsePool() { m_fUseMaster = FALSE; SetControlStates(); } void CAddAppPoolDlg::SetControlStates() { m_button_UseMaster.SetCheck(m_fUseMaster); m_button_UsePool.SetCheck(!m_fUseMaster); m_combo_Pool.EnableWindow(!m_fUseMaster); UpdateData(); BOOL fGoodData = !m_strPoolId.IsEmpty() && IsUniqueId(m_strPoolId, FALSE); GetDlgItem(IDOK)->EnableWindow(fGoodData); } BOOL CAddAppPoolDlg::OnInitDialog() { CDialog::OnInitDialog(); CString def_pool; m_pCont->QueryDefaultPoolId(def_pool); CAppPoolNode * pDefPool = NULL; POSITION pos = m_pool_list->GetHeadPosition(); int sel_idx = 0; while (pos != NULL) { CAppPoolNode * pPool = m_pool_list->GetNext(pos); int i = m_combo_Pool.AddString(pPool->QueryDisplayName()); if (def_pool.CompareNoCase(pPool->QueryNodeName()) == 0) { sel_idx = i; pDefPool = pPool; } if (i != CB_ERR) { m_combo_Pool.SetItemDataPtr(i, pPool); } } m_combo_Pool.SetCurSel(sel_idx); m_strPoolId.LoadString(IDS_DEFAULT_APP_POOL); MakeUniquePoolId(m_strPoolId); UpdateData(FALSE); SetControlStates(); return TRUE; } BOOL CAddAppPoolDlg::IsUniqueId(CString& id, BOOL bCheckMetabase) { BOOL bRes = TRUE; POSITION pos = m_pool_list->GetHeadPosition(); while (pos != NULL) { CAppPoolNode * pPool = m_pool_list->GetNext(pos); if (id.CompareNoCase(pPool->QueryNodeName()) == 0) { bRes = FALSE; break; } } // check the metabase when asked to. if (bRes) { if (bCheckMetabase) { if (m_pCont) { CComBSTR cont_path; CMetaInterface * pInterface = NULL; CError err; m_pCont->BuildMetaPath(cont_path); CMetabasePath path(FALSE, cont_path, id); // check if path exists... pInterface = m_pCont->QueryInterface(); if (pInterface) { CMetaKey mk(pInterface, path, METADATA_PERMISSION_READ); err = mk.QueryResult(); if (err.Succeeded()) { bRes = FALSE; } } } } } return bRes; } void CAddAppPoolDlg::MakeUniquePoolId(CString& id) { TCHAR fmt[] = _T("%s #%d"); CString unique; for (int n = 1; n < 100; n++) { unique.Format(fmt, id, n); if (IsUniqueId(unique,FALSE)) break; } id = unique; } void CAddAppPoolDlg::OnHelp() { WinHelpDebug(0x20000 + CAddAppPoolDlg::IDD); ::WinHelp(m_hWnd, theApp.m_pszHelpFilePath, HELP_CONTEXT, 0x20000 + CAddAppPoolDlg::IDD); } /////////////////////////////////////////////////////////////// HRESULT CIISMBNode::AddAppPool( const CSnapInObjectRootBase * pObj, DATA_OBJECT_TYPES type, CAppPoolsContainer * pCont, CString& name ) { AFX_MANAGE_STATE(::AfxGetStaticModuleState()); HRESULT hr = S_OK; IConsoleNameSpace2 * pConsole = (IConsoleNameSpace2 *)GetOwner()->GetConsoleNameSpace(); ASSERT(pConsole != NULL); HSCOPEITEM hChild = NULL, hCurrent; LONG_PTR cookie; hr = pConsole->Expand(pCont->QueryScopeItem()); if (SUCCEEDED(hr)) { pConsole->GetChildItem(pCont->QueryScopeItem(), &hChild, &cookie); CAppPoolNode * pPool; CPoolList pool_list; while (SUCCEEDED(hr) && hChild != NULL) { pPool = (CAppPoolNode *)cookie; ASSERT(pPool != NULL); pool_list.AddTail(pPool); hCurrent = hChild; hr = pConsole->GetNextItem(hCurrent, &hChild, &cookie); } CThemeContextActivator activator(theApp.GetFusionInitHandle()); CAddAppPoolDlg dlg(pCont, &pool_list, GetMainWindow(GetConsole())); if (dlg.DoModal() == IDOK) { CComBSTR cont_path; pCont->BuildMetaPath(cont_path); CMetabasePath path(FALSE, cont_path, dlg.m_strPoolId); CIISAppPool pool(QueryAuthInfo(), path); if (SUCCEEDED(hr = pool.QueryResult())) { hr = pool.Create(); if (SUCCEEDED(hr)) { name = dlg.m_strPoolId; if (!dlg.UseMaster()) { POSITION pos = pool_list.FindIndex(dlg.m_PoolIdx); CMetabasePath model_path(FALSE, cont_path, pool_list.GetAt(pos)->QueryNodeName()); CAppPoolProps model(QueryAuthInfo(), model_path, FALSE); if (SUCCEEDED(hr = model.LoadData())) { CAppPoolProps new_pool(QueryAuthInfo(), path); new_pool.InitFromModel(model); hr = new_pool.WriteDirtyProps(); } } else { CAppPoolProps new_pool(QueryAuthInfo(), path); hr = new_pool.WriteDirtyProps(); } } } } else { hr = CError::HResult(ERROR_CANCELLED); } } return hr; }