|
|
/*++
Copyright (c) 1994-1998 Microsoft Corporation
Module Name :
vdir.cpp
Abstract:
WWW Directory Properties Page
Author:
Ronald Meijer (ronaldm)
Project:
Internet Services Manager
Revision History:
--*/
//
// Include Files
//
#include "stdafx.h"
#include "w3scfg.h"
#include "vdir.h"
#include "dirbrows.h"
#include <lmcons.h>
#include <atlbase.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
/****************************************************************************
** ** ** WARNING: What a hairy mess this dialog and this code have become. ** ** The tale grew in the telling as it were, but at some point ** ** it ought to be rewritten. Currently, I would be very ** ** wary of touching anything in here if I were you, because this ** ** dialog exists in many configurations: file, directory, ** ** virtual directory, home directory, master properties, local ** ** path, redirected path, UNC path, downlevel, plus combinations ** ** of the aforementioned. Whatever you touch will likely affect ** ** all these configurations. ** ** ** ** 2/1/1998 - RonaldM ** ** ** ****************************************************************************/
//
// Directory Properties Page
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
LPCTSTR CvtPathToDosStyle( IN OUT CString & strPath ) { //
// Get a pointer to the string data without increasing the buffer
//
for (LPTSTR lp = strPath.GetBuffer(1); *lp; ++lp) { if (*lp == _T('/')) { *lp = _T('\\'); } } strPath.ReleaseBuffer();
return strPath; }
IMPLEMENT_DYNCREATE(CW3DirectoryPage, CInetPropertyPage)
CW3DirectoryPage::CW3DirectoryPage( IN CInetPropertySheet * pSheet, IN BOOL fHome, IN DWORD dwAttributes ) /*++
Routine Description:
Constructor for directory property page
Arguments:
CInetPropertySheet * pSheet : Sheet pointer BOOL fHome : TRUE if this is a home directory DWORD dwAttributes : Attributes of the directory/file/vroot
Return Value:
N/A
--*/ : CInetPropertyPage(CW3DirectoryPage::IDD, pSheet, fHome ? IDS_TAB_HOME_DIRECTORY : IS_VROOT(dwAttributes) ? IDS_TAB_VIRTUAL_DIRECTORY : IS_DIR(dwAttributes) ? IDS_TAB_DIR : IDS_TAB_FILE), //
// Assign the range of bits in m_dwAccessPermissions that
// we manage. This is important, because another page
// manages other bits, and we don't want to mess up
// the master value bits when our changes collide (it
// will mark the original bits as dirty, because we're not
// notified when the change is made...
//
m_dwBitRangePermissions(MD_ACCESS_EXECUTE | MD_ACCESS_SCRIPT | MD_ACCESS_WRITE | MD_ACCESS_SOURCE | MD_ACCESS_READ), m_dwBitRangeDirBrowsing(MD_DIRBROW_ENABLED), m_fHome(fHome), m_fRecordChanges(FALSE), m_strMetaRoot(), m_dwAttributes(dwAttributes), m_pApplication(NULL), m_fOriginallyUNC(FALSE) { #if 0 // Keep Class-wizard happy
//{{AFX_DATA_INIT(CW3DirectoryPage)
m_nPathType = RADIO_DIRECTORY; m_nPermissions = -1; m_fBrowsingAllowed = FALSE; m_fRead = FALSE; m_fWrite = FALSE; m_fAuthor = FALSE; m_fLogAccess = FALSE; m_strPath = _T(""); m_strRedirectPath = _T(""); m_strAppFriendlyName = _T(""); m_fIndex = FALSE; m_strDefaultDocument = _T(""); //}}AFX_DATA_INIT
#endif // 0
VERIFY(m_strPrompt[RADIO_DIRECTORY].LoadString(IDS_PROMPT_DIR)); VERIFY(m_strPrompt[RADIO_NETDIRECTORY].LoadString(IDS_PROMPT_UNC)); VERIFY(m_strPrompt[RADIO_REDIRECT].LoadString(IDS_PROMPT_REDIRECT)); VERIFY(m_strRemove.LoadString(IDS_BUTTON_REMOVE)); VERIFY(m_strCreate.LoadString(IDS_BUTTON_CREATE)); VERIFY(m_strEnable.LoadString(IDS_BUTTON_ENABLE)); VERIFY(m_strDisable.LoadString(IDS_BUTTON_DISABLE)); VERIFY(m_strWebFmt.LoadString(IDS_APPROOT_FMT)); VERIFY(m_strWebMaster.LoadString(IDS_WEB_MASTER)); }
CW3DirectoryPage::~CW3DirectoryPage() /*++
Routine Description:
Destructor
Arguments:
N/A
Return Value:
N/A
--*/ { SAFE_DELETE(m_pApplication); }
void CW3DirectoryPage::MakeDisplayAlias() /*++
Routine Description:
Build display version of the metabase alias;
Arguments:
None
Return Value:
None
--*/ { CString strPath(((CW3Sheet *)GetSheet())->QueryParent()); strPath += _T("/"); strPath += m_strAlias; m_strDisplayAlias = strPath.Mid(::lstrlen(g_cszRoot));
CvtPathToDosStyle(m_strDisplayAlias); }
void CW3DirectoryPage::DoDataExchange( IN CDataExchange * pDX ) /*++
Routine Description:
Initialise/Store control Data
Arguments:
CDataExchange * pDX : DDX/DDV struct
Return Value:
None.
--*/ { CInetPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CW3DirectoryPage)
DDX_Radio(pDX, IDC_RADIO_DIR, m_nPathType); DDX_CBIndex(pDX, IDC_COMBO_PERMISSIONS, m_nPermissions); DDX_Check(pDX, IDC_CHECK_DIRECTORY_BROWSING_ALLOWED, m_fBrowsingAllowed); DDX_Check(pDX, IDC_CHECK_READ, m_fRead); DDX_Check(pDX, IDC_CHECK_WRITE, m_fWrite); DDX_Check(pDX, IDC_CHECK_AUTHOR, m_fAuthor); DDX_Check(pDX, IDC_CHECK_LOG_ACCESS, m_fLogAccess); DDX_Check(pDX, IDC_CHECK_INDEX, m_fIndexed); DDX_Text(pDX, IDC_EDIT_ALIAS, m_strDisplayAlias); DDX_Text(pDX, IDC_EDIT_APPLICATION, m_strAppFriendlyName); DDV_MinMaxChars(pDX, m_strAppFriendlyName, 0, MAX_PATH); /// ?
DDX_Control(pDX, IDC_EDIT_PATH, m_edit_Path); DDX_Control(pDX, IDC_EDIT_ALIAS, m_edit_DisplayAlias); DDX_Control(pDX, IDC_EDIT_REDIRECT, m_edit_Redirect); DDX_Control(pDX, IDC_EDIT_APPLICATION, m_edit_AppFriendlyName); DDX_Control(pDX, IDC_STATIC_APP_PROMPT, m_static_AppPrompt); DDX_Control(pDX, IDC_STATIC_PATH_PROMPT, m_static_PathPrompt); DDX_Control(pDX, IDC_STATIC_STARTING_POINT, m_static_StartingPoint); DDX_Control(pDX, IDC_STATIC_PROTECTIOn, m_static_ProtectionPrompt); DDX_Control(pDX, IDC_STATIC_PERMISSIONS, m_static_PermissionsPrompt); DDX_Control(pDX, IDC_BUTTON_UNLOAD_APP, m_button_Unload); DDX_Control(pDX, IDC_BUTTON_CREATE_REMOVE_APP, m_button_CreateRemove); DDX_Control(pDX, IDC_BUTTON_BROWSE, m_button_Browse); DDX_Control(pDX, IDC_BUTTON_CONNECT_AS, m_button_ConnectAs); DDX_Control(pDX, IDC_DUMMY_CONFIGURATION, m_button_Configuration); DDX_Control(pDX, IDC_RADIO_DIR, m_radio_Dir); DDX_Control(pDX, IDC_CHECK_AUTHOR, m_check_Author); DDX_Control(pDX, IDC_CHECK_CHILD, m_check_Child); DDX_Control(pDX, IDC_CHECK_DIRECTORY_BROWSING_ALLOWED, m_check_DirBrowse); DDX_Control(pDX, IDC_CHECK_INDEX, m_check_Index); DDX_Control(pDX, IDC_CHECK_WRITE, m_check_Write); DDX_Control(pDX, IDC_CHECK_READ, m_check_Read); DDX_Control(pDX, IDC_COMBO_PERMISSIONS, m_combo_Permissions); DDX_Control(pDX, IDC_COMBO_PROCESS, m_combo_Process); //}}AFX_DATA_MAP
DDX_Control(pDX, IDC_RADIO_UNC, m_radio_Unc); DDX_Control(pDX, IDC_RADIO_REDIRECT, m_radio_Redirect);
DDX_Check(pDX, IDC_CHECK_CHILD, m_fChild); DDX_Check(pDX, IDC_CHECK_EXACT, m_fExact); DDX_Check(pDX, IDC_CHECK_PERMANENT, m_fPermanent);
if (pDX->m_bSaveAndValidate) { //
// Make sure all field names are correct
//
if (m_nPathType == RADIO_NETDIRECTORY) { DDX_Text(pDX, IDC_EDIT_PATH, m_strPath); m_strPath.TrimLeft(); DDV_MinMaxChars(pDX, m_strPath, 0, MAX_PATH);
if (!IsUNCName(m_strPath)) { ::AfxMessageBox(IDS_BAD_UNC_PATH); pDX->Fail(); }
m_strRedirectPath.Empty();
/*
ISSUE: Don't need username/password?
if (m_strUserName.IsEmpty()) { ::AfxMessageBox(IDS_ERR_NO_USERNAME);
if (!BrowseUser()) { pDX->Fail(); } } */ } else if (m_nPathType == RADIO_REDIRECT) { DDX_Text(pDX, IDC_EDIT_REDIRECT, m_strRedirectPath); m_strRedirectPath.TrimLeft(); DDV_MinMaxChars(pDX, m_strRedirectPath, 0, 2 * MAX_PATH);
if (!IsRelURLPath(m_strRedirectPath) && !IsWildcardedRedirectPath(m_strRedirectPath) && !IsURLName(m_strRedirectPath)) { ::AfxMessageBox(IDS_BAD_URL_PATH); pDX->Fail(); } } else // Local directory
{ ASSERT(m_nPathType == RADIO_DIRECTORY); m_strRedirectPath.Empty();
if (IsVroot()) { DDX_Text(pDX, IDC_EDIT_PATH, m_strPath); m_strPath.TrimLeft();
if (!IsMasterInstance()) { DDV_MinMaxChars(pDX, m_strPath, 1, MAX_PATH); } else { if (m_strPath.IsEmpty()) { //
// No additional validation necc. on master
// instance.
//
return; } }
if (!IsFullyQualifiedPath(m_strPath) && !IsDevicePath(m_strPath)) { ::AfxMessageBox(IDS_ERR_INVALID_PATH); pDX->Fail(); }
if (IsLocal()) { DWORD dwAttr = GetFileAttributes(m_strPath);
if (dwAttr == 0xffffffff || (dwAttr & FILE_ATTRIBUTE_DIRECTORY) == 0) { ::AfxMessageBox(IDS_ERR_PATH_NOT_FOUND); pDX->Fail(); } } } } } else { DDX_Text(pDX, IDC_EDIT_REDIRECT, m_strRedirectPath); DDX_Text(pDX, IDC_EDIT_PATH, m_strPath); DDV_MinMaxChars(pDX, m_strPath, 0, MAX_PATH);
if (!IsMasterInstance() && IS_VROOT(m_dwAttributes)) { DDV_MinMaxChars(pDX, m_strPath, 1, MAX_PATH); } } }
//
// Message Map
//
BEGIN_MESSAGE_MAP(CW3DirectoryPage, CInetPropertyPage) //{{AFX_MSG_MAP(CW3DirectoryPage)
ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse) ON_BN_CLICKED(IDC_BUTTON_CONNECT_AS, OnButtonConnectAs) ON_BN_CLICKED(IDC_BUTTON_CREATE_REMOVE_APP, OnButtonCreateRemoveApp) ON_BN_CLICKED(IDC_BUTTON_UNLOAD_APP, OnButtonUnloadApp) ON_BN_CLICKED(IDC_DUMMY_CONFIGURATION, OnButtonConfiguration) ON_BN_CLICKED(IDC_CHECK_READ, OnCheckRead) ON_BN_CLICKED(IDC_CHECK_WRITE, OnCheckWrite) ON_BN_CLICKED(IDC_CHECK_AUTHOR, OnCheckAuthor) ON_BN_CLICKED(IDC_RADIO_DIR, OnRadioDir) ON_BN_CLICKED(IDC_RADIO_REDIRECT, OnRadioRedirect) ON_BN_CLICKED(IDC_RADIO_UNC, OnRadioUnc) ON_CBN_SELCHANGE(IDC_COMBO_PERMISSIONS, OnSelchangeComboPermissions) ON_CBN_SELCHANGE(IDC_COMBO_PROCESS, OnSelchangeComboProcess) //}}AFX_MSG_MAP
ON_EN_CHANGE(IDC_EDIT_PATH, OnItemChanged) ON_EN_CHANGE(IDC_EDIT_REDIRECT, OnItemChanged) ON_EN_CHANGE(IDC_EDIT_APPLICATION, OnItemChanged) ON_BN_CLICKED(IDC_CHECK_DIRECTORY_BROWSING_ALLOWED, OnItemChanged) ON_BN_CLICKED(IDC_CHECK_LOG_ACCESS, OnItemChanged) ON_BN_CLICKED(IDC_CHECK_SCRIPT, OnItemChanged) ON_BN_CLICKED(IDC_CHECK_CHILD, OnItemChanged) ON_BN_CLICKED(IDC_CHECK_EXACT, OnItemChanged) ON_BN_CLICKED(IDC_CHECK_PERMANENT, OnItemChanged) ON_BN_CLICKED(IDC_CHECK_INDEX, OnItemChanged)
END_MESSAGE_MAP()
void CW3DirectoryPage::RefreshAppState() /*++
Routine Description:
Refresh app state parameters
Arguments:
None
Return Value:
None
--*/ { ASSERT(m_pApplication != NULL);
CError err(m_pApplication->RefreshAppState());
if (err.Failed()) { m_dwAppState = APPSTATUS_NOTDEFINED;
if (err.Win32Error() == ERROR_PATH_NOT_FOUND) { //
// Ignore this error, it really just means the path
// doesn't exist in the metabase, which is true for most
// file and directory properties, and not an error
// condition.
//
err.Reset(); } } else { m_dwAppState = m_pApplication->QueryAppState(); }
if (err.Succeeded()) { //
// Get metabase information
//
m_strAppRoot = m_pApplication->m_strAppRoot; m_dwAppProtection = m_pApplication->m_dwProcessProtection; m_strAppFriendlyName = m_pApplication->m_strFriendlyName; m_fIsAppRoot = m_strMetaRoot.CompareNoCase( CMetaKey::CleanMetaPath(m_strAppRoot)) == 0; } else { //
// Display error information
//
err.MessageBoxFormat(IDS_ERR_APP, MB_OK, NO_HELP_CONTEXT); } }
CString & CW3DirectoryPage::FriendlyAppRoot( IN LPCTSTR lpAppRoot, OUT CString & strFriendly ) /*++
Routine Description:
Convert the metabase app root path to a friendly display name format.
Arguments:
LPCTSTR lpAppRoot : App root CString & strFriendly : Output friendly app root format
Return Value:
Reference to the output string
Notes:
App root must have been cleaned from WAM format priort to calling this function (see first ASSERT below
--*/ { //
// Make sure we cleaned up WAM format
//
ASSERT(*lpAppRoot != _T('/'));
CString strAppRoot(lpAppRoot);
TRACEEOLID("Unfriendly app root: " << strAppRoot);
//
// Break into fields
//
strFriendly.Empty(); LPCTSTR lp = _tcschr(lpAppRoot, _T('/')); // lm
if (lp != NULL) { lp = _tcschr(++lp, _T('/')); // w3svc
if (lp == NULL) { //
// Master Instance
//
strFriendly = m_strWebMaster;
return strFriendly; } DWORD dwInstance = _ttol(++lp); lp = _tcschr(lp, _T('/')); // Instance #
if (lp != NULL) { lp = _tcschr(++lp, _T('/')); // Skip "ROOT"
}
CInstanceProps prop(QueryServerName(), g_cszSvc, dwInstance); HRESULT hr = prop.LoadData();
if (SUCCEEDED(hr)) { CString strName; strFriendly.Format( m_strWebFmt, prop.GetDisplayText(strName, SERVICE_SHORT_NAME) );
if (lp != NULL) { //
// Add rest of dir path
//
strFriendly += lp; }
//
// Now change forward slashes in the path to backward slashes
//
CvtPathToDosStyle(strFriendly);
return strFriendly; } }; //
// Bogus
//
VERIFY(strFriendly.LoadString(IDS_APPROOT_UNKNOWN));
return strFriendly; }
int CW3DirectoryPage::SetComboSelectionFromAppState( IN DWORD dwAppState ) /*++
Routine Description:
Set the protection combo box current selection from the app state DWORD
Arguments:
DWORD dwAppState : Application State
Return Value:
Combo selection ID
--*/ { int nSel = -1;
switch(dwAppState) { case CWamInterface::APP_INPROC: nSel = m_nSelInProc; break;
case CWamInterface::APP_POOLEDPROC: ASSERT(m_pApplication->SupportsPooledProc()); nSel = m_nSelPooledProc; break;
case CWamInterface::APP_OUTOFPROC: nSel = m_nSelOutOfProc; break;
default: ASSERT("Bogus app protection level"); }
ASSERT(nSel >= 0); m_combo_Process.SetCurSel(nSel);
return nSel; }
DWORD CW3DirectoryPage::GetAppStateFromComboSelection() const /*++
Routine Description:
Get the app state DWORD that coresponds to the current combo box list selection
Arguments:
None
Return Value:
App state DWORD or 0xffffffff;
--*/ { int nSel = m_combo_Process.GetCurSel();
if (nSel == m_nSelOutOfProc) { return CWamInterface::APP_OUTOFPROC; }
if (nSel == m_nSelPooledProc) { ASSERT(m_pApplication->SupportsPooledProc()); return CWamInterface::APP_POOLEDPROC; }
if (nSel == m_nSelInProc) { return CWamInterface::APP_INPROC; }
ASSERT(FALSE && "Invalid application state");
return 0xffffffff; }
void CW3DirectoryPage::SetApplicationState() /*++
Routine Description:
Set application control state
Arguments:
None
Return Value:
None
--*/ { //
// SetWindowText causes a dirty marker
//
BOOL fOld = m_fRecordChanges; m_fRecordChanges = FALSE;
m_fParentEnabled = !m_strAppRoot.IsEmpty();
m_fAppEnabled = FALSE;
if (m_pApplication != NULL) { m_pApplication->RefreshAppState(); m_fAppEnabled = m_fIsAppRoot && m_pApplication->IsEnabledApplication(); }
m_button_CreateRemove.EnableWindow( !IsMasterInstance() && HasAdminAccess() ); m_button_CreateRemove.SetWindowText(m_fAppEnabled ? m_strRemove : m_strCreate ); m_static_ProtectionPrompt.EnableWindow( m_fAppEnabled && !IsMasterInstance() && HasAdminAccess() );
//
// Set selection in combo box to match current app state
//
SetComboSelectionFromAppState(m_dwAppProtection);
m_combo_Process.EnableWindow( m_fAppEnabled && !IsMasterInstance() && HasAdminAccess() );
m_static_PermissionsPrompt.EnableWindow(HasAdminAccess()); m_combo_Permissions.EnableWindow(HasAdminAccess());
m_static_AppPrompt.EnableWindow(m_fIsAppRoot && HasAdminAccess()); m_edit_AppFriendlyName.EnableWindow(m_fIsAppRoot && HasAdminAccess()); m_button_Configuration.EnableWindow(m_fAppEnabled);
//
// Write out the verbose starting point.
//
CString str;
FitPathToControl( m_static_StartingPoint, FriendlyAppRoot(m_strAppRoot, str) );
m_edit_AppFriendlyName.SetWindowText(m_strAppFriendlyName); m_button_Unload.EnableWindow(m_dwAppState == APPSTATUS_RUNNING);
//
// Restore (see note on top)
//
m_fRecordChanges = fOld; }
void CW3DirectoryPage::ChangeTypeTo( IN int nNewType ) /*++
Routine Description
Change the directory type
Arguments:
int nNewType : New radio value
Return Value:
None
--*/ { int nOldType = m_nPathType; m_nPathType = nNewType;
if (nOldType == m_nPathType) { //
// No change
//
return; }
OnItemChanged(); SetStateByType();
int nID = -1; CEdit * pPath = NULL; LPCTSTR lpKeepPath = NULL;
switch(m_nPathType) { case RADIO_DIRECTORY: if (IsVroot()) { if (IsFullyQualifiedPath(m_strPath) || IsDevicePath(m_strPath)) { //
// The old path info is acceptable, propose it
// as a default
//
lpKeepPath = m_strPath; }
nID = IDS_DIRECTORY_MASK; pPath = &m_edit_Path; } break;
case RADIO_NETDIRECTORY: if (IsVroot()) { if (IsUNCName(m_strPath)) { //
// The old path info is acceptable, propose it
// as a default
//
lpKeepPath = m_strPath; }
nID = IDS_UNC_MASK; pPath = &m_edit_Path; } break;
case RADIO_REDIRECT: if (!m_strRedirectPath.IsEmpty()) { //
// The old path info is acceptable, propose it
// as a default
//
lpKeepPath = m_strRedirectPath; }
nID = IDS_REDIRECT_MASK; pPath = &m_edit_Redirect; break;
default: ASSERT(FALSE); return; }
//
// Load mask resource, and display
// this in the directory
//
if (pPath != NULL) { if (lpKeepPath != NULL) { pPath->SetWindowText(lpKeepPath); } else { CString str; VERIFY(str.LoadString(nID)); pPath->SetWindowText(str); } pPath->SetSel(0,-1); pPath->SetFocus(); } }
void CW3DirectoryPage::ShowControl( IN CWnd * pWnd, IN BOOL fShow ) /*++
Routine Description:
Show/hide the given control
Arguments:
CWnd * pWnd : Window control BOOL fShow : TRUE to show, FALSE to hide
Return Value:
None
--*/ { ASSERT(pWnd != NULL);
/*
if (pWnd) { pWnd->ShowWindow(fShow ? SW_SHOW : SW_HIDE); } */
ActivateControl(*pWnd, fShow); }
int CW3DirectoryPage::AddStringToComboBox( IN CComboBox & combo, IN UINT nID ) /*++
Routine Description:
Add a string referred to by resource ID to the combobox
Arguments:
CComboBox & combo : Combo box UINT nID : Resource ID
Return Value:
Index of the string added
--*/ { CString str;
VERIFY(str.LoadString(nID)); return combo.AddString(str); }
void CW3DirectoryPage::SetStateByType() /*++
Routine Description:
Set the state of the dialog by the path type currently selected
Arguments:
None
Return Value:
None
--*/ { BOOL fShowDirFlags; BOOL fShowLargeDirGroup; BOOL fShowRedirectFlags; BOOL fShowApp; BOOL fShowIndex; BOOL fShowDirBrowse; BOOL fShowDAV; BOOL fEnableChild; BOOL fEnableBrowse;
switch(m_nPathType) { case RADIO_DIRECTORY: ShowControl(&m_button_ConnectAs, FALSE); ShowControl(&m_button_Browse, IsVroot()); ShowControl(&m_edit_Path, IsVroot()); ShowControl(&m_edit_DisplayAlias, !IsVroot()); ShowControl(&m_edit_Redirect, FALSE); fShowDirFlags = TRUE; fShowLargeDirGroup = !IsFile(); fShowRedirectFlags = FALSE; fShowApp = !IsFile(); fShowIndex = !IsFile(); fShowDirBrowse = !IsFile(); fShowDAV = TRUE; fEnableChild = FALSE; fEnableBrowse = IsLocal() && !IsMasterInstance() && HasAdminAccess(); break;
case RADIO_NETDIRECTORY: ShowControl(&m_button_ConnectAs, TRUE); ShowControl(&m_button_Browse, FALSE); ShowControl(&m_edit_Path, TRUE); ShowControl(&m_edit_DisplayAlias, FALSE); ShowControl(&m_edit_Redirect, FALSE); fShowDirFlags = TRUE; fShowLargeDirGroup = TRUE; fShowRedirectFlags = FALSE; fShowApp = TRUE; fShowIndex = TRUE; fShowDirBrowse = TRUE; fShowDAV = TRUE; fEnableChild = FALSE; fEnableBrowse = FALSE; break;
case RADIO_REDIRECT: ShowControl(&m_button_ConnectAs, FALSE); ShowControl(&m_button_Browse, FALSE); ShowControl(&m_edit_Path, FALSE); ShowControl(&m_edit_DisplayAlias, FALSE); ShowControl(&m_edit_Redirect, TRUE); fShowDirFlags = FALSE; fShowRedirectFlags = TRUE; fShowApp = FALSE; fShowDAV = FALSE; fShowIndex = FALSE; fShowDirBrowse = FALSE; fEnableChild = !IsFile(); fEnableBrowse = FALSE; break;
default: ASSERT(FALSE && "Invalid Selection"); return; }
UINT nID; for (nID = IDC_DIR_FLAGS_FIRST; nID <= IDC_DIR_FLAGS_LAST; ++nID) { ShowControl(GetDlgItem(nID), fShowDirFlags); }
ShowControl(GetDlgItem(IDC_STATIC_DIRFLAGS_LARGE), fShowDirFlags && fShowLargeDirGroup); ShowControl(GetDlgItem(IDC_STATIC_DIRFLAGS_SMALL), fShowDirFlags && !fShowLargeDirGroup);
for (nID = IDC_REDIRECT_FLAGS_FIRST; nID <= IDC_REDIRECT_FLAGS_LAST; ++nID) { ShowControl(nID, fShowRedirectFlags); }
for (nID = IDC_APPLICATIONS_FIRST; nID <= IDC_APPLICATIONS_LAST; ++nID) { ShowControl(nID, fShowApp); }
ShowControl(&m_check_Author, fShowDAV); ShowControl(&m_check_DirBrowse, fShowDirBrowse); ShowControl(&m_check_Index, fShowIndex);
//
// Enable/Disable must come after the showcontrols
//
m_button_Browse.EnableWindow(fEnableBrowse); m_check_Child.EnableWindow(fEnableChild); m_static_PathPrompt.SetWindowText(m_strPrompt[m_nPathType]);
SetApplicationState(); }
void CW3DirectoryPage::SaveAuthoringState() /*++
Routine Description:
Save authoring state
Arguments:
None
Return Value:
None
--*/ { /*
if (m_check_Write.m_hWnd) { //
// Controls initialized -- store live data
//
m_fOriginalWrite = m_check_Write.GetCheck() > 0; m_fOriginalRead = m_check_Read.GetCheck() > 0; } else { //
// Controls not yet initialized, store original data
//
m_fOriginalWrite = m_fWrite; m_fOriginalRead = m_fRead; } */ }
void CW3DirectoryPage::RestoreAuthoringState() /*++
Routine Description:
Restore the authoring state
Arguments:
None
Return Value:
None
--*/ { /*
m_fWrite = m_fOriginalWrite; m_fRead = m_fOriginalRead; */ }
void CW3DirectoryPage::SetAuthoringState( BOOL fAlterReadAndWrite ) /*++
Routine Description:
Set authoring state
Arguments:
None
Return Value:
None
--*/ { /*
if (fAlterReadAndWrite) { if (m_fAuthor) { //
// Remember previous setting to undo
// this thing.
//
SaveAuthoringState(); m_fRead = m_fWrite = TRUE; } else { //
// Restore previous defaults
//
RestoreAuthoringState(); }
m_check_Read.SetCheck(m_fRead); m_check_Write.SetCheck(m_fWrite); } */
m_check_Author.EnableWindow( (m_fRead || m_fWrite) && HasAdminAccess() && HasDAV() );
//m_check_Read.EnableWindow(!m_fAuthor && HasAdminAccess());
//m_check_Write.EnableWindow(!m_fAuthor && HasAdminAccess());
m_check_Read.EnableWindow(HasAdminAccess()); m_check_Write.EnableWindow(HasAdminAccess()); }
void CW3DirectoryPage::SetPathType() /*++
Routine Description:
Set path type from given path
Arguments:
None
Return Value:
None
--*/ { if (!m_strRedirectPath.IsEmpty()) { m_nPathType = RADIO_REDIRECT; m_radio_Dir.SetCheck(0); m_radio_Unc.SetCheck(0); m_radio_Redirect.SetCheck(1); } else if (!IsVroot()) { m_nPathType = RADIO_DIRECTORY; m_radio_Redirect.SetCheck(0); m_radio_Unc.SetCheck(0); m_radio_Dir.SetCheck(1); } else { m_radio_Redirect.SetCheck(0); SetPathType(m_strPath); }
m_static_PathPrompt.SetWindowText(m_strPrompt[m_nPathType]); }
void CW3DirectoryPage::SetPathType( IN LPCTSTR lpstrPath ) /*++
Routine Description:
Set path type from given path
Arguments:
LPCTSTR lpstrPath : Path string
Return Value:
None
--*/ { if (::IsUNCName(lpstrPath)) { m_nPathType = RADIO_NETDIRECTORY; m_radio_Dir.SetCheck(0); m_radio_Unc.SetCheck(1); } else { m_nPathType = RADIO_DIRECTORY; m_radio_Unc.SetCheck(0); m_radio_Dir.SetCheck(1); } }
BOOL CW3DirectoryPage::BrowseUser() /*++
Routine Description:
Browse for username/password
Arguments:
None
Return Value:
TRUE if one was selected, FALSE otherwise.
--*/ { CUserAccountDlg dlg( QueryServerName(), m_strUserName, m_strPassword, this );
if (dlg.DoModal() == IDOK) { m_strUserName = dlg.m_strUserName; m_strPassword = dlg.m_strPassword; OnItemChanged();
return TRUE; }
return FALSE; }
//
// Message Handlers
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
void CW3DirectoryPage::OnItemChanged() /*++
Routine Description:
Handle change in data on the item
Arguments:
None
Return Value:
None
--*/ { if (m_fRecordChanges) { SetModified(TRUE); } }
void CW3DirectoryPage::OnButtonBrowse() /*++
Routine Description:
"Browse" button handler
Arguments:
None
Return Value:
None
--*/ { ASSERT(IsLocal()); CString str; m_edit_Path.GetWindowText(str);
CDirBrowseDlg dlgBrowse(this, str); if (dlgBrowse.DoModal() == IDOK) { m_edit_Path.SetWindowText(dlgBrowse.GetFullPath(m_strPath)); SetPathType();
OnItemChanged(); } }
BOOL CW3DirectoryPage::OnSetActive() /*++
Routine Description:
Page has become active. Dismiss if we're in an inconsistent state
Arguments:
None
Return Value:
TRUE to proceed, FALSE to dismiss.
--*/ { if (m_pApplication == NULL) { return FALSE; }
return CInetPropertyPage::OnSetActive(); }
BOOL CW3DirectoryPage::OnInitDialog() /*++
Routine Description:
WM_INITDIALOG handler. Initialize the dialog.
Arguments:
None.
Return Value:
TRUE if no focus is to be set automatically, FALSE if the focus is already set.
--*/ { CInetPropertyPage::OnInitDialog();
//
// Dynamically create a hidden app config OCX.
//
CRect rc(0, 0, 0, 0); CString str; VERIFY(str.LoadString( IsVroot() ? IDS_RADIO_VDIR : IsDir() ? IDS_RADIO_DIR : IDS_RADIO_FILE));
m_radio_Dir.SetWindowText(str);
//
// Fill permissions combo box.
//
for (UINT n = IDS_PERMISSIONS_NONE; n <= IDS_PERMISSIONS_EXECUTE; ++n) { AddStringToComboBox(m_combo_Permissions, n); } m_combo_Permissions.SetCurSel(m_nPermissions);
//
// And process combo box (low, medium and high)
//
m_nSelInProc = AddStringToComboBox(m_combo_Process, IDS_COMBO_INPROC);
if (m_pApplication->SupportsPooledProc()) { m_nSelPooledProc = AddStringToComboBox( m_combo_Process, IDS_COMBO_POOLEDPROC ); } else { m_nSelPooledProc = -1; // N/A
}
m_nSelOutOfProc = AddStringToComboBox(m_combo_Process, IDS_COMBO_OUTPROC);
//
// Selection will be set later...
//
SetPathType(); SetStateByType(); SetAuthoringState(FALSE);
TRACEEOLID(m_strMetaRoot);
//
// Some items not available on master instance, or if no admin
// access exists
//
BOOL fOkToDIR = TRUE; BOOL fOkToUNC = TRUE;
if (!HasAdminAccess() && IsVroot()) { //
// If not an admin, operator cannot change
// the path, he can only cancel a redirect
// by going back to the path it had before.
//
fOkToDIR = IsFullyQualifiedPath(m_strPath) || IsDevicePath(m_strPath); fOkToUNC = IsUNCName(m_strPath); }
GetDlgItem(IDC_STATIC_PATH_TYPE)->EnableWindow(!IsMasterInstance()); GetDlgItem(IDC_RADIO_DIR)->EnableWindow(!IsMasterInstance() && fOkToDIR); GetDlgItem(IDC_RADIO_UNC)->EnableWindow( IsVroot() && !IsMasterInstance() && fOkToUNC ); GetDlgItem(IDC_RADIO_REDIRECT)->EnableWindow(!IsMasterInstance()); GetDlgItem(IDC_STATIC_PATH_PROMPT)->EnableWindow(!IsMasterInstance()); GetDlgItem(IDC_EDIT_PATH)->EnableWindow( !IsMasterInstance() && HasAdminAccess() ); GetDlgItem(IDC_BUTTON_EDIT_PATH_TYPE)->EnableWindow(!IsMasterInstance());
//SetApplicationState();
//
// Store the original value of fUNC of reference later
// when saving out --BoydM
//
m_fOriginallyUNC = (m_nPathType == RADIO_NETDIRECTORY);
//
// All changes from here on out need to be reflected.
//
m_fRecordChanges = TRUE;
return TRUE; }
/* virtual */ HRESULT CW3DirectoryPage::FetchLoadedValues() /*++
Routine Description: Move configuration data from sheet to dialog controls
Arguments:
None
Return Value:
HRESULT
--*/ { CError err; m_strMetaRoot = QueryMetaPath();
BEGIN_META_DIR_READ(CW3Sheet) //
// Use m_ notation because the message crackers require it
//
BOOL m_fDontLog;
FETCH_DIR_DATA_FROM_SHEET(m_strAlias); FETCH_DIR_DATA_FROM_SHEET(m_strUserName); FETCH_DIR_DATA_FROM_SHEET(m_strPassword); FETCH_DIR_DATA_FROM_SHEET(m_strPath); FETCH_DIR_DATA_FROM_SHEET(m_strRedirectPath); FETCH_DIR_DATA_FROM_SHEET(m_dwAccessPerms); FETCH_DIR_DATA_FROM_SHEET(m_dwDirBrowsing); FETCH_DIR_DATA_FROM_SHEET(m_fDontLog); FETCH_DIR_DATA_FROM_SHEET(m_fIndexed); FETCH_DIR_DATA_FROM_SHEET(m_fExact); FETCH_DIR_DATA_FROM_SHEET(m_fChild); FETCH_DIR_DATA_FROM_SHEET(m_fPermanent);
m_fBrowsingAllowed = IS_FLAG_SET(m_dwDirBrowsing, MD_DIRBROW_ENABLED); m_fRead = IS_FLAG_SET(m_dwAccessPerms, MD_ACCESS_READ); m_fWrite = IS_FLAG_SET(m_dwAccessPerms, MD_ACCESS_WRITE); m_fAuthor = IS_FLAG_SET(m_dwAccessPerms, MD_ACCESS_SOURCE); m_fLogAccess = !m_fDontLog;
SaveAuthoringState();
if (!m_fIsAppRoot) { m_dwAppState = APPSTATUS_NOTDEFINED; }
MakeDisplayAlias(); END_META_DIR_READ(err)
m_nPermissions = IS_FLAG_SET(m_dwAccessPerms, MD_ACCESS_EXECUTE) ? COMBO_EXECUTE : IS_FLAG_SET(m_dwAccessPerms, MD_ACCESS_SCRIPT) ? COMBO_SCRIPT : COMBO_NONE;
//
// Make sure we were passed the right home directory
// flag
//
ASSERT((m_fHome && !::lstrcmp(m_strAlias, g_cszRoot)) || (!m_fHome && ::lstrcmp(m_strAlias, g_cszRoot)));
TRACEEOLID(QueryMetaPath());
BeginWaitCursor(); m_pApplication = new CIISApplication(QueryServerName(), QueryMetaPath()); err = m_pApplication != NULL ? m_pApplication->QueryResult() : ERROR_NOT_ENOUGH_MEMORY;
if (err.Win32Error() == ERROR_PATH_NOT_FOUND) { //
// No app information; that's ok in cases of file system directories
// that don't exist in the metabase yet.
//
err.Reset(); } EndWaitCursor();
if (err.Succeeded()) { //
// CODEWORK: RefreshAppState should be split up into two
// different methods: one that fetches the data, and one
// that moves the data to the UI controls on this page.
//
RefreshAppState(); } return err; }
/* virtual */ HRESULT CW3DirectoryPage::SaveInfo() /*++
Routine Description:
Save the information on this property page
Arguments:
None
Return Value:
Error return code
--*/ { ASSERT(IsDirty());
TRACEEOLID("Saving W3 virtual directory page now...");
CError err;
SET_FLAG_IF(m_fBrowsingAllowed, m_dwDirBrowsing, MD_DIRBROW_ENABLED); SET_FLAG_IF(m_fRead, m_dwAccessPerms, MD_ACCESS_READ); SET_FLAG_IF(m_fWrite, m_dwAccessPerms, MD_ACCESS_WRITE); SET_FLAG_IF(m_fAuthor, m_dwAccessPerms, MD_ACCESS_SOURCE); SET_FLAG_IF( (m_nPermissions == COMBO_EXECUTE), m_dwAccessPerms, MD_ACCESS_EXECUTE );
//
// script is set on EXECUTE as well "Execute (including script)"
//
SET_FLAG_IF(((m_nPermissions == COMBO_SCRIPT) || (m_nPermissions == COMBO_EXECUTE)), m_dwAccessPerms, MD_ACCESS_SCRIPT); BOOL m_fDontLog = !m_fLogAccess;
BOOL fUNC = (m_nPathType == RADIO_NETDIRECTORY); ASSERT(!fUNC || IsVroot());
DWORD dwAppProtection = GetAppStateFromComboSelection();
if (dwAppProtection != m_dwAppProtection && m_fAppEnabled) { //
// Isolation state has changed; recreate the application
//
CError err2(m_pApplication->RefreshAppState());
if (err2.Succeeded()) { err2 = m_pApplication->Create( m_strAppFriendlyName, dwAppProtection );
//
// Remember the new state, so we don't do this again
// the next time the guy hits "apply"
//
if (err2.Succeeded()) { m_dwAppProtection = dwAppProtection; } }
err2.MessageBoxOnFailure(); }
BOOL fUserNameWritten = FALSE;
BeginWaitCursor();
BEGIN_META_DIR_WRITE(CW3Sheet) INIT_DIR_DATA_MASK(m_dwAccessPerms, m_dwBitRangePermissions) INIT_DIR_DATA_MASK(m_dwDirBrowsing, m_dwBitRangeDirBrowsing)
if (fUNC) { // Fix for 380353 -- sergeia
// When user want to change password only the above construction doesn't work
// because flag will be false -- user name is the same and not written!
// STORE_DIR_DATA_ON_SHEET_REMEMBER(m_strUserName, fUserNameWritten)
// if (fUserNameWritten)
// {
STORE_DIR_DATA_ON_SHEET(m_strUserName); STORE_DIR_DATA_ON_SHEET(m_strPassword); // }
// endoffix
} else { if (m_fOriginallyUNC) { FLAG_DIR_DATA_FOR_DELETION(MD_VR_USERNAME) FLAG_DIR_DATA_FOR_DELETION(MD_VR_PASSWORD) } } STORE_DIR_DATA_ON_SHEET(m_strPath) STORE_DIR_DATA_ON_SHEET(m_fDontLog) STORE_DIR_DATA_ON_SHEET(m_fIndexed) STORE_DIR_DATA_ON_SHEET(m_fChild); STORE_DIR_DATA_ON_SHEET(m_fExact); STORE_DIR_DATA_ON_SHEET(m_fPermanent); //
// CODEWORK: Not an elegant solution
//
pSheet->GetDirectoryProperties().MarkRedirAsInherit(!m_fChild); STORE_DIR_DATA_ON_SHEET(m_strRedirectPath) STORE_DIR_DATA_ON_SHEET(m_dwAccessPerms) STORE_DIR_DATA_ON_SHEET(m_dwDirBrowsing) END_META_DIR_WRITE(err)
if (err.Succeeded() && m_pApplication->IsEnabledApplication()) { err = m_pApplication->WriteFriendlyName(m_strAppFriendlyName); }
if (err.Succeeded()) { //
// Save Defaults
//
SaveAuthoringState(); }
EndWaitCursor();
return err; }
BOOL CW3DirectoryPage::CheckWriteAndExecWarning() /*++
Routine Description:
Warn if both 'exec' and 'write' permissions are set. Arguments:
None
Return Value:
TRUE to proceed anyway.
-*/ { if (m_nPermissions == COMBO_EXECUTE && m_fWrite) { if (::AfxMessageBox( IDS_WRN_WRITE_EXEC, MB_YESNO | MB_DEFBUTTON2 ) != IDYES) { return FALSE; } }
OnItemChanged();
return TRUE; }
void CW3DirectoryPage::OnCheckRead() /*++
Routine Description:
handle 'read' checkbox
Arguments:
None
Return Value:
None
--*/ { m_fRead = !m_fRead; SetAuthoringState(FALSE); OnItemChanged(); }
void CW3DirectoryPage::OnCheckWrite() /*++
Routine Description:
handle 'write' checkbox
Arguments:
None
Return Value:
None
--*/ { m_fWrite = !m_fWrite;
if (!CheckWriteAndExecWarning()) { //
// Undo
//
m_fWrite = FALSE; m_check_Write.SetCheck(m_fWrite); } else { SetAuthoringState(FALSE); OnItemChanged(); } }
void CW3DirectoryPage::OnCheckAuthor() /*++
Routine Description:
'Author' checkbox handler
Arguments:
None
Return Value:
None
--*/ { m_fAuthor = !m_fAuthor; SetAuthoringState(TRUE);
if (!CheckWriteAndExecWarning()) { //
// Undo -- set script instead
//
m_combo_Permissions.SetCurSel(m_nPermissions = COMBO_SCRIPT); }
OnItemChanged(); }
void CW3DirectoryPage::OnSelchangeComboPermissions() /*++
Routine Description:
Permissions combo box selection change handler
Arguments:
None
Return Value:
None
--*/ { m_nPermissions = m_combo_Permissions.GetCurSel(); ASSERT(m_nPermissions >= COMBO_NONE && m_nPermissions <= COMBO_EXECUTE);
if (!CheckWriteAndExecWarning()) { //
// Undo -- set script instead
//
m_combo_Permissions.SetCurSel(m_nPermissions = COMBO_SCRIPT); }
OnItemChanged(); }
void CW3DirectoryPage::OnButtonConnectAs() /*++
Routine Description:
Handle 'connect as' button.
Arguments:
None
Return Value:
None
--*/ { BrowseUser(); }
void CW3DirectoryPage::OnRadioDir() /*++
Routine Description: 'Directory' radio button handler
Arguments:
None
Return Value:
None
--*/ { ChangeTypeTo(RADIO_DIRECTORY); }
void CW3DirectoryPage::OnRadioUnc() /*++
Routine Description: 'Network path' radio button handler
Arguments:
None
Return Value:
None
--*/ { ChangeTypeTo(RADIO_NETDIRECTORY); }
void CW3DirectoryPage::OnRadioRedirect() /*++
Routine Description: 'Redirect' radio button handler
Arguments:
None
Return Value:
None
--*/ { ChangeTypeTo(RADIO_REDIRECT); }
void CW3DirectoryPage::OnButtonCreateRemoveApp() /*++
Routine Description:
Create/Remove button handler
Arguments:
None
Return Value:
None
--*/ { BeginWaitCursor();
CError err(m_pApplication->RefreshAppState());
if (m_fAppEnabled) { //
// App currently exists -- delete it
//
err = m_pApplication->Delete(); } else { //
// Create new app in-proc
//
CString strAppName;
if (m_fHome) { //
// Use default name for application name
//
VERIFY(strAppName.LoadString(IDS_DEF_APP)); } else { //
// Use name of the virtual directory for the
// application name
//
strAppName = m_strAlias; }
//
// Attempt to create a pooled-proc by default; failing
// that if it's not supported, create it in proc
//
DWORD dwAppProtState = m_pApplication->SupportsPooledProc() ? CWamInterface::APP_POOLEDPROC : CWamInterface::APP_INPROC; err = m_pApplication->Create(strAppName, dwAppProtState); }
if (err.Succeeded()) { RefreshAppState(); NotifyMMC(); }
//
// Move app data to the controls
//
UpdateData(FALSE);
EndWaitCursor();
err.MessageBoxOnFailure(); SetApplicationState(); }
void CW3DirectoryPage::OnButtonUnloadApp() /*++
Routine Description:
'Unload' button handler
Arguments:
None
Return Value:
None
--*/ { ASSERT(m_dwAppState == APPSTATUS_RUNNING);
BeginWaitCursor(); CError err(m_pApplication->RefreshAppState());
if (err.Succeeded()) { if (m_dwAppProtection == CWamInterface::APP_POOLEDPROC) { //
// Warn that everything in its process will get unloaded
//
if (!NoYesMessageBox(IDS_WRN_UNLOAD_POOP)) { //
// Chickened out
//
return; } }
err = m_pApplication->Unload(); }
err.MessageBoxOnFailure(); RefreshAppState(); EndWaitCursor();
//
// Ensure that an enabled button will have focus.
//
m_button_CreateRemove.SetFocus();
SetApplicationState(); }
#include "..\AppConfig\AppConfig.h"
void CW3DirectoryPage::OnButtonConfiguration() /*++
Routine Description:
Pass on "configuration" button click to the ocx.
Arguments:
None
Return Value:
None
--*/ { IIISAppConfig * pAppConfig = NULL; CLSID clsID; HRESULT hr;
if ( SUCCEEDED(hr = CLSIDFromProgID(OLESTR("AppConfig.IISAppConfig"), &clsID)) && SUCCEEDED(hr = ::CoCreateInstance(clsID, NULL, CLSCTX_ALL, __uuidof(IIISAppConfig), (void **)&pAppConfig))) { pAppConfig->put_ComputerName((LPTSTR)(LPCTSTR)GetServerName()); pAppConfig->put_MetaPath((LPTSTR)QueryMetaPath()); pAppConfig->put_UserName((LPTSTR)(LPCTSTR)m_strUserName); pAppConfig->put_UserPassword((LPTSTR)(LPCTSTR)m_strPassword); pAppConfig->Run(); } }
void CW3DirectoryPage::OnSelchangeComboProcess() /*++
Routine Description:
Handle change in process protection UI
Arguments:
None
Return Value:
None
--*/ { OnItemChanged(); }
|