diff options
| author | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2007-03-29 20:23:05 +0000 | 
|---|---|---|
| committer | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2007-03-29 20:23:05 +0000 | 
| commit | 3b82e98cb01ce9632701c0872e5e64f1290a0c8a (patch) | |
| tree | 59679c8d67364ebbbb49f4d3b08d675ba5b1bd8e | |
| parent | d0c225bdc87726ead2b2bcf5ba8e80921c338b57 (diff) | |
Fixes to use DefaultAdapter when an adapter is necessary.
| -rw-r--r-- | network/manager.c | 107 | 
1 files changed, 71 insertions, 36 deletions
| diff --git a/network/manager.c b/network/manager.c index 2f745c1c..1accb8a2 100644 --- a/network/manager.c +++ b/network/manager.c @@ -48,7 +48,6 @@  #include "common.h"  struct manager { -	bdaddr_t src;		/* Local adapter BT address */  	GSList *servers;	/* Network registered servers paths */  	GSList *connections;	/* Network registered connections paths */  }; @@ -182,11 +181,12 @@ static void pan_record_reply(DBusPendingCall *call, void *data)  	DBusError derr;  	int len, scanned;  	uint8_t *rec_bin; -	sdp_record_t *rec; +	sdp_record_t *rec = NULL;  	dbus_error_init(&derr);  	if (dbus_set_error_from_message(&derr, reply)) { -		if (dbus_error_has_name(&derr, "org.bluez.Error.ConnectionAttemptFailed")) +		if (dbus_error_has_name(&derr, +				"org.bluez.Error.ConnectionAttemptFailed"))  			err_connection_failed(pr->conn, pr->msg, derr.message);  		else  			err_not_supported(pr->conn, pr->msg); @@ -267,18 +267,20 @@ static void pan_handle_reply(DBusPendingCall *call, void *data)  	dbus_error_init(&derr);  	if (dbus_set_error_from_message(&derr, reply)) { -		if (dbus_error_has_name(&derr, "org.bluez.Error.ConnectionAttemptFailed")) +		if (dbus_error_has_name(&derr, +				"org.bluez.Error.ConnectionAttemptFailed"))  			err_connection_failed(pr->conn, pr->msg, derr.message);  		else  			err_not_supported(pr->conn, pr->msg); -		error("GetRemoteServiceHandles: %s(%s)", derr.name, derr.message); +		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)) { +				DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &phandle, +				&len, DBUS_TYPE_INVALID)) {  		err_not_supported(pr->conn, pr->msg);  		error("%s: %s", derr.name, derr.message);  		goto fail; @@ -302,7 +304,8 @@ fail:  	pending_reply_free(pr);  } -static int get_handles(struct pending_reply *pr, DBusPendingCallNotifyFunction cb) +static int get_handles(struct pending_reply *pr, +			DBusPendingCallNotifyFunction cb)  {  	DBusMessage *msg;  	DBusPendingCall *pending; @@ -330,6 +333,65 @@ static int get_handles(struct pending_reply *pr, DBusPendingCallNotifyFunction c  	return 0;  } +static void default_adapter_reply(DBusPendingCall *call, void *data) +{ +	struct pending_reply *pr = data; +	DBusMessage *reply = dbus_pending_call_steal_reply(call); +	DBusError derr; +	const char *adapter; + +	dbus_error_init(&derr); +	if (dbus_set_error_from_message(&derr, reply)) { +		err_connection_failed(pr->conn, pr->msg, derr.message); +		error("DefaultAdapter: %s(%s)", derr.name, derr.message); +		goto fail; +	} + +	if (!dbus_message_get_args(reply, &derr, +				DBUS_TYPE_STRING, &adapter, +				DBUS_TYPE_INVALID)) { +		err_connection_failed(pr->conn, pr->msg, derr.message); +		error("%s: %s", derr.name, derr.message); +		goto fail; +	} + +	pr->adapter_path = g_strdup(adapter); + +	if (get_handles(pr, pan_handle_reply) < 0) { +		err_failed(pr->conn, pr->msg, "D-Bus path registration failed"); +		goto fail; +	} + +	dbus_message_unref(reply); +	dbus_pending_call_unref(call); +	return; +fail: +	dbus_error_free(&derr); +	pending_reply_free(pr); +} + +static int get_default_adapter(struct pending_reply *pr, +		DBusPendingCallNotifyFunction cb) +{ +	DBusMessage *msg; +	DBusPendingCall *pending; + +	msg = dbus_message_new_method_call("org.bluez", "/org/bluez", +			"org.bluez.Manager", "DefaultAdapter"); +	if (!msg) +		return -1; + +	if (dbus_connection_send_with_reply(pr->conn, msg, &pending, -1) == FALSE) { +		error("Can't send D-Bus message."); +		return -1; +	} + +	dbus_pending_call_set_notify(pending, cb, pr, NULL); +	dbus_message_unref(msg); + +	return 0; +} +  static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg,  					void *data)  { @@ -402,7 +464,6 @@ static DBusHandlerResult create_connection(DBusConnection *conn,  	struct pending_reply *pr;  	static int uid = 0;  	DBusError derr; -	char src_addr[18];  	const char *addr;  	const char *str;  	uint16_t id; @@ -429,11 +490,8 @@ static DBusHandlerResult create_connection(DBusConnection *conn,  	pr->id = id;  	pr->path = g_new0(char, 48);  	snprintf(pr->path, 48, NETWORK_PATH "/connection%d", uid++); -	ba2str(&mgr->src, src_addr); -	pr->adapter_path = g_new0(char, 32); -	snprintf(pr->adapter_path , 32, "/org/bluez/hci%d", hci_devid(src_addr)); -	if (get_handles(pr, pan_handle_reply) < 0) { +	if (get_default_adapter(pr, default_adapter_reply) < 0) {  		err_failed(conn, msg, "D-Bus path registration failed");  		pending_reply_free(pr);  	} @@ -524,12 +582,6 @@ static const DBusObjectPathVTable manager_table = {  int network_dbus_init(void)  {  	struct manager *mgr; -	bdaddr_t src; -#if 0 -	int dev_id; -#endif - -	dbus_connection_set_exit_on_disconnect(connection, TRUE);  	mgr = g_new0(struct manager, 1); @@ -542,23 +594,6 @@ int network_dbus_init(void)  	info("Registered manager path:%s", NETWORK_PATH); -	/* Set the default adapter */ -	bacpy(&src, BDADDR_ANY); -#if 0 -	dev_id = hci_get_route(&src); -	if (dev_id < 0) { -		error("Bluetooth device not available"); -		goto fail; -	} - -	if (hci_devba(dev_id, &src) < 0) { -		error("Can't get local adapter device info"); -		goto fail; -	} -#endif - -	bacpy(&mgr->src, &src); -  	return 0;  fail: | 
