summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2013-01-23 11:53:42 -0800
committerGravatar Dirk Hohndel <dirk@hohndel.org>2013-01-23 11:53:42 -0800
commitc521aec88452460cc139d9d74d1f23ef58eac1a6 (patch)
tree819396ee40b8ca251f854560c22b1f10c67b855c
parentb1db60ba4795638192c0dea93670d858d4178528 (diff)
downloadsubsurface-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.c7
-rw-r--r--main.c5
-rw-r--r--parse-xml.c22
-rw-r--r--webservice.c4
4 files changed, 35 insertions, 3 deletions
diff --git a/dive.c b/dive.c
index fe9ce3a20..db8ebda9d 100644
--- a/dive.c
+++ b/dive.c
@@ -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()'
diff --git a/main.c b/main.c
index b96c39fd3..27458f86a 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->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);