X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/805d282e7a5a8ac92df2cf1a0c1987cfe1756101..020b155be89ee1825309eb6d8d1958f3b46c310d:/src/datasource_google.c?ds=inline diff --git a/src/datasource_google.c b/src/datasource_google.c index a352882b..0bb8137d 100644 --- a/src/datasource_google.c +++ b/src/datasource_google.c @@ -26,55 +26,80 @@ #include "gpx.h" #include "acquire.h" -#define GOOGLE_DIRECTIONS_STRING "(wget -O - \"http://maps.google.com/maps?q=%s to %s&output=xml\" 2>/dev/null) | head -3 | tail -1 | sed 's/.*\\(.*\\)<\\/page>.*/\\1<\\/page>/'" +#define GOOGLE_DIRECTIONS_STRING "(wget -O - \"http://maps.google.com/maps?q=%s to %s&output=js\" 2>/dev/null)" typedef struct { GtkWidget *from_entry, *to_entry; } datasource_google_widgets_t; +static gchar *last_from_str = NULL; +static gchar *last_to_str = NULL; -gpointer datasource_google_add_widgets ( GtkWidget *dialog ); +static gpointer datasource_google_init( ); +static void datasource_google_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ); static void datasource_google_get_cmd_string ( datasource_google_widgets_t *widgets, gchar **cmd, gchar **input_type ); -static void datasource_google_first_cleanup ( gpointer data ); +static void datasource_google_cleanup ( gpointer data ); VikDataSourceInterface vik_datasource_google_interface = { - "Acquire from Google", + "Google Directions", + "Google Directions", VIK_DATASOURCE_SHELL_CMD, VIK_DATASOURCE_ADDTOLAYER, - (VikDataSourceAddWidgetsFunc) datasource_google_add_widgets, + (VikDataSourceInitFunc) datasource_google_init, + (VikDataSourceCheckExistenceFunc) NULL, + (VikDataSourceAddSetupWidgetsFunc) datasource_google_add_setup_widgets, (VikDataSourceGetCmdStringFunc) datasource_google_get_cmd_string, - (VikDataSourceFirstCleanupFunc) datasource_google_first_cleanup, (VikDataSourceProgressFunc) NULL, (VikDataSourceAddProgressWidgetsFunc) NULL, - (VikDataSourceCleanupFunc) NULL + (VikDataSourceCleanupFunc) datasource_google_cleanup, }; - -gpointer datasource_google_add_widgets ( GtkWidget *dialog ) +static gpointer datasource_google_init ( ) { datasource_google_widgets_t *widgets = g_malloc(sizeof(*widgets)); + return widgets; +} + +static void datasource_google_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ) +{ + datasource_google_widgets_t *widgets = (datasource_google_widgets_t *)user_data; GtkWidget *from_label, *to_label; from_label = gtk_label_new ("From:"); widgets->from_entry = gtk_entry_new(); to_label = gtk_label_new ("To:"); widgets->to_entry = gtk_entry_new(); + if (last_from_str) + gtk_entry_set_text(GTK_ENTRY(widgets->from_entry), last_from_str); + if (last_to_str) + gtk_entry_set_text(GTK_ENTRY(widgets->to_entry), last_to_str); gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog)->vbox), from_label, FALSE, FALSE, 5 ); gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog)->vbox), widgets->from_entry, FALSE, FALSE, 5 ); gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog)->vbox), to_label, FALSE, FALSE, 5 ); gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog)->vbox), widgets->to_entry, FALSE, FALSE, 5 ); gtk_widget_show_all(dialog); - return widgets; } static void datasource_google_get_cmd_string ( datasource_google_widgets_t *widgets, gchar **cmd, gchar **input_type ) { /* TODO: special characters handling!!! */ - *cmd = g_strdup_printf( GOOGLE_DIRECTIONS_STRING, gtk_entry_get_text ( GTK_ENTRY(widgets->from_entry) ), gtk_entry_get_text ( GTK_ENTRY(widgets->to_entry) ) ); + gchar *from_quoted, *to_quoted; + from_quoted = g_shell_quote ( gtk_entry_get_text ( GTK_ENTRY(widgets->from_entry) ) ); + to_quoted = g_shell_quote ( gtk_entry_get_text ( GTK_ENTRY(widgets->to_entry) ) ); + + *cmd = g_strdup_printf( GOOGLE_DIRECTIONS_STRING, from_quoted, to_quoted ); *input_type = g_strdup("google"); + g_free(last_from_str); + g_free(last_to_str); + + last_from_str = g_strdup(gtk_entry_get_text ( GTK_ENTRY(widgets->from_entry) ) ); + last_to_str = g_strdup(gtk_entry_get_text ( GTK_ENTRY(widgets->to_entry) ) ); + + g_free(from_quoted); + g_free(to_quoted); } -static void datasource_google_first_cleanup ( gpointer data ) +static void datasource_google_cleanup ( gpointer data ) { g_free ( data ); }