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