+static int import_thread_done = 0, import_thread_cancelled;
+
+static int
+cancel_cb(void *userdata)
+{
+ return import_thread_cancelled;
+}
+
+static const char *do_device_import(device_data_t *data)
+{
+ dc_status_t rc;
+ 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)
+ return "Error registering the event handler.";
+
+ // Register the cancellation handler.
+ rc = dc_device_set_cancel(device, cancel_cb, data);
+ if (rc != DC_STATUS_SUCCESS)
+ return "Error registering the cancellation handler.";
+
+ rc = import_device_data(device, data);
+ if (rc != DC_STATUS_SUCCESS)
+ return "Dive data import error";
+
+ /* 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;
+ const char *err_string = do_libdivecomputer_import(data);
+ import_thread_done = 1;
+ return (void *)err_string;
+}
+
+GError *do_import(device_data_t *data)
+{
+ pthread_t pthread;
+ void *retval;
+
+ /* I'm sure there is some better interface for waiting on a thread in a UI main loop */
+ import_thread_done = 0;
+ pthread_create(&pthread, NULL, pthread_wrapper, data);
+ while (!import_thread_done) {
+ import_thread_cancelled = process_ui_events();
+ usleep(100000);
+ }
+ if (pthread_join(pthread, &retval) < 0)
+ retval = "Odd pthread error return";
+ if (retval)
+ return error(retval, data->vendor, data->product, data->devname);
+ return NULL;
+}