dc_status_t dc_parser_new (dc_parser_t **out, dc_device_t *device) { if (device == NULL) return DC_STATUS_INVALIDARGS; return dc_parser_new_internal (out, device->context, dc_device_get_type (device), device->devinfo.model, device->clock.devtime, device->clock.systime); }
static void event_cb (dc_device_t *device, dc_event_type_t event, const void *data, void *userdata) { const dc_event_devinfo_t *devinfo = (const dc_event_devinfo_t *) data; event_data_t *eventdata = (event_data_t *) userdata; // Forward to the default event handler. dctool_event_cb (device, event, data, userdata); switch (event) { case DC_EVENT_DEVINFO: // Load the fingerprint from the cache. If there is no // fingerprint present in the cache, a NULL buffer is returned, // and the registered fingerprint will be cleared. if (eventdata->cachedir) { char filename[1024] = {0}; dc_family_t family = DC_FAMILY_NULL; dc_buffer_t *fingerprint = NULL; // Generate the fingerprint filename. family = dc_device_get_type (device); snprintf (filename, sizeof (filename), "%s/%s-%08X.bin", eventdata->cachedir, dctool_family_name (family), devinfo->serial); // Read the fingerprint file. fingerprint = dctool_file_read (filename); // Register the fingerprint data. dc_device_set_fingerprint (device, dc_buffer_get_data (fingerprint), dc_buffer_get_size (fingerprint)); // Free the buffer again. dc_buffer_free (fingerprint); } // Keep a copy of the event data. It will be used for generating // the fingerprint filename again after a (successful) download. eventdata->devinfo = *devinfo; break; default: break; } }
static dc_status_t download (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname, const char *cachedir, dc_buffer_t *fingerprint, dctool_output_t *output) { dc_status_t rc = DC_STATUS_SUCCESS; dc_device_t *device = NULL; dc_buffer_t *ofingerprint = NULL; // Open the device. message ("Opening the device (%s %s, %s).\n", dc_descriptor_get_vendor (descriptor), dc_descriptor_get_product (descriptor), devname ? devname : "null"); rc = dc_device_open (&device, context, descriptor, devname); if (rc != DC_STATUS_SUCCESS) { ERROR ("Error opening the device."); goto cleanup; } // Initialize the event data. event_data_t eventdata = {0}; if (fingerprint) { eventdata.cachedir = NULL; } else { eventdata.cachedir = cachedir; } // Register the event handler. message ("Registering the event handler.\n"); int events = DC_EVENT_WAITING | DC_EVENT_PROGRESS | DC_EVENT_DEVINFO | DC_EVENT_CLOCK | DC_EVENT_VENDOR; rc = dc_device_set_events (device, events, event_cb, &eventdata); if (rc != DC_STATUS_SUCCESS) { ERROR ("Error registering the event handler."); goto cleanup; } // Register the cancellation handler. message ("Registering the cancellation handler.\n"); rc = dc_device_set_cancel (device, dctool_cancel_cb, NULL); if (rc != DC_STATUS_SUCCESS) { ERROR ("Error registering the cancellation handler."); goto cleanup; } // Register the fingerprint data. if (fingerprint) { message ("Registering the fingerprint data.\n"); rc = dc_device_set_fingerprint (device, dc_buffer_get_data (fingerprint), dc_buffer_get_size (fingerprint)); if (rc != DC_STATUS_SUCCESS) { ERROR ("Error registering the fingerprint data."); goto cleanup; } } // Initialize the dive data. dive_data_t divedata = {0}; divedata.device = device; divedata.fingerprint = &ofingerprint; divedata.number = 0; divedata.output = output; // Download the dives. message ("Downloading the dives.\n"); rc = dc_device_foreach (device, dive_cb, &divedata); if (rc != DC_STATUS_SUCCESS) { ERROR ("Error downloading the dives."); goto cleanup; } // Store the fingerprint data. if (cachedir && ofingerprint) { char filename[1024] = {0}; dc_family_t family = DC_FAMILY_NULL; // Generate the fingerprint filename. family = dc_device_get_type (device); snprintf (filename, sizeof (filename), "%s/%s-%08X.bin", cachedir, dctool_family_name (family), eventdata.devinfo.serial); // Write the fingerprint file. dctool_file_write (filename, ofingerprint); } cleanup: dc_buffer_free (ofingerprint); dc_device_close (device); return rc; }
dc_status_t dc_parser_new (dc_parser_t **out, dc_device_t *device) { dc_status_t rc = DC_STATUS_SUCCESS; dc_parser_t *parser = NULL; if (out == NULL || device == NULL) return DC_STATUS_INVALIDARGS; dc_context_t *context = device->context; switch (dc_device_get_type (device)) { case DC_FAMILY_SUUNTO_SOLUTION: rc = suunto_solution_parser_create (&parser, context); break; case DC_FAMILY_SUUNTO_EON: rc = suunto_eon_parser_create (&parser, context, 0); break; case DC_FAMILY_SUUNTO_VYPER: if (device->devinfo.model == 0x01) rc = suunto_eon_parser_create (&parser, context, 1); else rc = suunto_vyper_parser_create (&parser, context); break; case DC_FAMILY_SUUNTO_VYPER2: case DC_FAMILY_SUUNTO_D9: rc = suunto_d9_parser_create (&parser, context, device->devinfo.model); break; case DC_FAMILY_UWATEC_ALADIN: case DC_FAMILY_UWATEC_MEMOMOUSE: rc = uwatec_memomouse_parser_create (&parser, context, device->clock.devtime, device->clock.systime); break; case DC_FAMILY_UWATEC_SMART: rc = uwatec_smart_parser_create (&parser, context, device->devinfo.model, device->clock.devtime, device->clock.systime); break; case DC_FAMILY_REEFNET_SENSUS: rc = reefnet_sensus_parser_create (&parser, context, device->clock.devtime, device->clock.systime); break; case DC_FAMILY_REEFNET_SENSUSPRO: rc = reefnet_sensuspro_parser_create (&parser, context, device->clock.devtime, device->clock.systime); break; case DC_FAMILY_REEFNET_SENSUSULTRA: rc = reefnet_sensusultra_parser_create (&parser, context, device->clock.devtime, device->clock.systime); break; case DC_FAMILY_OCEANIC_VTPRO: rc = oceanic_vtpro_parser_create (&parser, context); break; case DC_FAMILY_OCEANIC_VEO250: rc = oceanic_veo250_parser_create (&parser, context, device->devinfo.model); break; case DC_FAMILY_OCEANIC_ATOM2: if (device->devinfo.model == REACTPROWHITE) rc = oceanic_veo250_parser_create (&parser, context, device->devinfo.model); else rc = oceanic_atom2_parser_create (&parser, context, device->devinfo.model); break; case DC_FAMILY_MARES_NEMO: case DC_FAMILY_MARES_PUCK: rc = mares_nemo_parser_create (&parser, context, device->devinfo.model); break; case DC_FAMILY_MARES_DARWIN: rc = mares_darwin_parser_create (&parser, context, device->devinfo.model); break; case DC_FAMILY_MARES_ICONHD: rc = mares_iconhd_parser_create (&parser, context, device->devinfo.model); break; case DC_FAMILY_HW_OSTC: rc = hw_ostc_parser_create (&parser, context, 0); break; case DC_FAMILY_HW_FROG: case DC_FAMILY_HW_OSTC3: rc = hw_ostc_parser_create (&parser, context, 1); break; case DC_FAMILY_CRESSI_EDY: case DC_FAMILY_ZEAGLE_N2ITION3: rc = cressi_edy_parser_create (&parser, context, device->devinfo.model); break; case DC_FAMILY_CRESSI_LEONARDO: rc = cressi_leonardo_parser_create (&parser, context); break; case DC_FAMILY_ATOMICS_COBALT: rc = atomics_cobalt_parser_create (&parser, context); break; case DC_FAMILY_SHEARWATER_PREDATOR: rc = shearwater_predator_parser_create (&parser, context); break; case DC_FAMILY_SHEARWATER_PETREL: rc = shearwater_petrel_parser_create (&parser, context); break; default: return DC_STATUS_INVALIDARGS; } *out = parser; return rc; }