diff options
| author | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2008-03-06 21:58:13 +0000 | 
|---|---|---|
| committer | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2008-03-06 21:58:13 +0000 | 
| commit | 6eab5e203d793fbeea8a488a315a62ab2e69417e (patch) | |
| tree | 3843d76b14275da37d94acbe49c05a6eb3c29cee /hcid/adapter.c | |
| parent | 51a5483169faa3b64b50970891a545192836ee9b (diff) | |
added bt_discover_services function
Diffstat (limited to 'hcid/adapter.c')
| -rw-r--r-- | hcid/adapter.c | 60 | 
1 files changed, 46 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, | 
