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" +  | 
