summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dive.h3
-rw-r--r--file.c2
-rw-r--r--parse-xml.c82
-rw-r--r--webservice.c7
4 files changed, 24 insertions, 70 deletions
diff --git a/dive.h b/dive.h
index 4132d0c30..2f4dcbd9e 100644
--- a/dive.h
+++ b/dive.h
@@ -469,7 +469,7 @@ static inline struct dive *get_dive_by_diveid(int diveid, int deviceid)
extern int match_one_dc(struct divecomputer *a, struct divecomputer *b);
extern void parse_xml_init(void);
-extern void parse_xml_buffer(const char *url, const char *buf, int size, GError **error);
+extern void parse_xml_buffer(const char *url, const char *buf, int size, struct dive_table *table, GError **error);
extern void parse_xml_exit(void);
extern void set_filename(const char *filename, gboolean force);
@@ -500,7 +500,6 @@ extern void utc_mkdate(timestamp_t, struct tm *tm);
extern struct dive *alloc_dive(void);
extern void record_dive(struct dive *dive);
-extern void delete_dive(struct dive *dive);
extern struct sample *prepare_sample(struct divecomputer *dc);
extern void finish_sample(struct divecomputer *dc);
diff --git a/file.c b/file.c
index 10bb4274e..73c07f82d 100644
--- a/file.c
+++ b/file.c
@@ -246,7 +246,7 @@ static void parse_file_buffer(const char *filename, struct memblock *mem, GError
if (fmt && open_by_filename(filename, fmt+1, mem, error))
return;
- parse_xml_buffer(filename, mem->buffer, mem->size, error);
+ parse_xml_buffer(filename, mem->buffer, mem->size, &dive_table, error);
}
void parse_file(const char *filename, GError **error, gboolean possible_default_filename)
diff --git a/parse-xml.c b/parse-xml.c
index 184a0e89d..eb75e74c0 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -4,6 +4,7 @@
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
+#include <assert.h>
#define __USE_XOPEN
#include <time.h>
#include <libxml/parser.h>
@@ -18,85 +19,34 @@
int verbose;
+/* the dive table holds the overall dive list; target table points at
+ * the table we are currently filling */
struct dive_table dive_table;
-
+struct dive_table *target_table = NULL;
/*
* Add a dive into the dive_table array
*/
-void record_dive(struct dive *dive)
+static void record_dive_to_table(struct dive *dive, struct dive_table *table)
{
- int nr = dive_table.nr, allocated = dive_table.allocated;
- struct dive **dives = dive_table.dives;
+ assert(table != NULL);
+ int nr = table->nr, allocated = table->allocated;
+ struct dive **dives = table->dives;
if (nr >= allocated) {
allocated = (nr + 32) * 3 / 2;
dives = realloc(dives, allocated * sizeof(struct dive *));
if (!dives)
exit(1);
- dive_table.dives = dives;
- dive_table.allocated = allocated;
+ table->dives = dives;
+ table->allocated = allocated;
}
dives[nr] = fixup_dive(dive);
- dive_table.nr = nr+1;
+ table->nr = nr+1;
}
-static void delete_dive_renumber(struct dive **dives, int i, int nr)
-{
- struct dive *dive = dives[i];
- int number = dive->number, j;
-
- if (!number)
- return;
-
- /*
- * Check that all numbered dives after the deleted
- * ones are consecutive, return without renumbering
- * if that is not the case.
- */
- for (j = i+1; j < nr; j++) {
- struct dive *next = dives[j];
- if (!next->number)
- break;
- number++;
- if (next->number != number)
- return;
- }
-
- /*
- * Ok, we hit the end of the dives or a unnumbered
- * dive - renumber.
- */
- for (j = i+1 ; j < nr; j++) {
- struct dive *next = dives[j];
- if (!next->number)
- break;
- next->number--;
- }
-}
-
-/*
- * Remove a dive from the dive_table array
- */
-void delete_dive(struct dive *dive)
+void record_dive(struct dive *dive)
{
- int nr = dive_table.nr, i;
- struct dive **dives = dive_table.dives;
-
- /*
- * Stupid. We know the dive table is sorted by date,
- * we could do a binary lookup. Sue me.
- */
- for (i = 0; i < nr; i++) {
- struct dive *d = dives[i];
- if (d != dive)
- continue;
- /* should we re-number? */
- delete_dive_renumber(dives, i, nr);
- memmove(dives+i, dives+i+1, sizeof(struct dive *)*(nr-i-1));
- dives[nr] = NULL;
- dive_table.nr = nr-1;
- break;
- }
+ record_dive_to_table(dive, &dive_table);
}
static void start_match(const char *type, const char *name, char *buffer)
@@ -1172,7 +1122,7 @@ static void dive_end(void)
if (!is_dive())
free(cur_dive);
else
- record_dive(cur_dive);
+ record_dive_to_table(cur_dive, target_table);
cur_dive = NULL;
cur_dc = NULL;
cur_cylinder_index = 0;
@@ -1480,10 +1430,12 @@ static void reset_all(void)
import_source = UNKNOWN;
}
-void parse_xml_buffer(const char *url, const char *buffer, int size, GError **error)
+void parse_xml_buffer(const char *url, const char *buffer, int size,
+ struct dive_table *table, GError **error)
{
xmlDoc *doc;
+ target_table = table;
doc = xmlReadMemory(buffer, size, url, NULL, 0);
if (!doc) {
fprintf(stderr, _("Failed to parse '%s'.\n"), url);
diff --git a/webservice.c b/webservice.c
index 243d9b5a0..9dde771e8 100644
--- a/webservice.c
+++ b/webservice.c
@@ -6,6 +6,8 @@
#include "dive.h"
#include "display-gtk.h"
+struct dive_table gps_location_table;
+
enum {
DD_STATUS_OK,
DD_STATUS_ERROR_CONNECT,
@@ -203,8 +205,9 @@ void webservice_download_dialog(void)
result = gtk_dialog_run(GTK_DIALOG(dialog));
if (result == GTK_RESPONSE_ACCEPT) {
/* apply download */
- parse_xml_buffer(_("Webservice"), state.xmldata, state.xmldata_len, NULL);
- report_dives(TRUE, FALSE);
+ 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 */
+ // TBD
/* store last entered uid in config */
subsurface_set_conf("webservice_uid", gtk_entry_get_text(GTK_ENTRY(uid)));
}