]> git.street.me.uk Git - andy/viking.git/blobdiff - src/babel.c
Replace g_thread by g_thread_pool
[andy/viking.git] / src / babel.c
index 87493bca766e48deaaa16390bdf5b43c235e51f1..63b1ea587c5ad3a8c8e50225587a4ceb9bb0331e 100644 (file)
@@ -189,12 +189,11 @@ gboolean babel_general_convert_from( VikTrwLayer *vt, BabelStatusFunc cb, gchar
 
 gboolean a_babel_convert_from( VikTrwLayer *vt, const char *babelargs, BabelStatusFunc cb, const char *from, gpointer user_data )
 {
+  int i,j;
   int fd_dst;
   gchar *name_dst;
-  gchar *cmd;
   gboolean ret = FALSE;
-  gchar **args;  
-  gint nb_args;
+  gchar *args[64];
 
   if ((fd_dst = g_file_open_tmp("tmp-viking.XXXXXX", &name_dst, NULL)) >= 0) {
     gchar *gpsbabel_loc;
@@ -204,23 +203,31 @@ gboolean a_babel_convert_from( VikTrwLayer *vt, const char *babelargs, BabelStat
 
     if (gpsbabel_loc ) {
       gchar *unbuffer_loc = g_find_program_in_path("unbuffer");
-      cmd = g_strdup_printf ( "%s%s%s %s -o gpx %s %s",
-                             unbuffer_loc ? unbuffer_loc : "",
-                             unbuffer_loc ? " " : "",
-                             gpsbabel_loc,
-                             babelargs,
-                             from,
-                             name_dst );
-
-      if ( unbuffer_loc )
-        g_free ( unbuffer_loc );
-
-      if ( g_shell_parse_argv(cmd, &nb_args, &args, NULL) ) {
-        ret = babel_general_convert_from ( vt, cb, args, name_dst, user_data );
-        g_strfreev(args);
+      gchar **sub_args = g_strsplit(babelargs, " ", 0);
+
+      i = 0;
+      if (unbuffer_loc)
+        args[i++] = unbuffer_loc;
+      args[i++] = gpsbabel_loc;
+      for (j = 0; sub_args[j]; j++) {
+        /* some version of gpsbabel can not take extra blank arg */
+        if (sub_args[j][0] != '\0')
+          args[i++] = sub_args[j];
       }
-      g_free ( cmd );
+      args[i++] = "-o";
+      args[i++] = "gpx";
+      args[i++] = "-f";
+      args[i++] = from;
+      args[i++] = "-F";
+      args[i++] = name_dst;
+      args[i] = NULL;
+
+      ret = babel_general_convert_from ( vt, cb, args, name_dst, user_data );
+
+      g_free ( unbuffer_loc );
+      g_strfreev(sub_args);
     }
+    g_free(gpsbabel_loc);
   }
 
   g_remove(name_dst);
@@ -405,12 +412,11 @@ gboolean babel_general_convert_to( VikTrwLayer *vt, BabelStatusFunc cb, gchar **
 
 gboolean a_babel_convert_to( VikTrwLayer *vt, const char *babelargs, BabelStatusFunc cb, const char *to, gpointer user_data )
 {
+  int i,j;
   int fd_src;
   gchar *name_src;
-  gchar *cmd;
   gboolean ret = FALSE;
-  gchar **args;  
-  gint nb_args;
+  gchar *args[64];  
 
   if ((fd_src = g_file_open_tmp("tmp-viking.XXXXXX", &name_src, NULL)) >= 0) {
     gchar *gpsbabel_loc;
@@ -420,23 +426,30 @@ gboolean a_babel_convert_to( VikTrwLayer *vt, const char *babelargs, BabelStatus
 
     if (gpsbabel_loc ) {
       gchar *unbuffer_loc = g_find_program_in_path("unbuffer");
-      cmd = g_strdup_printf ( "%s%s%s %s -i gpx %s %s",
-                             unbuffer_loc ? unbuffer_loc : "",
-                             unbuffer_loc ? " " : "",
-                             gpsbabel_loc,
-                             babelargs,
-                             name_src,
-                             to);
-
-      if ( unbuffer_loc )
-        g_free ( unbuffer_loc );
-      g_debug ( "%s: %s", __FUNCTION__, cmd );
-      if ( g_shell_parse_argv(cmd, &nb_args, &args, NULL) ) {
-        ret = babel_general_convert_to ( vt, cb, args, name_src, user_data );
-        g_strfreev(args);
-      }
-      g_free ( cmd );
+      gchar **sub_args = g_strsplit(babelargs, " ", 0);
+
+      i = 0;
+      if (unbuffer_loc)
+        args[i++] = unbuffer_loc;
+      args[i++] = gpsbabel_loc;
+      args[i++] = "-i";
+      args[i++] = "gpx";
+      for (j = 0; sub_args[j]; j++)
+        /* some version of gpsbabel can not take extra blank arg */
+        if (sub_args[j][0] != '\0')
+          args[i++] = sub_args[j];
+      args[i++] = "-f";
+      args[i++] = name_src;
+      args[i++] = "-F";
+      args[i++] = to;
+      args[i] = NULL;
+
+      ret = babel_general_convert_to ( vt, cb, args, name_src, user_data );
+
+      g_free ( unbuffer_loc );
+      g_strfreev(sub_args);
     }
+    g_free(gpsbabel_loc);
   }
 
   g_remove(name_src);