X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/4cfba6c7a364755192c63d8a32ec18da4e6dbb0a..00de8de3e9c61db157855abdc793c403ab24ab0e:/src/osm-traces.c?ds=inline diff --git a/src/osm-traces.c b/src/osm-traces.c index bf796e3b..33df22c7 100644 --- a/src/osm-traces.c +++ b/src/osm-traces.c @@ -52,12 +52,12 @@ static gint last_active = -1; /** * Login to use for OSM uploading. */ -static gchar *user = NULL; +static gchar *osm_user = NULL; /** * Password to use for OSM uploading. */ -static gchar *password = NULL; +static gchar *osm_password = NULL; /** * Mutex to protect auth. token @@ -87,14 +87,15 @@ typedef struct _OsmTracesInfo { gchar *name; gchar *description; gchar *tags; + gboolean anonymize_times; // ATM only available on a single track. const OsmTraceVis_t *vistype; VikTrwLayer *vtl; VikTrack *trk; } OsmTracesInfo; static VikLayerParam prefs[] = { - { VIK_LAYER_NUM_TYPES, VIKING_OSM_TRACES_PARAMS_NAMESPACE "username", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("OSM username:"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL }, - { VIK_LAYER_NUM_TYPES, VIKING_OSM_TRACES_PARAMS_NAMESPACE "password", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("OSM password:"), VIK_LAYER_WIDGET_PASSWORD, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_OSM_TRACES_PARAMS_NAMESPACE "username", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("OSM username:"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_OSM_TRACES_PARAMS_NAMESPACE "password", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("OSM password:"), VIK_LAYER_WIDGET_PASSWORD, NULL, NULL, NULL, NULL, NULL, NULL }, }; /** @@ -124,7 +125,7 @@ static const gchar *get_default_user() return default_user; } -void osm_set_login(const gchar *user_, const gchar *password_) +void osm_set_login(const gchar *user, const gchar *password) { /* Allocate mutex */ if (login_mutex == NULL) @@ -132,10 +133,10 @@ void osm_set_login(const gchar *user_, const gchar *password_) login_mutex = g_mutex_new(); } g_mutex_lock(login_mutex); - g_free(user); user = NULL; - g_free(password); password = NULL; - user = g_strdup(user_); - password = g_strdup(password_); + g_free(osm_user); osm_user = NULL; + g_free(osm_password); osm_password = NULL; + osm_user = g_strdup(user); + osm_password = g_strdup(password); g_mutex_unlock(login_mutex); } @@ -143,7 +144,7 @@ gchar *osm_get_login() { gchar *user_pass = NULL; g_mutex_lock(login_mutex); - user_pass = g_strdup_printf("%s:%s", user, password); + user_pass = g_strdup_printf("%s:%s", osm_user, osm_password); g_mutex_unlock(login_mutex); return user_pass; } @@ -264,45 +265,37 @@ static void osm_traces_upload_thread ( OsmTracesInfo *oti, gpointer threaddata ) /* Due to OSM limits, we have to enforce ele and time fields also don't upload invisible tracks */ static GpxWritingOptions options = { TRUE, TRUE, FALSE, FALSE }; - FILE *file = NULL; - gchar *filename = NULL; - int fd; - GError *error = NULL; - int ret; - - g_assert(oti != NULL); - /* Opening temporary file */ - fd = g_file_open_tmp("viking_osm_upload_XXXXXX.gpx", &filename, &error); - if (fd < 0) { - g_error(_("failed to open temporary file: %s"), strerror(errno)); + if (!oti) return; - } - g_clear_error(&error); - g_debug("%s: temporary file = %s", __FUNCTION__, filename); - /* Creating FILE* */ - file = fdopen(fd, "w"); + gchar *filename = NULL; /* writing gpx file */ if (oti->trk != NULL) { /* Upload only the selected track */ - a_gpx_write_track_file(oti->trk, file, &options); + if ( oti->anonymize_times ) + { + VikTrack *trk = vik_track_copy(oti->trk, TRUE); + vik_track_anonymize_times(trk); + filename = a_gpx_write_track_tmp_file(trk, &options); + vik_track_free(trk); + } + else + filename = a_gpx_write_track_tmp_file (oti->trk, &options); } else { /* Upload the whole VikTrwLayer */ - a_gpx_write_file(oti->vtl, file, &options); + filename = a_gpx_write_tmp_file (oti->vtl, &options); } - /* We can close the file */ - /* This also close the associated fd */ - fclose(file); - file = NULL; + if ( !filename ) + return; /* finally, upload it */ - gint ans = osm_traces_upload_file(user, password, filename, + gint ans = osm_traces_upload_file(osm_user, osm_password, filename, oti->name, oti->description, oti->tags, oti->vistype); // @@ -341,7 +334,7 @@ static void osm_traces_upload_thread ( OsmTracesInfo *oti, gpointer threaddata ) g_free (msg); } /* Removing temporary file */ - ret = g_unlink(filename); + int ret = g_unlink(filename); if (ret != 0) { g_critical(_("failed to unlink temporary file: %s"), strerror(errno)); } @@ -359,15 +352,15 @@ void osm_login_widgets (GtkWidget *user_entry, GtkWidget *password_entry) const gchar *pref_user = a_preferences_get(VIKING_OSM_TRACES_PARAMS_NAMESPACE "username")->s; const gchar *pref_password = a_preferences_get(VIKING_OSM_TRACES_PARAMS_NAMESPACE "password")->s; - if (user != NULL && user[0] != '\0') - gtk_entry_set_text(GTK_ENTRY(user_entry), user); + if (osm_user != NULL && osm_user[0] != '\0') + gtk_entry_set_text(GTK_ENTRY(user_entry), osm_user); else if (pref_user != NULL && pref_user[0] != '\0') gtk_entry_set_text(GTK_ENTRY(user_entry), pref_user); else if (default_user != NULL) gtk_entry_set_text(GTK_ENTRY(user_entry), default_user); - if (password != NULL && password[0] != '\0') - gtk_entry_set_text(GTK_ENTRY(password_entry), password); + if (osm_password != NULL && osm_password[0] != '\0') + gtk_entry_set_text(GTK_ENTRY(password_entry), osm_password); else if (pref_password != NULL) gtk_entry_set_text(GTK_ENTRY(password_entry), pref_password); /* This is a password -> invisible */ @@ -380,7 +373,7 @@ void osm_login_widgets (GtkWidget *user_entry, GtkWidget *password_entry) * @param vtl VikTrwLayer * @param trk if not null, the track to upload */ -static void osm_traces_upload_viktrwlayer ( VikTrwLayer *vtl, VikTrack *trk ) +void osm_traces_upload_viktrwlayer ( VikTrwLayer *vtl, VikTrack *trk ) { GtkWidget *dia = gtk_dialog_new_with_buttons (_("OSM upload"), VIK_GTK_WINDOW_FROM_LAYER(vtl), @@ -398,6 +391,7 @@ static void osm_traces_upload_viktrwlayer ( VikTrwLayer *vtl, VikTrack *trk ) GtkWidget *description_label, *description_entry; GtkWidget *tags_label, *tags_entry; GtkWidget *visibility; + GtkWidget *anonymize_checkbutton = NULL; const OsmTraceVis_t *vis_t; user_label = gtk_label_new(_("Email:")); @@ -434,13 +428,35 @@ static void osm_traces_upload_viktrwlayer ( VikTrwLayer *vtl, VikTrack *trk ) description_label = gtk_label_new(_("Description:")); description_entry = gtk_entry_new(); + const gchar *description = NULL; + if (trk != NULL) + description = trk->description; + else { + VikTRWMetadata *md = vik_trw_layer_get_metadata (vtl); + description = md ? md->description : NULL; + } + if (description) + gtk_entry_set_text(GTK_ENTRY(description_entry), description); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), description_label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), description_entry, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(GTK_WIDGET(description_entry), _("The description of the trace")); + if (trk != NULL) { + GtkWidget *label = gtk_label_new(_("Anonymize Times:")); + anonymize_checkbutton = gtk_check_button_new (); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), anonymize_checkbutton, FALSE, FALSE, 0); + gtk_widget_set_tooltip_text(GTK_WIDGET(anonymize_checkbutton), + _("Anonymize times of the trace.\n" + "You may choose to make the trace identifiable, yet mask the actual real time values")); + } + tags_label = gtk_label_new(_("Tags:")); tags_entry = gtk_entry_new(); + VikTRWMetadata *md = vik_trw_layer_get_metadata (vtl); + if (md->keywords) + gtk_entry_set_text(GTK_ENTRY(tags_entry), md->keywords); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), tags_label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), tags_entry, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(GTK_WIDGET(tags_entry), @@ -497,6 +513,10 @@ static void osm_traces_upload_viktrwlayer ( VikTrwLayer *vtl, VikTrack *trk ) info->vistype = &OsmTraceVis[gtk_combo_box_get_active(GTK_COMBO_BOX(visibility))]; info->vtl = VIK_TRW_LAYER(g_object_ref(vtl)); info->trk = trk; + if (trk != NULL && anonymize_checkbutton != NULL ) + info->anonymize_times = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(anonymize_checkbutton)); + else + info->anonymize_times = FALSE; // Save visibility value for default reuse last_active = gtk_combo_box_get_active(GTK_COMBO_BOX(visibility)); @@ -516,24 +536,3 @@ static void osm_traces_upload_viktrwlayer ( VikTrwLayer *vtl, VikTrack *trk ) } gtk_widget_destroy ( dia ); } - -/** - * Function called by the entry menu of a TrwLayer - */ -void osm_traces_upload_cb ( gpointer layer_and_vlp[2], guint file_type ) -{ - osm_traces_upload_viktrwlayer(VIK_TRW_LAYER(layer_and_vlp[0]), NULL); -} - -/** - * Function called by the entry menu of a single track - */ -// TODO: Fix this dodgy usage of magic 8 ball array sized numbering -// At least have some common definition somewhere... -void osm_traces_upload_track_cb ( gpointer pass_along[8] ) -{ - if ( pass_along[7] ) { - VikTrack *trk = VIK_TRACK(pass_along[7]); - osm_traces_upload_viktrwlayer(VIK_TRW_LAYER(pass_along[0]), trk); - } -}