From 0a27978014162f88f1ac26695e7180f502e66498 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Wed, 22 Oct 2014 12:11:12 -0700 Subject: Use the new DC_FIELD_STRING callback if it exists This recognizes recognize some strigns (serial number and firmware version), and the ones that it doesn't recognize it adds as extra data using Dirk's new interface. Signed-off-by: Linus Torvalds Signed-off-by: Dirk Hohndel --- libdivecomputer.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'libdivecomputer.c') diff --git a/libdivecomputer.c b/libdivecomputer.c index ff8d0eb93..c78d3b620 100644 --- a/libdivecomputer.c +++ b/libdivecomputer.c @@ -397,6 +397,39 @@ static uint32_t calculate_diveid(const unsigned char *fingerprint, unsigned int return csum[0]; } +static uint32_t calculate_string_hash(const char *str) +{ + return calculate_diveid(str, strlen(str)); +} + +#ifdef DC_FIELD_STRING +static void parse_string_field(struct dive *dive, dc_field_string_t *str) +{ + // Our dive ID is the string hash of the "Dive ID" string + if (!strcmp(str->desc, "Dive ID")) { + if (!dive->dc.diveid) + dive->dc.diveid = calculate_string_hash(str->value); + return; + } + + if (!strcmp(str->desc, "Serial")) { + if (!dive->dc.serial) + dive->dc.serial = strdup(str->value); + if (!dive->dc.deviceid) + dive->dc.deviceid = calculate_string_hash(str->value); + return; + } + + if (!strcmp(str->desc, "FW Version")) { + if (!dive->dc.fw_version) + dive->dc.fw_version = strdup(str->value); + return; + } + + add_extra_data(&dive->dc, str->desc, str->value); +} +#endif + /* returns true if we want libdivecomputer's dc_device_foreach() to continue, * false otherwise */ static int dive_cb(const unsigned char *data, unsigned int size, @@ -494,6 +527,20 @@ static int dive_cb(const unsigned char *data, unsigned int size, dive->dc.surface_pressure.mbar = rint(surface_pressure * 1000.0); #endif +#ifdef DC_FIELD_STRING + // The dive parsing may give us more device information + int idx; + for (idx = 0; idx < 100; idx++) { + dc_field_string_t str = { NULL }; + rc = dc_parser_get_field(parser, DC_FIELD_STRING, idx, &str); + if (rc != DC_STATUS_SUCCESS) + break; + if (!str.desc || !str.value) + break; + parse_string_field(dive, &str); + } +#endif + rc = parse_gasmixes(devdata, dive, parser, ngases, data); if (rc != DC_STATUS_SUCCESS) { dev_info(devdata, translate("gettextFromC", "Error parsing the gas mix")); -- cgit v1.2.3-70-g09d2