// AppEdMpD.cpp : implementation file // #include "stdafx.h" #include "cnfgprts.h" #include "AppEdMpD.h" #include #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(); }