From e4a11fbe911ed83bd6b48404804641fdef53af7a Mon Sep 17 00:00:00 2001 From: Guilhem Bonnefille Date: Mon, 4 Nov 2013 23:31:23 +0100 Subject: [PATCH] Extract trw export module VikTrwLayer module is really huge. Export seems a good feature-candidate for externalisation. Signed-off-by: Guilhem Bonnefille --- po/POTFILES.in | 1 + src/Makefile.am | 1 + src/file.c | 38 +++++++++++++ src/file.h | 2 + src/viktrwlayer.c | 113 +++++++-------------------------------- src/viktrwlayer_export.c | 107 ++++++++++++++++++++++++++++++++++++ src/viktrwlayer_export.h | 36 +++++++++++++ 7 files changed, 204 insertions(+), 94 deletions(-) create mode 100644 src/viktrwlayer_export.c create mode 100644 src/viktrwlayer_export.h diff --git a/po/POTFILES.in b/po/POTFILES.in index 3b7719af..6c9b1778 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -49,6 +49,7 @@ src/vikmapslayer.c src/vikrouting.c src/viktreeview.c src/viktrwlayer.c +src/viktrwlayer_export.c src/viktrwlayer_propwin.c src/viktrwlayer_tpwin.c src/viktrwlayer_tracklist.c diff --git a/src/Makefile.am b/src/Makefile.am index 1c796776..48d88406 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -84,6 +84,7 @@ libviking_a_SOURCES = \ vikgototool.c vikgototool.h \ vikgotoxmltool.c vikgotoxmltool.h \ vikgoto.c vikgoto.h \ + viktrwlayer_export.c viktrwlayer_export.h \ viktrwlayer_tpwin.c viktrwlayer_tpwin.h \ viktrwlayer_propwin.c viktrwlayer_propwin.h \ viktrwlayer_analysis.c viktrwlayer_analysis.h \ diff --git a/src/file.c b/src/file.c index c1a1c77c..ce935d87 100644 --- a/src/file.c +++ b/src/file.c @@ -603,6 +603,44 @@ gboolean check_file_magic_vik ( const gchar *filename ) return result; } +/** + * append_file_ext: + * + * Append a file extension, if not already present. + * + * Returns: a newly allocated string + */ +gchar *append_file_ext ( const gchar *filename, VikLoadType_t type ) +{ + gchar *new_name = NULL; + const gchar *ext = NULL; + + /* Select an extension */ + switch (type) + { + case FILE_TYPE_GPX: + ext = ".gpx"; + break; + case FILE_TYPE_KML: + ext = ".kml"; + break; + case FILE_TYPE_GPSMAPPER: + case FILE_TYPE_GPSPOINT: + default: + /* Do nothing, ext already set to NULL */ + break; + } + + /* Do */ + if ( ext != NULL && ! check_file_ext ( filename, ext ) ) + new_name = g_strconcat ( filename, ext, NULL ); + else + /* Simply duplicate */ + new_name = g_strdup ( filename ); + + return new_name; +} + VikLoadType_t a_file_load ( VikAggregateLayer *top, VikViewport *vp, const gchar *filename_or_uri ) { g_return_val_if_fail ( vp != NULL, LOAD_TYPE_READ_FAILURE ); diff --git a/src/file.h b/src/file.h index 0cbf98fe..5370f688 100644 --- a/src/file.h +++ b/src/file.h @@ -56,6 +56,8 @@ typedef enum { LOAD_TYPE_OTHER_SUCCESS, } VikLoadType_t; +gchar *append_file_ext ( const gchar *filename, VikLoadType_t type ); + VikLoadType_t a_file_load ( VikAggregateLayer *top, VikViewport *vp, const gchar *filename ); gboolean a_file_save ( VikAggregateLayer *top, gpointer vp, const gchar *filename ); /* Only need to define VikTrack if the file type is FILE_TYPE_GPX_TRACK */ diff --git a/src/viktrwlayer.c b/src/viktrwlayer.c index 80ecd745..c085e720 100644 --- a/src/viktrwlayer.c +++ b/src/viktrwlayer.c @@ -33,6 +33,7 @@ #include "viking.h" #include "vikmapslayer.h" #include "vikgpslayer.h" +#include "viktrwlayer_export.h" #include "viktrwlayer_tpwin.h" #include "viktrwlayer_propwin.h" #include "viktrwlayer_analysis.h" @@ -307,7 +308,6 @@ static void trw_layer_gps_upload_any ( menu_array_sublayer values ); static void trw_layer_centerize ( menu_array_layer values ); static void trw_layer_auto_view ( menu_array_layer values ); -static void trw_layer_export ( menu_array_layer values, const gchar* title, const gchar* default_name, VikTrack* trk, guint file_type ); static void trw_layer_goto_wp ( menu_array_layer values ); static void trw_layer_new_wp ( menu_array_layer values ); static void trw_layer_new_track ( menu_array_layer values ); @@ -3245,123 +3245,51 @@ static void trw_layer_auto_view ( menu_array_layer values ) a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("This layer has no waypoints or trackpoints.") ); } -static void trw_layer_export ( menu_array_layer values, const gchar *title, const gchar* default_name, VikTrack* trk, guint file_type ) -{ - VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); - GtkWidget *file_selector; - const gchar *fn; - gboolean failed = FALSE; - file_selector = gtk_file_chooser_dialog_new (title, - NULL, - GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, - NULL); - gchar *cwd = g_get_current_dir(); - if ( cwd ) { - gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER(file_selector), cwd ); - g_free ( cwd ); - } - - gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER(file_selector), default_name); - - while ( gtk_dialog_run ( GTK_DIALOG(file_selector) ) == GTK_RESPONSE_ACCEPT ) - { - fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(file_selector) ); - if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) == FALSE || - a_dialog_yes_or_no ( GTK_WINDOW(file_selector), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) ) - { - gtk_widget_hide ( file_selector ); - vik_window_set_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); - failed = ! a_file_export ( vtl, fn, file_type, trk, TRUE ); - vik_window_clear_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); - break; - } - } - gtk_widget_destroy ( file_selector ); - if ( failed ) - a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("The filename you requested could not be opened for writing.") ); -} - static void trw_layer_export_gpspoint ( menu_array_layer values ) { - trw_layer_export ( values, _("Export Layer"), vik_layer_get_name(VIK_LAYER(values[MA_VTL])), NULL, FILE_TYPE_GPSPOINT ); + gchar *auto_save_name = append_file_ext ( vik_layer_get_name(VIK_LAYER(values[MA_VTL])), FILE_TYPE_GPSPOINT ); + + vik_trw_layer_export ( VIK_TRW_LAYER (values[MA_VTL]), _("Export Layer"), auto_save_name, NULL, FILE_TYPE_GPSPOINT ); + + g_free ( auto_save_name ); } static void trw_layer_export_gpsmapper ( menu_array_layer values ) { - trw_layer_export ( values, _("Export Layer"), vik_layer_get_name(VIK_LAYER(values[MA_VTL])), NULL, FILE_TYPE_GPSMAPPER ); + gchar *auto_save_name = append_file_ext ( vik_layer_get_name(VIK_LAYER(values[MA_VTL])), FILE_TYPE_GPSMAPPER ); + + vik_trw_layer_export ( VIK_TRW_LAYER (values[MA_VTL]), _("Export Layer"), auto_save_name, NULL, FILE_TYPE_GPSMAPPER ); + + g_free ( auto_save_name ); } static void trw_layer_export_gpx ( menu_array_layer values ) { - /* Auto append '.gpx' to track name (providing it's not already there) for the default filename */ - gchar *auto_save_name = g_strdup ( vik_layer_get_name(VIK_LAYER(values[MA_VTL])) ); - if ( ! check_file_ext ( auto_save_name, ".gpx" ) ) - auto_save_name = g_strconcat ( auto_save_name, ".gpx", NULL ); + gchar *auto_save_name = append_file_ext ( vik_layer_get_name(VIK_LAYER(values[MA_VTL])), FILE_TYPE_GPX ); - trw_layer_export ( values, _("Export Layer"), auto_save_name, NULL, FILE_TYPE_GPX ); + vik_trw_layer_export ( VIK_TRW_LAYER (values[MA_VTL]), _("Export Layer"), auto_save_name, NULL, FILE_TYPE_GPX ); g_free ( auto_save_name ); } static void trw_layer_export_kml ( menu_array_layer values ) { - /* Auto append '.kml' to the name (providing it's not already there) for the default filename */ - gchar *auto_save_name = g_strdup ( vik_layer_get_name(VIK_LAYER(values[MA_VTL])) ); - if ( ! check_file_ext ( auto_save_name, ".kml" ) ) - auto_save_name = g_strconcat ( auto_save_name, ".kml", NULL ); + gchar *auto_save_name = append_file_ext ( vik_layer_get_name(VIK_LAYER(values[MA_VTL])), FILE_TYPE_KML ); - trw_layer_export ( values, _("Export Layer"), auto_save_name, NULL, FILE_TYPE_KML ); + vik_trw_layer_export ( VIK_TRW_LAYER (values[MA_VTL]), _("Export Layer"), auto_save_name, NULL, FILE_TYPE_KML ); g_free ( auto_save_name ); } -/** - * Convert the given TRW layer into a temporary GPX file and open it with the specified program - * - */ -static void trw_layer_export_external_gpx ( menu_array_layer values, const gchar* external_program ) -{ - VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); - gchar *name_used = NULL; - int fd; - - if ((fd = g_file_open_tmp("tmp-viking.XXXXXX.gpx", &name_used, NULL)) >= 0) { - vik_window_set_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); - gboolean failed = ! a_file_export ( vtl, name_used, FILE_TYPE_GPX, NULL, TRUE); - vik_window_clear_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); - if (failed) { - a_dialog_error_msg (VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Could not create temporary file for export.") ); - } - else { - GError *err = NULL; - gchar *quoted_file = g_shell_quote ( name_used ); - gchar *cmd = g_strdup_printf ( "%s %s", external_program, quoted_file ); - g_free ( quoted_file ); - if ( ! g_spawn_command_line_async ( cmd, &err ) ) - { - a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Could not launch %s."), external_program ); - g_error_free ( err ); - } - g_free ( cmd ); - } - // Note ATM the 'temporary' file is not deleted, as loading via another program is not instantaneous - //g_remove ( name_used ); - // Perhaps should be deleted when the program ends? - // For now leave it to the user to delete it / use system temp cleanup methods. - g_free ( name_used ); - } -} static void trw_layer_export_external_gpx_1 ( menu_array_layer values ) { - trw_layer_export_external_gpx ( values, a_vik_get_external_gpx_program_1() ); + vik_trw_layer_export_external_gpx ( VIK_TRW_LAYER (values[MA_VTL]), a_vik_get_external_gpx_program_1() ); } static void trw_layer_export_external_gpx_2 ( menu_array_layer values ) { - trw_layer_export_external_gpx ( values, a_vik_get_external_gpx_program_2() ); + vik_trw_layer_export_external_gpx ( VIK_TRW_LAYER (values[MA_VTL]), a_vik_get_external_gpx_program_2() ); } static void trw_layer_export_gpx_track ( menu_array_sublayer values ) @@ -3380,17 +3308,14 @@ static void trw_layer_export_gpx_track ( menu_array_sublayer values ) if ( !trk || !trk->name ) return; - /* Auto append '.gpx' to track name (providing it's not already there) for the default filename */ - gchar *auto_save_name = g_strdup ( trk->name ); - if ( ! check_file_ext ( auto_save_name, ".gpx" ) ) - auto_save_name = g_strconcat ( auto_save_name, ".gpx", NULL ); + gchar *auto_save_name = append_file_ext ( trk->name, FILE_TYPE_GPX ); gchar *label = NULL; if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) label = _("Export Route as GPX"); else label = _("Export Track as GPX"); - trw_layer_export ( data, label, auto_save_name, trk, FILE_TYPE_GPX ); + vik_trw_layer_export ( VIK_TRW_LAYER (values[MA_VTL]), label, auto_save_name, trk, FILE_TYPE_GPX ); g_free ( auto_save_name ); } diff --git a/src/viktrwlayer_export.c b/src/viktrwlayer_export.c new file mode 100644 index 00000000..0dd5e9bb --- /dev/null +++ b/src/viktrwlayer_export.c @@ -0,0 +1,107 @@ + +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Guilhem Bonnefille + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include +#include +#include +#include +#include +#include + +#include "babel.h" +#include "viking.h" +#include "viktrwlayer_export.h" + +void vik_trw_layer_export ( VikTrwLayer *vtl, const gchar *title, const gchar* default_name, VikTrack* trk, guint file_type ) +{ + GtkWidget *file_selector; + const gchar *fn; + gboolean failed = FALSE; + file_selector = gtk_file_chooser_dialog_new (title, + NULL, + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + gchar *cwd = g_get_current_dir(); + if ( cwd ) { + gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER(file_selector), cwd ); + g_free ( cwd ); + } + + gtk_file_chooser_set_current_name ( GTK_FILE_CHOOSER(file_selector), default_name ); + + while ( gtk_dialog_run ( GTK_DIALOG(file_selector) ) == GTK_RESPONSE_ACCEPT ) + { + fn = gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(file_selector) ); + if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) == FALSE || + a_dialog_yes_or_no ( GTK_WINDOW(file_selector), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) ) + { + gtk_widget_hide ( file_selector ); + vik_window_set_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); + failed = ! a_file_export ( vtl, fn, file_type, trk, TRUE ); + vik_window_clear_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); + break; + } + } + gtk_widget_destroy ( file_selector ); + if ( failed ) + a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("The filename you requested could not be opened for writing.") ); +} + + +/** + * Convert the given TRW layer into a temporary GPX file and open it with the specified program + * + */ +void vik_trw_layer_export_external_gpx ( VikTrwLayer *vtl, const gchar* external_program ) +{ + gchar *name_used = NULL; + int fd; + + if ((fd = g_file_open_tmp("tmp-viking.XXXXXX.gpx", &name_used, NULL)) >= 0) { + vik_window_set_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); + gboolean failed = ! a_file_export ( VIK_TRW_LAYER(vtl), name_used, FILE_TYPE_GPX, NULL, TRUE); + vik_window_clear_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); + if (failed) { + a_dialog_error_msg (VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Could not create temporary file for export.") ); + } + else { + GError *err = NULL; + gchar *quoted_file = g_shell_quote ( name_used ); + gchar *cmd = g_strdup_printf ( "%s %s", external_program, quoted_file ); + g_free ( quoted_file ); + if ( ! g_spawn_command_line_async ( cmd, &err ) ) + { + a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_LAYER( vtl), _("Could not launch %s."), external_program ); + g_error_free ( err ); + } + g_free ( cmd ); + } + // Note ATM the 'temporary' file is not deleted, as loading via another program is not instantaneous + //g_remove ( name_used ); + // Perhaps should be deleted when the program ends? + // For now leave it to the user to delete it / use system temp cleanup methods. + g_free ( name_used ); + } +} + diff --git a/src/viktrwlayer_export.h b/src/viktrwlayer_export.h new file mode 100644 index 00000000..05cc2c75 --- /dev/null +++ b/src/viktrwlayer_export.h @@ -0,0 +1,36 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Guilhem Bonnefille + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_TRWLAYER_EXPORT_H +#define _VIKING_TRWLAYER_EXPORT_H + +#include "viktrwlayer.h" + +G_BEGIN_DECLS + +void vik_trw_layer_export ( VikTrwLayer *vtl, const gchar *title, const gchar* default_name, VikTrack* trk, guint file_type ); + +void vik_trw_layer_export_external_gpx ( VikTrwLayer *vtl, const gchar* external_program ); + +G_END_DECLS + +#endif -- 2.39.5