X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/805d282e7a5a8ac92df2cf1a0c1987cfe1756101..e044ae9e96b95fc6e58b4f05f759e5fc59bb79ab:/src/acquire.c diff --git a/src/acquire.c b/src/acquire.c index 4b07e987..1c47a151 100644 --- a/src/acquire.c +++ b/src/acquire.c @@ -29,7 +29,6 @@ /* passed along to worker thread */ typedef struct { acq_dialog_widgets_t *w; - VikDataSourceInterface *interface; gchar *cmd; gchar *extra; } w_and_interface_t; @@ -38,9 +37,25 @@ extern VikDataSourceInterface vik_datasource_gps_interface; extern VikDataSourceInterface vik_datasource_google_interface; /********************************************************* - * Definitions and routines for acquiring data from GPS + * Definitions and routines for acquiring data from Data Sources in general *********************************************************/ +static void progress_func ( BabelProgressCode c, gpointer data, acq_dialog_widgets_t *w ) +{ + gdk_threads_enter (); + if (!w->ok) { + if ( w->interface->cleanup_func ) + w->interface->cleanup_func( w->user_data ); + g_free ( w ); + gdk_threads_leave(); + g_thread_exit ( NULL ); + } + gdk_threads_leave (); + + if ( w->interface->progress_func ) + w->interface->progress_func ( (gpointer) c, data, w ); +} + /* this routine is the worker thread. there is only one simultaneous download allowed */ static void get_from_anything ( w_and_interface_t *wi ) { @@ -52,7 +67,7 @@ static void get_from_anything ( w_and_interface_t *wi ) gboolean creating_new_layer = TRUE; acq_dialog_widgets_t *w = wi->w; - VikDataSourceInterface *interface = wi->interface; + VikDataSourceInterface *interface = wi->w->interface; g_free ( wi ); gdk_threads_enter(); @@ -71,9 +86,9 @@ static void get_from_anything ( w_and_interface_t *wi ) gdk_threads_leave(); if ( interface->type == VIK_DATASOURCE_GPSBABEL_DIRECT ) - result = a_babel_convert_from (vtl, cmd, (BabelStatusFunc) interface->progress_func, extra, w); + result = a_babel_convert_from (vtl, cmd, (BabelStatusFunc) progress_func, extra, w); else - result = a_babel_convert_from_shellcommand ( vtl, cmd, extra, (BabelStatusFunc) interface->progress_func, w); + result = a_babel_convert_from_shellcommand ( vtl, cmd, extra, (BabelStatusFunc) progress_func, w); g_free ( cmd ); g_free ( extra ); @@ -85,22 +100,22 @@ static void get_from_anything ( w_and_interface_t *wi ) g_object_unref ( G_OBJECT ( vtl ) ); gdk_threads_leave(); } - - gdk_threads_enter(); - if (w->ok) { - gtk_label_set_text ( GTK_LABEL(w->status), "Done." ); - if ( creating_new_layer ) - vik_aggregate_layer_add_layer( vik_layers_panel_get_top_layer(w->vlp), VIK_LAYER(vtl)); - gtk_dialog_set_response_sensitive ( GTK_DIALOG(w->dialog), GTK_RESPONSE_ACCEPT, TRUE ); - gtk_dialog_set_response_sensitive ( GTK_DIALOG(w->dialog), GTK_RESPONSE_REJECT, FALSE ); - } else { - /* canceled */ - if ( creating_new_layer ) - g_object_unref(vtl); + else { + gdk_threads_enter(); + if (w->ok) { + gtk_label_set_text ( GTK_LABEL(w->status), "Done." ); + if ( creating_new_layer ) + vik_aggregate_layer_add_layer( vik_layers_panel_get_top_layer(w->vlp), VIK_LAYER(vtl)); + gtk_dialog_set_response_sensitive ( GTK_DIALOG(w->dialog), GTK_RESPONSE_ACCEPT, TRUE ); + gtk_dialog_set_response_sensitive ( GTK_DIALOG(w->dialog), GTK_RESPONSE_REJECT, FALSE ); + } else { + /* canceled */ + if ( creating_new_layer ) + g_object_unref(vtl); + } } - if ( interface->cleanup_func ) - interface->cleanup_func ( w->specific_data ); + interface->cleanup_func ( w->user_data ); if ( w->ok ) { w->ok = FALSE; @@ -119,24 +134,38 @@ void a_acquire ( VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikDataSo GtkWidget *status; gchar *cmd, *extra; acq_dialog_widgets_t *w; + gpointer user_data; w_and_interface_t *wi; - if ( interface->add_widgets_func ) { - gpointer first_dialog_data; - dialog = gtk_dialog_new_with_buttons ( "", NULL, 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); - first_dialog_data = interface->add_widgets_func(dialog); + g_assert(interface->init_func); + user_data = interface->init_func(); + + if ( interface->check_existence_func ) { + gchar *error_str = interface->check_existence_func(); + if ( error_str ) { + a_dialog_error_msg ( GTK_WINDOW(vw), error_str ); + g_free ( error_str ); + return; + } + } + + if ( interface->add_setup_widgets_func ) { + dialog = gtk_dialog_new_with_buttons ( "", GTK_WINDOW(vw), 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); + + interface->add_setup_widgets_func(dialog, vvp, user_data); + gtk_window_set_title ( GTK_WINDOW(dialog), interface->window_title ); + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) != GTK_RESPONSE_ACCEPT ) { - interface->first_cleanup_func(first_dialog_data); + interface->cleanup_func(user_data); gtk_widget_destroy(dialog); return; } - interface->get_cmd_string_func ( first_dialog_data, &cmd, &extra ); - interface->first_cleanup_func(first_dialog_data); + interface->get_cmd_string_func ( user_data, &cmd, &extra ); gtk_widget_destroy(dialog); dialog = NULL; } else - interface->get_cmd_string_func ( NULL, &cmd, &extra ); + interface->get_cmd_string_func ( user_data, &cmd, &extra ); if ( ! cmd ) return; @@ -144,17 +173,17 @@ void a_acquire ( VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikDataSo w = g_malloc(sizeof(*w)); wi = g_malloc(sizeof(*wi)); wi->w = w; - wi->interface = interface; + wi->w->interface = interface; wi->cmd = cmd; wi->extra = extra; - dialog = gtk_dialog_new_with_buttons ( "", NULL, 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); + dialog = gtk_dialog_new_with_buttons ( "", GTK_WINDOW(vw), 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); gtk_dialog_set_response_sensitive ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT, FALSE ); + gtk_window_set_title ( GTK_WINDOW(dialog), interface->window_title ); w->dialog = dialog; w->ok = TRUE; - status = gtk_label_new ("Status: detecting gpsbabel"); gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog)->vbox), status, FALSE, FALSE, 5 ); gtk_widget_show_all(status); @@ -163,10 +192,11 @@ void a_acquire ( VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikDataSo w->vw = vw; w->vlp = vlp; w->vvp = vvp; - if ( interface->add_progress_widgets_func ) - w->specific_data = interface->add_progress_widgets_func ( dialog ); - else - w->specific_data = NULL; + if ( interface->add_progress_widgets_func ) { + interface->add_progress_widgets_func ( dialog, user_data ); + } + w->user_data = user_data; + g_thread_create((GThreadFunc)get_from_anything, wi, FALSE, NULL );