summaryrefslogtreecommitdiffstats
path: root/src/device.c
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2009-01-10 17:00:12 -0300
committerJohan Hedberg <johan.hedberg@nokia.com>2009-01-11 19:17:08 +0200
commitc4338c0b7a46d6288e350b8c05fc02ee28b4bdbc (patch)
tree4f0002fd8c6fb30a75cf3a08de526ea092dbb476 /src/device.c
parent2aad1cf41acbc69481915d24cef33fa721d4e1fd (diff)
Handle active connection using device object.
Diffstat (limited to 'src/device.c')
-rw-r--r--src/device.c76
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)