windows-nt/Source/XPSP1/NT/inetsrv/iis/admin/snapin/fltdlg.cpp
2020-09-26 16:20:57 +08:00

432 lines
7.2 KiB
C++

/*++
Copyright (c) 1994-1999 Microsoft Corporation
Module Name :
fltdlg.cpp
Abstract:
WWW Filters Property Dialog
Author:
Ronald Meijer (ronaldm)
Project:
Internet Services Manager
Revision History:
--*/
//
// Include Files
//
#include "stdafx.h"
#include "common.h"
#include "inetprop.h"
#include "InetMgrApp.h"
#include "shts.h"
#include "w3sht.h"
#include "fltdlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CFilterDlg::CFilterDlg(
IN OUT CIISFilter & flt,
IN CIISFilterList * & pFilters,
IN BOOL fLocal,
IN CWnd * pParent OPTIONAL
)
/*++
Routine Description:
Filter properties dialog constructor
Arguments:
CIISFilter & flt : Filter being edited
CFilters * & pFilters : List of filters that exist
BOOL fLocal : TRUE on the local system
CWnd * pParent OPTIONAL : Optional parent window
Return Value:
N/A
--*/
: CDialog(CFilterDlg::IDD, pParent),
m_fLocal(fLocal),
m_pFilters(pFilters),
m_fEditMode(FALSE),
m_flt(flt)
{
//{{AFX_DATA_INIT(CFilterDlg)
m_strExecutable = m_flt.m_strExecutable;
m_strFilterName = m_flt.m_strName;
//}}AFX_DATA_INIT
//
// Map priority to string ID
//
m_strPriority.LoadString(IDS_HIGH + 3 - m_flt.m_nPriority);
}
void
CFilterDlg::DoDataExchange(
IN CDataExchange * pDX
)
/*++
Routine Description:
Initialise/Store control data
Arguments:
CDataExchange * pDX - DDX/DDV control structure
Return Value:
None
--*/
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFilterDlg)
DDX_Control(pDX, IDC_STATIC_PRIORITY_VALUE, m_static_Priority);
DDX_Control(pDX, IDC_STATIC_PRIORITY, m_static_PriorityPrompt);
DDX_Control(pDX, IDOK, m_button_Ok);
DDX_Control(pDX, IDC_EDIT_FILTERNAME, m_edit_FilterName);
DDX_Control(pDX, IDC_EDIT_EXECUTABLE, m_edit_Executable);
DDX_Control(pDX, IDC_BUTTON_BROWSE, m_button_Browse);
DDX_Text(pDX, IDC_EDIT_FILTERNAME, m_strFilterName);
DDX_Text(pDX, IDC_STATIC_PRIORITY_VALUE, m_strPriority);
//}}AFX_DATA_MAP
DDX_Text(pDX, IDC_EDIT_EXECUTABLE, m_strExecutable);
DDV_MaxChars(pDX, m_strExecutable, 255);
if (pDX->m_bSaveAndValidate)
{
//
// Validate executable
//
if (PathIsRelative(m_strExecutable))
{
::AfxMessageBox(IDS_ERR_BAD_PATH);
pDX->Fail();
}
if (m_fLocal &&
(::GetFileAttributes(m_strExecutable) & FILE_ATTRIBUTE_DIRECTORY))
{
::AfxMessageBox(IDS_ERR_FILE_NOT_FOUND);
pDX->Fail();
}
}
}
//
// Message Map
//
BEGIN_MESSAGE_MAP(CFilterDlg, CDialog)
//{{AFX_MSG_MAP(CFilterDlg)
ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse)
ON_EN_CHANGE(IDC_EDIT_EXECUTABLE, OnExecutableChanged)
//}}AFX_MSG_MAP
ON_EN_CHANGE(IDC_EDIT_FILTERNAME, OnItemChanged)
END_MESSAGE_MAP()
//
// Message Handlers
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
BOOL
CFilterDlg::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.
--*/
{
CDialog::OnInitDialog();
//
// Available on local connections only
//
m_button_Browse.EnableWindow(m_fLocal);
if ((m_fEditMode = m_edit_FilterName.GetWindowTextLength() > 0))
{
m_edit_FilterName.SetReadOnly();
}
SetControlStates();
return TRUE;
}
void
CFilterDlg::OnButtonBrowse()
/*++
Routine Description:
Browse button handler
Arguments:
None
Return Value:
None
--*/
{
ASSERT(m_fLocal);
CString strFilterMask((LPCTSTR)IDS_FILTER_MASK);
//
// CODEWORK: Derive a class from CFileDialog that allows
// the setting of the initial path
//
//CString strPath;
//m_edit_Executable.GetWindowText(strPath);
CFileDialog dlgBrowse(
TRUE,
NULL,
NULL,
OFN_HIDEREADONLY,
strFilterMask,
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)
{
m_edit_Executable.SetWindowText(dlgBrowse.GetPathName());
}
else if (rc == IDCANCEL)
{
DWORD err = CommDlgExtendedError();
}
OnItemChanged();
}
void
CFilterDlg::SetControlStates()
/*++
Routine Description:
Set the states of the dialog control depending on its current
values.
Arguments:
BOOL fAllowAnonymous : If TRUE, 'allow anonymous' is on.
Return Value:
None
--*/
{
m_button_Ok.EnableWindow(
m_edit_FilterName.GetWindowTextLength() > 0
&& m_edit_Executable.GetWindowTextLength() > 0);
ActivateControl(m_static_PriorityPrompt, m_flt.m_nPriority != FLTR_PR_INVALID);
ActivateControl(m_static_Priority, m_flt.m_nPriority != FLTR_PR_INVALID);
}
void
CFilterDlg::OnItemChanged()
/*++
Routine Description:
Register a change in control value on this page. Mark the page as dirty.
All change messages map to this function
Arguments:
None
Return Value:
None
--*/
{
SetControlStates();
}
void
CFilterDlg::OnExecutableChanged()
/*++
Routine Description:
Handle change in executable edit box. Remove priority as this
is no longer valid
Arguments:
None
Return Value:
None
--*/
{
//
// Priority no longer makes sense.
//
m_flt.m_nPriority = FLTR_PR_INVALID;
OnItemChanged();
}
BOOL
CFilterDlg::FilterNameExists(
IN LPCTSTR lpName
)
/*++
Routine Description:
Look for a given filter name in the list
Arguments:
LPCTSTR lpName : Filter name to look for
Return Value:
TRUE if the name already existed in the list
--*/
{
m_pFilters->ResetEnumerator();
while(m_pFilters->MoreFilters())
{
CIISFilter * pFilter = m_pFilters->GetNextFilter();
ASSERT(pFilter != NULL);
if (!pFilter->IsFlaggedForDeletion())
{
if (!pFilter->m_strName.CompareNoCase(lpName))
{
return TRUE;
}
}
}
return FALSE;
}
void
CFilterDlg::OnOK()
/*++
Routine Description:
OK button handler. Save data
Arguments:
None
Return Value:
None
--*/
{
if (UpdateData(TRUE))
{
if (!PathIsValid(m_strExecutable))
{
m_edit_Executable.SetSel(0,-1);
m_edit_Executable.SetFocus();
::AfxMessageBox(IDS_ERR_BAD_PATH);
return;
}
//
// Make sure the filter name is unique
//
if (!m_fEditMode && FilterNameExists(m_strFilterName))
{
::AfxMessageBox(IDS_ERR_DUP_FILTER);
return;
}
m_flt.m_strExecutable = m_strExecutable;
m_flt.m_strName = m_strFilterName;
//
// Anyway to load this from the DLL?
//
//m_flt.m_nPriority = FLTR_PR_MEDIUM;
CDialog::OnOK();
}
//
// Don't dismiss the dialog
//
}