diff --git a/android/gatt.c b/android/gatt.c
index 5f68945..ba5de4e 100644
--- a/android/gatt.c
+++ b/android/gatt.c
static struct queue *gatt_servers = NULL;
static struct queue *conn_list = NULL; /* Connected devices */
static struct queue *conn_wait_queue = NULL; /* Devs waiting to connect */
+static struct queue *disc_dev_list = NULL; /* Disconnected devices */
static void bt_le_discovery_stop_cb(void);
bt_le_discovery_stop(bt_le_discovery_stop_cb);
}
+static void put_device_on_disc_list(struct gatt_device *dev)
+{
+ dev->conn_id = 0;
+ queue_remove_all(dev->clients, NULL, NULL, NULL);
+ queue_push_tail(disc_dev_list, dev);
+}
+
static gboolean disconnected_cb(GIOChannel *io, GIOCondition cond,
gpointer user_data)
{
connection_cleanup(dev);
queue_foreach(dev->clients, client_disconnect_notify, dev);
- destroy_device(dev);
+
+ /* Reset conn_id and put on disconnected list.*/
+ put_device_on_disc_list(dev);
return FALSE;
}
goto reply;
}
- /* Lets create new gatt device and put it on conn_wait_queue.
- * Once it is connected we move it to conn_list
- */
- dev = create_device(&addr);
+ /* Let's check if we know device already */
+ dev = queue_remove_if(disc_dev_list, match_dev_by_bdaddr, &addr);
if (!dev) {
- status = HAL_STATUS_FAILED;
- goto reply;
+ /* New device, create it. */
+ dev = create_device(&addr);
+ if (!dev) {
+ status = HAL_STATUS_FAILED;
+ goto reply;
+ }
}
/* Update client list of device */
/* If this is last client do more cleaning */
connection_cleanup(dev);
dev = queue_remove_if(conn_list, match_dev_by_bdaddr, &dev->bdaddr);
- destroy_device(dev);
+ put_device_on_disc_list(dev);
}
static void handle_client_listen(const void *buf, uint16_t len)
conn_wait_queue = queue_new();
gatt_clients = queue_new();
gatt_servers = queue_new();
+ disc_dev_list = queue_new();
- if (!conn_list || !conn_wait_queue || !gatt_clients || !gatt_servers) {
+ if (!conn_list || !conn_wait_queue || !gatt_clients || !gatt_servers ||
+ !disc_dev_list) {
error("gatt: Failed to allocate memory for queues");
queue_destroy(gatt_servers, NULL);
queue_destroy(conn_wait_queue, NULL);
conn_wait_queue = NULL;
+ queue_destroy(disc_dev_list, NULL);
+ disc_dev_list = NULL;
+
return false;
}
queue_destroy(conn_wait_queue, destroy_device);
conn_wait_queue = NULL;
+
+ queue_destroy(disc_dev_list, destroy_device);
+ disc_dev_list = NULL;
}