Alexandre Julliard : winebrowser: Support browser and mailer commands with arguments.

Alexandre Julliard julliard at winehq.org
Mon May 30 09:43:40 CDT 2016


Module: wine
Branch: master
Commit: e27e733f69a69d3c352d434ee751688666a5d017
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e27e733f69a69d3c352d434ee751688666a5d017

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Sat May 28 14:53:00 2016 +0900

winebrowser: Support browser and mailer commands with arguments.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/winebrowser/Makefile.in |  2 +-
 programs/winebrowser/main.c      | 27 ++++++++++++++++-----------
 2 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/programs/winebrowser/Makefile.in b/programs/winebrowser/Makefile.in
index 1e7a842..4a300a6 100644
--- a/programs/winebrowser/Makefile.in
+++ b/programs/winebrowser/Makefile.in
@@ -1,6 +1,6 @@
 MODULE    = winebrowser.exe
 APPMODE   = -mwindows -municode
-IMPORTS   = urlmon oleaut32 user32 advapi32
+IMPORTS   = urlmon oleaut32 shell32 user32 advapi32
 
 C_SRCS = \
 	main.c
diff --git a/programs/winebrowser/main.c b/programs/winebrowser/main.c
index 0a443c1..4ec1d14 100644
--- a/programs/winebrowser/main.c
+++ b/programs/winebrowser/main.c
@@ -45,6 +45,7 @@
 
 #include <windows.h>
 #include <shlwapi.h>
+#include <shellapi.h>
 #include <urlmon.h>
 #include <ddeml.h>
 #include <stdio.h>
@@ -71,27 +72,31 @@ static char *strdup_unixcp( const WCHAR *str )
 /* try to launch a unix app from a comma separated string of app names */
 static int launch_app( const WCHAR *candidates, const WCHAR *argv1 )
 {
-    char *app, *cmdline;
-    const char *argv_new[3];
+    char *cmdline;
+    int i, count;
+    char **argv_new;
 
     if (!(cmdline = strdup_unixcp( argv1 ))) return 1;
 
     while (*candidates)
     {
-        if (!(app = strdup_unixcp( candidates ))) break;
+        WCHAR **args = CommandLineToArgvW( candidates, &count );
 
-        WINE_TRACE( "Considering: %s\n", wine_dbgstr_a(app) );
-        WINE_TRACE( "argv[1]: %s\n", wine_dbgstr_a(cmdline) );
+        if (!(argv_new = HeapAlloc( GetProcessHeap(), 0, (count + 1) * sizeof(*argv_new) ))) break;
+        for (i = 0; i < count; i++) argv_new[i] = strdup_unixcp( args[i] );
+        argv_new[count] = cmdline;
+        argv_new[count + 1] = NULL;
 
-        argv_new[0] = app;
-        argv_new[1] = cmdline;
-        argv_new[2] = NULL;
+        TRACE( "Trying" );
+        for (i = 0; i <= count; i++) TRACE( " %s", wine_dbgstr_a( argv_new[i] ));
+        TRACE( "\n" );
 
-        _spawnvp( _P_OVERLAY, app, argv_new );  /* only returns on error */
-        HeapFree( GetProcessHeap(), 0, app );
+        _spawnvp( _P_OVERLAY, argv_new[0], (const char **)argv_new );  /* only returns on error */
+        for (i = 0; i < count; i++) HeapFree( GetProcessHeap(), 0, argv_new[i] );
+        HeapFree( GetProcessHeap(), 0, argv_new );
         candidates += strlenW( candidates ) + 1;  /* grab the next app */
     }
-    WINE_ERR( "could not find a suitable app to run\n" );
+    WINE_ERR( "could not find a suitable app to open %s\n", debugstr_w( argv1 ));
 
     HeapFree( GetProcessHeap(), 0, cmdline );
     return 1;




More information about the wine-cvs mailing list