diff options
author | Oliver Wolff <oliver.wolff@qt.io> | 2019-04-01 08:51:54 +0200 |
---|---|---|
committer | Oliver Wolff <oliver.wolff@qt.io> | 2019-04-10 07:59:43 +0000 |
commit | cddb1c96c6b5d3f2e5e3715bfda6721fb31410c6 (patch) | |
tree | e37069972651ae8470e6bdbf4e3580bcee0af5fc | |
parent | d4c0af715be750ddfc28daadff19617e80af6406 (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.cpp | 28 | ||||
-rw-r--r-- | src/bluetooth/qlowenergycontroller_winrt_new_p.h | 2 |
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); |