windows-nt/Source/XPSP1/NT/base/cluster/admin/iisclex3/iis.cpp
2020-09-26 16:20:57 +08:00

492 lines
14 KiB
C++

/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-1997 Microsoft Corporation
//
// Module Name:
// Iis.cpp
//
// Abstract:
// Implementation of the CIISVirtualRootParamsPage class.
//
// Author:
// Pete Benoit (v-pbenoi) October 16, 1996
// David Potter (davidp) October 17, 1996
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <inetinfo.h>
#include "IISClEx3.h"
#include "Iis.h"
#include "ExtObj.h"
#include "DDxDDv.h"
#include "HelpData.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CIISVirtualRootParamsPage property page
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CIISVirtualRootParamsPage, CBasePropertyPage)
/////////////////////////////////////////////////////////////////////////////
// Message Maps
BEGIN_MESSAGE_MAP(CIISVirtualRootParamsPage, CBasePropertyPage)
//{{AFX_MSG_MAP(CIISVirtualRootParamsPage)
ON_BN_CLICKED(IDC_PP_IIS_FTP, OnChangeServiceType)
ON_BN_CLICKED(IDC_PP_IIS_GOPHER, OnChangeServiceType)
ON_BN_CLICKED(IDC_PP_IIS_WWW, OnChangeServiceType)
#ifdef _ACCOUNT_AND_PASSWORD
ON_EN_CHANGE(IDC_PP_IIS_DIRECTORY, OnChangeDirectory)
#endif // _ACCOUNT_AND_PASSWORD
ON_EN_CHANGE(IDC_PP_IIS_ALIAS, OnChangeRequiredField)
//}}AFX_MSG_MAP
// TODO: Modify the following lines to represent the data displayed on this page.
#ifdef _ACCOUNT_AND_PASSWORD
ON_EN_CHANGE(IDC_PP_IIS_ACCOUNTNAME, CBasePropertyPage::OnChangeCtrl)
ON_EN_CHANGE(IDC_PP_IIS_PASSWORD, CBasePropertyPage::OnChangeCtrl)
#endif /// _ACCOUNT_AND_PASSWORD
ON_BN_CLICKED(IDC_PP_IIS_READ_ACCESS, CBasePropertyPage::OnChangeCtrl)
ON_BN_CLICKED(IDC_PP_IIS_WRITE_ACCESS, CBasePropertyPage::OnChangeCtrl)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CIISVirtualRootParamsPage::CIISVirtualRootParamsPage
//
// Routine Description:
// Default constructor.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CIISVirtualRootParamsPage::CIISVirtualRootParamsPage(void)
: CBasePropertyPage(g_aHelpIDs_IDD_PP_IIS_PARAMETERS, g_aHelpIDs_IDD_WIZ_IIS_PARAMETERS)
{
// TODO: Modify the following lines to represent the data displayed on this page.
//{{AFX_DATA_INIT(CIISVirtualRootParamsPage)
m_strDirectory = _T("");
m_strAlias = _T("");
m_bRead = FALSE;
m_bWrite = FALSE;
m_nServerType = -1;
#ifdef _ACCOUNT_AND_PASSWORD
m_strAccountName = _T("");
m_strPassword = _T("");
#endif // _ACCOUNT_AND_PASSWORD
//}}AFX_DATA_INIT
// Setup the property array.
{
m_rgProps[epropServiceName].Set(REGPARAM_IIS_SERVICE_NAME, m_strServiceName, m_strPrevServiceName);
m_rgProps[epropDirectory].Set(REGPARAM_IIS_DIRECTORY, m_strDirectory, m_strPrevDirectory);
m_rgProps[epropAlias].Set(REGPARAM_IIS_ALIAS, m_strAlias, m_strPrevAlias);
#ifdef _ACCOUNT_AND_PASSWORD
m_rgProps[epropAccoutName].Set(REGPARAM_IIS_ACCOUNTNAME, m_strAccountName, m_strPrevAccountName);
m_rgProps[epropPassword].Set(REGPARAM_IIS_PASSWORD, m_strPassword, m_strPrevPassword);
#endif // _ACCOUNT_AND_PASSWORD
m_rgProps[epropAccessMask].Set(REGPARAM_IIS_ACCESSMASK, m_dwAccessMask, m_dwPrevAccessMask);
} // Setup the property array
m_iddPropertyPage = IDD_PP_IIS_PARAMETERS;
m_iddWizardPage = IDD_WIZ_IIS_PARAMETERS;
} //*** CIISVirtualRootParamsPage::CIISVirtualRootParamsPage()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CIISVirtualRootParamsPage::DoDataExchange
//
// Routine Description:
// Do data exchange between the dialog and the class.
//
// Arguments:
// pDX [IN OUT] Data exchange object
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CIISVirtualRootParamsPage::DoDataExchange(CDataExchange * pDX)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (!pDX->m_bSaveAndValidate)
{
// Set the service type.
if (m_strServiceName.CompareNoCase(IIS_SVC_NAME_FTP) == 0)
m_nServerType = 0;
else if (m_strServiceName.CompareNoCase(IIS_SVC_NAME_GOPHER) == 0)
m_nServerType = 1;
else if (m_strServiceName.CompareNoCase(IIS_SVC_NAME_WWW) == 0)
m_nServerType = 2;
else
m_nServerType = -1;
// Set the access variables.
if (m_dwAccessMask & VROOT_MASK_READ)
m_bRead = TRUE;
else
m_bRead = FALSE;
if (m_dwAccessMask & (VROOT_MASK_WRITE | VROOT_MASK_EXECUTE))
m_bWrite = TRUE;
else
m_bWrite = FALSE;
} // if: setting data to dialog
// TODO: Modify the following lines to represent the data displayed on this page.
//{{AFX_DATA_MAP(CIISVirtualRootParamsPage)
DDX_Control(pDX, IDC_PP_IIS_WRITE_ACCESS, m_ckbWrite);
DDX_Control(pDX, IDC_PP_IIS_READ_ACCESS, m_ckbRead);
DDX_Control(pDX, IDC_PP_IIS_ACCESS_GROUP, m_groupAccess);
#ifdef _ACCOUNT_AND_PASSWORD
DDX_Control(pDX, IDC_PP_IIS_PASSWORD, m_editPassword);
DDX_Control(pDX, IDC_PP_IIS_PASSWORD_LABEL, m_staticPassword);
DDX_Control(pDX, IDC_PP_IIS_ACCOUNTNAME, m_editAccountName);
DDX_Control(pDX, IDC_PP_IIS_ACCOUNTNAME_LABEL, m_staticAccountName);
DDX_Control(pDX, IDC_PP_IIS_ACCT_INFO_GROUP, m_groupAccountInfo);
#endif // _ACCOUNT_AND_PASSWORD
DDX_Control(pDX, IDC_PP_IIS_ALIAS, m_editAlias);
DDX_Control(pDX, IDC_PP_IIS_DIRECTORY, m_editDirectory);
DDX_Control(pDX, IDC_PP_IIS_WWW, m_rbWWW);
DDX_Control(pDX, IDC_PP_IIS_GOPHER, m_rbGOPHER);
DDX_Control(pDX, IDC_PP_IIS_FTP, m_rbFTP);
DDX_Radio(pDX, IDC_PP_IIS_FTP, m_nServerType);
DDX_Text(pDX, IDC_PP_IIS_DIRECTORY, m_strDirectory);
DDX_Text(pDX, IDC_PP_IIS_ALIAS, m_strAlias);
#ifdef _ACCOUNT_AND_PASSWORD
DDX_Text(pDX, IDC_PP_IIS_ACCOUNTNAME, m_strAccountName);
DDX_Text(pDX, IDC_PP_IIS_PASSWORD, m_strPassword);
#endif // _ACCOUNT_AND_PASSWORD
DDX_Check(pDX, IDC_PP_IIS_READ_ACCESS, m_bRead);
DDX_Check(pDX, IDC_PP_IIS_WRITE_ACCESS, m_bWrite);
//}}AFX_DATA_MAP
if (pDX->m_bSaveAndValidate)
{
if (!BBackPressed())
{
DDV_MaxChars(pDX, m_strDirectory, MAX_PATH);
DDV_MaxChars(pDX, m_strAlias, MAX_PATH);
DDV_RequiredText(pDX, IDC_PP_IIS_DIRECTORY, IDC_PP_IIS_DIRECTORY_LABEL, m_strDirectory);
DDV_RequiredText(pDX, IDC_PP_IIS_ALIAS, IDC_PP_IIS_ALIAS_LABEL, m_strAlias);
} // if: Back button not pressed
// Save the type.
if (m_nServerType == 0)
m_strServiceName = IIS_SVC_NAME_FTP;
else if (m_nServerType == 1)
m_strServiceName = IIS_SVC_NAME_GOPHER;
else if (m_nServerType == 2)
m_strServiceName = IIS_SVC_NAME_WWW;
else
{
CString strMsg;
strMsg.LoadString(IDS_INVALID_IIS_SERVICE_TYPE);
AfxMessageBox(strMsg, MB_OK | MB_ICONSTOP);
strMsg.Empty();
pDX->PrepareCtrl(IDC_PP_IIS_FTP); // do this just to set the control for Fail().
pDX->Fail();
} // else: no service type set
// Save the access mask values.
m_dwAccessMask = 0;
if (m_bRead)
m_dwAccessMask |= VROOT_MASK_READ;
if (m_bWrite)
{
if (m_nServerType == 2) // WWW
m_dwAccessMask |= VROOT_MASK_EXECUTE;
else if (m_nServerType == 0) // FTP
m_dwAccessMask |= VROOT_MASK_WRITE;
} // if: Write/Execute button pressed
// If the alias isn't prefixed with a slash, supply it.
if (m_strAlias[0] != _T('/'))
{
CString strTempAlias;
try
{
strTempAlias = _T('/') + m_strAlias;
m_strAlias = strTempAlias;
} // try
catch (CException * pe)
{
pe->ReportError();
pe->Delete();
strTempAlias.Empty();
pDX->PrepareCtrl(IDC_PP_IIS_ALIAS); // do this just to set the control for Fail().
pDX->Fail();
} // catch: CException
} // if: alias not prefixed with slash
} // if: saving data from dialog
CBasePropertyPage::DoDataExchange(pDX);
} //*** CIISVirtualRootParamsPage::DoDataExchange()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CIISVirtualRootParamsPage::OnInitDialog
//
// Routine Description:
// Handler for the WM_INITDIALOG message.
//
// Arguments:
// None.
//
// Return Value:
// TRUE We need the focus to be set for us.
// FALSE We already set the focus to the proper control.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CIISVirtualRootParamsPage::OnInitDialog(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (BWizard())
{
try
{
m_strServiceName = IIS_SVC_NAME_WWW;
m_dwAccessMask = VROOT_MASK_READ;
} // try
catch (CMemoryException * pme)
{
pme->ReportError();
pme->Delete();
} // catch: CMemoryException
} // if: creating a new resource
CBasePropertyPage::OnInitDialog();
// Set limits on the edit controls.
m_editDirectory.SetLimitText(MAX_PATH);
m_editAlias.SetLimitText(MAX_PATH);
#ifdef _ACCOUNT_AND_PASSWORD
m_staticPassword.EnableWindow(FALSE);
m_editPassword.EnableWindow(FALSE);
#endif // _ACCOUNT_AND_PASSWORD
OnChangeServiceType();
#ifdef _ACCOUNT_AND_PASSWORD
OnChangeDirectory();
#endif // _ACCOUNT_AND_PASSWORD
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
} //*** CIISVirtualRootParamsPage::OnInitDialog()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CIISVirtualRootParamsPage::OnSetActive
//
// Routine Description:
// Handler for the PSN_SETACTIVE message.
//
// Arguments:
// None.
//
// Return Value:
// TRUE Page successfully initialized.
// FALSE Page not initialized.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CIISVirtualRootParamsPage::OnSetActive(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// Enable/disable the Next/Finish button.
if (BWizard())
{
if ((m_editDirectory.GetWindowTextLength() == 0)
|| (m_editAlias.GetWindowTextLength() == 0))
EnableNext(FALSE);
else
EnableNext(TRUE);
} // if: in the wizard
return CBasePropertyPage::OnSetActive();
} //*** CIISVirtualRootParamsPage::OnSetActive()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CIISVirtualRootParamsPage::OnChangeServiceType
//
// Routine Description:
// Handler for the BN_CLICKED message on one of the service type radio
// buttons.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CIISVirtualRootParamsPage::OnChangeServiceType(void)
{
int nCmdShowAccess;
IDS idsWriteLabel = 0;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
OnChangeCtrl();
if (m_rbFTP.GetCheck() == BST_CHECKED)
{
nCmdShowAccess = SW_SHOW;
idsWriteLabel = IDS_WRITE;
} // if: FTP service
else if (m_rbGOPHER.GetCheck() == BST_CHECKED)
{
nCmdShowAccess = SW_HIDE;
} // else if: GOPHER service
else if (m_rbWWW.GetCheck() == BST_CHECKED)
{
nCmdShowAccess = SW_SHOW;
idsWriteLabel = IDS_EXECUTE;
} // else if: WWW service
else
{
nCmdShowAccess = SW_HIDE;
} // else: unknown service
// Set the access checkbox labels.
if (idsWriteLabel != 0)
{
CString strWriteLabel;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
strWriteLabel.LoadString(idsWriteLabel);
m_ckbWrite.SetWindowText(strWriteLabel);
} // if: write label needs to be set
// Hide the Access group if this is for a GOPHER Virtual Root.
m_groupAccess.ShowWindow(nCmdShowAccess);
m_ckbRead.ShowWindow(nCmdShowAccess);
m_ckbWrite.ShowWindow(nCmdShowAccess);
} //*** CIISVirtualRootParamsPage::OnChangeServiceType()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CIISVirtualRootParamsPage::OnChangeDirectory
//
// Routine Description:
// Handler for the EN_CHANGE message on the Directory edit control.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
#ifdef _ACCOUNT_AND_PASSWORD
void CIISVirtualRootParamsPage::OnChangeDirectory(void)
{
BOOL bEnable = FALSE;
CString strDirectory;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
OnChangeCtrl();
// If the edit control begins with a \\name\, enable the account info
// group. Otherwise disable it.
m_editDirectory.GetWindowText(strDirectory);
if ((strDirectory.GetLength() >= 4)
&& (strDirectory[0] == _T('\\'))
&& (strDirectory[1] == _T('\\'))
&& (strDirectory[2] != _T('\\')))
{
CString strRight;
strRight = strDirectory.Right(strDirectory.GetLength() - 3);
if (strRight.Find(_T('\\')) >= 0)
bEnable = TRUE;
} // if: directory begins with a double backslash + non-backslash
// Enable or disable the account info group.
m_groupAccountInfo.EnableWindow(bEnable);
m_staticAccountName.EnableWindow(bEnable);
m_editAccountName.EnableWindow(bEnable);
// m_staticPassword.EnableWindow(bEnable);
// m_editPassword.EnableWindow(bEnable);
if (BWizard())
{
if ((m_strDirectory.GetLength() == 0)
|| (m_editAlias.GetWindowTextLength() == 0))
EnableNext(FALSE);
else
EnableNext(TRUE);
} // if: in a wizard
} //*** CIISVirtualRootParamsPage::OnChangeDirectory()
#endif // _ACCOUNT_AND_PASSWORD
/////////////////////////////////////////////////////////////////////////////
//++
//
// CIISVirtualRootParamsPage::OnChangeRequiredField
//
// Routine Description:
// Handler for the EN_CHANGE message on the Share name or Path edit
// controls.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CIISVirtualRootParamsPage::OnChangeRequiredField(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
OnChangeCtrl();
if (BWizard())
{
if ((m_editDirectory.GetWindowTextLength() == 0)
|| (m_editAlias.GetWindowTextLength() == 0))
EnableNext(FALSE);
else
EnableNext(TRUE);
} // if: in a wizard
} //*** CIISVirtualRootParamsPage::OnChangeRequiredField()