]> git.street.me.uk Git - andy/viking.git/blame - src/viktrwlayer_export.c
SF Feature#49: Export via GPSBabel
[andy/viking.git] / src / viktrwlayer_export.c
CommitLineData
e4a11fbe
GB
1
2/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
3/*
4 * viking -- GPS Data and Topo Analyzer, Explorer, and Manager
5 *
6 * Copyright (C) 2013, Guilhem Bonnefille <guilhem.bonnefille@gmail.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 *
22 */
23#include <string.h>
24#include <stdlib.h>
25#include <stdio.h>
26#include <glib.h>
27#include <glib/gstdio.h>
28#include <glib/gi18n.h>
29
30#include "babel.h"
17720e63 31#include "babel_ui.h"
e4a11fbe
GB
32#include "viking.h"
33#include "viktrwlayer_export.h"
34
35void vik_trw_layer_export ( VikTrwLayer *vtl, const gchar *title, const gchar* default_name, VikTrack* trk, guint file_type )
36{
37 GtkWidget *file_selector;
38 const gchar *fn;
39 gboolean failed = FALSE;
40 file_selector = gtk_file_chooser_dialog_new (title,
41 NULL,
42 GTK_FILE_CHOOSER_ACTION_SAVE,
43 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
44 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
45 NULL);
46 gchar *cwd = g_get_current_dir();
47 if ( cwd ) {
48 gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER(file_selector), cwd );
49 g_free ( cwd );
50 }
51
52 gtk_file_chooser_set_current_name ( GTK_FILE_CHOOSER(file_selector), default_name );
53
54 while ( gtk_dialog_run ( GTK_DIALOG(file_selector) ) == GTK_RESPONSE_ACCEPT )
55 {
56 fn = gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(file_selector) );
57 if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) == FALSE ||
58 a_dialog_yes_or_no ( GTK_WINDOW(file_selector), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) )
59 {
60 gtk_widget_hide ( file_selector );
61 vik_window_set_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) );
62 failed = ! a_file_export ( vtl, fn, file_type, trk, TRUE );
63 vik_window_clear_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) );
64 break;
65 }
66 }
67 gtk_widget_destroy ( file_selector );
68 if ( failed )
69 a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("The filename you requested could not be opened for writing.") );
70}
71
72
73/**
74 * Convert the given TRW layer into a temporary GPX file and open it with the specified program
75 *
76 */
77void vik_trw_layer_export_external_gpx ( VikTrwLayer *vtl, const gchar* external_program )
78{
79 gchar *name_used = NULL;
80 int fd;
81
82 if ((fd = g_file_open_tmp("tmp-viking.XXXXXX.gpx", &name_used, NULL)) >= 0) {
83 vik_window_set_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) );
84 gboolean failed = ! a_file_export ( VIK_TRW_LAYER(vtl), name_used, FILE_TYPE_GPX, NULL, TRUE);
85 vik_window_clear_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) );
86 if (failed) {
87 a_dialog_error_msg (VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Could not create temporary file for export.") );
88 }
89 else {
90 GError *err = NULL;
91 gchar *quoted_file = g_shell_quote ( name_used );
92 gchar *cmd = g_strdup_printf ( "%s %s", external_program, quoted_file );
93 g_free ( quoted_file );
94 if ( ! g_spawn_command_line_async ( cmd, &err ) )
95 {
96 a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_LAYER( vtl), _("Could not launch %s."), external_program );
97 g_error_free ( err );
98 }
99 g_free ( cmd );
100 }
101 // Note ATM the 'temporary' file is not deleted, as loading via another program is not instantaneous
102 //g_remove ( name_used );
103 // Perhaps should be deleted when the program ends?
104 // For now leave it to the user to delete it / use system temp cleanup methods.
105 g_free ( name_used );
106 }
107}
108
17720e63
GB
109
110void vik_trw_layer_export_gpsbabel ( VikTrwLayer *vtl, const gchar *title, const gchar* default_name )
111{
112 BabelMode mode = { 0, 0, 0, 0, 0, 0 };
113 if ( g_hash_table_size (vik_trw_layer_get_routes(vtl)) ) {
114 mode.routesWrite = 1;
115 }
116 if ( g_hash_table_size (vik_trw_layer_get_tracks(vtl)) ) {
117 mode.tracksWrite = 1;
118 }
119 if ( g_hash_table_size (vik_trw_layer_get_waypoints(vtl)) ) {
120 mode.waypointsWrite = 1;
121 }
122
123 GtkWidget *file_selector;
124 const gchar *fn;
125 gboolean failed = FALSE;
126 file_selector = gtk_file_chooser_dialog_new (title,
127 NULL,
128 GTK_FILE_CHOOSER_ACTION_SAVE,
129 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
130 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
131 NULL);
132 gchar *cwd = g_get_current_dir();
133 if ( cwd ) {
134 gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER(file_selector), cwd );
135 g_free ( cwd );
136 }
137
138 /* Build the extra part of the widget */
139 GtkWidget *babel_selector = a_babel_ui_file_type_selector_new ( mode );
140 GtkWidget *label = gtk_label_new(_("File format:"));
141 GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
142 gtk_box_pack_start ( GTK_BOX(hbox), label, TRUE, TRUE, 0 );
143 gtk_box_pack_start ( GTK_BOX(hbox), babel_selector, TRUE, TRUE, 0 );
144 gtk_widget_show (babel_selector);
145 gtk_widget_show (label);
146 gtk_widget_show_all (hbox);
147
148 gtk_widget_set_tooltip_text( babel_selector, _("Select the file format.") );
149
150 GtkWidget *babel_modes = a_babel_ui_modes_new(mode.tracksWrite, mode.routesWrite, mode.waypointsWrite);
151 gtk_widget_show (babel_modes);
152
153 gtk_widget_set_tooltip_text( babel_modes, _("Select the information to process.\n"
154 "Warning: the behavior of these switches is highly dependent of the file format selected.\n"
155 "Please, refer to GPSbabel if unsure.") );
156
157 GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
158 gtk_box_pack_start ( GTK_BOX(vbox), hbox, TRUE, TRUE, 0 );
159 gtk_box_pack_start ( GTK_BOX(vbox), babel_modes, TRUE, TRUE, 0 );
160 gtk_widget_show_all (vbox);
161
162 gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER(file_selector), vbox);
163
164 /* Add some dynamic: only allow dialog's validation when format selection is done */
165 g_signal_connect (babel_selector, "changed", G_CALLBACK(a_babel_ui_type_selector_dialog_sensitivity_cb), file_selector);
166 /* Manually call the callback to fix the state */
167 a_babel_ui_type_selector_dialog_sensitivity_cb (babel_selector, file_selector);
168
169 /* Set possible name of the file */
170 gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER(file_selector), default_name);
171
172 while ( gtk_dialog_run ( GTK_DIALOG(file_selector) ) == GTK_RESPONSE_ACCEPT )
173 {
174 fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(file_selector) );
175 if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) == FALSE ||
176 a_dialog_yes_or_no ( GTK_WINDOW(file_selector), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) )
177 {
178 BabelFile *active = a_babel_ui_file_type_selector_get(babel_selector);
179 if (active == NULL) {
180 a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("You did not select a valid file format.") );
181 } else {
182 gtk_widget_hide ( file_selector );
183 vik_window_set_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) );
184 gboolean tracks, routes, waypoints;
185 a_babel_ui_modes_get( babel_modes, &tracks, &routes, &waypoints );
186 failed = ! a_file_export_babel ( vtl, fn, active->name, tracks, routes, waypoints );
187 vik_window_clear_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) );
188 break;
189 }
190 }
191 }
192 //babel_ui_selector_destroy(babel_selector);
193 gtk_widget_destroy ( file_selector );
194 if ( failed )
195 a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("The filename you requested could not be opened for writing.") );
196}