One bug fix,
2 code simplifications that done have real algorithm changes.

-- 
Best regards,
Guido
From 75eedcfa1b3f3e57cf667661ca08bf6e52349c1b Mon Sep 17 00:00:00 2001
From: glerch <[email protected]>
Date: Mon, 14 Sep 2015 10:31:29 +0200
Subject: [PATCH 3/5] Uemis bugfix

Fixed a bug in do_uemis_download when cleaning up delted dives. My
test for valid dives was wrong. now counting the nr of dives in the
download table.

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

diff --git a/uemis-downloader.c b/uemis-downloader.c
index 9db2f33..7e7c4fc 100644
--- a/uemis-downloader.c
+++ b/uemis-downloader.c
@@ -10,7 +10,7 @@
  * Zurich) but did not actually use any of his copyrighted code, therefore the 
license under which
  * he released his code does not apply to this new implementation in C
  *
- * Modified by Guido Lerch [email protected] in August 2015
+ * Modified by Guido Lerch [email protected] in August 2015
  */
 #include <fcntl.h>
 #include <dirent.h>
@@ -1301,7 +1301,7 @@ const char *do_uemis_import(device_data_t *data)
        /* Regardless on where we are with the memory situation, it's time now
         * to see if we have to clean some dead bodies from our download table 
*/
        next_table_index = 0;
-       while (data->download_table->dives[next_table_index]) {
+       while (next_table_index < data->download_table->nr) {
                if (!data->download_table->dives[next_table_index]->downloaded)
                        uemis_delete_dive(data, 
data->download_table->dives[next_table_index]->dc.diveid);
                else
-- 
1.9.5 (Apple Git-50.3)

From 0f18babe5874f4d9252439c8f109bc3b82e00a4a Mon Sep 17 00:00:00 2001
From: glerch <[email protected]>
Date: Mon, 14 Sep 2015 10:42:00 +0200
Subject: [PATCH 4/5] Uemis code simplification 1

Reducing the identination within the do_uemis_import.

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

diff --git a/uemis-downloader.c b/uemis-downloader.c
index 7e7c4fc..063f4f6 100644
--- a/uemis-downloader.c
+++ b/uemis-downloader.c
@@ -1037,6 +1037,36 @@ static bool load_uemis_divespot(const char *mountpath, 
int divespot_id)
        return false;
 }
 
+static void get_uemis_divespot(const char *mountpath, int divespot_id, struct 
dive *dive)
+{
+       if (load_uemis_divespot(mountpath, divespot_id)) {
+               /* get the divesite based on the diveid, this should give us
+                * the newly created site
+                */
+               struct dive_site *nds = 
get_dive_site_by_uuid(dive->dive_site_uuid);
+               struct dive_site *ods = NULL;
+               if (nds) {
+                       /* with the divesite name we got from parse_dive, that 
is called on load_uemis_divespot
+                        * we search all existing divesites if we have one with 
the same name already. The function
+                        * returns the first found which is luckily not the 
newly created.
+                        */
+                       (void)get_dive_site_uuid_by_name(nds->name, &ods);
+                       if (ods) {
+                               /* if the uuid's are the same, the new site is 
a duplicat and can be deleted */
+                               if (nds->uuid != ods->uuid) {
+                                       delete_dive_site(nds->uuid);
+                                       dive->dive_site_uuid = ods->uuid;
+                               }
+                       }
+               }
+       } else {
+               /* if we cant load the dive site details, delete the site we
+                * created in process_raw_buffer
+                */
+               delete_dive_site(dive->dive_site_uuid);
+       }
+}
+
 const char *do_uemis_import(device_data_t *data)
 {
        const char *mountpath = data->devname;
@@ -1188,32 +1218,8 @@ const char *do_uemis_import(device_data_t *data)
 #endif
                                                                        
last_found_log_file_nr = dive_to_read;
                                                                        int 
divespot_id = uemis_get_divespot_id_by_diveid(dive->dc.diveid);
-                                                                       if 
(load_uemis_divespot(mountpath, divespot_id)) {
-                                                                               
/* get the divesite based on the diveid, this should give us
-                                                                               
 * the newly created site
-                                                                               
 */
-                                                                               
struct dive_site *nds = get_dive_site_by_uuid(dive->dive_site_uuid);
-                                                                               
struct dive_site *ods = NULL;
-                                                                               
if (nds) {
-                                                                               
        /* with the divesite name we got from parse_dive, that is called on 
load_uemis_divespot
-                                                                               
         * we search all existing divesites if we have one with the same name 
already. The function
-                                                                               
         * returns the first found which is luckily not the newly created.
-                                                                               
         */
-                                                                               
        (void)get_dive_site_uuid_by_name(nds->name, &ods);
-                                                                               
        if (ods) {
-                                                                               
                /* if the uuid's are the same, the new site is a duplicat and 
can be deleted */
-                                                                               
                if (nds->uuid != ods->uuid) {
-                                                                               
                        delete_dive_site(nds->uuid);
-                                                                               
                        dive->dive_site_uuid = ods->uuid;
-                                                                               
                }
-                                                                               
        }
-                                                                               
}
-                                                                       } else {
-                                                                               
/* if we cant load the dive site details, delete the site we
-                                                                               
 * created in process_raw_buffer
-                                                                               
 */
-                                                                               
delete_dive_site(dive->dive_site_uuid);
-                                                                       }
+                                                                       
(void)get_uemis_divespot(mountpath, divespot_id, dive);
+
                                                                } else {
                                                                        /* in 
this case we found a deleted file, so let's increment */
 #if UEMIS_DEBUG & 2
-- 
1.9.5 (Apple Git-50.3)

From 111e06a15a41b121e4def2c2e0bd9a4883682d35 Mon Sep 17 00:00:00 2001
From: glerch <[email protected]>
Date: Mon, 14 Sep 2015 22:04:10 +0200
Subject: [PATCH 5/5] Uemis - code simplification 2

Reducing code depth, not done yet as I'd like to
simplyfy the new helper further.

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

diff --git a/uemis-downloader.c b/uemis-downloader.c
index 063f4f6..2f88c97 100644
--- a/uemis-downloader.c
+++ b/uemis-downloader.c
@@ -1067,6 +1067,87 @@ 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)
+{
+       struct dive *dive = data->download_table->dives[idx];
+       const char *dTime = get_dive_date_c_string(dive->when);
+       char log_file_no_to_find[20];
+       char dive_to_read_buf[10];
+       bool found = false;
+
+       snprintf(log_file_no_to_find, sizeof(log_file_no_to_find), 
"logfilenr{int{%d", dive->dc.diveid);
+       while (!found) {
+               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
+               do_dump_buffer_to_file(mbuf, "Dive", round);
+#endif
+               *uemis_mem_status = get_memory(data->download_table);
+               if (*uemis_mem_status == UEMIS_MEM_OK || *uemis_mem_status == 
UEMIS_MEM_CRITICAL) {
+                       /* if the memory isn's completely full we can try to 
read more divelog vs. dive details
+                        * UEMIS_MEM_CRITICAL means not enough space for a full 
round but the dive details
+                        * and the divespots should fit into the UEMIS memory
+                        * The match we do here is to map the object_id to the 
logfilenr, we do this
+                        * by iterating through the last set of loaded divelogs 
and then find the corresponding
+                        * dive with the matching logfilenr */
+                       if (mbuf) {
+                               if (strstr(mbuf, log_file_no_to_find)) {
+                                       /* we found the logfilenr that matches 
our object_id from the divelog we were looking for
+                                        * we mark the search sucessfull even 
if the dive has been deleted. */
+                                       found = true;
+                                       if (strstr(mbuf, "deleted{bool{true") 
== NULL) {
+                                               process_raw_buffer(data, 
deviceidnr, mbuf, &newmax, false, NULL);
+                                               /* remember the last log file 
number as it is very likely that subsequent dives
+                                                * have the same or higher 
logfile number.
+                                                * UEMIS unfortunately deletes 
dives by deleting the dive details and not the logs. */
+#if UEMIS_DEBUG & 2
+                                               fprintf(debugfile, "Matching 
divelog id %d from %s with dive details %d\n", dive->dc.diveid, dTime, 
iDiveToRead);
+#endif
+                                               *last_found_log_file_nr = 
*dive_to_read;
+                                               int divespot_id = 
uemis_get_divespot_id_by_diveid(dive->dc.diveid);
+                                               
(void)get_uemis_divespot(mountpath, divespot_id, dive);
+
+                                       } else {
+                                               /* in this case we found a 
deleted file, so let's increment */
+#if UEMIS_DEBUG & 2
+                                               fprintf(debugfile, "TRY 
matching divelog id %d from %s with dive details %d but details are deleted\n", 
dive->dc.diveid, dTime, iDiveToRead);
+#endif
+                                               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", dTime, 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);
+                               }
+                       }
+                       *dive_to_read = *dive_to_read + 1;
+               } 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. */
+                       do_delete_dives(data->download_table, idx);
+                       return false;
+               }
+       }
+       /* 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;
+       if (*uemis_mem_status == UEMIS_MEM_FULL)
+               /* game over, not enough memory left */
+               return false;
+       return true;
+}
+
 const char *do_uemis_import(device_data_t *data)
 {
        const char *mountpath = data->devname;
@@ -1074,23 +1155,16 @@ const char *do_uemis_import(device_data_t *data)
        char *newmax = NULL;
        int first, start, end = -2;
        uint32_t deviceidnr;
-       //char objectid[10];
        char *deviceid = NULL;
        const char *result = NULL;
        char *endptr;
        bool success, keep_number = false, once = true;
-       char dive_to_read_buf[10];
-       char log_file_no_to_find[20];
        int deleted_files = 0;
        int last_found_log_file_nr = 0;
        int match_dive_and_log = 0;
        int start_cleanup = 0;
-       struct dive_table *td = NULL;
-       struct dive *dive = NULL;
        int uemis_mem_status = UEMIS_MEM_OK;
 
-       const char *dTime;
-
        if (dive_table.nr == 0)
                keep_number = true;
 
@@ -1180,81 +1254,9 @@ const char *do_uemis_import(device_data_t *data)
                         * 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);
-                       td = data->download_table;
-
-                       for (int i = match_dive_and_log; i < td->nr; i++) {
-                               dive = td->dives[i];
-                               dTime = get_dive_date_c_string(dive->when);
-                               snprintf(log_file_no_to_find, 
sizeof(log_file_no_to_find), "logfilenr{int{%d", dive->dc.diveid);
-
-                               bool found = false;
-                               while (!found) {
-                                       snprintf(dive_to_read_buf, 
sizeof(dive_to_read_buf), "%d", dive_to_read);
-                                       param_buff[2] = dive_to_read_buf;
-                                       success = uemis_get_answer(mountpath, 
"getDive", 3, 0, &result);
-#if UEMIS_DEBUG & 16
-                                       do_dump_buffer_to_file(mbuf, "Dive", 
round);
-#endif
-                                       uemis_mem_status = 
get_memory(data->download_table);
-                                       if (uemis_mem_status == UEMIS_MEM_OK || 
uemis_mem_status == UEMIS_MEM_CRITICAL) {
-                                               /* if the memory isn's 
completely full we can try to read more divelog vs. dive details
-                                                * UEMIS_MEM_CRITICAL means not 
enough space for a full round but the dive details
-                                                * and the divespots should fit 
into the UEMIS memory
-                                                * The match we do here is to 
map the object_id to the logfilenr, we do this
-                                                * by iterating through the 
last set of loaded divelogs and then find the corresponding
-                                                * dive with the matching 
logfilenr */
-                                               if (mbuf) {
-                                                       if (strstr(mbuf, 
log_file_no_to_find)) {
-                                                               /* we found the 
logfilenr that matches our object_id from the divelog we were looking for
-                                                                * we mark the 
search sucessfull even if the dive has been deleted. */
-                                                               found = true;
-                                                               if 
(strstr(mbuf, "deleted{bool{true") == NULL) {
-                                                                       
process_raw_buffer(data, deviceidnr, mbuf, &newmax, false, NULL);
-                                                                       /* 
remember the last log file number as it is very likely that subsequent dives
-                                                                        * have 
the same or higher logfile number.
-                                                                        * 
UEMIS unfortunately deletes dives by deleting the dive details and not the 
logs. */
-#if UEMIS_DEBUG & 2
-                                                                       
fprintf(debugfile, "Matching divelog id %d from %s with dive details %d\n", 
dive->dc.diveid, dTime, iDiveToRead);
-#endif
-                                                                       
last_found_log_file_nr = dive_to_read;
-                                                                       int 
divespot_id = uemis_get_divespot_id_by_diveid(dive->dc.diveid);
-                                                                       
(void)get_uemis_divespot(mountpath, divespot_id, dive);
-
-                                                               } else {
-                                                                       /* in 
this case we found a deleted file, so let's increment */
-#if UEMIS_DEBUG & 2
-                                                                       
fprintf(debugfile, "TRY matching divelog id %d from %s with dive details %d but 
details are deleted\n", dive->dc.diveid, dTime, iDiveToRead);
-#endif
-                                                                       
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", dTime, 
dive->dc.diveid);
-#endif
-                                                               }
-                                                       } 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);
-                                                       }
-                                               }
-                                               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. */
-                                               do_delete_dives(td, i);
-                                               break;
-                                       }
-                               }
-                               /* 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;
-                               if (uemis_mem_status == UEMIS_MEM_FULL)
-                                       /* game over, not enough memory left */
+                       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);
+                               if (!success)
                                        break;
                        }
 
-- 
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