static bool load_uemis_divespot(const char *mountpath, int divespot_id) { char divespotnr[10]; snprintf(divespotnr, sizeof(divespotnr), "%d", divespot_id); param_buff[2] = divespotnr; #if UEMIS_DEBUG & 2 fprintf(debugfile, "getDivespot %d\n", divespot_id); #endif bool success = uemis_get_answer(mountpath, "getDivespot", 3, 0, NULL); if (mbuf && success) { #if UEMIS_DEBUG & 16 do_dump_buffer_to_file(mbuf, "Spot"); #endif return parse_divespot(mbuf); } return false; }
const char *do_uemis_import(const char *mountpath, short force_download) { char *newmax = NULL; int start, end = -2, i, offset; uint32_t deviceidnr; char objectid[10]; char *deviceid = NULL; const char *result = NULL; char *endptr; bool success, keep_number = false, once = true; if (dive_table.nr == 0) keep_number = true; uemis_info(translate("gettextFromC", "Init Communication")); if (!uemis_init(mountpath)) return translate("gettextFromC", "Uemis init failed"); if (!uemis_get_answer(mountpath, "getDeviceId", 0, 1, &result)) goto bail; deviceid = strdup(param_buff[0]); deviceidnr = atoi(deviceid); /* the answer from the DeviceId call becomes the input parameter for getDeviceData */ if (!uemis_get_answer(mountpath, "getDeviceData", 1, 0, &result)) goto bail; /* param_buff[0] is still valid */ if (!uemis_get_answer(mountpath, "initSession", 1, 6, &result)) goto bail; uemis_info(translate("gettextFromC", "Start download")); if (!uemis_get_answer(mountpath, "processSync", 0, 2, &result)) goto bail; /* before starting the long download, check if user pressed cancel */ if (import_thread_cancelled) goto bail; param_buff[1] = "notempty"; /* if we have an empty divelist or force it, then we start downloading from the * first dive on the Uemis; otherwise check which was the last dive downloaded */ if (!force_download && dive_table.nr > 0) newmax = uemis_get_divenr(deviceid); else newmax = strdup("0"); 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); #endif param_buff[2] = newmax; param_buff[3] = 0; success = uemis_get_answer(mountpath, "getDivelogs", 3, 0, &result); /* process the buffer we have assembled */ if (mbuf) if (!process_raw_buffer(deviceidnr, mbuf, &newmax, keep_number, NULL)) { /* if no dives were downloaded, mark end appropriately */ if (end == -2) end = start - 1; success = false; } if (once) { char *t = first_object_id_val(mbuf); if (t && atoi(t) > start) start = atoi(t); free(t); once = false; } #if UEMIS_DEBUG & 4 fprintf(debugfile, "d_u_i after download and parse start %d end %d newmax %s\n", start, end, newmax); #endif /* if the user clicked cancel, exit gracefully */ if (import_thread_cancelled) goto bail; /* if we got an error or got nothing back, stop trying */ if (!success || !param_buff[3]) break; /* finally, if the memory is getting too full, maybe we better stop, too */ if (progress_bar_fraction > 0.85) { result = translate("gettextFromC", ERR_FS_ALMOST_FULL); break; } /* clean up mbuf */ endptr = strstr(mbuf, "{{{"); if (endptr) *(endptr + 2) = '\0'; /* last object_id we parsed */ sscanf(newmax, "%d", &end); } 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); #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(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]; snprintf(divespotnr, sizeof(divespotnr), "%d", i); param_buff[2] = divespotnr; #if UEMIS_DEBUG & 2 fprintf(debugfile, "getDivespot %d\n", i); #endif success = uemis_get_answer(mountpath, "getDivespot", 3, 0, &result); if (mbuf) parse_divespot(mbuf); } bail: (void)uemis_get_answer(mountpath, "terminateSync", 0, 3, &result); if (!strcmp(param_buff[0], "error")) { if (!strcmp(param_buff[2], "Out of Memory")) result = translate("gettextFromC", ERR_FS_FULL); else result = param_buff[2]; } free(deviceid); return result; }