summaryrefslogtreecommitdiff
path: root/src/bluetooth/qbluetoothlocaldevice_bluez.cpp
diff options
context:
space:
mode:
authorAlex Blasche <alexander.blasche@digia.com>2014-05-22 15:44:46 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-05-28 15:18:34 +0200
commit6ef2e80a31ba1f96c0e38ea93c700e33c348a64c (patch)
treef1ebd5f73aa754d7f94e7ce4db771a93652b4316 /src/bluetooth/qbluetoothlocaldevice_bluez.cpp
parent00163ae2994916fd75375e588690003130721c50 (diff)
downloadqtconnectivity-6ef2e80a31ba1f96c0e38ea93c700e33c348a64c.tar.gz
Bluez5: QBluetoothLocalDevice becomes invalid if adapter disappears
Bluez5 supports org.freedesktop.DBus.ObjectManager interface which permits monitoring of removal/addition of Bt adapters. This permits the invalidation of the current QBluetoothLocalDevice instance. Once the instance is invalid, it will remain invalid. Otherwise we could have a switch of the adapter without the developer noticing it because the next Bt dongle could get the same interface path. This would violate the sense of identity that is attached to a QBluetoothLocalDevice instance. Task-number: QTBUG-38399 Change-Id: I007278ff1f94c48d6e6902959132088858b0d011 Reviewed-by: Aaron McCarthy <mccarthy.aaron@gmail.com>
Diffstat (limited to 'src/bluetooth/qbluetoothlocaldevice_bluez.cpp')
-rw-r--r--src/bluetooth/qbluetoothlocaldevice_bluez.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/bluetooth/qbluetoothlocaldevice_bluez.cpp b/src/bluetooth/qbluetoothlocaldevice_bluez.cpp
index 98894dff..eb3dcf6e 100644
--- a/src/bluetooth/qbluetoothlocaldevice_bluez.cpp
+++ b/src/bluetooth/qbluetoothlocaldevice_bluez.cpp
@@ -927,10 +927,11 @@ void QBluetoothLocalDevicePrivate::InterfacesAdded(const QDBusObjectPath &object
}
}
-void QBluetoothLocalDevicePrivate::InterfacesRemoved(const QDBusObjectPath &object_path, const QStringList &interfaces)
+void QBluetoothLocalDevicePrivate::InterfacesRemoved(const QDBusObjectPath &object_path,
+ const QStringList &interfaces)
{
if (deviceChangeMonitors.contains(object_path.path())
- && interfaces.contains(QStringLiteral("org.bluez.Device1"))) {
+ && interfaces.contains(QLatin1String("org.bluez.Device1"))) {
//a device was removed
delete deviceChangeMonitors.take(object_path.path());
@@ -944,6 +945,27 @@ void QBluetoothLocalDevicePrivate::InterfacesRemoved(const QDBusObjectPath &obje
if (found)
emit q_ptr->deviceDisconnected(address);
}
+
+ if (adapterBluez5
+ && object_path.path() == adapterBluez5->path()
+ && interfaces.contains(QLatin1String("org.bluez.Adapter1"))) {
+ qCDebug(QT_BT_BLUEZ) << "Adapter" << adapterBluez5->path() << "was removed";
+ // current adapter was removed -> invalidate the instance
+ delete adapterBluez5;
+ adapterBluez5 = 0;
+ managerBluez5->deleteLater();
+ managerBluez5 = 0;
+ delete adapterProperties;
+ adapterProperties = 0;
+
+ delete pairingTarget;
+ pairingTarget = 0;
+
+ // turn off connectivity monitoring
+ qDeleteAll(deviceChangeMonitors);
+ deviceChangeMonitors.clear();
+ connectedDevicesSet.clear();
+ }
}
bool QBluetoothLocalDevicePrivate::isValid() const