diff --git a/dive.c b/dive.c index c7d4d3dce..f6807f3e6 100644 --- a/dive.c +++ b/dive.c @@ -1206,12 +1206,19 @@ static int max_time(duration_t a, duration_t b) */ static int likely_same_dive(struct dive *a, struct dive *b) { - int fuzz, match; + int match, fuzz = 20 * 60; /* Don't try to merge dives in different trips */ if (a->divetrip && b->divetrip && a->divetrip != b->divetrip) return 0; + /* if one of the dives has no depth and duration this could be + * a location marker from the webservice (in this situation it + * is valid to only check the first dc structure as we know that + * a location marker will only ever have one of those structures) */ + if ((!a->dc.maxdepth.mm && !a->dc.duration.seconds) || + (!b->dc.maxdepth.mm && !b->dc.duration.seconds)) + return ((a->when <= b->when + fuzz) && (a->when >= b->when - fuzz)); /* * Do some basic sanity testing of the values we * have filled in during 'fixup_dive()' diff --git a/main.c b/main.c index 0e98d9059..b471e5f9d 100644 --- a/main.c +++ b/main.c @@ -165,7 +165,10 @@ void report_dives(gboolean is_imported, gboolean prefer_imported) struct dive *dive = pp[1]; struct dive *merged; - if (prev->when + prev->dc.duration.seconds < dive->when) + /* only try to merge overlapping dives - or if one of the dives has + * zero duration (that might be a gps marker from the webservice) */ + if (prev->dc.duration.seconds && dive->dc.duration.seconds && + prev->when + prev->dc.duration.seconds < dive->when) continue; merged = try_to_merge(prev, dive, prefer_imported); diff --git a/parse-xml.c b/parse-xml.c index 85b1c5306..ba5ca1e50 100644 --- a/parse-xml.c +++ b/parse-xml.c @@ -932,6 +932,22 @@ static degrees_t parse_degrees(char *buf, char **end) return ret; } +static void gps_lat(char *buffer, void *_dive) +{ + char *end; + struct dive *dive = _dive; + + dive->latitude = parse_degrees(buffer, &end); +} + +static void gps_long(char *buffer, void *_dive) +{ + char *end; + struct dive *dive = _dive; + + dive->longitude = parse_degrees(buffer, &end); +} + static void gps_location(char *buffer, void *_dive) { char *end; @@ -986,8 +1002,14 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf) return; if (MATCH(".gps", gps_location, dive)) return; + if (MATCH(".latitude", gps_lat, dive)) + return; + if (MATCH(".longitude", gps_long, dive)) + return; if (MATCH(".location", utf8_string, &dive->location)) return; + if (MATCH(".name", utf8_string, &dive->location)) + return; if (MATCH(".suit", utf8_string, &dive->suit)) return; if (MATCH(".divesuit", utf8_string, &dive->suit)) diff --git a/webservice.c b/webservice.c index 5acfb2da9..1f7b32f2e 100644 --- a/webservice.c +++ b/webservice.c @@ -198,7 +198,9 @@ void webservice_download_dialog(void) result = gtk_dialog_run(GTK_DIALOG(dialog)); if (result == GTK_RESPONSE_ACCEPT) { /* apply download */ - g_message("\napply download should happen here: \n\n %s", state.xmldata); + /* g_message("\napply download should happen here: \n\n %s", state.xmldata); */ + parse_xml_buffer(_("Webservice"), state.xmldata, strlen(state.xmldata), NULL); + report_dives(TRUE, FALSE); } download_dialog_release_xml(&state); gtk_widget_destroy(dialog);