summaryrefslogtreecommitdiffstats
path: root/webservice.c
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2013-03-02 13:28:15 -0800
committerGravatar Dirk Hohndel <dirk@hohndel.org>2013-03-02 13:28:15 -0800
commitd85b4e64623a3c5e95fe3fe27d5313bf16392af5 (patch)
treef82187a85b34bb58e7d6755c83216a11823b900d /webservice.c
parent0e3c6f7517619c877a924f493cc1d1fa4293e533 (diff)
downloadsubsurface-d85b4e64623a3c5e95fe3fe27d5313bf16392af5.tar.gz
Webservice: only mark divelist changed if we actually modified it
If no new gps fixes or new location names were obtained from the webservice there is no need to save the datafile on exit. Reported-by: Sergey Starosek <sergey.starosek@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'webservice.c')
-rw-r--r--webservice.c31
1 files changed, 21 insertions, 10 deletions
diff --git a/webservice.c b/webservice.c
index d52d480ec..5308046f0 100644
--- a/webservice.c
+++ b/webservice.c
@@ -8,7 +8,7 @@
#include "display-gtk.h"
struct dive_table gps_location_table;
-static void merge_locations_into_dives(void);
+static gboolean merge_locations_into_dives(void);
enum {
DD_STATUS_OK,
@@ -152,9 +152,10 @@ static void download_dialog_response_cb(GtkDialog *d, gint response, gpointer da
/* apply download */
parse_xml_buffer(_("Webservice"), state->xmldata, state->xmldata_len, &gps_location_table, NULL);
/* now merge the data in the gps_location table into the dive_table */
- merge_locations_into_dives();
- mark_divelist_changed(TRUE);
- dive_list_update_dives();
+ if (merge_locations_into_dives()) {
+ mark_divelist_changed(TRUE);
+ dive_list_update_dives();
+ }
/* store last entered uid in config */
subsurface_set_conf("webservice_uid", gtk_entry_get_text(GTK_ENTRY(state->uid)));
default:
@@ -167,16 +168,19 @@ static void download_dialog_response_cb(GtkDialog *d, gint response, gpointer da
static gboolean is_automatic_fix(struct dive *gpsfix)
{
- if (gpsfix && gpsfix->location && !strcmp(gpsfix->location, "automatic fix"))
+ if (gpsfix && gpsfix->location &&
+ !strcmp(gpsfix->location, "automatic fix") &&
+ !strcmp(gpsfix->location, "Auto-created dive"))
return TRUE;
return FALSE;
}
#define SAME_GROUP 6 * 3600 // six hours
-static void merge_locations_into_dives(void)
+/* returns TRUE if dive_table was changed */
+static gboolean merge_locations_into_dives(void)
{
- int i, nr = 0;
+ int i, nr = 0, changed = 0;
struct dive *gpsfix, *last_named_fix = NULL, *dive;
sort_table(&gps_location_table);
@@ -184,8 +188,10 @@ static void merge_locations_into_dives(void)
for_each_gps_location(i, gpsfix) {
if (is_automatic_fix(gpsfix)) {
dive = find_dive_including(gpsfix->when);
- if (dive && !dive_has_gps_location(dive))
+ if (dive && !dive_has_gps_location(dive)) {
+ changed++;
copy_gps_location(gpsfix, dive);
+ }
} else {
if (last_named_fix && dive_within_time_range(last_named_fix, gpsfix->when, SAME_GROUP)) {
nr++;
@@ -195,10 +201,14 @@ static void merge_locations_into_dives(void)
}
dive = find_dive_n_near(gpsfix->when, nr, SAME_GROUP);
if (dive) {
- if (!dive_has_gps_location(dive))
+ if (!dive_has_gps_location(dive)) {
copy_gps_location(gpsfix, dive);
- if (!dive->location)
+ changed++;
+ }
+ if (!dive->location) {
dive->location = strdup(gpsfix->location);
+ changed++;
+ }
} else {
struct tm tm;
utc_mkdate(gpsfix->when, &tm);
@@ -209,6 +219,7 @@ static void merge_locations_into_dives(void)
}
}
}
+ return changed > 0;
}
void webservice_download_dialog(void)