diff --git a/core/device.cpp b/core/device.cpp index 8096d1efa..05646df66 100644 --- a/core/device.cpp +++ b/core/device.cpp @@ -286,12 +286,20 @@ extern "C" uint32_t fp_get_diveid(struct fingerprint_table *table, unsigned int return table->fingerprints[i].fdiveid; } -extern "C" char *fp_get_data(struct fingerprint_table *table, unsigned int i) +static char to_hex_digit(unsigned char d) +{ + return d <= 9 ? d + '0' : d - 10 + 'a'; +} + +std::string fp_get_data(struct fingerprint_table *table, unsigned int i) { if (!table || i >= table->fingerprints.size()) - return 0; + return std::string(); struct fingerprint_record *fpr = &table->fingerprints[i]; - // fromRawData() avoids one copy of the raw_data - QByteArray hex = QByteArray::fromRawData((char *)fpr->raw_data, fpr->fsize).toHex(); - return strdup(hex.constData()); + std::string res(' ', fpr->fsize * 2); + for (unsigned int i = 0; i < fpr->fsize; ++i) { + res[2 * i] = to_hex_digit((fpr->raw_data[i] >> 4) & 0xf); + res[2 * i + 1] = to_hex_digit(fpr->raw_data[i] & 0xf); + } + return res; } diff --git a/core/device.h b/core/device.h index 2abd0aa14..147f56e1e 100644 --- a/core/device.h +++ b/core/device.h @@ -54,7 +54,6 @@ extern uint32_t fp_get_model(struct fingerprint_table *table, unsigned int i); extern uint32_t fp_get_serial(struct fingerprint_table *table, unsigned int i); extern uint32_t fp_get_deviceid(struct fingerprint_table *table, unsigned int i); extern uint32_t fp_get_diveid(struct fingerprint_table *table, unsigned int i); -extern char *fp_get_data(struct fingerprint_table *table, unsigned int i); extern int is_default_dive_computer_device(const char *); @@ -100,6 +99,8 @@ struct fingerprint_table { std::vector fingerprints; }; +std::string fp_get_data(struct fingerprint_table *table, unsigned int i); + #endif #endif // DEVICE_H diff --git a/core/save-git.cpp b/core/save-git.cpp index 78e0b0ec3..4112b217e 100644 --- a/core/save-git.cpp +++ b/core/save-git.cpp @@ -881,14 +881,12 @@ static void save_one_device(struct membuffer *b, const struct device *d) static void save_one_fingerprint(struct membuffer *b, int i) { - char *fp_data = fp_get_data(&fingerprint_table, i); put_format(b, "fingerprint model=%08x serial=%08x deviceid=%08x diveid=%08x data=\"%s\"\n", fp_get_model(&fingerprint_table, i), fp_get_serial(&fingerprint_table, i), fp_get_deviceid(&fingerprint_table, i), fp_get_diveid(&fingerprint_table, i), - fp_data); - free(fp_data); + fp_get_data(&fingerprint_table, i).c_str()); } static void save_settings(git_repository *repo, struct dir *tree) diff --git a/core/save-xml.cpp b/core/save-xml.cpp index b70c52587..89818d439 100644 --- a/core/save-xml.cpp +++ b/core/save-xml.cpp @@ -620,14 +620,12 @@ static void save_one_device(struct membuffer *b, const struct device *d) static void save_one_fingerprint(struct membuffer *b, int i) { - char *data = fp_get_data(&fingerprint_table, i); put_format(b, "\n", fp_get_model(&fingerprint_table, i), fp_get_serial(&fingerprint_table, i), fp_get_deviceid(&fingerprint_table, i), fp_get_diveid(&fingerprint_table, i), - data); - free(data); + fp_get_data(&fingerprint_table, i).c_str()); } extern "C" int save_dives(const char *filename)