]> git.street.me.uk Git - andy/viking.git/blobdiff - src/babel.c
Fix excluding own self track when creating lists of other tracks.
[andy/viking.git] / src / babel.c
index 5d30af91334d71a0471d61cda4ee59f6cdc458f1..93ad52e32cbf00f7d0c73634a1bf66c6ca5ba898 100644 (file)
@@ -73,6 +73,31 @@ GList *a_babel_file_list;
  */
 GList *a_babel_device_list;
 
+/**
+ * Run a function on all file formats supporting a given mode.
+ */
+void a_babel_foreach_file_with_mode (BabelMode mode, GFunc func, gpointer user_data)
+{
+  GList *current;
+  for ( current = g_list_first (a_babel_file_list) ;
+        current != NULL ;
+        current = g_list_next (current) )
+  {
+    BabelFile *currentFile = current->data;
+    /* Check compatibility of modes */
+    gboolean compat = TRUE;
+    if (mode.waypointsRead  && ! currentFile->mode.waypointsRead)  compat = FALSE;
+    if (mode.waypointsWrite && ! currentFile->mode.waypointsWrite) compat = FALSE;
+    if (mode.tracksRead     && ! currentFile->mode.tracksRead)     compat = FALSE;
+    if (mode.tracksWrite    && ! currentFile->mode.tracksWrite)    compat = FALSE;
+    if (mode.routesRead     && ! currentFile->mode.routesRead)     compat = FALSE;
+    if (mode.routesWrite    && ! currentFile->mode.routesWrite)    compat = FALSE;
+    /* Do call */
+    if (compat)
+      func (currentFile, user_data);
+  }
+}
+
 /**
  * a_babel_convert:
  * @vt:        The TRW layer to modify. All data will be deleted, and replaced by what gpsbabel outputs.
@@ -332,7 +357,7 @@ gboolean a_babel_convert_from_shellcommand ( VikTrwLayer *vt, const char *input_
 gboolean a_babel_convert_from_url ( VikTrwLayer *vt, const char *url, const char *input_type, BabelStatusFunc cb, gpointer user_data, DownloadMapOptions *options )
 {
   // If no download options specified, use defaults:
-  DownloadMapOptions myoptions = { FALSE, FALSE, NULL, 0, NULL, NULL };
+  DownloadMapOptions myoptions = { FALSE, FALSE, NULL, 2, NULL, NULL, NULL };
   if ( options )
     myoptions = *options;
   gint fd_src;
@@ -479,14 +504,14 @@ gboolean a_babel_convert_to( VikTrwLayer *vt, VikTrack *track, const char *babel
   return ret;
 }
 
-static void set_mode(BabelMode mode, gchar *smode)
+static void set_mode(BabelMode *mode, gchar *smode)
 {
-  mode.waypointsRead  = smode[0] == 'r';
-  mode.waypointsWrite = smode[1] == 'w';
-  mode.tracksRead     = smode[2] == 'r';
-  mode.tracksWrite    = smode[3] == 'w';
-  mode.routesRead     = smode[4] == 'r';
-  mode.routesWrite    = smode[5] == 'w';
+  mode->waypointsRead  = smode[0] == 'r';
+  mode->waypointsWrite = smode[1] == 'w';
+  mode->tracksRead     = smode[2] == 'r';
+  mode->tracksWrite    = smode[3] == 'w';
+  mode->routesRead     = smode[4] == 'r';
+  mode->routesWrite    = smode[5] == 'w';
 }
 
 /**
@@ -505,11 +530,16 @@ static void load_feature_parse_line (gchar *line)
            && tokens[3] != NULL
            && tokens[4] != NULL ) {
         BabelDevice *device = g_malloc ( sizeof (BabelDevice) );
-        set_mode (device->mode, tokens[1]);
+        set_mode (&(device->mode), tokens[1]);
         device->name = g_strdup (tokens[2]);
         device->label = g_strndup (tokens[4], 50); // Limit really long label text
         a_babel_device_list = g_list_append (a_babel_device_list, device);
-        g_debug ("New gpsbabel device: %s", device->name);
+        g_debug ("New gpsbabel device: %s, %d%d%d%d%d%d(%s)",
+                       device->name,
+                       device->mode.waypointsRead, device->mode.waypointsWrite,
+                       device->mode.tracksRead, device->mode.tracksWrite,
+                       device->mode.routesRead, device->mode.routesWrite,
+                               tokens[1]);
       } else {
         g_warning ( "Unexpected gpsbabel format string: %s", line);
       }
@@ -519,12 +549,17 @@ static void load_feature_parse_line (gchar *line)
            && tokens[3] != NULL
            && tokens[4] != NULL ) {
         BabelFile *file = g_malloc ( sizeof (BabelFile) );
-        set_mode (file->mode, tokens[1]);
+        set_mode (&(file->mode), tokens[1]);
         file->name = g_strdup (tokens[2]);
         file->ext = g_strdup (tokens[3]);
         file->label = g_strdup (tokens[4]);
         a_babel_file_list = g_list_append (a_babel_file_list, file);
-        g_debug ("New gpsbabel file: %s", file->name);
+        g_debug ("New gpsbabel file: %s, %d%d%d%d%d%d(%s)",
+                       file->name,
+                       file->mode.waypointsRead, file->mode.waypointsWrite,
+                       file->mode.tracksRead, file->mode.tracksWrite,
+                       file->mode.routesRead, file->mode.routesWrite,
+                       tokens[1]);
       } else {
         g_warning ( "Unexpected gpsbabel format string: %s", line);
       }
@@ -621,3 +656,15 @@ void a_babel_uninit ()
   }
 
 }
+
+/**
+ * a_babel_available:
+ *
+ * Indicates if babel is available or not.
+ *
+ * Returns: true if babel available
+ */
+gboolean a_babel_available ()
+{
+  return a_babel_device_list != NULL;
+}