summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2008-06-10 22:24:46 +0000
committerMarcel Holtmann <marcel@holtmann.org>2008-06-10 22:24:46 +0000
commita6f07d2bf12942854072c37c3c42d7447921beee (patch)
treec5f35ec2ba0b6914d3473017e2cd004195e75bd3
parentee47b8948cf78f2dd3f9c1ee94916cec5387481d (diff)
Use the pattern parameter in DiscoverServices()
-rw-r--r--hcid/adapter.c2
-rw-r--r--hcid/dbus-hci.c3
-rw-r--r--hcid/device.c28
-rw-r--r--hcid/device.h2
4 files changed, 27 insertions, 8 deletions
diff --git a/hcid/adapter.c b/hcid/adapter.c
index f3472256..94eaa25a 100644
--- a/hcid/adapter.c
+++ b/hcid/adapter.c
@@ -3895,7 +3895,7 @@ static DBusMessage *create_device(DBusConnection *conn,
device->temporary = FALSE;
- device_browse(device, conn, msg, FALSE);
+ device_browse(device, conn, msg, FALSE, 0);
adapter->devices = g_slist_append(adapter->devices, device);
diff --git a/hcid/dbus-hci.c b/hcid/dbus-hci.c
index 89ab956d..c7be87e3 100644
--- a/hcid/dbus-hci.c
+++ b/hcid/dbus-hci.c
@@ -1263,7 +1263,8 @@ proceed:
dbus_message_unref(reply);
} else {
device->temporary = FALSE;
- device_browse(device, bonding->conn, bonding->msg, FALSE);
+ device_browse(device, bonding->conn,
+ bonding->msg, FALSE, 0);
}
}
diff --git a/hcid/device.c b/hcid/device.c
index 500a401c..a9a937c6 100644
--- a/hcid/device.c
+++ b/hcid/device.c
@@ -76,6 +76,7 @@ struct browse_req {
struct device *device;
int search_uuid;
gboolean update;
+ gboolean browse;
};
struct hci_peer {
@@ -1030,12 +1031,22 @@ static DBusMessage *discover_services(DBusConnection *conn,
{
struct device *device = user_data;
const char *pattern;
+ uint16_t search;
if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &pattern,
DBUS_TYPE_INVALID) == FALSE)
return NULL;
- device_browse(device, conn, msg, TRUE);
+ if (strlen(pattern) == 0) {
+ device_browse(device, conn, msg, TRUE, 0);
+ return NULL;
+ }
+
+ search = sdp_str2svclass(pattern);
+ if (!search)
+ return invalid_args(msg);
+
+ device_browse(device, conn, msg, TRUE, search);
return NULL;
}
@@ -1295,8 +1306,8 @@ 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)
+ /* Public browsing successful or Single record requested */
+ if (req->browse == FALSE || (!req->search_uuid && recs))
goto probe;
if (uuid_list[++req->search_uuid]) {
@@ -1377,7 +1388,7 @@ fail:
}
int device_browse(struct device *device, DBusConnection *conn,
- DBusMessage *msg, gboolean update)
+ DBusMessage *msg, gboolean update, uint16_t search)
{
struct adapter *adapter = device->adapter;
struct browse_req *req;
@@ -1392,7 +1403,14 @@ int device_browse(struct device *device, DBusConnection *conn,
str2ba(adapter->address, &src);
str2ba(device->address, &dst);
- sdp_uuid16_create(&uuid, uuid_list[req->search_uuid]);
+
+ if (search) {
+ sdp_uuid16_create(&uuid, search);
+ req->browse = FALSE;
+ } else {
+ sdp_uuid16_create(&uuid, uuid_list[req->search_uuid]);
+ req->browse = TRUE;
+ }
return bt_search_service(&src, &dst, &uuid, browse_cb, req, NULL);
}
diff --git a/hcid/device.h b/hcid/device.h
index a3d5c903..985a7b46 100644
--- a/hcid/device.h
+++ b/hcid/device.h
@@ -47,7 +47,7 @@ struct device *device_create(DBusConnection *conn, struct adapter *adapter,
void device_remove(DBusConnection *conn, struct device *device);
gint device_address_cmp(struct device *device, const gchar *address);
int device_browse(struct device *device, DBusConnection *conn,
- DBusMessage *msg, gboolean update);
+ DBusMessage *msg, gboolean update, uint16_t search);
void device_probe_drivers(struct device *device);
#define BTD_UUIDS(args...) ((const char *[]) { args, NULL } )