diff options
| author | Johan Hedberg <johan.hedberg@nokia.com> | 2008-09-25 19:01:08 -0700 | 
|---|---|---|
| committer | Johan Hedberg <johan.hedberg@nokia.com> | 2008-09-25 19:01:08 -0700 | 
| commit | fa2f213673116a81e9d6ac9740f96acd92987073 (patch) | |
| tree | cdc4f930f958a57083e3819797adc8be371a9b34 /src | |
| parent | 2ba670eae0d7d0d57160b7e5bd387079f86d933c (diff) | |
Implement first part of CancelDeviceCreation
Currently only canceling of CreatePairedDevice is supported
Diffstat (limited to 'src')
| -rw-r--r-- | src/adapter.c | 74 | 
1 files changed, 60 insertions, 14 deletions
| diff --git a/src/adapter.c b/src/adapter.c index f6aea35b..63039fec 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -1127,7 +1127,6 @@ static gboolean create_bonding_conn_complete(GIOChannel *io, GIOCondition cond,  		/* If we come here it implies a bug somewhere */  		debug("create_bonding_conn_complete: no pending bonding!");  		g_io_channel_close(io); -		g_io_channel_unref(io);  		return FALSE;  	} @@ -1280,28 +1279,43 @@ static void cancel_auth_request(struct pending_auth_info *auth, int dev_id)  	hci_close_dev(dd);  } -static void create_bond_req_exit(void *user_data) +static void cancel_bonding(struct btd_adapter *adapter, gboolean exited)  { -	struct btd_adapter *adapter = user_data;  	struct pending_auth_info *auth; +	struct bonding_request_info *bonding = adapter->bonding; -	debug("CreateConnection requestor exited before bonding was completed"); - -	auth = adapter_find_auth_request(adapter, &adapter->bonding->bdaddr); +	auth = adapter_find_auth_request(adapter, &adapter->bdaddr);  	if (auth) {  		cancel_auth_request(auth, adapter->dev_id);  		if (auth->agent)  			agent_cancel(auth->agent); -		adapter_remove_auth_request(adapter, &adapter->bonding->bdaddr); +		adapter_remove_auth_request(adapter, &bonding->bdaddr);  	}  	remove_pending_device(adapter); -	g_io_channel_close(adapter->bonding->io); -	if (adapter->bonding->io_id) -		g_source_remove(adapter->bonding->io_id); -	bonding_request_free(adapter->bonding); -	adapter->bonding = NULL; +	if (bonding->io) +		g_io_channel_close(bonding->io); + +	if (exited) { +		if (bonding->io_id) { +			g_source_remove(bonding->io_id); +			bonding->io_id = 0; +		} +		bonding_request_free(bonding); +		adapter->bonding = NULL; + +	} else +		bonding->cancel = TRUE; +} + +static void create_bond_req_exit(void *user_data) +{ +	struct btd_adapter *adapter = user_data; + +	debug("CreateConnection requestor exited before bonding was completed"); + +	cancel_bonding(adapter, TRUE);  }  static DBusMessage *create_bonding(DBusConnection *conn, DBusMessage *msg, @@ -1824,6 +1838,35 @@ static DBusMessage *list_devices(DBusConnection *conn,  	return reply;  } +static DBusMessage *cancel_device_creation(DBusConnection *conn, +						DBusMessage *msg, void *data) +{ +	struct btd_adapter *adapter = data; +	struct bonding_request_info *bonding = adapter->bonding; +	const gchar *address; +	bdaddr_t bda; + +	if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address, +						DBUS_TYPE_INVALID) == FALSE) +		return invalid_args(msg); + +	if (check_address(address) < 0) +		return invalid_args(msg); + +	str2ba(address, &bda); + +	if (bonding && !bacmp(&bonding->bdaddr, &bda)) { +		if (!g_str_equal(dbus_message_get_sender(msg), +					dbus_message_get_sender(bonding->msg))) +			return not_authorized(msg); + +		debug("Canceling device creation for %s", address); +		cancel_bonding(adapter, FALSE); +	} + +	return dbus_message_new_method_return(msg); +} +  static DBusMessage *create_device(DBusConnection *conn,  					DBusMessage *msg, void *data)  { @@ -2072,6 +2115,7 @@ static GDBusMethodTable adapter_methods[] = {  						G_DBUS_METHOD_FLAG_ASYNC},  	{ "CreatePairedDevice",	"sos",	"o",	create_paired_device,  						G_DBUS_METHOD_FLAG_ASYNC}, +	{ "CancelDeviceCreation","s",	"",	cancel_device_creation	},  	{ "RemoveDevice",	"o",	"",	remove_device		},  	{ "FindDevice",		"s",	"o",	find_device		},  	{ "RegisterAgent",	"os",	"",	register_agent		}, @@ -2548,7 +2592,8 @@ static void reply_pending_requests(struct btd_adapter *adapter)  		if (adapter->bonding->io_id)  			g_source_remove(adapter->bonding->io_id); -		g_io_channel_close(adapter->bonding->io); +		if (adapter->bonding->io) +			g_io_channel_close(adapter->bonding->io);  		bonding_request_free(adapter->bonding);  		adapter->bonding = NULL;  	} @@ -3186,7 +3231,8 @@ void adapter_free_bonding_request(struct btd_adapter *adapter)  	if (adapter->bonding->io_id)  		g_source_remove(adapter->bonding->io_id); -	g_io_channel_close(adapter->bonding->io); +	if (adapter->bonding->io) +		g_io_channel_close(adapter->bonding->io);  	bonding_request_free(adapter->bonding); | 
