diff options
author | David Woodhouse <David.Woodhouse@intel.com> | 2008-09-14 12:28:30 -0700 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2008-09-14 12:42:18 -0700 |
commit | af8bb26f9bbc3ffb63a8dcc50768c59466540357 (patch) | |
tree | 0d961e384838acc720b6e2ff2c19c27c6247d35d | |
parent | 60af857dbc8a258eb91ef3fb6de06c17c8fb4ec2 (diff) |
Find device ID from SDP records
-rw-r--r-- | src/device.h | 2 | ||||
-rw-r--r-- | src/storage.c | 77 | ||||
-rw-r--r-- | src/storage.h | 3 |
3 files changed, 75 insertions, 7 deletions
diff --git a/src/device.h b/src/device.h index 21f7ffaa..d2331173 100644 --- a/src/device.h +++ b/src/device.h @@ -45,8 +45,6 @@ uint8_t device_get_auth(struct btd_device *device); #define BTD_UUIDS(args...) ((const char *[]) { args, NULL } ) -#define PNP_UUID "00001200-0000-1000-8000-00805f9b34fb" - struct btd_device_driver { const char *name; const char **uuids; diff --git a/src/storage.c b/src/storage.c index c951f0f2..96c5edc4 100644 --- a/src/storage.c +++ b/src/storage.c @@ -46,6 +46,8 @@ #include "textfile.h" #include "glib-helper.h" +#include "storage.h" + static inline int create_filename(char *buf, size_t size, const bdaddr_t *bdaddr, const char *name) { char addr[18]; @@ -883,8 +885,8 @@ sdp_record_t *find_record_in_list(sdp_list_t *recs, const char *uuid) } int store_device_id(const gchar *src, const gchar *dst, - const uint16_t source, const uint16_t vendor, - const uint16_t product, const uint16_t version) + const uint16_t source, const uint16_t vendor, + const uint16_t product, const uint16_t version) { char filename[PATH_MAX + 1], str[20]; @@ -898,9 +900,9 @@ int store_device_id(const gchar *src, const gchar *dst, return textfile_put(filename, dst, str); } -int read_device_id(const gchar *src, const gchar *dst, - uint16_t *source, uint16_t *vendor, - uint16_t *product, uint16_t *version) +static int read_device_id_from_did(const gchar *src, const gchar *dst, + uint16_t *source, uint16_t *vendor, + uint16_t *product, uint16_t *version) { char filename[PATH_MAX + 1]; char *str, *vendor_str, *product_str, *version_str; @@ -948,3 +950,68 @@ int read_device_id(const gchar *src, const gchar *dst, return 0; } + +int read_device_id(const gchar *src, const gchar *dst, + uint16_t *source, uint16_t *vendor, + uint16_t *product, uint16_t *version) +{ + uint16_t lsource, lvendor, lproduct, lversion; + sdp_list_t *recs; + sdp_record_t *rec; + int err; + + err = read_device_id_from_did(src, dst, &lsource, vendor, + product, version); + if (!err) { + if (lsource == 0xFFFF) + err = -ENOENT; + + return err; + } + + recs = read_records(src, dst); + rec = find_record_in_list(recs, PNP_UUID); + + if (rec) { + sdp_data_t *pdlist; + + pdlist = sdp_data_get(rec, SDP_ATTR_VENDOR_ID_SOURCE); + lsource = pdlist ? pdlist->val.uint16 : 0x0000; + + pdlist = sdp_data_get(rec, SDP_ATTR_VENDOR_ID); + lvendor = pdlist ? pdlist->val.uint16 : 0x0000; + + pdlist = sdp_data_get(rec, SDP_ATTR_PRODUCT_ID); + lproduct = pdlist ? pdlist->val.uint16 : 0x0000; + + pdlist = sdp_data_get(rec, SDP_ATTR_VERSION); + lversion = pdlist ? pdlist->val.uint16 : 0x0000; + + err = 0; + } + sdp_list_free(recs, (sdp_free_func_t)sdp_record_free); + + if (err) { + /* FIXME: We should try EIR data if we have it, too */ + + /* If we don't have the data, we don't want to go + through the above search every time. */ + lsource = 0xFFFF; + lvendor = lproduct = lversion = 0; + } + + store_device_id(src, dst, lsource, lvendor, lproduct, lversion); + + if (err) + return err; + + if (source) + *source = lsource; + if (vendor) + *vendor = lvendor; + if (product) + *product = lproduct; + if (version) + *version = lversion; + return 0; +} diff --git a/src/storage.h b/src/storage.h index adfc420b..d6008a40 100644 --- a/src/storage.h +++ b/src/storage.h @@ -67,3 +67,6 @@ int store_device_id(const gchar *src, const gchar *dst, int read_device_id(const gchar *src, const gchar *dst, uint16_t *source, uint16_t *vendor, uint16_t *product, uint16_t *version); + +#define PNP_UUID "00001200-0000-1000-8000-00805f9b34fb" + |