Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

502 lines
9.2 KiB

/*++
Copyright (c) 1994-2001 Microsoft Corporation
Module Name :
fltdlg.cpp
Abstract:
WWW Filters Property Dialog
Author:
Ronald Meijer (ronaldm)
Sergei Antonov (sergeia)
Project:
Internet Services Manager
Revision History:
--*/
#include "stdafx.h"
#include "common.h"
#include "inetprop.h"
#include "InetMgrApp.h"
#include "shts.h"
#include "w3sht.h"
#include "fltdlg.h"
extern CInetmgrApp theApp;
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define FILTER_NAME_MAX 24
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);
}
static BOOL
PathIsValidFilter(LPCTSTR path)
{
LPCTSTR p = path;
BOOL rc = TRUE;
if (p == NULL || *p == 0)
return FALSE;
while (*p != 0)
{
switch (*p)
{
case TEXT('|'):
case TEXT('>'):
case TEXT('<'):
case TEXT('/'):
case TEXT('?'):
case TEXT('*'):
// case TEXT(';'):
case TEXT(','):
case TEXT('"'):
rc = FALSE;
break;
default:
if (*p < TEXT(' '))
{
rc = FALSE;
}
break;
}
if (!rc)
{
break;
}
p++;
}
return rc;
}
static BOOL
PathIsValidFilterName(LPCTSTR name)
{
LPCTSTR p = name;
BOOL rc = TRUE;
if (p == NULL || *p == 0)
return FALSE;
while (*p != 0)
{
switch (*p)
{
case TEXT('|'):
case TEXT('>'):
case TEXT('<'):
case TEXT('/'):
case TEXT('\\'):
case TEXT('?'):
case TEXT('*'):
case TEXT(';'):
case TEXT(','):
case TEXT('"'):
rc = FALSE;
break;
default:
if (*p < TEXT(' '))
{
rc = FALSE;
}
break;
}
if (!rc)
{
break;
}
p++;
}
return rc;
}
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_STATIC_PRIORITY_VALUE, m_strPriority);
//}}AFX_DATA_MAP
DDX_Text(pDX, IDC_EDIT_EXECUTABLE, m_strExecutable);
if (pDX->m_bSaveAndValidate)
{
DDV_FilePath(pDX, m_strExecutable, m_fLocal);
}
DDX_Text(pDX, IDC_EDIT_FILTERNAME, m_strFilterName);
DDV_MaxCharsBalloon(pDX, m_strFilterName, FILTER_NAME_MAX);
if (pDX->m_bSaveAndValidate)
{
m_strFilterName.TrimLeft();
m_strFilterName.TrimRight();
if (m_strFilterName.IsEmpty() || !PathIsValidFilterName(m_strFilterName))
{
DDV_ShowBalloonAndFail(pDX, IDS_ERR_INVALID_FILTER_NAME);
}
}
}
//
// Message Map
//
BEGIN_MESSAGE_MAP(CFilterDlg, CDialog)
//{{AFX_MSG_MAP(CFilterDlg)
ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse)
ON_BN_CLICKED(ID_HELP, OnHelp)
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();
#ifdef SUPPORT_SLASH_SLASH_QUESTIONMARK_SLASH_TYPE_PATHS
LimitInputPath(CONTROL_HWND(IDC_EDIT_EXECUTABLE),TRUE);
#else
LimitInputPath(CONTROL_HWND(IDC_EDIT_EXECUTABLE),FALSE);
#endif
return TRUE;
}
void
CFilterDlg::OnHelp()
{
WinHelpDebug(0x20000 + CFilterDlg::IDD);
::WinHelp(m_hWnd, theApp.m_pszHelpFilePath, HELP_CONTEXT, 0x20000 + CFilterDlg::IDD);
}
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))
{
//
// Make sure the filter name is unique
//
if (!m_fEditMode && FilterNameExists(m_strFilterName))
{
EditShowBalloon(m_edit_FilterName.m_hWnd, 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
//
}