diff options
| author | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2009-01-10 17:00:12 -0300 | 
|---|---|---|
| committer | Johan Hedberg <johan.hedberg@nokia.com> | 2009-01-11 19:17:08 +0200 | 
| commit | c4338c0b7a46d6288e350b8c05fc02ee28b4bdbc (patch) | |
| tree | 4f0002fd8c6fb30a75cf3a08de526ea092dbb476 /src/device.c | |
| parent | 2aad1cf41acbc69481915d24cef33fa721d4e1fd (diff) | |
Handle active connection using device object.
Diffstat (limited to 'src/device.c')
| -rw-r--r-- | src/device.c | 76 | 
1 files changed, 44 insertions, 32 deletions
diff --git a/src/device.c b/src/device.c index 7891d1e5..8317dcb9 100644 --- a/src/device.c +++ b/src/device.c @@ -102,7 +102,7 @@ struct btd_device {  	uint8_t		cap;  	uint8_t		auth; -	gboolean	connected; +	uint16_t	handle;			/* Connection handle */  	/* Whether were creating a security mode 3 connection */  	gboolean	secmode3; @@ -225,7 +225,6 @@ static DBusMessage *get_properties(DBusConnection *conn,  	uint32_t class;  	int i;  	GSList *l; -	struct active_conn_info *dev;  	ba2str(&device->bdaddr, dstaddr); @@ -287,13 +286,9 @@ static DBusMessage *get_properties(DBusConnection *conn,  	dict_append_entry(&dict, "Trusted", DBUS_TYPE_BOOLEAN, &boolean);  	/* Connected */ -	dev = adapter_search_active_conn_by_bdaddr(adapter, &device->bdaddr); -	if (dev) -		boolean = TRUE; -	else -		boolean = FALSE; - -	dict_append_entry(&dict, "Connected", DBUS_TYPE_BOOLEAN, &boolean); +	boolean = (device->handle != 0); +	dict_append_entry(&dict, "Connected", DBUS_TYPE_BOOLEAN, +				&boolean);  	/* UUIDs */  	uuids = g_new0(char *, g_slist_length(device->uuids) + 1); @@ -493,25 +488,18 @@ static DBusMessage *cancel_discover(DBusConnection *conn,  static gboolean disconnect_timeout(gpointer user_data)  {  	struct btd_device *device = user_data; -	struct active_conn_info *ci;  	disconnect_cp cp;  	int dd;  	uint16_t dev_id = adapter_get_dev_id(device->adapter);  	device->disconn_timer = 0; -	ci = adapter_search_active_conn_by_bdaddr(device->adapter, -							&device->bdaddr); - -	if (!ci) -		return FALSE; -  	dd = hci_open_dev(dev_id);  	if (dd < 0)  		goto fail;  	memset(&cp, 0, sizeof(cp)); -	cp.handle = htobs(ci->handle); +	cp.handle = htobs(device->handle);  	cp.reason = HCI_OE_USER_ENDED_CONNECTION;  	hci_send_cmd(dd, OGF_LINK_CTL, OCF_DISCONNECT, @@ -527,12 +515,8 @@ static DBusMessage *disconnect(DBusConnection *conn,  					DBusMessage *msg, void *user_data)  {  	struct btd_device *device = user_data; -	struct active_conn_info *dev; - -	dev = adapter_search_active_conn_by_bdaddr(device->adapter, -							&device->bdaddr); -	if (!dev) +	if (!device->handle)  		return g_dbus_create_error(msg,  				ERROR_INTERFACE ".NotConnected",  				"Device is not connected"); @@ -563,16 +547,14 @@ static GDBusSignalTable device_signals[] = {  	{ }  }; -gboolean device_get_connected(struct btd_device *device) +gboolean device_is_connected(struct btd_device *device)  { -	return device->connected; +	return (device->handle != 0);  } -void device_set_connected(struct btd_device *device, DBusConnection *conn, +static void device_set_connected(struct btd_device *device, DBusConnection *conn,  			gboolean connected)  { -	device->connected = connected; -  	emit_property_changed(conn, device->path, DEVICE_INTERFACE,  				"Connected", DBUS_TYPE_BOOLEAN, &connected); @@ -588,6 +570,39 @@ void device_set_connected(struct btd_device *device, DBusConnection *conn,  	}  } +void device_add_connection(struct btd_device *device, DBusConnection *conn, +				uint16_t handle) +{ +	if (device->handle) { +		error("%s: Unable to add connection %u, %u already exist)", +			device->path, handle, device->handle); +		return; +	} + +	device->handle = handle; + +	device_set_connected(device, conn, TRUE); +} + +void device_remove_connection(struct btd_device *device, DBusConnection *conn, +				uint16_t handle) +{ +	if (device->handle != handle) { +		error("%s: Unable to remove connection %u, handle mismatch (%u)", +			device->path, handle, device->handle); +		return; +	} + +	device->handle = 0; + +	device_set_connected(device, conn, FALSE); +} + +gboolean device_has_connection(struct btd_device *device, uint16_t handle) +{ +	return (handle == device->handle); +} +  void device_set_secmode3_conn(struct btd_device *device, gboolean enable)  {  	device->secmode3 = enable; @@ -626,7 +641,6 @@ struct btd_device *device_create(DBusConnection *conn, struct btd_adapter *adapt  static void device_remove_bonding(struct btd_device *device, DBusConnection *conn)  { -	struct active_conn_info *ci;  	char filename[PATH_MAX + 1];  	char *str, srcaddr[18], dstaddr[18];  	int dd, dev_id; @@ -661,10 +675,8 @@ static void device_remove_bonding(struct btd_device *device, DBusConnection *con  	hci_delete_stored_link_key(dd, &device->bdaddr, 0, HCI_REQ_TIMEOUT);  	/* Send the HCI disconnect command */ -	ci = adapter_search_active_conn_by_bdaddr(device->adapter, -						&device->bdaddr); -	if (ci) { -		int err = hci_disconnect(dd, htobs(ci->handle), +	if (device->handle) { +		int err = hci_disconnect(dd, htobs(device->handle),  					HCI_OE_USER_ENDED_CONNECTION,  					HCI_REQ_TIMEOUT);  		if (err < 0)  | 
