summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--uemis-downloader.c49
1 files changed, 25 insertions, 24 deletions
diff --git a/uemis-downloader.c b/uemis-downloader.c
index 0981f4b5f..85a26d62a 100644
--- a/uemis-downloader.c
+++ b/uemis-downloader.c
@@ -69,6 +69,7 @@ static int mbuf_size = 0;
static int max_mem_used = -1;
static int next_table_index = 0;
+static int dive_to_read = 0;
/* helper function to parse the Uemis data structures */
static void uemis_ts(char *buffer, void *_when)
@@ -367,7 +368,7 @@ static void buffer_add(char **buffer, int *buffer_size, char *buf)
*buffer = realloc(*buffer, *buffer_size);
strcat(*buffer, buf);
}
-#if UEMIS_DEBUG & 16
+#if UEMIS_DEBUG & 8
fprintf(debugfile, "added \"%s\" to buffer - new length %d\n", buf, *buffer_size);
#endif
}
@@ -435,7 +436,7 @@ static void show_progress(char *buf, const char *what)
char *val = first_object_id_val(buf);
if (val) {
/* let the user know what we are working on */
-#if UEMIS_DEBUG & 16
+#if UEMIS_DEBUG & 8
fprintf(debugfile, "reading %s\n %s\n %s\n", what, val, buf);
#endif
uemis_info(translate("gettextFromC", "%s %s"), what, val);
@@ -789,7 +790,7 @@ static bool process_raw_buffer(device_data_t *devdata, uint32_t deviceid, char *
struct dive *dive = NULL;
char dive_no[10];
-#if UEMIS_DEBUG & 4
+#if UEMIS_DEBUG & 8
fprintf(debugfile, "p_r_b %s\n", inbuf);
#endif
if (for_dive)
@@ -1085,18 +1086,19 @@ static void get_uemis_divespot(const char *mountpath, int divespot_id, struct di
}
}
-static bool get_matching_dive(int idx, int *dive_to_read, int *last_found_log_file_nr, int *deleted_files, char *newmax, int *uemis_mem_status, struct device_data_t *data, const char* mountpath, const char deviceidnr)
+static bool get_matching_dive(int idx, char *newmax, int *uemis_mem_status, struct device_data_t *data, const char* mountpath, const char deviceidnr)
{
struct dive *dive = data->download_table->dives[idx];
char log_file_no_to_find[20];
char dive_to_read_buf[10];
bool found = false;
+ int deleted_files = 0;
snprintf(log_file_no_to_find, sizeof(log_file_no_to_find), "logfilenr{int{%d", dive->dc.diveid);
while (!found) {
if (import_thread_cancelled)
break;
- snprintf(dive_to_read_buf, sizeof(dive_to_read_buf), "%d", *dive_to_read);
+ snprintf(dive_to_read_buf, sizeof(dive_to_read_buf), "%d", dive_to_read);
param_buff[2] = dive_to_read_buf;
(void)uemis_get_answer(mountpath, "getDive", 3, 0, NULL);
#if UEMIS_DEBUG & 16
@@ -1122,9 +1124,8 @@ static bool get_matching_dive(int idx, int *dive_to_read, int *last_found_log_fi
* UEMIS unfortunately deletes dives by deleting the dive details and not the logs. */
#if UEMIS_DEBUG & 2
d_time = get_dive_date_c_string(dive->when);
- fprintf(debugfile, "Matching divelog id %d from %s with dive details %d\n", dive->dc.diveid, d_time, *dive_to_read);
+ fprintf(debugfile, "Matching divelog id %d from %s with dive details %d\n", dive->dc.diveid, d_time, dive_to_read);
#endif
- *last_found_log_file_nr = *dive_to_read;
int divespot_id = uemis_get_divespot_id_by_diveid(dive->dc.diveid);
get_uemis_divespot(mountpath, divespot_id, dive);
@@ -1132,26 +1133,28 @@ static bool get_matching_dive(int idx, int *dive_to_read, int *last_found_log_fi
/* in this case we found a deleted file, so let's increment */
#if UEMIS_DEBUG & 2
d_time = get_dive_date_c_string(dive->when);
- fprintf(debugfile, "TRY matching divelog id %d from %s with dive details %d but details are deleted\n", dive->dc.diveid, d_time, *dive_to_read);
+ fprintf(debugfile, "TRY matching divelog id %d from %s with dive details %d but details are deleted\n", dive->dc.diveid, d_time, dive_to_read);
#endif
- *deleted_files = *deleted_files + 1;
+ deleted_files++;
/* mark this log entry as deleted and cleanup later, otherwise we mess up our array */
dive->downloaded = false;
#if UEMIS_DEBUG & 2
fprintf(debugfile, "Deleted dive from %s, with id %d from table\n", d_time, dive->dc.diveid);
#endif
}
- return true;
} else {
- /* Ugly, need something better than this
- * essentially, if we start reading divelogs not from the start
- * we have no idea on how many log entries are there that have no
- * valid dive details */
- if (*dive_to_read >= dive->dc.diveid)
- *dive_to_read = (*dive_to_read - 2 >= 0 ? *dive_to_read - 2 : 0);
+ uint32_t nr_found = 0;
+ char *logfilenr = strstr(mbuf, "logfilenr");
+ if (logfilenr) {
+ sscanf(logfilenr, "logfilenr{int{%u", &nr_found);
+ if (nr_found >= dive->dc.diveid)
+ dive_to_read = dive_to_read - 2;
+ if (dive_to_read < -1)
+ dive_to_read = -1;
+ }
}
}
- *dive_to_read = *dive_to_read + 1;
+ dive_to_read++;
} else {
/* At this point the memory of the UEMIS is full, let's cleanup all divelog files were
* we could not match the details to. */
@@ -1161,8 +1164,8 @@ static bool get_matching_dive(int idx, int *dive_to_read, int *last_found_log_fi
}
/* decrement iDiveToRead by the amount of deleted entries found to assure
* we are not missing any valid matches when processing subsequent logs */
- *dive_to_read = (dive_to_read - deleted_files > 0 ? dive_to_read - deleted_files : 0);
- *deleted_files = 0;
+ dive_to_read = (dive_to_read - deleted_files > 0 ? dive_to_read - deleted_files : 0);
+ deleted_files = 0;
return true;
}
@@ -1177,8 +1180,6 @@ const char *do_uemis_import(device_data_t *data)
const char *result = NULL;
char *endptr;
bool success, keep_number = false, once = true;
- int deleted_files = 0;
- int last_found_log_file_nr = 0;
int match_dive_and_log = 0;
int uemis_mem_status = UEMIS_MEM_OK;
@@ -1188,6 +1189,7 @@ const char *do_uemis_import(device_data_t *data)
#endif
if (dive_table.nr == 0)
keep_number = true;
+
uemis_info(translate("gettextFromC", "Initialise communication"));
if (!uemis_init(mountpath)) {
free(reqtxt_path);
@@ -1220,7 +1222,7 @@ const char *do_uemis_import(device_data_t *data)
newmax = strdup("0");
first = start = atoi(newmax);
-
+ dive_to_read = first;
for (;;) {
#if UEMIS_DEBUG & 2
debug_round++;
@@ -1269,9 +1271,8 @@ const char *do_uemis_import(device_data_t *data)
* What the following part does is to optimize the mapping by using
* dive_to_read = the dive deatils entry that need to be read using the object_id
* logFileNoToFind = map the logfilenr of the dive details with the object_id = diveid from the get dive logs */
- int dive_to_read = (last_found_log_file_nr > 0 ? last_found_log_file_nr + 1 : start);
for (int i = match_dive_and_log; i < data->download_table->nr; i++) {
- bool success = get_matching_dive(i, &dive_to_read, &last_found_log_file_nr, &deleted_files, newmax, &uemis_mem_status, data, mountpath, deviceidnr);
+ bool success = get_matching_dive(i, newmax, &uemis_mem_status, data, mountpath, deviceidnr);
if (!success)
break;
if (import_thread_cancelled)