]> git.saurik.com Git - wxWidgets.git/commitdiff
Quote file names with spaces in wxFileType::ExpandCommand().
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 20 Jun 2010 17:43:35 +0000 (17:43 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 20 Jun 2010 17:43:35 +0000 (17:43 +0000)
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

index 32430d97d2fe68880a717d85d3fc7c76f067c376..332404b839a0376b90c43a069eff1d88dd2b381a 100644 (file)
@@ -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;