diff --git a/3rdparty/solid-lite/backends/udisks2/udisksdevicebackend.cpp b/3rdparty/solid-lite/backends/udisks2/udisksdevicebackend.cpp index 411efaf83..332d09706 100644 --- a/3rdparty/solid-lite/backends/udisks2/udisksdevicebackend.cpp +++ b/3rdparty/solid-lite/backends/udisks2/udisksdevicebackend.cpp @@ -34,7 +34,7 @@ using namespace Solid::Backends::UDisks2; /* Static cache for DeviceBackends for all UDIs */ QMap DeviceBackend::s_backends; -DeviceBackend* DeviceBackend::backendForUDI(const QString& udi) +DeviceBackend* DeviceBackend::backendForUDI(const QString& udi, bool create) { DeviceBackend *backend = 0; if (udi.isEmpty()) { @@ -43,7 +43,7 @@ DeviceBackend* DeviceBackend::backendForUDI(const QString& udi) if (s_backends.contains(udi)) { backend = s_backends.value(udi); - } else { + } else if (create) { backend = new DeviceBackend(udi); s_backends.insert(udi, backend); } @@ -154,6 +154,11 @@ QVariantMap DeviceBackend::allProperties() const return m_propertyCache; } +void DeviceBackend::invalidateProperties() +{ + m_propertyCache.clear(); +} + QString DeviceBackend::introspect() const { QDBusMessage call = QDBusMessage::createMethodCall(UD2_DBUS_SERVICE, m_udi, diff --git a/3rdparty/solid-lite/backends/udisks2/udisksdevicebackend.h b/3rdparty/solid-lite/backends/udisks2/udisksdevicebackend.h index 8126236a3..7ac004613 100644 --- a/3rdparty/solid-lite/backends/udisks2/udisksdevicebackend.h +++ b/3rdparty/solid-lite/backends/udisks2/udisksdevicebackend.h @@ -40,7 +40,7 @@ class DeviceBackend: public QObject { Q_OBJECT public: - static DeviceBackend* backendForUDI(const QString &udi); + static DeviceBackend* backendForUDI(const QString &udi, bool create = true); static void destroyBackend(const QString &udi); DeviceBackend(const QString &udi); @@ -53,6 +53,7 @@ class DeviceBackend: public QObject { QStringList interfaces() const; const QString & udi() const; + void invalidateProperties(); Q_SIGNALS: void propertyChanged(const QMap &changeMap); void changed(); diff --git a/3rdparty/solid-lite/backends/udisks2/udisksmanager.cpp b/3rdparty/solid-lite/backends/udisks2/udisksmanager.cpp index 0588d0397..b9d8bb1fa 100644 --- a/3rdparty/solid-lite/backends/udisks2/udisksmanager.cpp +++ b/3rdparty/solid-lite/backends/udisks2/udisksmanager.cpp @@ -198,6 +198,8 @@ void Manager::slotInterfacesAdded(const QDBusObjectPath &object_path, const QVar qDebug() << udi << "has new interfaces:" << interfaces_and_properties.keys(); + updateBackend(udi); + // new device, we don't know it yet if (!m_deviceCache.contains(udi)) { m_deviceCache.append(udi); @@ -220,6 +222,8 @@ void Manager::slotInterfacesRemoved(const QDBusObjectPath &object_path, const QS qDebug() << udi << "lost interfaces:" << interfaces; + updateBackend(udi); + Device device(udi); if (!udi.isEmpty() && (interfaces.isEmpty() || device.interfaces().isEmpty())) { @@ -237,6 +241,7 @@ void Manager::slotMediaChanged(const QDBusMessage & msg) return; const QString udi = msg.path(); + updateBackend(udi); qulonglong size = properties.value("Size").toULongLong(); qDebug() << "MEDIA CHANGED in" << udi << "; size is:" << size; @@ -260,3 +265,23 @@ const QStringList & Manager::deviceCache() return m_deviceCache; } +void Manager::updateBackend(const QString & udi) +{ + DeviceBackend *backend = DeviceBackend::backendForUDI(udi); + if (!backend) + return; + + //This doesn't emit "changed" signals. Signals are emitted later by DeviceBackend's slots + backend->allProperties(); + + QVariant driveProp = backend->prop("Drive"); + if (!driveProp.isValid()) + return; + + QDBusObjectPath drivePath = qdbus_cast(driveProp); + DeviceBackend *driveBackend = DeviceBackend::backendForUDI(drivePath.path(), false); + if (!driveBackend) + return; + + driveBackend->invalidateProperties(); +} diff --git a/3rdparty/solid-lite/backends/udisks2/udisksmanager.h b/3rdparty/solid-lite/backends/udisks2/udisksmanager.h index 912b1f94d..9692432c4 100644 --- a/3rdparty/solid-lite/backends/udisks2/udisksmanager.h +++ b/3rdparty/solid-lite/backends/udisks2/udisksmanager.h @@ -59,6 +59,7 @@ private Q_SLOTS: private: const QStringList &deviceCache(); void introspect(const QString & path, bool checkOptical = false); + void updateBackend(const QString & udi); QSet m_supportedInterfaces; org::freedesktop::DBus::ObjectManager m_manager; QStringList m_deviceCache; diff --git a/ChangeLog b/ChangeLog index b011cb188..a9e58de68 100644 --- a/ChangeLog +++ b/ChangeLog @@ -115,6 +115,7 @@ 73. Add SoundCloud to online services. 74. Drop usage of lame when playing back AudioCDs, its not required. 75. Always use QNetworkAccessManager - as KIO is not thread safe :-( +76. Update copy of Solid to KDE4.10.5. 1.0.3 -----