diff options
| author | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2008-05-07 21:58:19 +0000 | 
|---|---|---|
| committer | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2008-05-07 21:58:19 +0000 | 
| commit | ca1711891647c07d70fbcce29ef7e7576e45c016 (patch) | |
| tree | 2707e6d39887542db7deab093001b7d9c86cd61d /network/manager.c | |
| parent | a16521516b28c155bbaa2edaea31d4c8efd53345 (diff) | |
Fix dbus internals calls.
Diffstat (limited to 'network/manager.c')
| -rw-r--r-- | network/manager.c | 163 | 
1 files changed, 19 insertions, 144 deletions
| diff --git a/network/manager.c b/network/manager.c index a65f56a5..2ad0a97d 100644 --- a/network/manager.c +++ b/network/manager.c @@ -44,6 +44,7 @@  #include "dbus-helper.h"  #include "logging.h"  #include "textfile.h" +#include "glib-helper.h"  #define NETWORK_MANAGER_INTERFACE "org.bluez.network.Manager" @@ -213,47 +214,26 @@ static DBusHandlerResult remove_path(DBusConnection *conn,  	return send_message_and_unref(conn, reply);  } -static void pan_record_reply(DBusPendingCall *call, void *data) +static void records_cb(sdp_list_t *recs, int err, gpointer data)  {  	struct pending_reply *pr = data; -	DBusMessage *reply = dbus_pending_call_steal_reply(call); -	DBusError derr; -	int len, scanned; -	uint8_t *rec_bin; +	int len;  	sdp_data_t *d;  	sdp_record_t *rec = NULL;  	char name[MAX_NAME_SIZE], *desc = NULL; -	dbus_error_init(&derr); -	if (dbus_set_error_from_message(&derr, reply)) { -		/* FIXME: forward error as is */ -		if (dbus_error_has_name(&derr, -				"org.bluez.Error.ConnectionAttemptFailed")) -			error_connection_attempt_failed(pr->conn, pr->msg, -					EINVAL); -		else -			error_not_supported(pr->conn, pr->msg); - -		error("GetRemoteServiceRecord failed: %s(%s)", derr.name, -			derr.message); +	if (err < 0) { +		error_connection_attempt_failed(pr->conn, pr->msg, -err);  		goto fail;  	} -	if (!dbus_message_get_args(reply, &derr, -				DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &rec_bin, &len, -				DBUS_TYPE_INVALID)) { +	if (!recs || !recs->data) {  		error_not_supported(pr->conn, pr->msg); -		error("%s: %s", derr.name, derr.message); +		error("Invalid PAN service record");  		goto fail;  	} -	if (len == 0) { -		error_not_supported(pr->conn, pr->msg); -		error("Invalid PAN service record length"); -		goto fail; -	} - -	rec = sdp_extract_pdu(rec_bin, &scanned); +	rec = recs->data;  	/* Concat remote name and service name */  	memset(name, 0, MAX_NAME_SIZE); @@ -276,6 +256,8 @@ static void pan_record_reply(DBusPendingCall *call, void *data)  				d->unitSize, d->val.str);  	} +	sdp_list_free(recs, (sdp_free_func_t) sdp_record_free); +  	if (connection_register(pr->path, &pr->src, &pr->dst, pr->id, name,  				desc) < 0) {  		error_failed(pr->conn, pr->msg, "D-Bus path registration failed"); @@ -286,125 +268,12 @@ static void pan_record_reply(DBusPendingCall *call, void *data)  	connection_paths = g_slist_append(connection_paths, g_strdup(pr->path));  	create_path(pr->conn, pr->msg, pr->path, "ConnectionCreated"); -fail: - -	if (desc) -		g_free(desc); - -	sdp_record_free(rec); -	dbus_error_free(&derr); -	pending_reply_free(pr); -	dbus_message_unref(reply); -} - -static int get_record(struct pending_reply *pr, uint32_t handle, -					DBusPendingCallNotifyFunction cb) -{ -	DBusMessage *msg; -	DBusPendingCall *pending; - -	msg = dbus_message_new_method_call("org.bluez", pr->adapter_path, -			"org.bluez.Adapter", "GetRemoteServiceRecord"); -	if (!msg) -		return -1; - -	dbus_message_append_args(msg, -			DBUS_TYPE_STRING, &pr->addr, -			DBUS_TYPE_UINT32, &handle, -			DBUS_TYPE_INVALID); - -	if (dbus_connection_send_with_reply(pr->conn, msg, &pending, -1) == FALSE) { -		error("Can't send D-Bus message."); -		dbus_message_unref(msg); -		return -1; -	} - -	dbus_pending_call_set_notify(pending, cb, pr, NULL); -	dbus_message_unref(msg); -	dbus_pending_call_unref(pending); - -	return 0; -} - -static void pan_handle_reply(DBusPendingCall *call, void *data) -{ -	struct pending_reply *pr = data; -	DBusMessage *reply = dbus_pending_call_steal_reply(call); -	DBusError derr; -	uint32_t *phandle; -	int len; -	dbus_error_init(&derr); -	if (dbus_set_error_from_message(&derr, reply)) { -		/* FIXME : forward error as is */ -		if (dbus_error_has_name(&derr, -				"org.bluez.Error.ConnectionAttemptFailed")) -			error_connection_attempt_failed(pr->conn, pr->msg, -					EINVAL); -		else -			error_not_supported(pr->conn, pr->msg); - -		error("GetRemoteServiceHandles: %s(%s)", derr.name, -				derr.message); -		goto fail; -	} - -	if (!dbus_message_get_args(reply, &derr, -				DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &phandle, -				&len, DBUS_TYPE_INVALID)) { -		error_not_supported(pr->conn, pr->msg); -		error("%s: %s", derr.name, derr.message); -		goto fail; -	} - -	if (!len) { -		error_not_supported(pr->conn, pr->msg); -		goto fail; -	} - -	if (get_record(pr, *phandle, pan_record_reply) < 0) { -		error_not_supported(pr->conn, pr->msg); -		goto fail; -	} - -	dbus_message_unref(reply); -	return;  fail: -	dbus_error_free(&derr); +	g_free(desc);  	pending_reply_free(pr);  } -static int get_handles(struct pending_reply *pr, -			DBusPendingCallNotifyFunction cb) -{ -	DBusMessage *msg; -	DBusPendingCall *pending; -	const char *uuid; - -	msg = dbus_message_new_method_call("org.bluez", pr->adapter_path, -			"org.bluez.Adapter", "GetRemoteServiceHandles"); -	if (!msg) -		return -1; - -	uuid = bnep_uuid(pr->id); -	dbus_message_append_args(msg, -			DBUS_TYPE_STRING, &pr->addr, -			DBUS_TYPE_STRING, &uuid, -			DBUS_TYPE_INVALID); - -	if (dbus_connection_send_with_reply(pr->conn, msg, &pending, -1) == FALSE) { -		error("Can't send D-Bus message."); -		dbus_message_unref(msg); -		return -1; -	} - -	dbus_pending_call_set_notify(pending, cb, pr, NULL); -	dbus_message_unref(msg); -	dbus_pending_call_unref(pending); - -	return 0; -} -  static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg,  					void *data)  { @@ -520,9 +389,10 @@ static DBusHandlerResult create_connection(DBusConnection *conn,  	const char *str;  	bdaddr_t src;  	uint16_t id; -	int dev_id; +	int dev_id, err;  	char key[32];  	GSList *l; +	uuid_t uuid;  	dbus_error_init(&derr);  	if (!dbus_message_get_args(msg, &derr, @@ -573,8 +443,13 @@ static DBusHandlerResult create_connection(DBusConnection *conn,  	snprintf(pr->path, MAX_PATH_LENGTH,  			NETWORK_PATH"/connection%d", net_uid++); -	if (get_handles(pr, pan_handle_reply) < 0) +	sdp_uuid16_create(&uuid, pr->id); +	err = bt_search_service(&pr->src, &pr->dst, &uuid, records_cb, pr, +				NULL); +	if (err < 0) { +		pending_reply_free(pr);  		return error_not_supported(conn, msg); +	}  	return DBUS_HANDLER_RESULT_HANDLED;  } | 
