Return-Path: From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Rechi=20Vita?= To: linux-bluetooth@vger.kernel.org Cc: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Rechi=20Vita?= Subject: [PATCH BlueZ v5 05/14] core: Use adapter connect list for LE connections Date: Tue, 4 Sep 2012 16:04:33 -0300 Message-Id: <1346785482-13359-6-git-send-email-jprvita@openbossa.org> In-Reply-To: <1346785482-13359-1-git-send-email-jprvita@openbossa.org> References: <1346785482-13359-1-git-send-email-jprvita@openbossa.org> Sender: linux-bluetooth-owner@vger.kernel.org List-ID: When a connection is needed for a LE device it is added to the adapter connect list instead of directly connecting the ATT io channel. --- src/adapter.c | 2 +- src/device.c | 45 +++++++++++---------------------------------- src/device.h | 1 + 3 files changed, 13 insertions(+), 35 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index c17f518..298a9cd 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -2916,7 +2916,7 @@ static gboolean connect_pending_cb(gpointer user_data) if (adapter->discovering) return TRUE; - /* TODO: call device connect callback */ + device_att_connect(device); return FALSE; } diff --git a/src/device.c b/src/device.c index c65f0b7..cc8a77a 100644 --- a/src/device.c +++ b/src/device.c @@ -68,8 +68,6 @@ #define DISCONNECT_TIMER 2 #define DISCOVERY_TIMER 2 -#define AUTO_CONNECTION_INTERVAL 5 /* Next connection attempt */ - struct btd_disconnect_data { guint id; disconnect_watch watch; @@ -1831,15 +1829,6 @@ static void attio_disconnected(gpointer data, gpointer user_data) attio->dcfunc(attio->user_data); } -static void att_connect_dispatched(gpointer user_data) -{ - struct btd_device *device = user_data; - - device->auto_id = 0; -} - -static gboolean att_connect(gpointer user_data); - static gboolean attrib_disconnected_cb(GIOChannel *io, GIOCondition cond, gpointer user_data) { @@ -1859,10 +1848,7 @@ static gboolean attrib_disconnected_cb(GIOChannel *io, GIOCondition cond, if (device->auto_connect == FALSE || err != ETIMEDOUT) goto done; - device->auto_id = g_timeout_add_seconds_full(G_PRIORITY_DEFAULT_IDLE, - AUTO_CONNECTION_INTERVAL, - att_connect, device, - att_connect_dispatched); + adapter_connect_list_add(device_get_adapter(device), device); done: attio_cleanup(device); @@ -1962,11 +1948,7 @@ static void att_error_cb(const GError *gerr, gpointer user_data) if (device->auto_connect == FALSE) return; - device->auto_id = g_timeout_add_seconds_full(G_PRIORITY_DEFAULT_IDLE, - AUTO_CONNECTION_INTERVAL, - att_connect, device, - att_connect_dispatched); - + adapter_connect_list_add(device_get_adapter(device), device); DBG("Enabling automatic connections"); } @@ -1981,7 +1963,7 @@ static void att_success_cb(gpointer user_data) g_slist_foreach(device->attios, attio_connected, device->attrib); } -static gboolean att_connect(gpointer user_data) +gboolean device_att_connect(gpointer user_data) { struct btd_device *device = user_data; struct btd_adapter *adapter = device->adapter; @@ -2243,6 +2225,9 @@ void device_set_temporary(struct btd_device *device, gboolean temporary) DBG("temporary %d", temporary); + if (temporary) + adapter_connect_list_remove(device_get_adapter(device), device); + device->temporary = temporary; } @@ -2258,6 +2243,7 @@ void device_set_bonded(struct btd_device *device, gboolean bonded) void device_set_auto_connect(struct btd_device *device, gboolean enable) { + struct btd_adapter *adapter = device_get_adapter(device); char addr[18]; if (!device) @@ -2271,15 +2257,10 @@ void device_set_auto_connect(struct btd_device *device, gboolean enable) /* Disabling auto connect */ if (enable == FALSE) { - if (device->auto_id) - g_source_remove(device->auto_id); + adapter_connect_list_remove(adapter, device); return; } - /* Enabling auto connect */ - if (device->auto_id != 0) - return; - if (device->attrib) { DBG("Already connected"); return; @@ -2288,9 +2269,8 @@ void device_set_auto_connect(struct btd_device *device, gboolean enable) if (device->attios == NULL && device->attios_offline == NULL) return; - device->auto_id = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, - att_connect, device, - att_connect_dispatched); + /* Enabling auto connect */ + adapter_connect_list_add(adapter, device); } static gboolean start_discovery(gpointer user_data) @@ -3191,10 +3171,7 @@ guint btd_device_add_attio_callback(struct btd_device *device, device->attios = g_slist_append(device->attios, attio); - if (device->auto_id == 0) - device->auto_id = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, - att_connect, device, - att_connect_dispatched); + adapter_connect_list_add(device_get_adapter(device), device); return attio->id; } diff --git a/src/device.h b/src/device.h index f1d95c6..ab70f90 100644 --- a/src/device.h +++ b/src/device.h @@ -158,3 +158,4 @@ int device_unblock(DBusConnection *conn, struct btd_device *device, void device_set_pnpid(struct btd_device *device, uint8_t vendor_id_src, uint16_t vendor_id, uint16_t product_id, uint16_t product_ver); +gboolean device_att_connect(gpointer user_data); -- 1.7.11.4