summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--uemis-downloader.c84
1 files changed, 44 insertions, 40 deletions
diff --git a/uemis-downloader.c b/uemis-downloader.c
index ed3e94ec6..61cbbe0ef 100644
--- a/uemis-downloader.c
+++ b/uemis-downloader.c
@@ -847,7 +847,8 @@ const char *do_uemis_import(device_data_t *data)
const char *mountpath = data->devname;
short force_download = data->force_download;
char *newmax = NULL;
- int start, end = -2, i, offset;
+ int first, start, end = -2;
+ int i, offset = 0;
uint32_t deviceidnr;
char objectid[10];
char *deviceid = NULL;
@@ -883,7 +884,7 @@ const char *do_uemis_import(device_data_t *data)
newmax = uemis_get_divenr(deviceid);
else
newmax = strdup("0");
- start = atoi(newmax);
+ first = start = atoi(newmax);
for (;;) {
#if UEMIS_DEBUG & 4
fprintf(debugfile, "d_u_i inner loop start %d end %d newmax %s\n", start, end, newmax);
@@ -915,6 +916,46 @@ const char *do_uemis_import(device_data_t *data)
#if UEMIS_DEBUG & 4
fprintf(debugfile, "d_u_i after download and parse start %d end %d newmax %s progress %4.2f\n", start, end, newmax, progress_bar_fraction);
#endif
+ /* now download the additional dive data with "getDive" for the dives
+ * we just downloaded - yes, this is completely insane - why isn't all of
+ * this downloaded in the first place??? */
+ for (i = start; i <= end; i++) {
+ snprintf(objectid, sizeof(objectid), "%d", i + offset);
+ param_buff[2] = objectid;
+#if UEMIS_DEBUG & 2
+ fprintf(debugfile, "getDive %d, object_id %s\n", i, objectid);
+#endif
+ /* there is no way I have found to directly get the dive information
+ * for dive #i as the object_id and logfilenr can be different in the
+ * getDive call; so we get the first one, compare the actual divenr
+ * with the one that we wanted, calculate the offset and try again.
+ * What an insane design... */
+ success = uemis_get_answer(mountpath, "getDive", 3, 0, &result);
+ if (mbuf) {
+ int divenr;
+ (void)process_raw_buffer(data, deviceidnr, mbuf, &newmax, false, &divenr);
+#if UEMIS_DEBUG & 2
+ fprintf(debugfile, "got dive %d, looking for dive %d\n", divenr, i);
+#endif
+ if (divenr != i) {
+ if (divenr == -1) {
+ offset--;
+ } else {
+ offset += i - divenr;
+ }
+#if UEMIS_DEBUG & 2
+ fprintf(debugfile, " -> trying again with offset %d\n", offset);
+#endif
+ i = start - 1;
+ if (i + offset < 0)
+ break;
+ continue;
+ }
+ }
+ if (!success || import_thread_cancelled)
+ break;
+ }
+ start = end + 1;
/* if the user clicked cancel, exit gracefully */
if (import_thread_cancelled)
goto bail;
@@ -930,46 +971,9 @@ const char *do_uemis_import(device_data_t *data)
if (end == -2 && sscanf(newmax, "%d", &end) != 1)
end = start;
#if UEMIS_DEBUG & 2
- fprintf(debugfile, "done: read from object_id %d to %d\n", start, end);
+ fprintf(debugfile, "done: read from object_id %d to %d\n", first, end);
#endif
free(newmax);
- offset = 0;
- for (i = start; i <= end; i++) {
- snprintf(objectid, sizeof(objectid), "%d", i + offset);
- param_buff[2] = objectid;
-#if UEMIS_DEBUG & 2
- fprintf(debugfile, "getDive %d, object_id %s\n", i, objectid);
-#endif
- /* there is no way I have found to directly get the dive information
- * for dive #i as the object_id and logfilenr can be different in the
- * getDive call; so we get the first one, compare the actual divenr
- * with the one that we wanted, calculate the offset and try again.
- * What an insane design... */
- success = uemis_get_answer(mountpath, "getDive", 3, 0, &result);
- if (mbuf) {
- int divenr;
- (void)process_raw_buffer(data, deviceidnr, mbuf, &newmax, false, &divenr);
-#if UEMIS_DEBUG & 2
- fprintf(debugfile, "got dive %d, looking for dive %d\n", divenr, i);
-#endif
- if (divenr != i) {
- if (divenr == -1) {
- offset--;
- } else {
- offset += i - divenr;
- }
-#if UEMIS_DEBUG & 2
- fprintf(debugfile, " -> trying again with offset %d\n", offset);
-#endif
- i = start - 1;
- if (i + offset < 0)
- break;
- continue;
- }
- }
- if (!success || import_thread_cancelled)
- break;
- }
success = true;
for (i = 0; i <= nr_divespots; i++) {
char divespotnr[10];