mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Uemis downloader: more code restructuring
Another helper function to make things easier to read - but actually even this helper is still quite complex so I'm not done yet as I'd like to simplyfy this even further. Signed-off-by: glerch <guido.lerch@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
9921f32f80
commit
277dbf2a67
1 changed files with 84 additions and 82 deletions
|
@ -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);
|
||||||
|
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 *do_uemis_import(device_data_t *data)
|
||||||
{
|
{
|
||||||
const char *mountpath = data->devname;
|
const char *mountpath = data->devname;
|
||||||
|
@ -1074,23 +1155,16 @@ const char *do_uemis_import(device_data_t *data)
|
||||||
char *newmax = NULL;
|
char *newmax = NULL;
|
||||||
int first, start, end = -2;
|
int first, start, end = -2;
|
||||||
uint32_t deviceidnr;
|
uint32_t deviceidnr;
|
||||||
//char objectid[10];
|
|
||||||
char *deviceid = NULL;
|
char *deviceid = NULL;
|
||||||
const char *result = NULL;
|
const char *result = NULL;
|
||||||
char *endptr;
|
char *endptr;
|
||||||
bool success, keep_number = false, once = true;
|
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 deleted_files = 0;
|
||||||
int last_found_log_file_nr = 0;
|
int last_found_log_file_nr = 0;
|
||||||
int match_dive_and_log = 0;
|
int match_dive_and_log = 0;
|
||||||
int start_cleanup = 0;
|
int start_cleanup = 0;
|
||||||
struct dive_table *td = NULL;
|
|
||||||
struct dive *dive = NULL;
|
|
||||||
int uemis_mem_status = UEMIS_MEM_OK;
|
int uemis_mem_status = UEMIS_MEM_OK;
|
||||||
|
|
||||||
const char *dTime;
|
|
||||||
|
|
||||||
if (dive_table.nr == 0)
|
if (dive_table.nr == 0)
|
||||||
keep_number = true;
|
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
|
* 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 */
|
* 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);
|
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 < 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);
|
||||||
for (int i = match_dive_and_log; i < td->nr; i++) {
|
if (!success)
|
||||||
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 */
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue