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

402 lines
10 KiB
C++

// AppEdMpD.cpp : implementation file
//
#include "stdafx.h"
#include "cnfgprts.h"
#include "AppEdMpD.h"
#include <iiscnfg.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAppEditMapDlg dialog
//----------------------------------------------------------------
CAppEditMapDlg::CAppEditMapDlg(CWnd* pParent /*=NULL*/)
: CDialog(CAppEditMapDlg::IDD, pParent),
m_pList( NULL ),
m_fNewMapping( FALSE ),
m_fLocalMachine( TRUE )
{
//{{AFX_DATA_INIT(CAppEditMapDlg)
m_bool_file_exists = FALSE;
m_bool_script_engine = FALSE;
m_sz_executable = _T("");
m_sz_extension = _T("");
m_sz_exclusions = _T("");
m_nAllLimited = RADIO_LIMITED_VERBS;
//}}AFX_DATA_INIT
}
//----------------------------------------------------------------
void CAppEditMapDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAppEditMapDlg)
DDX_Control(pDX, IDC_RADIO_LIMIT_VERBS, m_radio_LimitedTo);
DDX_Control(pDX, IDC_RADIO_ALL_VERBS, m_radio_All);
DDX_Control(pDX, IDC_EDT_EXCLUSIONS, m_edit_Exclusions);
DDX_Control(pDX, IDC_EDT_EXTENSION, m_cedit_extension);
DDX_Control(pDX, IDC_EDT_EXECUTABLE, m_cedit_executable);
DDX_Control(pDX, IDC_BROWSE, m_cbttn_browse);
DDX_Check(pDX, IDC_CHK_FILE_EXISTS, m_bool_file_exists);
DDX_Check(pDX, IDC_CHK_SCRIPT_ENGINE, m_bool_script_engine);
DDX_Text(pDX, IDC_EDT_EXECUTABLE, m_sz_executable);
DDX_Text(pDX, IDC_EDT_EXTENSION, m_sz_extension);
DDX_Text(pDX, IDC_EDT_EXCLUSIONS, m_sz_exclusions);
DDX_Radio(pDX, IDC_RADIO_ALL_VERBS, m_nAllLimited);
//}}AFX_DATA_MAP
}
//----------------------------------------------------------------
BEGIN_MESSAGE_MAP(CAppEditMapDlg, CDialog)
//{{AFX_MSG_MAP(CAppEditMapDlg)
ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
ON_BN_CLICKED(ID_HELPBTN, OnHelpbtn)
ON_BN_CLICKED(IDC_RADIO_ALL_VERBS, OnRadioAllVerbs)
ON_BN_CLICKED(IDC_RADIO_LIMIT_VERBS, OnRadioLimitVerbs)
//}}AFX_MSG_MAP
ON_COMMAND(ID_HELP_FINDER, DoHelp)
ON_COMMAND(ID_HELP, DoHelp)
ON_COMMAND(ID_CONTEXT_HELP, DoHelp)
ON_COMMAND(ID_DEFAULT_HELP, DoHelp)
END_MESSAGE_MAP()
//---------------------------------------------------------------------------
void CAppEditMapDlg::DoHelp()
{
WinHelp( HIDD_APPMAPS_EDIT_MAP );
}
/////////////////////////////////////////////////////////////////////////////
// CAppEditMapDlg message handlers
//---------------------------------------------------------------------------
BOOL CAppEditMapDlg::OnInitDialog()
{
// we can deal with the flags right here
if ( m_dwFlags & MD_SCRIPTMAPFLAG_SCRIPT ) m_bool_script_engine = TRUE;
if ( m_dwFlags & MD_SCRIPTMAPFLAG_CHECK_PATH_INFO ) m_bool_file_exists = TRUE;
m_sz_extensionOrig = m_sz_extension;
//call the parental oninitdialog
BOOL fAnswer = CDialog::OnInitDialog();
// if this is not the local machine we are editing, then disable browsing
if ( fAnswer && (!m_fLocalMachine) )
{
m_cbttn_browse.EnableWindow( FALSE );
}
//
// Set All/Limited radio button
//
if (m_sz_exclusions.IsEmpty())
{
m_radio_All.SetCheck(1);
m_radio_LimitedTo.SetCheck(0);
OnRadioAllVerbs();
}
else
{
m_radio_All.SetCheck(0);
m_radio_LimitedTo.SetCheck(1);
OnRadioLimitVerbs();
}
// return the answer
return fAnswer;
}
//---------------------------------------------------------------------------
void CAppEditMapDlg::OnOK()
{
UpdateData( TRUE );
CString szFile;
CString sz;
DWORD attrib;
// clean up the strings
m_sz_executable.TrimLeft();
m_sz_extension.TrimLeft();
m_sz_executable.TrimRight();
m_sz_extension.TrimRight();
//--------------------------------------------------
//
// RONALDM -- handle all/limited to verbs situations
//
m_sz_exclusions.TrimLeft();
m_sz_exclusions.TrimRight();
if (m_nAllLimited == RADIO_ALL_VERBS)
{
//
// "All" supported, empty the list
//
m_sz_exclusions.Empty();
}
else if (m_sz_exclusions.IsEmpty())
{
//
// Now, it CAN'T be empty, complain about it.
//
AfxMessageBox(IDS_ERR_NO_VERBS);
m_edit_Exclusions.SetFocus();
m_edit_Exclusions.SetSel(0, -1);
//
// Don't dismiss the dialog
//
return;
}
//--------------------------------------------------
// the extension is a required field
if ( m_sz_extension.IsEmpty() || m_sz_extension == _T(".") )
{
AfxMessageBox( IDS_APP_ERR_EXT_REQUIRED );
m_cedit_extension.SetFocus();
m_cedit_extension.SetSel( 0 , -1 );
return;
}
// if the file starts with a quote then there may be spaces in the name.
// Extract the file up to the second quote
if ( m_sz_executable[0] == _T('\"') )
{
szFile = m_sz_executable.Right(m_sz_executable.GetLength()-1);
szFile = szFile.Left(szFile.Find('\"'));
}
else if ( m_sz_executable.Find(' ') >= 0 )
{
// in case there are parameters after the file name, just take it to the first space
szFile = m_sz_executable.Left( m_sz_executable.Find(' ') );
}
else
szFile = m_sz_executable;
// we do NOT allow UNC names in script mappings. Get the drive letter
// first we test the drive to see if it is local or remote
// but before that we need to get the drive letter
_tsplitpath( (LPCTSTR)szFile, sz.GetBuffer(_MAX_DRIVE+1), NULL, NULL, NULL );
sz.ReleaseBuffer();
// it can't be a unc path
if ( sz.IsEmpty() )
{
AfxMessageBox( IDS_APP_MAP_USE_VALID_DRIVE );
m_cedit_executable.SetFocus();
m_cedit_executable.SetSel( 0 , -1 );
return;
}
// perform extra local-machine tests
if ( m_fLocalMachine )
{
// if local, the drive can't be redirected
// test the drive and only accept valid, non-remote drives
attrib = GetDriveType( (LPCTSTR)sz );
if ( (attrib == DRIVE_REMOTE) )
{
AfxMessageBox( IDS_APP_MAP_USE_VALID_DRIVE );
m_cedit_executable.SetFocus();
m_cedit_executable.SetSel( 0 , -1 );
return;
}
// check that the file exists
if ( ::GetFileAttributes(szFile) & FILE_ATTRIBUTE_DIRECTORY )
{
AfxMessageBox( IDS_APP_MAP_INVALID_PATH );
m_cedit_executable.SetFocus();
m_cedit_executable.SetSel( 0 , -1 );
return;
}
}
// make sure the extension is valid
if ( m_sz_extension.ReverseFind('.') > 0 )
{
AfxMessageBox( IDS_APP_MAP_INVALID_EXT );
m_cedit_extension.SetFocus();
m_cedit_extension.SetSel( 0 , -1 );
return;
}
const TCHAR szBadChars[] = _T(" ,:<>?*/\\");
if (m_sz_extension != _T("*") && m_sz_extension != _T(".*"))
{
if (0 != m_sz_extension.SpanExcluding(szBadChars).Compare(m_sz_extension))
{
AfxMessageBox( IDS_APP_MAP_INVALID_EXT );
m_cedit_extension.SetFocus();
m_cedit_extension.SetSel( 0 , -1 );
return;
}
}
if (m_sz_extension[0] == '*')
{
m_sz_extension.SetAt(1, '\0');
}
else if (m_sz_extension == _T(".*"))
{
m_sz_extension = _T("*");
}
else
{
// clean up the extensions string
if ( m_sz_extension[0] != '.' )
m_sz_extension = '.' + m_sz_extension;
}
// there can be only one copy of an extension in the listbox
// only check this if it is a new mapping, or if the mapping extension has changed
if ( m_pList && ((m_sz_extensionOrig != m_sz_extension) || m_fNewMapping) )
{
DWORD nItems = m_pList->GetItemCount();
for ( DWORD i = 0; i < nItems; i++ )
{
if ( m_pList->GetItemText(i,0) == m_sz_extension )
{
AfxMessageBox( IDS_APP_ONLY_ONE );
m_cedit_extension.SetFocus();
m_cedit_extension.SetSel( 0 , -1 );
return;
}
}
}
// rebuild the flags
m_dwFlags = 0;
if ( m_bool_script_engine )
{
m_dwFlags |= MD_SCRIPTMAPFLAG_SCRIPT;
}
if ( m_bool_file_exists )
{
m_dwFlags |= MD_SCRIPTMAPFLAG_CHECK_PATH_INFO;
}
// make sure the data goes back
UpdateData( FALSE );
CDialog::OnOK();
}
//---------------------------------------------------------------------------
void CAppEditMapDlg::OnBrowse()
{
// prepare the file dialog variables
CFileDialog cfdlg(TRUE);
CString szFilter;
WORD i = 0;
LPTSTR lpszBuffer;
// prepare the filter string
szFilter.LoadString( IDS_APP_MAP_FILTER );
// replace the "!" characters with nulls
lpszBuffer = szFilter.GetBuffer(MAX_PATH+1);
while( lpszBuffer[i] )
{
if ( lpszBuffer[i] == _T('!') )
lpszBuffer[i] = _T('\0'); // yes, set \0 on purpose
i++;
}
// prep the dialog
cfdlg.m_ofn.lpstrFilter = lpszBuffer;
// run the dialog
if ( cfdlg.DoModal() == IDOK )
{
UpdateData( TRUE );
m_sz_executable = cfdlg.GetPathName();
UpdateData( FALSE );
}
// release the buffer in the filter string
szFilter.ReleaseBuffer(-1);
}
//---------------------------------------------------------------------------
void CAppEditMapDlg::OnHelpbtn()
{
DoHelp();
}
void
CAppEditMapDlg::OnRadioAllVerbs()
/*++
Routine Description:
"All" radio button handler
Arguments:
None
Return Value:
None
Notes:
Routine by RonaldM
--*/
{
//
// No need for the exclusions to be specified by name.
// Move focus elsewhere to prevent disabled control from
// having focus.
//
m_edit_Exclusions.EnableWindow(FALSE);
m_radio_All.SetFocus();
}
void
CAppEditMapDlg::OnRadioLimitVerbs()
/*++
Routine Description:
"Limited to" radio button handler
Arguments:
None
Return Value:
None
Notes:
Routine by RonaldM
--*/
{
//
// User wants to specify exclusions by name, so
// focus on exclusions edit box.
//
m_edit_Exclusions.EnableWindow(TRUE);
m_edit_Exclusions.SetFocus();
}