summaryrefslogtreecommitdiffstats
path: root/hcid
diff options
context:
space:
mode:
authorClaudio Takahasi <claudio.takahasi@openbossa.org>2008-03-06 21:58:13 +0000
committerClaudio Takahasi <claudio.takahasi@openbossa.org>2008-03-06 21:58:13 +0000
commit6eab5e203d793fbeea8a488a315a62ab2e69417e (patch)
tree3843d76b14275da37d94acbe49c05a6eb3c29cee /hcid
parent51a5483169faa3b64b50970891a545192836ee9b (diff)
added bt_discover_services function
Diffstat (limited to 'hcid')
-rw-r--r--hcid/adapter.c60
-rw-r--r--hcid/adapter.h6
2 files changed, 52 insertions, 14 deletions
diff --git a/hcid/adapter.c b/hcid/adapter.c
index 5784b863..e58cb87a 100644
--- a/hcid/adapter.c
+++ b/hcid/adapter.c
@@ -62,6 +62,8 @@
#include "dbus-sdp.h"
#include "dbus-error.h"
#include "error.h"
+#include "glib-helper.h"
+#include "logging.h"
#define NUM_ELEMENTS(table) (sizeof(table)/sizeof(const char *))
@@ -3174,17 +3176,44 @@ static DBusHandlerResult list_devices(DBusConnection *conn,
return send_message_and_unref(conn, reply);
}
+static void discover_services_cb(gpointer user_data, sdp_list_t *recs, int err)
+{
+ struct adapter *adapter = user_data;
+ DBusMessage *reply;
+
+ if (err < 0) {
+ error_connection_attempt_failed(adapter->create->conn,
+ adapter->create->msg, -err);
+ goto failed;
+ }
+
+ /* FIXME: Register the device object path */
+
+ reply = dbus_message_new_method_return(adapter->create->msg);
+ send_message_and_unref(adapter->create->conn, reply);
+
+failed:
+ dbus_connection_unref(adapter->create->conn);
+ dbus_message_unref(adapter->create->msg);
+ g_free(adapter->create);
+ adapter->create = NULL;
+}
+
static DBusHandlerResult create_device(DBusConnection *conn,
- DBusMessage *msg, void *data)
+ DBusMessage *msg, void *data)
{
struct adapter *adapter = data;
- struct device *device;
- DBusMessage *reply;
- const char *address, *path;
+ struct create_device_req *create;
+ const char *address;
+ bdaddr_t src, dst;
+ int err;
if (!hcid_dbus_use_experimental())
return error_unknown_method(conn, msg);
+ if (adapter->create)
+ return error_in_progress(conn, msg, "CreateDevice in progress");
+
if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
DBUS_TYPE_INVALID) == FALSE)
return error_invalid_arguments(conn, msg, NULL);
@@ -3192,18 +3221,21 @@ static DBusHandlerResult create_device(DBusConnection *conn,
if (check_address(address) < 0)
return error_invalid_arguments(conn, msg, NULL);
- reply = dbus_message_new_method_return(msg);
- if (!reply)
- return DBUS_HANDLER_RESULT_NEED_MEMORY;
-
- device = device_create(adapter, address);
-
- path = device->path;
+ str2ba(adapter->address, &src);
+ str2ba(address, &dst);
+ err = bt_discover_services(&src, &dst,
+ discover_services_cb, adapter, NULL);
+ if (err < 0) {
+ error("Discover services failed!");
+ return error_connection_attempt_failed(conn, msg, -err);
+ }
- dbus_message_append_args(reply, DBUS_TYPE_STRING, &path,
- DBUS_TYPE_INVALID);
+ create = g_malloc0(sizeof(struct create_device_req));
+ create->conn = dbus_connection_ref(conn);
+ create->msg = dbus_message_ref(msg);
+ adapter->create = create;
- return send_message_and_unref(conn, reply);
+ return DBUS_HANDLER_RESULT_HANDLED;
}
static DBusHandlerResult remove_device(DBusConnection *conn,
diff --git a/hcid/adapter.h b/hcid/adapter.h
index 0331f29a..b6f30291 100644
--- a/hcid/adapter.h
+++ b/hcid/adapter.h
@@ -80,6 +80,11 @@ struct pending_dc_info {
guint timeout_id;
};
+struct create_device_req {
+ DBusConnection *conn;
+ DBusMessage *msg;
+};
+
struct adapter {
uint16_t dev_id;
int up;
@@ -106,6 +111,7 @@ struct adapter {
struct bonding_request_info *bonding;
GSList *pin_reqs;
struct pending_dc_info *pending_dc;
+ struct create_device_req *create;
};
dbus_bool_t adapter_init(DBusConnection *conn, const char *path);