diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2013-01-23 11:53:42 -0800 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2013-01-23 11:53:42 -0800 |
commit | c521aec88452460cc139d9d74d1f23ef58eac1a6 (patch) | |
tree | 819396ee40b8ca251f854560c22b1f10c67b855c | |
parent | b1db60ba4795638192c0dea93670d858d4178528 (diff) | |
download | subsurface-c521aec88452460cc139d9d74d1f23ef58eac1a6.tar.gz |
Import and merge GPS data from the webservice
Dive locations marked (and named) via the companion app are downloaded
from the webservice, parsed and merged with the existing dives.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | dive.c | 7 | ||||
-rw-r--r-- | main.c | 5 | ||||
-rw-r--r-- | parse-xml.c | 22 | ||||
-rw-r--r-- | webservice.c | 4 |
4 files changed, 35 insertions, 3 deletions
@@ -1209,12 +1209,17 @@ 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 */ + if ((!a->maxdepth.mm && !a->duration.seconds) || + (!b->maxdepth.mm && !b->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()' @@ -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->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->duration.seconds && dive->duration.seconds && + prev->when + prev->duration.seconds < dive->when) continue; merged = try_to_merge(prev, dive, prefer_imported); diff --git a/parse-xml.c b/parse-xml.c index 35ebf0446..6aa063467 100644 --- a/parse-xml.c +++ b/parse-xml.c @@ -909,6 +909,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; @@ -984,8 +1000,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); |