diff options
Diffstat (limited to 'src')
-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) |