diff --git a/src/device.c b/src/device.c
index 9c6e1c5..63babc2 100644
--- a/src/device.c
+++ b/src/device.c
struct btd_device *device = req->device;
struct btd_adapter *adapter = device->adapter;
+ DBG("");
+
bt_cancel_discovery(btd_adapter_get_address(adapter), &device->bdaddr);
attio_cleanup(device);
return 0;
}
-static void discover_services_req_exit(DBusConnection *conn, void *user_data)
+static void browse_request_exit(DBusConnection *conn, void *user_data)
{
struct browse_req *req = user_data;
- DBG("DiscoverServices requestor exited");
+ DBG("Requestor exited");
browse_request_cancel(req);
}
DBG("ATT connection successful");
}
-static int device_browse_gatt(struct btd_device *device, DBusMessage *msg)
+static struct browse_req *browse_request_new(struct btd_device *device,
+ DBusMessage *msg)
{
- struct btd_adapter *adapter = device->adapter;
- struct att_callbacks *attcb;
struct browse_req *req;
if (device->browse)
- return -EBUSY;
+ return NULL;
req = g_new0(struct browse_req, 1);
req->device = device;
device->browse = req;
+ if (!msg)
+ return req;
+
+ req->msg = dbus_message_ref(msg);
+
+ /*
+ * Track the request owner to cancel it automatically if the owner
+ * exits
+ */
+ req->listener_id = g_dbus_add_disconnect_watch(dbus_conn,
+ dbus_message_get_sender(msg),
+ browse_request_exit,
+ req, NULL);
+
+ return req;
+}
+
+static int device_browse_gatt(struct btd_device *device, DBusMessage *msg)
+{
+ struct btd_adapter *adapter = device->adapter;
+ struct att_callbacks *attcb;
+ struct browse_req *req;
+
+ req = browse_request_new(device, msg);
+ if (!req)
+ return -EBUSY;
+
if (device->attrib) {
/*
* If discovery has not yet completed, then wait for gatt-client
* to become ready.
*/
if (!device->le_state.svc_resolved)
- goto done;
+ return 0;
/*
* Services have already been discovered, so signal this browse
return -EIO;
}
-done:
-
- if (msg) {
- const char *sender = dbus_message_get_sender(msg);
-
- req->msg = dbus_message_ref(msg);
- /* Track the request owner to cancel it
- * automatically if the owner exits */
- req->listener_id = g_dbus_add_disconnect_watch(dbus_conn,
- sender,
- discover_services_req_exit,
- req, NULL);
- }
-
return 0;
}
uuid_t uuid;
int err;
- if (device->browse)
+ req = browse_request_new(device, msg);
+ if (!req)
return -EBUSY;
- req = g_new0(struct browse_req, 1);
- req->device = device;
sdp_uuid16_create(&uuid, uuid_list[req->search_uuid++]);
req->sdp_flags = get_sdp_flags(device);
return err;
}
- device->browse = req;
-
- if (msg) {
- const char *sender = dbus_message_get_sender(msg);
-
- req->msg = dbus_message_ref(msg);
- /* Track the request owner to cancel it
- * automatically if the owner exits */
- req->listener_id = g_dbus_add_disconnect_watch(dbus_conn,
- sender,
- discover_services_req_exit,
- req, NULL);
- }
-
return err;
}