]> granicus.if.org Git - transmission/commitdiff
(trunk) #4160: mike.dld patch: 4160-08-args.patch
authorJordan Lee <jordan@transmissionbt.com>
Sun, 21 Sep 2014 18:06:28 +0000 (18:06 +0000)
committerJordan Lee <jordan@transmissionbt.com>
Sun, 21 Sep 2014 18:06:28 +0000 (18:06 +0000)
cli/cli.c
daemon/daemon.c
daemon/remote.c
libtransmission/utils.c
libtransmission/utils.h
qt/app.cc
utils/create.c
utils/edit.c
utils/show.c

index d62c444202f031900c9a4c09ab5f8a97f557f900..6b903d9acfdf1f68af7443165d12b16cd0136ee2 100644 (file)
--- a/cli/cli.c
+++ b/cli/cli.c
@@ -233,6 +233,10 @@ main (int argc, char ** argv)
   size_t        fileLength;
   const char  * str;
 
+#ifdef _WIN32
+  tr_win32_make_args_utf8 (&argc, &argv);
+#endif
+
   tr_formatter_mem_init (MEM_K, MEM_K_STR, MEM_M_STR, MEM_G_STR, MEM_T_STR);
   tr_formatter_size_init (DISK_K,DISK_K_STR, DISK_M_STR, DISK_G_STR, DISK_T_STR);
   tr_formatter_speed_init (SPEED_K, SPEED_K_STR, SPEED_M_STR, SPEED_G_STR, SPEED_T_STR);
index e43ae6ee470022bd6a69cc7f525cce1022e73f11..21d2891ceabab91f4ac34a996f5159c4833dcb2d 100644 (file)
@@ -425,6 +425,10 @@ main (int argc, char ** argv)
     tr_session * session = NULL;
     struct event *status_ev;
 
+#ifdef _WIN32
+    tr_win32_make_args_utf8 (&argc, &argv);
+#endif
+
     key_pidfile = tr_quark_new ("pidfile",  7);
 
     signal (SIGINT, gotsig);
index 36a2e9274ae303675031e7776391ba67ece5b5d1..4f8cfffc3022a7fb2ac36539edd1a12308ef2eea 100644 (file)
@@ -2406,6 +2406,10 @@ main (int argc, char ** argv)
     char * rpcurl = NULL;
     int exit_status = EXIT_SUCCESS;
 
+#ifdef _WIN32
+    tr_win32_make_args_utf8 (&argc, &argv);
+#endif
+
     if (argc < 2) {
         showUsage ();
         return EXIT_FAILURE;
index 75d9316f0cf8005c34afabe7acf2e58a3d432298..5949c423576916a69ecbde88aaa80d8ae41065f2 100644 (file)
@@ -41,6 +41,7 @@
  #include <w32api.h>
  #define WINVER WindowsXP /* freeaddrinfo (), getaddrinfo (), getnameinfo () */
  #include <windows.h> /* Sleep (), GetSystemTimeAsFileTime (), GetEnvironmentVariable () */
+ #include <shellapi.h> /* CommandLineToArgv () */
 #endif
 
 #include "transmission.h"
@@ -1217,6 +1218,53 @@ tr_win32_format_message (uint32_t code)
   return text;
 }
 
+void
+tr_win32_make_args_utf8 (int    * argc,
+                         char *** argv)
+{
+  int my_argc, i;
+  char ** my_argv;
+  wchar_t ** my_wide_argv;
+
+  my_wide_argv = CommandLineToArgvW (GetCommandLineW (), &my_argc);
+  if (my_wide_argv == NULL)
+    return;
+
+  assert (*argc == my_argc);
+
+  my_argv = tr_new (char *, my_argc + 1);
+
+  for (i = 0; i < my_argc; ++i)
+    {
+      my_argv[i] = tr_win32_native_to_utf8 (my_wide_argv[i], -1);
+      if (my_argv[i] == NULL)
+        break;
+    }
+
+  if (i < my_argc)
+    {
+      int j;
+
+      for (j = 0; j < i; ++j)
+        {
+          tr_free (my_argv[j]);
+        }
+
+      tr_free (my_argv);
+    }
+  else
+    {
+      my_argv[my_argc] = NULL;
+
+      *argc = my_argc;
+      *argv = my_argv;
+
+      /* TODO: Add atexit handler to cleanup? */
+    }
+
+  LocalFree (my_wide_argv);
+}
+
 #endif
 
 /***
index 8c2c23f6b9ad97cb083b6e9dfc462dcee082d77d..c6783796e0971d2b8e0251a014ec98308e3a5f3c 100644 (file)
@@ -190,6 +190,9 @@ wchar_t * tr_win32_utf8_to_native_ex (const char    * text,
                                       int             extra_chars);
 char    * tr_win32_format_message    (uint32_t        code);
 
+void      tr_win32_make_args_utf8    (int    * argc,
+                                      char *** argv);
+
 #endif
 
 /***
index 8e3bf5e3f3b089a4f5a94643712c9bb7281f6456..9b04d275aeada182d4f20952413c11bbfe5cc467 100644 (file)
--- a/qt/app.cc
+++ b/qt/app.cc
@@ -493,7 +493,13 @@ main (int argc, char * argv[])
   int c;
   QStringList addme;
   const char * optarg;
-  char ** argvv = argv;
+  char ** argvv;
+
+#ifdef _WIN32
+  tr_win32_make_args_utf8 (&argc, &argv);
+#endif
+
+  argvv = argv;
   while ( (c = tr_getopt (getUsage (), argc, (const char **)argvv, opts, &optarg)))
     if (c == TR_OPT_UNK)
       addme.append (optarg);
index 9f73c7b14b986e0fa716f57dd51e2517e5230b59..d82d37f5a05b132c7e9cad9bbb067917f0b21937 100644 (file)
@@ -131,6 +131,10 @@ main (int argc, char * argv[])
   char * out2 = NULL;
   tr_metainfo_builder * b = NULL;
 
+#ifdef _WIN32
+  tr_win32_make_args_utf8 (&argc, &argv);
+#endif
+
   tr_logSetLevel (TR_LOG_ERROR);
   tr_formatter_mem_init (MEM_K, MEM_K_STR, MEM_M_STR, MEM_G_STR, MEM_T_STR);
   tr_formatter_size_init (DISK_K, DISK_K_STR, DISK_M_STR, DISK_G_STR, DISK_T_STR);
index 6daef08d9f14c4a2f2063123a3edc24e9ff0ab21..ced150b8921e30267b0880ceeff35ff55ed3dd37 100644 (file)
@@ -290,6 +290,10 @@ main (int argc, char * argv[])
   int i;
   int changedCount = 0;
 
+#ifdef _WIN32
+  tr_win32_make_args_utf8 (&argc, &argv);
+#endif
+
   files = tr_new0 (const char*, argc);
 
   tr_logSetLevel (TR_LOG_ERROR);
index dabfe524f60cce2874200275a2c2ee3cd836138a..98b901f0efbb6ea47fac568dd633b3a054145a47 100644 (file)
@@ -289,6 +289,10 @@ main (int argc, char * argv[])
   tr_info inf;
   tr_ctor * ctor;
 
+#ifdef _WIN32
+  tr_win32_make_args_utf8 (&argc, &argv);
+#endif
+
   tr_logSetLevel (TR_LOG_ERROR);
   tr_formatter_mem_init (MEM_K, MEM_K_STR, MEM_M_STR, MEM_G_STR, MEM_T_STR);
   tr_formatter_size_init (DISK_K, DISK_K_STR, DISK_M_STR, DISK_G_STR, DISK_T_STR);