diff --git a/doc/device-api.txt b/doc/device-api.txt
index 36ea1d9..d7a30cd 100644
--- a/doc/device-api.txt
+++ b/doc/device-api.txt
Interface org.bluez.Device1
Object path [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX
-Methods dict DiscoverServices(string pattern)
-
- This method starts the service discovery to retrieve
- remote service records. The pattern parameter can
- be used to specify specific UUIDs. And empty string
- will look for the public browse group.
-
- The return value is a dictionary with the record
- handles as keys and the service record in XML format
- as values. The key is uint32 and the value a string
- for this dictionary.
-
- Possible errors: org.bluez.Error.NotReady
- org.bluez.Error.Failed
- org.bluez.Error.InProgress
-
- void CancelDiscovery()
-
- This method will cancel any previous DiscoverServices
- transaction.
-
- Possible errors: org.bluez.Error.NotReady
- org.bluez.Error.Failed
- org.bluez.Error.NotAuthorized
-
- void Connect()
+Methods void Connect()
This is a generic method to connect any profiles
the remote device supports that can be connected
diff --git a/src/device.c b/src/device.c
index 0e66f79..e7aa44d 100644
--- a/src/device.c
+++ b/src/device.c
browse_request_cancel(req);
}
-static DBusMessage *discover_services(DBusConnection *conn,
- DBusMessage *msg, void *user_data)
-{
- struct btd_device *device = user_data;
- const char *pattern;
- int err;
-
- if (device->browse)
- return btd_error_in_progress(msg);
-
- if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &pattern,
- DBUS_TYPE_INVALID) == FALSE)
- return btd_error_invalid_args(msg);
-
- if (strlen(pattern) == 0) {
- err = device_browse_sdp(device, msg, NULL, FALSE);
- if (err < 0)
- goto fail;
- } else {
- uuid_t uuid;
-
- if (bt_string2uuid(&uuid, pattern) < 0)
- return btd_error_invalid_args(msg);
-
- sdp_uuid128_to_uuid(&uuid);
-
- err = device_browse_sdp(device, msg, &uuid, FALSE);
- if (err < 0)
- goto fail;
- }
-
- return NULL;
-
-fail:
- return btd_error_failed(msg, strerror(-err));
-}
-
-static const char *browse_request_get_requestor(struct browse_req *req)
-{
- if (!req->msg)
- return NULL;
-
- return dbus_message_get_sender(req->msg);
-}
-
-static void iter_append_record(DBusMessageIter *dict, uint32_t handle,
- const char *record)
-{
- DBusMessageIter entry;
-
- dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
- NULL, &entry);
-
- dbus_message_iter_append_basic(&entry, DBUS_TYPE_UINT32, &handle);
-
- dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &record);
-
- dbus_message_iter_close_container(dict, &entry);
-}
-
-static void discover_services_reply(struct browse_req *req, int err,
- sdp_list_t *recs)
-{
- DBusConnection *conn = btd_get_dbus_connection();
- DBusMessage *reply;
- DBusMessageIter iter, dict;
- sdp_list_t *seq;
-
- if (err) {
- const char *err_if;
-
- if (err == -EHOSTDOWN)
- err_if = ERROR_INTERFACE ".ConnectionAttemptFailed";
- else
- err_if = ERROR_INTERFACE ".Failed";
-
- reply = dbus_message_new_error(req->msg, err_if,
- strerror(-err));
- g_dbus_send_message(conn, reply);
- return;
- }
-
- reply = dbus_message_new_method_return(req->msg);
- if (!reply)
- return;
-
- dbus_message_iter_init_append(reply, &iter);
-
- dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
- DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
- DBUS_TYPE_UINT32_AS_STRING DBUS_TYPE_STRING_AS_STRING
- DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
-
- for (seq = recs; seq; seq = seq->next) {
- sdp_record_t *rec = (sdp_record_t *) seq->data;
- GString *result;
-
- if (!rec)
- break;
-
- result = g_string_new(NULL);
-
- convert_sdp_record_to_xml(rec, result,
- (void *) g_string_append);
-
- if (result->len)
- iter_append_record(&dict, rec->handle, result->str);
-
- g_string_free(result, TRUE);
- }
-
- dbus_message_iter_close_container(&iter, &dict);
-
- g_dbus_send_message(conn, reply);
-}
-
-static DBusMessage *cancel_discover(DBusConnection *conn,
- DBusMessage *msg, void *user_data)
-{
- struct btd_device *device = user_data;
- const char *sender = dbus_message_get_sender(msg);
- const char *requestor;
-
- if (!device->browse)
- return btd_error_does_not_exist(msg);
-
- if (!dbus_message_is_method_call(device->browse->msg, DEVICE_INTERFACE,
- "DiscoverServices"))
- return btd_error_not_authorized(msg);
-
- requestor = browse_request_get_requestor(device->browse);
-
- /* only the discover requestor can cancel the inquiry process */
- if (!requestor || !g_str_equal(requestor, sender))
- return btd_error_not_authorized(msg);
-
- discover_services_reply(device->browse, -ECANCELED, NULL);
-
- browse_request_cancel(device->browse);
-
- return dbus_message_new_method_return(msg);
-}
-
static void bonding_request_cancel(struct bonding_req *bonding)
{
struct btd_device *device = bonding->device;
if (device->bonding)
bonding_request_cancel(device->bonding);
- if (device->browse) {
- discover_services_reply(device->browse, -ECANCELED, NULL);
+ if (device->browse)
browse_request_cancel(device->browse);
- }
if (device->connect) {
DBusMessage *reply = btd_error_failed(device->connect,
return;
if (dbus_message_is_method_call(req->msg, DEVICE_INTERFACE,
- "DiscoverServices")) {
- discover_services_reply(req, err, dev->tmp_records);
- return;
- }
-
- if (dbus_message_is_method_call(req->msg, DEVICE_INTERFACE,
"Pair")) {
reply = dbus_message_new_method_return(req->msg);
g_dbus_send_message(conn, reply);
}
static const GDBusMethodTable device_methods[] = {
- { GDBUS_ASYNC_METHOD("DiscoverServices",
- GDBUS_ARGS({ "pattern", "s" }),
- GDBUS_ARGS({ "services", "a{us}" }),
- discover_services) },
- { GDBUS_METHOD("CancelDiscovery", NULL, NULL, cancel_discover) },
{ GDBUS_ASYNC_METHOD("Disconnect", NULL, NULL, disconnect) },
{ GDBUS_ASYNC_METHOD("Connect", NULL, NULL, dev_connect) },
{ GDBUS_ASYNC_METHOD("ConnectProfile", GDBUS_ARGS({ "UUID", "s" }),
device_cancel_bonding(device, status);
}
- if (device->browse) {
- discover_services_reply(device->browse, -ECANCELED, NULL);
+ if (device->browse)
browse_request_cancel(device->browse);
- }
g_slist_foreach(device->connected_profiles, dev_disconn_profile,
device);