diff options
-rw-r--r-- | libdivecomputer.c | 54 | ||||
-rw-r--r-- | libdivecomputer.h | 1 |
2 files changed, 30 insertions, 25 deletions
diff --git a/libdivecomputer.c b/libdivecomputer.c index e362d1d2b..d96d2769f 100644 --- a/libdivecomputer.c +++ b/libdivecomputer.c @@ -305,13 +305,6 @@ static dc_status_t import_device_data(dc_device_t *device, device_data_t *device return dc_device_foreach(device, dive_cb, devicedata); } -static dc_status_t device_open(const char *devname, - dc_descriptor_t *descriptor, - dc_device_t **device) -{ - return dc_device_open(device, descriptor, devname); -} - static void event_cb(dc_device_t *device, dc_event_type_t event, const void *data, void *userdata) { @@ -351,42 +344,53 @@ cancel_cb(void *userdata) return import_thread_cancelled; } -static const char *do_libdivecomputer_import(device_data_t *data) +static const char *do_device_import(device_data_t *data) { - dc_device_t *device = NULL; dc_status_t rc; - - import_dive_number = 0; - rc = device_open(data->devname, data->descriptor, &device); - if (rc != DC_STATUS_SUCCESS) - return "Unable to open %s %s (%s)"; - data->device = device; + dc_device_t *device = data->device; // Register the event handler. int events = DC_EVENT_WAITING | DC_EVENT_PROGRESS | DC_EVENT_DEVINFO | DC_EVENT_CLOCK; rc = dc_device_set_events(device, events, event_cb, data); - if (rc != DC_STATUS_SUCCESS) { - dc_device_close(device); + if (rc != DC_STATUS_SUCCESS) return "Error registering the event handler."; - } // Register the cancellation handler. rc = dc_device_set_cancel(device, cancel_cb, data); - if (rc != DC_STATUS_SUCCESS) { - dc_device_close(device); + if (rc != DC_STATUS_SUCCESS) return "Error registering the cancellation handler."; - } rc = import_device_data(device, data); - if (rc != DC_STATUS_SUCCESS) { - dc_device_close(device); + if (rc != DC_STATUS_SUCCESS) return "Dive data import error"; - } - dc_device_close(device); + /* All good */ return NULL; } +static const char *do_libdivecomputer_import(device_data_t *data) +{ + dc_status_t rc; + const char *err; + + import_dive_number = 0; + data->device = NULL; + data->context = NULL; + + rc = dc_context_new(&data->context); + if (rc != DC_STATUS_SUCCESS) + return "Unable to create libdivecomputer context"; + + err = "Unable to open %s %s (%s)"; + rc = dc_device_open(&data->device, data->context, data->descriptor, data->devname); + if (rc == DC_STATUS_SUCCESS) { + err = do_device_import(data); + dc_device_close(data->device); + } + dc_context_free(data->context); + return err; +} + static void *pthread_wrapper(void *_data) { device_data_t *data = _data; diff --git a/libdivecomputer.h b/libdivecomputer.h index 8d77a25be..6b54e9c2a 100644 --- a/libdivecomputer.h +++ b/libdivecomputer.h @@ -15,6 +15,7 @@ typedef struct device_data_t { dc_descriptor_t *descriptor; const char *vendor, *product, *devname; dc_device_t *device; + dc_context_t *context; progressbar_t progress; int preexisting; } device_data_t; |