From 33527cb9e51da2c82f89d975e69fec23e607dea8 Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Sat, 30 Oct 2021 13:23:47 -0700 Subject: [PATCH] core: add more C interfaces for fingerprint table These are used to read/write fingerprint records as git or XML data from C code. Signed-off-by: Dirk Hohndel --- core/device.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++++++++ core/device.h | 10 ++++++++++ 2 files changed, 61 insertions(+) diff --git a/core/device.cpp b/core/device.cpp index 4b7eb9213..4d2220ff9 100644 --- a/core/device.cpp +++ b/core/device.cpp @@ -252,3 +252,54 @@ extern "C" void create_fingerprint_node(struct fingerprint_table *table, uint32_ table->fingerprints.insert(it, fpr); } } + +extern "C" void create_fingerprint_node_from_hex(struct fingerprint_table *table, uint32_t model, uint32_t serial, + const char *hex_data, uint32_t fdeviceid, uint32_t fdiveid) +{ + QByteArray raw = QByteArray::fromHex(hex_data); + create_fingerprint_node(table, model, serial, + (const unsigned char *)raw.constData(), raw.size(), fdeviceid, fdiveid); +} + +extern "C" int nr_fingerprints(struct fingerprint_table *table) +{ + return table->fingerprints.size(); +} + +extern "C" uint32_t fp_get_model(struct fingerprint_table *table, unsigned int i) +{ + if (!table || i >= table->fingerprints.size()) + return 0; + return table->fingerprints[i].model; +} + +extern "C" uint32_t fp_get_serial(struct fingerprint_table *table, unsigned int i) +{ + if (!table || i >= table->fingerprints.size()) + return 0; + return table->fingerprints[i].serial; +} + +extern "C" uint32_t fp_get_deviceid(struct fingerprint_table *table, unsigned int i) +{ + if (!table || i >= table->fingerprints.size()) + return 0; + return table->fingerprints[i].fdeviceid; +} + +extern "C" uint32_t fp_get_diveid(struct fingerprint_table *table, unsigned int i) +{ + if (!table || i >= table->fingerprints.size()) + return 0; + return table->fingerprints[i].fdiveid; +} + +extern "C" char *fp_get_data(struct fingerprint_table *table, unsigned int i) +{ + if (!table || i >= table->fingerprints.size()) + return 0; + 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()); +} diff --git a/core/device.h b/core/device.h index 95c1f7694..720f0db5c 100644 --- a/core/device.h +++ b/core/device.h @@ -44,9 +44,19 @@ extern void free_device_table(struct device_table *devices); // create fingerprint entry - raw data remains owned by caller extern void create_fingerprint_node(struct fingerprint_table *table, uint32_t model, uint32_t serial, const unsigned char *raw_data, unsigned int fsize, uint32_t fdeviceid, uint32_t fdiveid); +extern void create_fingerprint_node_from_hex(struct fingerprint_table *table, uint32_t model, uint32_t serial, + const char *hex_data, uint32_t fdeviceid, uint32_t fdiveid); // look up the fingerprint for model/serial - returns the number of bytes in the fingerprint; memory owned by the table extern unsigned int get_fingerprint_data(const struct fingerprint_table *table, uint32_t model, uint32_t serial, const unsigned char **fp_out); +// access the fingerprint data from C +extern int nr_fingerprints(struct fingerprint_table *table); +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); + #ifdef __cplusplus } #endif