X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/9ffaa4e528071a69410edfc92b0348d4512e17c4..b9f777e49bfc5880152c9c9b6f3e33d1a504fa31:/src/babel.c diff --git a/src/babel.c b/src/babel.c index 5d30af91..93ad52e3 100644 --- a/src/babel.c +++ b/src/babel.c @@ -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; +}