aboutsummaryrefslogtreecommitdiffstats
path: root/libdivecomputer.c
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2012-08-27 15:06:58 -0700
committerGravatar Linus Torvalds <torvalds@linux-foundation.org>2012-08-27 15:06:58 -0700
commita44d0049f6370d022067b8aee5e847f9fe550cf1 (patch)
tree78ddd1208a2592b521f28d712947e6e404e38a59 /libdivecomputer.c
parentd96b504bc4f926de86d06c3797b2fbcafb8727bf (diff)
downloadsubsurface-a44d0049f6370d022067b8aee5e847f9fe550cf1.tar.gz
Update for new libdivecomputer interfaces
For this you need to get the current libdivecomputer tree, reconfigure, build and install it first. But this cleans up some of the silly error handling too, and has just a single "dc_device_close()" call etc, rather than duplicating that (and the new dc_context_free()). Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'libdivecomputer.c')
-rw-r--r--libdivecomputer.c54
1 files changed, 29 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;