From 9ac34ac9156ea40ad76025aedb6eef86b2a813cc Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 20 Jun 2010 17:43:35 +0000 Subject: [PATCH 1/1] Quote file names with spaces in wxFileType::ExpandCommand(). Add double quotes around the file name inserted into the command to open the file by wxFileType::ExpandCommand() if the file name contains any spaces and if it's not already quoted by the command line itself. While this doesn't completely fix the problem, it does help with opening the files with spaces in their names under Windows and shouldn't do any harm under Unix. Closes #4607. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64655 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/mimecmn.cpp | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/common/mimecmn.cpp b/src/common/mimecmn.cpp index 32430d97d2..332404b839 100644 --- a/src/common/mimecmn.cpp +++ b/src/common/mimecmn.cpp @@ -192,22 +192,28 @@ wxString wxFileType::ExpandCommand(const wxString& command, { bool hasFilename = false; + // We consider that only the file names with spaces in them need to be + // handled specially. This is not perfect, but this can be done easily + // under all platforms while handling the file names with quotes in them, + // for example, needs to be done differently. + const bool needToQuoteFilename = params.GetFileName().find_first_of(" \t") + != wxString::npos; + wxString str; for ( const wxChar *pc = command.c_str(); *pc != wxT('\0'); pc++ ) { if ( *pc == wxT('%') ) { switch ( *++pc ) { case wxT('s'): - // '%s' expands into file name (quoted because it might - // contain spaces) - except if there are already quotes - // there because otherwise some programs may get confused - // by double double quotes -#if 0 - if ( *(pc - 2) == wxT('"') ) - str << params.GetFileName(); - else + // don't quote the file name if it's already quoted: notice + // that we check for a quote following it and not preceding + // it as at least under Windows we can have commands + // containing "file://%s" (with quotes) in them so the + // argument may be quoted even if there is no quote + // directly before "%s" itself + if ( needToQuoteFilename && pc[1] != '"' ) str << wxT('"') << params.GetFileName() << wxT('"'); -#endif - str << params.GetFileName(); + else + str << params.GetFileName(); hasFilename = true; break; @@ -264,8 +270,14 @@ wxString wxFileType::ExpandCommand(const wxString& command, #ifdef __UNIX__ && !str.StartsWith(wxT("test ")) #endif // Unix - ) { - str << wxT(" < '") << params.GetFileName() << wxT('\''); + ) + { + str << wxT(" < "); + if ( needToQuoteFilename ) + str << '"'; + str << params.GetFileName(); + if ( needToQuoteFilename ) + str << '"'; } return str; -- 2.47.2