summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2008-10-09 09:09:01 +0200
committerJohan Hedberg <johan.hedberg@nokia.com>2008-10-09 09:09:01 +0200
commit69adac833c5633714b84bf840c75aa814193b8a6 (patch)
treeabd05d52f8f14d99337fd2e4d224009cbf9e3fea
parente4d0a3b9051923b015ce633f9385e5af126211fe (diff)
Don't detect profile removal on during reverse service discovery
Some devices will hide their service secords when they are connected so we incorrectly think that they have removed support for the profile. A simple solution is not to try to do this detection when we are doing reverse service discovery.
-rw-r--r--src/adapter.c2
-rw-r--r--src/device.c21
-rw-r--r--src/device.h2
3 files changed, 16 insertions, 9 deletions
diff --git a/src/adapter.c b/src/adapter.c
index d850bee3..1e22b4b3 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -1901,7 +1901,7 @@ static DBusMessage *create_device(DBusConnection *conn,
device_set_temporary(device, FALSE);
- device_browse(device, conn, msg, NULL);
+ device_browse(device, conn, msg, NULL, FALSE);
adapter->devices = g_slist_append(adapter->devices, device);
diff --git a/src/device.c b/src/device.c
index bd58f7c3..778fc6f2 100644
--- a/src/device.c
+++ b/src/device.c
@@ -400,7 +400,7 @@ static DBusMessage *discover_services(DBusConnection *conn,
goto fail;
if (strlen(pattern) == 0) {
- err = device_browse(device, conn, msg, NULL);
+ err = device_browse(device, conn, msg, NULL, FALSE);
if (err < 0)
goto fail;
} else {
@@ -409,7 +409,7 @@ static DBusMessage *discover_services(DBusConnection *conn,
if (bt_string2uuid(&uuid, pattern) < 0)
return invalid_args(msg);
- err = device_browse(device, conn, msg, &uuid);
+ err = device_browse(device, conn, msg, &uuid, FALSE);
if (err < 0)
goto fail;
}
@@ -1097,7 +1097,7 @@ done:
search_cb(recs, err, user_data);
}
-static void init_browse(struct browse_req *req)
+static void init_browse(struct browse_req *req, gboolean reverse)
{
GSList *l;
@@ -1132,13 +1132,20 @@ static void init_browse(struct browse_req *req)
}
}
+ /* If we are doing reverse-SDP don't try to detect removed profiles
+ * since some devices hide their service records while they are
+ * connected
+ */
+ if (reverse)
+ return;
+
for (l = req->device->uuids; l; l = l->next)
req->uuids_removed = g_slist_append(req->uuids_removed,
l->data);
}
int device_browse(struct btd_device *device, DBusConnection *conn,
- DBusMessage *msg, uuid_t *search)
+ DBusMessage *msg, uuid_t *search, gboolean reverse)
{
struct btd_adapter *adapter = device->adapter;
struct browse_req *req;
@@ -1164,7 +1171,7 @@ int device_browse(struct btd_device *device, DBusConnection *conn,
cb = search_cb;
} else {
sdp_uuid16_create(&uuid, uuid_list[req->search_uuid++]);
- init_browse(req);
+ init_browse(req, reverse);
cb = browse_cb;
}
@@ -1268,7 +1275,7 @@ static gboolean start_discovery(gpointer user_data)
{
struct btd_device *device = user_data;
- device_browse(device, NULL, NULL, NULL);
+ device_browse(device, NULL, NULL, NULL, TRUE);
device->discov_timer = 0;
@@ -1299,7 +1306,7 @@ int device_set_paired(DBusConnection *conn, struct btd_device *device,
}
return device_browse(device, bonding->conn, bonding->msg,
- NULL);
+ NULL, FALSE);
}
/* If we are not initiators and there is no currently active discovery
diff --git a/src/device.h b/src/device.h
index f977d7eb..a1fa15ab 100644
--- a/src/device.h
+++ b/src/device.h
@@ -29,7 +29,7 @@ struct btd_device *device_create(DBusConnection *conn, struct btd_adapter *adapt
void device_remove(DBusConnection *conn, struct btd_device *device);
gint device_address_cmp(struct btd_device *device, const gchar *address);
int device_browse(struct btd_device *device, DBusConnection *conn,
- DBusMessage *msg, uuid_t *search);
+ DBusMessage *msg, uuid_t *search, gboolean reverse);
void device_probe_drivers(struct btd_device *device, GSList *uuids, sdp_list_t *recs);
struct btd_adapter *device_get_adapter(struct btd_device *device);
void device_get_address(struct btd_device *adapter, bdaddr_t *bdaddr);