mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
OSTCTools - Improve error management
- Introduce an exit point to cowardly run away from the file if something goes wrong (undefined dc family, inconsistent family/model pair, etc), without crashing subsurface. - Simplifies (user point of view) and makes translatables the error messages shown in the status bar. - Modifies ostc_prepare_data() to emit a return code to manage posible failures. Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
2847fb4af5
commit
4e88140b43
1 changed files with 18 additions and 13 deletions
31
ostctools.c
31
ostctools.c
|
@ -38,7 +38,7 @@ static dc_descriptor_t *ostc_get_data_descriptor(int data_model, dc_family_t dat
|
|||
/*
|
||||
* Fills a device_data_t structure with known dc data and a descriptor.
|
||||
*/
|
||||
static void ostc_prepare_data(int data_model, dc_family_t dc_fam, device_data_t *dev_data)
|
||||
static int ostc_prepare_data(int data_model, dc_family_t dc_fam, device_data_t *dev_data)
|
||||
{
|
||||
device_data_t *ldc_dat = calloc(1, sizeof(device_data_t));
|
||||
dc_descriptor_t *data_descriptor;
|
||||
|
@ -53,8 +53,10 @@ static void ostc_prepare_data(int data_model, dc_family_t dc_fam, device_data_t
|
|||
ldc_dat->vendor = copy_string(data_descriptor->vendor);
|
||||
ldc_dat->model = copy_string(data_descriptor->product);
|
||||
*dev_data = *ldc_dat;
|
||||
}
|
||||
} else
|
||||
return 0;
|
||||
free(ldc_dat);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -71,17 +73,15 @@ void ostctools_import(const char *file, struct dive_table *divetable)
|
|||
char *tmp;
|
||||
struct dive *ostcdive = alloc_dive();
|
||||
dc_status_t rc = 0;
|
||||
int model = 0, i = 0;
|
||||
int model, ret, i = 0;
|
||||
unsigned int serial;
|
||||
struct extra_data *ptr;
|
||||
|
||||
// Open the archive
|
||||
if ((archive = subsurface_fopen(file, "rb")) == NULL) {
|
||||
report_error(translate("gettextFromC", "Error: couldn't open the file"));
|
||||
free(devdata);
|
||||
free(buffer);
|
||||
report_error(translate("gettextFromC", "Failed to read '%s'"), file);
|
||||
free(ostcdive);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
|
||||
// Read dive number from the log
|
||||
|
@ -124,9 +124,14 @@ void ostctools_import(const char *file, struct dive_table *divetable)
|
|||
dc_fam = DC_FAMILY_NULL;
|
||||
}
|
||||
|
||||
// Prepare data to pass to libdivecomputer. OSTC protocol doesn't include
|
||||
// a model number so will use 0.
|
||||
ostc_prepare_data(model, dc_fam, devdata);
|
||||
// Prepare data to pass to libdivecomputer.
|
||||
ret = ostc_prepare_data(model, dc_fam, devdata);
|
||||
if (ret == 0){
|
||||
report_error(translate("gettextFromC", "Unknown DC in dive %d"), ostcdive->number);
|
||||
free(ostcdive);
|
||||
fclose(archive);
|
||||
goto out;
|
||||
}
|
||||
tmp = calloc(strlen(devdata->vendor)+strlen(devdata->model)+28,1);
|
||||
sprintf(tmp, "%s %s (Imported from OSTCTools)", devdata->vendor, devdata->model);
|
||||
ostcdive->dc.model = copy_string(tmp);
|
||||
|
@ -135,7 +140,7 @@ void ostctools_import(const char *file, struct dive_table *divetable)
|
|||
// Parse the dive data
|
||||
rc = libdc_buffer_parser(ostcdive, devdata, buffer, i+1);
|
||||
if (rc != DC_STATUS_SUCCESS)
|
||||
report_error("Libdc returned error -%s- for dive %d", errmsg(rc), ostcdive->number);
|
||||
report_error(translate("gettextFromC","Error - %s - parsing dive %d"), errmsg(rc), ostcdive->number);
|
||||
|
||||
// Serial number is not part of the header nor the profile, so libdc won't
|
||||
// catch it. If Serial is part of the extra_data, and set to zero, remove
|
||||
|
@ -153,10 +158,10 @@ void ostctools_import(const char *file, struct dive_table *divetable)
|
|||
*ptr = *(ptr)->next;
|
||||
}
|
||||
|
||||
free(devdata);
|
||||
free(buffer);
|
||||
record_dive_to_table(ostcdive, divetable);
|
||||
mark_divelist_changed(true);
|
||||
sort_table(divetable);
|
||||
fclose(archive);
|
||||
out: free(devdata);
|
||||
free(buffer);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue