summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Wolff <oliver.wolff@qt.io>2019-04-01 08:51:54 +0200
committerOliver Wolff <oliver.wolff@qt.io>2019-04-10 07:59:43 +0000
commitcddb1c96c6b5d3f2e5e3715bfda6721fb31410c6 (patch)
treee37069972651ae8470e6bdbf4e3580bcee0af5fc
parentd4c0af715be750ddfc28daadff19617e80af6406 (diff)
winrt: unregister status change callbacks on disconnect
We have to prevent late callbacks. Change-Id: Iedb36cdfb9708403bdbd68b68718c4b26f38d657 Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
-rw-r--r--src/bluetooth/qlowenergycontroller_winrt_new.cpp28
-rw-r--r--src/bluetooth/qlowenergycontroller_winrt_new_p.h2
2 files changed, 20 insertions, 10 deletions
diff --git a/src/bluetooth/qlowenergycontroller_winrt_new.cpp b/src/bluetooth/qlowenergycontroller_winrt_new.cpp
index bc578502..9c543b6d 100644
--- a/src/bluetooth/qlowenergycontroller_winrt_new.cpp
+++ b/src/bluetooth/qlowenergycontroller_winrt_new.cpp
@@ -93,6 +93,7 @@ typedef IGattReadClientCharacteristicConfigurationDescriptorResult IClientCharCo
#define CHECK_FOR_DEVICE_CONNECTION_ERROR(hr, msg, ret) \
if (FAILED(hr)) { \
qCWarning(QT_BT_WINRT) << msg; \
+ unregisterFromStatusChanges(); \
setError(QLowEnergyController::ConnectionError); \
setState(QLowEnergyController::UnconnectedState); \
ret; \
@@ -440,9 +441,7 @@ QLowEnergyControllerPrivateWinRTNew::QLowEnergyControllerPrivateWinRTNew()
QLowEnergyControllerPrivateWinRTNew::~QLowEnergyControllerPrivateWinRTNew()
{
- if (mDevice && mStatusChangedToken.value)
- mDevice->remove_ConnectionStatusChanged(mStatusChangedToken);
-
+ unregisterFromStatusChanges();
unregisterFromValueChanges();
}
@@ -497,6 +496,7 @@ void QLowEnergyControllerPrivateWinRTNew::connectToDevice()
&& status == BluetoothConnectionStatus::BluetoothConnectionStatus_Disconnected) {
invalidateServices();
unregisterFromValueChanges();
+ unregisterFromStatusChanges();
mDevice = nullptr;
setError(QLowEnergyController::RemoteHostClosedError);
setState(QLowEnergyController::UnconnectedState);
@@ -525,12 +525,14 @@ void QLowEnergyControllerPrivateWinRTNew::connectToDevice()
hr = QWinRTFunctions::await(deviceServicesOp, deviceServicesResult.GetAddressOf(),
QWinRTFunctions::ProcessMainThreadEvents, 5000);
CHECK_FOR_DEVICE_CONNECTION_ERROR(hr, "Could not await services operation", return)
+
GattCommunicationStatus commStatus;
hr = deviceServicesResult->get_Status(&commStatus);
if (FAILED(hr) || commStatus != GattCommunicationStatus_Success) {
qCWarning(QT_BT_WINRT()) << "Service operation failed";
setError(QLowEnergyController::ConnectionError);
setState(QLowEnergyController::UnconnectedState);
+ unregisterFromStatusChanges();
return;
}
@@ -572,6 +574,7 @@ void QLowEnergyControllerPrivateWinRTNew::connectToDevice()
"manifest capabilities";
setState(QLowEnergyController::UnconnectedState);
setError(QLowEnergyController::ConnectionError);
+ unregisterFromStatusChanges();
return;
}
WARN_AND_CONTINUE_IF_FAILED(hr, "Could not obtain characteristic list");
@@ -606,6 +609,7 @@ void QLowEnergyControllerPrivateWinRTNew::connectToDevice()
qCWarning(QT_BT_WINRT) << "Could not obtain characteristic read result that triggers"
"device connection. Is the device reachable?";
+ unregisterFromStatusChanges();
setError(QLowEnergyController::ConnectionError);
setState(QLowEnergyController::UnconnectedState);
}
@@ -616,13 +620,8 @@ void QLowEnergyControllerPrivateWinRTNew::disconnectFromDevice()
Q_Q(QLowEnergyController);
setState(QLowEnergyController::ClosingState);
unregisterFromValueChanges();
- if (mDevice) {
- if (mStatusChangedToken.value) {
- mDevice->remove_ConnectionStatusChanged(mStatusChangedToken);
- mStatusChangedToken.value = 0;
- }
- mDevice = nullptr;
- }
+ unregisterFromStatusChanges();
+ mDevice = nullptr;
setState(QLowEnergyController::UnconnectedState);
emit q->disconnected();
}
@@ -713,6 +712,15 @@ void QLowEnergyControllerPrivateWinRTNew::unregisterFromValueChanges()
mValueChangedTokens.clear();
}
+void QLowEnergyControllerPrivateWinRTNew::unregisterFromStatusChanges()
+{
+ qCDebug(QT_BT_WINRT) << __FUNCTION__;
+ if (mDevice && mStatusChangedToken.value) {
+ mDevice->remove_ConnectionStatusChanged(mStatusChangedToken);
+ mStatusChangedToken.value = 0;
+ }
+}
+
void QLowEnergyControllerPrivateWinRTNew::obtainIncludedServices(
QSharedPointer<QLowEnergyServicePrivate> servicePointer,
ComPtr<IGattDeviceService> service)
diff --git a/src/bluetooth/qlowenergycontroller_winrt_new_p.h b/src/bluetooth/qlowenergycontroller_winrt_new_p.h
index 93b763a4..bf409745 100644
--- a/src/bluetooth/qlowenergycontroller_winrt_new_p.h
+++ b/src/bluetooth/qlowenergycontroller_winrt_new_p.h
@@ -143,6 +143,8 @@ private:
void registerForValueChanges(const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid);
void unregisterFromValueChanges();
+ void unregisterFromStatusChanges();
+
void obtainIncludedServices(QSharedPointer<QLowEnergyServicePrivate> servicePointer,
Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::IGattDeviceService> nativeService);