summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Woodhouse <David.Woodhouse@intel.com>2008-09-14 12:28:30 -0700
committerDavid Woodhouse <David.Woodhouse@intel.com>2008-09-14 12:42:18 -0700
commitaf8bb26f9bbc3ffb63a8dcc50768c59466540357 (patch)
tree0d961e384838acc720b6e2ff2c19c27c6247d35d
parent60af857dbc8a258eb91ef3fb6de06c17c8fb4ec2 (diff)
Find device ID from SDP records
-rw-r--r--src/device.h2
-rw-r--r--src/storage.c77
-rw-r--r--src/storage.h3
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"
+