diff options
author | Alex Blasche <alexander.blasche@digia.com> | 2014-05-22 15:44:46 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-05-28 15:18:34 +0200 |
commit | 6ef2e80a31ba1f96c0e38ea93c700e33c348a64c (patch) | |
tree | f1ebd5f73aa754d7f94e7ce4db771a93652b4316 /src/bluetooth/qbluetoothlocaldevice_bluez.cpp | |
parent | 00163ae2994916fd75375e588690003130721c50 (diff) | |
download | qtconnectivity-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.cpp | 26 |
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 |