summaryrefslogtreecommitdiffstats
path: root/hcid/device.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2008-06-06 14:19:19 +0000
committerMarcel Holtmann <marcel@holtmann.org>2008-06-06 14:19:19 +0000
commitd69e08eb0d567b61106ca37e0546402f4ae0c34e (patch)
treeaac8e575a293a56994d224d5b12bfba784d1522e /hcid/device.c
parentf62f8d892b5d5cc5aedef83779671c1ed54a35da (diff)
Check for alternative UUIDs if public browse group fails
Diffstat (limited to 'hcid/device.c')
-rw-r--r--hcid/device.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/hcid/device.c b/hcid/device.c
index f24b98b1..9a814047 100644
--- a/hcid/device.c
+++ b/hcid/device.c
@@ -69,6 +69,7 @@ struct browse_req {
DBusConnection *conn;
DBusMessage *msg;
struct device *device;
+ int search_uuid;
};
struct hci_peer {
@@ -118,6 +119,14 @@ static struct hci_dev devices[MAX_DEVICES];
#define ASSERT_DEV_ID { if (dev_id >= MAX_DEVICES) return -ERANGE; }
+static uint16_t uuid_list[] = {
+ PUBLIC_BROWSE_GROUP,
+ GENERIC_AUDIO_SVCLASS_ID,
+ ADVANCED_AUDIO_SVCLASS_ID,
+ AV_REMOTE_SVCLASS_ID,
+ 0
+};
+
void init_adapters(void)
{
int i;
@@ -1077,6 +1086,7 @@ static void browse_cb(sdp_list_t *recs, int err, gpointer user_data)
int i;
GSList *l;
DBusMessage *reply;
+ uuid_t uuid;
if (err < 0)
goto proceed;
@@ -1126,6 +1136,16 @@ static void browse_cb(sdp_list_t *recs, int err, gpointer user_data)
DBUS_TYPE_ARRAY, &uuids);
g_free(uuids);
+ /* Public browsing was succesful */
+ if (!req->search_uuid && recs)
+ goto proceed;
+
+ if (uuid_list[++req->search_uuid]) {
+ sdp_uuid16_create(&uuid, uuid_list[req->search_uuid]);
+ bt_search_service(&src, &dst, &uuid, browse_cb, user_data, NULL);
+ return;
+ }
+
proceed:
dbus_connection_emit_signal(req->conn, dbus_message_get_path(req->msg),
ADAPTER_INTERFACE, "DeviceCreated",
@@ -1156,6 +1176,7 @@ int device_browse(struct device *device, DBusConnection *conn,
struct adapter *adapter = device->adapter;
struct browse_req *req;
bdaddr_t src, dst;
+ uuid_t uuid;
req = g_new0(struct browse_req, 1);
req->conn = dbus_connection_ref(conn);
@@ -1164,7 +1185,9 @@ int device_browse(struct device *device, DBusConnection *conn,
str2ba(adapter->address, &src);
str2ba(device->address, &dst);
- return bt_discover_services(&src, &dst, browse_cb, req, NULL);
+ sdp_uuid16_create(&uuid, uuid_list[req->search_uuid]);
+
+ return bt_search_service(&src, &dst, &uuid, browse_cb, req, NULL);
}
static GSList *drivers = NULL;