diff options
Diffstat (limited to 'src/device.c')
| -rw-r--r-- | src/device.c | 32 | 
1 files changed, 24 insertions, 8 deletions
| diff --git a/src/device.c b/src/device.c index b90861b9..a1d1575e 100644 --- a/src/device.c +++ b/src/device.c @@ -975,8 +975,9 @@ static void browse_cb(sdp_list_t *recs, int err, gpointer user_data)  	bdaddr_t src;  	uuid_t uuid; -	/* Public browsing successful or Single record requested */ -	if (err < 0 || (!req->search_uuid && recs)) +	/* If we have a valid response and req->search_uuid == 1, then +	   public browsing was successful -- we don't need any more */ +	if (err < 0 || (req->search_uuid == 1 && recs))  		goto done;  	update_services(req, recs); @@ -984,8 +985,8 @@ static void browse_cb(sdp_list_t *recs, int err, gpointer user_data)  	adapter_get_address(adapter, &src);  	/* Search for mandatory uuids */ -	if (uuid_list[++req->search_uuid]) { -		sdp_uuid16_create(&uuid, uuid_list[req->search_uuid]); +	if (uuid_list[req->search_uuid]) { +		sdp_uuid16_create(&uuid, uuid_list[req->search_uuid++]);  		bt_search_service(&src, &device->bdaddr, &uuid, browse_cb, user_data, NULL);  		return;  	} @@ -1022,10 +1023,25 @@ static void init_browse(struct browse_req *req)  		for (i = 0; driver->uuids[i]; i++) {  			char *uuid; - +			int j; + +			/* Eliminate duplicates of UUIDs in uuid_list[]... */ +			if (strlen(driver->uuids[i]) == 36 &&  +			    !strncmp(driver->uuids[i], "0000", 4) && +			    !strcasecmp(driver->uuids[i] + 8,  +					"-0000-1000-8000-00805F9B34FB")) { +				uint16_t uuid16 = strtol(driver->uuids[i], +							 NULL, 16); +				for (j = 0; uuid_list[j]; j++) { +					if (uuid16 == uuid_list[j]) +						continue; +				} +					 +			} +			/* ... and of UUIDs another driver already asked for */  			if (g_slist_find_custom(req->uuids, driver->uuids[i],  					(GCompareFunc) strcasecmp)) -				return; +				continue;  			uuid = g_strdup(driver->uuids[i]);  			req->uuids = g_slist_append(req->uuids, uuid); @@ -1057,7 +1073,7 @@ int device_browse(struct btd_device *device, DBusConnection *conn,  		memcpy(&uuid, search, sizeof(uuid_t));  		cb = search_cb;  	} else { -		sdp_uuid16_create(&uuid, uuid_list[req->search_uuid]); +		sdp_uuid16_create(&uuid, uuid_list[req->search_uuid++]);  		init_browse(req);  		cb = browse_cb;  	} @@ -1072,7 +1088,7 @@ int device_browse(struct btd_device *device, DBusConnection *conn,  						device, NULL);  	return bt_search_service(&src, &device->bdaddr, -					&uuid, browse_cb, req, NULL); +					&uuid, cb, req, NULL);  }  struct btd_adapter *device_get_adapter(struct btd_device *device) | 
