From 77c756fdb33e66dcdccc513af9cc865a658f7e73 Mon Sep 17 00:00:00 2001
From: Alex Blasche <alexander.blasche@theqtcompany.com>
Date: Fri, 21 Nov 2014 14:56:14 +0100
Subject: [PATCH] Reset the controller's internal state when disconnecting

This caused problems when disconnecting from the remote device while
an openrequest was pending and if the controller tried to reconnect
immediately afterwards. The pending request queue was blocked forever.

Change-Id: I444d5ac6763b65ec8baf687e0dccec4b28016a6c
Reviewed-by: Timur Pocheptsov <Timur.Pocheptsov@digia.com>
Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
---
 src/bluetooth/bluez/hcimanager.cpp           |  1 +
 src/bluetooth/qlowenergycontroller_bluez.cpp | 11 +++++++++++
 src/bluetooth/qlowenergycontroller_p.h       |  2 ++
 3 files changed, 14 insertions(+)

diff --git a/src/bluetooth/bluez/hcimanager.cpp b/src/bluetooth/bluez/hcimanager.cpp
index 449f0825..17d54a4b 100644
--- a/src/bluetooth/bluez/hcimanager.cpp
+++ b/src/bluetooth/bluez/hcimanager.cpp
@@ -150,6 +150,7 @@ bool HciManager::monitorEvent(HciManager::HciEvent event)
         return false;
 
     // this event is already enabled
+    // TODO runningEvents does not seem to be used
     if (runningEvents.contains(event))
         return true;
 
diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp
index 4f8021e2..5629966d 100644
--- a/src/bluetooth/qlowenergycontroller_bluez.cpp
+++ b/src/bluetooth/qlowenergycontroller_bluez.cpp
@@ -271,6 +271,7 @@ void QLowEnergyControllerPrivate::disconnectFromDevice()
 {
     setState(QLowEnergyController::ClosingState);
     l2cpSocket->close();
+    resetController();
 }
 
 void QLowEnergyControllerPrivate::l2cpDisconnected()
@@ -306,9 +307,19 @@ void QLowEnergyControllerPrivate::l2cpErrorChanged(QBluetoothSocket::SocketError
     }
 
     invalidateServices();
+    resetController();
     setState(QLowEnergyController::UnconnectedState);
 }
 
+
+void QLowEnergyControllerPrivate::resetController()
+{
+    openRequests.clear();
+    requestPending = false;
+    encryptionChangePending = false;
+    securityLevelValue = -1;
+}
+
 void QLowEnergyControllerPrivate::l2cpReadyRead()
 {
     const QByteArray reply = l2cpSocket->readAll();
diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h
index ee206035..db1b346a 100644
--- a/src/bluetooth/qlowenergycontroller_p.h
+++ b/src/bluetooth/qlowenergycontroller_p.h
@@ -160,6 +160,8 @@ private:
                                      const QByteArray &newValue, quint16 offset);
     bool increaseEncryptLevelfRequired(quint8 errorCode);
 
+    void resetController();
+
 private slots:
     void l2cpConnected();
     void l2cpDisconnected();
-- 
GitLab