I hope this works nor for you too, Dirk.

-- 
Best regards,
Guido
From cd5c20831b006fcb5da6397301026ac056fa949d Mon Sep 17 00:00:00 2001
From: glerch <[email protected]>
Date: Thu, 17 Sep 2015 16:46:02 +0200
Subject: [PATCH 7/7] UEMIS-fix alternating dive details

Implemented suggestion from Dir on how to deal with dive details
not being found.

I also cleaned up some unused variables, got rid of the last_log_file_nr
because it's not needed anymore.

I kept the UEMIS_DEBUG flags active on purpose.

One thing ins question I still need to check and this is whether we really
need to decrease the dive_to_read if we find deleted dive details, this is
still in but I dont think it's really needed.

Signed-off-by: glerch <[email protected]>
---
 uemis-downloader.c | 51 ++++++++++++++++++++++++++-------------------------
 1 file changed, 26 insertions(+), 25 deletions(-)

diff --git a/uemis-downloader.c b/uemis-downloader.c
index 0981f4b..43bda9b 100644
--- a/uemis-downloader.c
+++ b/uemis-downloader.c
@@ -31,7 +31,7 @@
 #define NUM_PARAM_BUFS 10
 
 // debugging setup
-// #define UEMIS_DEBUG 1 + 2 + 4 + 8 + 16 + 32
+#define UEMIS_DEBUG 1 + 2 + 4
 
 #define UEMIS_MAX_FILES 4000
 #define UEMIS_MEM_FULL 1
@@ -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)
-- 
1.9.5 (Apple Git-50.3)

_______________________________________________
subsurface mailing list
[email protected]
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to