[neon/kf6/kf6-solid/Neon/unstable] debian/patches: drop patch that's now in master
Carlos De Maine
null at kde.org
Thu Oct 9 04:49:03 BST 2025
Git commit 2b50b749c84e103a52ccbb16198c674dd8d8ca9a by Carlos De Maine.
Committed on 09/10/2025 at 03:49.
Pushed by carlosdem into branch 'Neon/unstable'.
drop patch that's now in master
D +0 -1138 debian/patches/kai_udisks.diff
D +0 -1 debian/patches/series
https://invent.kde.org/neon/kf6/kf6-solid/-/commit/2b50b749c84e103a52ccbb16198c674dd8d8ca9a
diff --git a/debian/patches/kai_udisks.diff b/debian/patches/kai_udisks.diff
deleted file mode 100644
index d26d381..0000000
--- a/debian/patches/kai_udisks.diff
+++ /dev/null
@@ -1,1138 +0,0 @@
-diff --git a/src/solid/devices/backends/udisks2/CMakeLists.txt b/src/solid/devices/backends/udisks2/CMakeLists.txt
-index 1e8f0143eee681919b87f04ea013089bc7bc1290..9be3732657de9e368382ba13183fc12d67d2119c 100644
---- a/src/solid/devices/backends/udisks2/CMakeLists.txt
-+++ b/src/solid/devices/backends/udisks2/CMakeLists.txt
-@@ -1,7 +1,6 @@
- set(backend_sources
- udisksmanager.cpp
- udisksdevice.cpp
-- udisksdevicebackend.cpp
- udisksblock.cpp
- udisksstoragevolume.cpp
- udisksdeviceinterface.cpp
-@@ -10,6 +9,7 @@ set(backend_sources
- udisksstoragedrive.cpp
- udisksstorageaccess.cpp
- udisksgenericinterface.cpp
-+ udisksutils.cpp
- dbus/manager.cpp
- )
-
-diff --git a/src/solid/devices/backends/udisks2/udisks2.h b/src/solid/devices/backends/udisks2/udisks2.h
-index 04d90128a99b502ab518291dcb3dc80b16ee2259..c92a42dae9eec6f89be9d6058baf94a8e892cbc0 100644
---- a/src/solid/devices/backends/udisks2/udisks2.h
-+++ b/src/solid/devices/backends/udisks2/udisks2.h
-@@ -32,6 +32,7 @@ Q_DECLARE_METATYPE(DBUSManagerStruct)
- #define UD2_DBUS_PATH "/org/freedesktop/UDisks2"
- #define UD2_UDI_DISKS_PREFIX "/org/freedesktop/UDisks2"
- #define UD2_DBUS_PATH_MANAGER "/org/freedesktop/UDisks2/Manager"
-+#define UD2_DBUS_PATH_BLOCK_DEVICES "/org/freedesktop/UDisks2/block_devices"
- #define UD2_DBUS_PATH_DRIVES "/org/freedesktop/UDisks2/drives"
- #define UD2_DBUS_PATH_JOBS "/org/freedesktop/UDisks2/jobs/"
- #define UD2_DBUS_PATH_BLOCKDEVICES "/org/freedesktop/UDisks2/block_devices"
-diff --git a/src/solid/devices/backends/udisks2/udisksblock.cpp b/src/solid/devices/backends/udisks2/udisksblock.cpp
-index d57e6523b790a4a8ddf7a4662c06a0b858de1ce7..45890af06ada7465be2a7aa2ceef769d71728140 100644
---- a/src/solid/devices/backends/udisks2/udisksblock.cpp
-+++ b/src/solid/devices/backends/udisks2/udisksblock.cpp
-@@ -48,7 +48,7 @@ Block::Block(Device *dev)
- if (!nodeElem.isNull() && nodeElem.hasAttribute(QStringLiteral("name"))) {
- const QString udi = QStringLiteral(UD2_DBUS_PATH_BLOCKDEVICES) + QLatin1Char('/') + nodeElem.attribute(QStringLiteral("name"));
-
-- Device device(udi);
-+ Device device(dev->manager(), udi);
- if (device.drivePath() == dev->udi()) {
- m_devNum = device.prop(QStringLiteral("DeviceNumber")).toULongLong();
- m_devFile = QFile::decodeName(device.prop(QStringLiteral("Device")).toByteArray());
-diff --git a/src/solid/devices/backends/udisks2/udisksdevice.cpp b/src/solid/devices/backends/udisks2/udisksdevice.cpp
-index 10f7c55d7f53483911b9852808878cd5b1fa3911..c50f00c7916dc935466ffcfb5c5a83e9eec1027c 100644
---- a/src/solid/devices/backends/udisks2/udisksdevice.cpp
-+++ b/src/solid/devices/backends/udisks2/udisksdevice.cpp
-@@ -8,9 +8,9 @@
- #include "udisksdevice.h"
- #include "udisks_debug.h"
- #include "udisksblock.h"
--#include "udisksdevicebackend.h"
- #include "udisksdeviceinterface.h"
- #include "udisksgenericinterface.h"
-+#include "udisksmanager.h"
- #include "udisksopticaldisc.h"
- #include "udisksopticaldrive.h"
- #include "udisksstorageaccess.h"
-@@ -87,16 +87,18 @@ static QString concatBlockDeviceDescription(const QString &name, qulonglong size
- return description;
- }
-
--Device::Device(const QString &udi)
-+Device::Device(Manager *manager, const QString &udi)
- : Solid::Ifaces::Device()
-- , m_backend(DeviceBackend::backendForUDI(udi))
-+ , m_manager(manager)
-+ , m_udi(udi)
- {
-- if (m_backend) {
-- connect(m_backend, &DeviceBackend::changed, this, &Device::changed);
-- connect(m_backend, &DeviceBackend::propertyChanged, this, &Device::propertyChanged);
-- } else {
-- qCDebug(UDISKS2) << "Created invalid Device for udi" << udi;
-- }
-+ connect(m_manager, &Manager::propertyChanged, this, [this](const QString &udi, const QMap<QString, int> &changes) {
-+ if (udi == m_udi) {
-+ Q_EMIT propertyChanged(changes);
-+ }
-+ });
-+
-+ connect(this, &Device::propertyChanged, this, &Device::changed);
- }
-
- Device::~Device()
-@@ -105,63 +107,44 @@ Device::~Device()
-
- QString Device::udi() const
- {
-- if (m_backend) {
-- return m_backend->udi();
-- }
--
-- return QString();
-+ return m_udi;
- }
-
- QVariant Device::prop(const QString &key) const
- {
-- if (m_backend) {
-- return m_backend->prop(key);
-- }
--
-- return QVariant();
-+ return m_manager->deviceProperty(m_udi, key);
- }
-
- bool Device::propertyExists(const QString &key) const
- {
-- if (m_backend) {
-- return m_backend->propertyExists(key);
-- }
--
-- return false;
-+ return m_manager->deviceProperty(m_udi, key, Manager::CachedOnly).isValid();
- }
-
- QVariantMap Device::allProperties() const
- {
-- if (m_backend) {
-- return m_backend->allProperties();
-- }
-+ QVariantMap flattened;
-
-- return QVariantMap();
--}
-+ const auto interfaces = m_manager->deviceProperties(m_udi);
-
--bool Device::hasInterface(const QString &name) const
--{
-- if (m_backend) {
-- return m_backend->interfaces().contains(name);
-+ // Flatten per-interface properties into a single map.
-+ // We iterate the interfaces in reverse since Manager::prop() returns the *first*
-+ // property found, so we'll override any other properties that way.
-+ // FIXME actually reverse it lol, no rbegin on QMap :(
-+ for (const auto &props : interfaces) {
-+ flattened.insert(props);
- }
-
-- return false;
-+ return flattened;
- }
-
--QStringList Device::interfaces() const
-+bool Device::hasInterface(const QString &name) const
- {
-- if (m_backend) {
-- return m_backend->interfaces();
-- }
--
-- return QStringList();
-+ return m_manager->hasInterface(m_udi, name);
- }
-
--void Device::invalidateCache()
-+Manager *Device::manager() const
- {
-- if (m_backend) {
-- return m_backend->invalidateProperties();
-- }
-+ return m_manager;
- }
-
- QObject *Device::createDeviceInterface(const Solid::DeviceInterface::Type &type)
-@@ -419,7 +402,7 @@ QString Device::volumeDescription() const
- return volume_label;
- }
-
-- UDisks2::Device storageDevice(drivePath());
-+ UDisks2::Device storageDevice(manager(), drivePath());
- const UDisks2::StorageDrive storageDrive(&storageDevice);
- Solid::StorageDrive::DriveType drive_type = storageDrive.driveType();
-
-@@ -629,7 +612,7 @@ QString Device::icon() const
- return QStringLiteral("drive-harddisk"); // stuff like loop devices or swap which don't have the Drive prop set
- }
-
-- Device drive(drv);
-+ Device drive(manager(), drv);
-
- // handle media
- const QString media = drive.prop(QStringLiteral("Media")).toString();
-@@ -696,7 +679,7 @@ QString Device::icon() const
- QString Device::product() const
- {
- if (!isDrive()) {
-- Device drive(drivePath());
-+ Device drive(manager(), drivePath());
- return drive.prop(QStringLiteral("Model")).toString();
- }
-
-@@ -706,7 +689,7 @@ QString Device::product() const
- QString Device::vendor() const
- {
- if (!isDrive()) {
-- Device drive(drivePath());
-+ Device drive(manager(), drivePath());
- return drive.prop(QStringLiteral("Vendor")).toString();
- }
-
-@@ -825,7 +808,7 @@ bool Device::isOpticalDisc() const
- return false;
- }
-
-- Device drive(drv);
-+ Device drive(manager(), drv);
- return drive.prop(QStringLiteral("Optical")).toBool();
- }
-
-@@ -836,7 +819,7 @@ bool Device::mightBeOpticalDisc() const
- return false;
- }
-
-- Device drive(drv);
-+ Device drive(manager(), drv);
- return drive.isOpticalDrive();
- }
-
-diff --git a/src/solid/devices/backends/udisks2/udisksdevice.h b/src/solid/devices/backends/udisks2/udisksdevice.h
-index 6a5f2ece84e01791d34e73877302b0159e602927..4f024a5c365b964c0f48396108cee9b5799c6568 100644
---- a/src/solid/devices/backends/udisks2/udisksdevice.h
-+++ b/src/solid/devices/backends/udisks2/udisksdevice.h
-@@ -24,14 +24,17 @@ namespace Backends
- namespace UDisks2
- {
- class DeviceBackend;
-+class Manager;
-
- class Device : public Solid::Ifaces::Device
- {
- Q_OBJECT
- public:
-- Device(const QString &udi);
-+ Device(Manager *manager, const QString &udi);
- ~Device() override;
-
-+ Manager *manager() const;
-+
- QObject *createDeviceInterface(const Solid::DeviceInterface::Type &type) override;
- bool queryDeviceInterface(const Solid::DeviceInterface::Type &type) const override;
- QString description() const override;
-@@ -45,10 +48,8 @@ public:
- QVariant prop(const QString &key) const;
- bool propertyExists(const QString &key) const;
- QVariantMap allProperties() const;
-- void invalidateCache();
-
- bool hasInterface(const QString &name) const;
-- QStringList interfaces() const;
-
- QString errorToString(const QString &error) const;
- Solid::ErrorType errorToSolidError(const QString &error) const;
-@@ -75,10 +76,10 @@ Q_SIGNALS:
- void changed();
- void propertyChanged(const QMap<QString, int> &changes);
-
--protected:
-- QPointer<DeviceBackend> m_backend;
--
- private:
-+ Manager *m_manager;
-+ QString m_udi;
-+
- QString loopDescription() const;
- QString storageDescription() const;
- QString volumeDescription() const;
-diff --git a/src/solid/devices/backends/udisks2/udisksdevicebackend.h b/src/solid/devices/backends/udisks2/udisksdevicebackend.h
-deleted file mode 100644
-index ac2c0266b5fe5a75f7712e32f93c763d02b51d76..0000000000000000000000000000000000000000
---- a/src/solid/devices/backends/udisks2/udisksdevicebackend.h
-+++ /dev/null
-@@ -1,71 +0,0 @@
--/*
-- SPDX-FileCopyrightText: 2010 Michael Zanetti <mzanetti at kde.org>
-- SPDX-FileCopyrightText: 2010-2012 Lukáš Tinkl <ltinkl at redhat.com>
-- SPDX-FileCopyrightText: 2012 Dan Vrátil <dvratil at redhat.com>
--
-- SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
--*/
--
--#ifndef UDISKSDEVICEBACKEND_H
--#define UDISKSDEVICEBACKEND_H
--
--#include <QDBusObjectPath>
--#include <QObject>
--#include <QStringList>
--#include <QThreadStorage>
--
--#include "udisks2.h"
--
--namespace Solid
--{
--namespace Backends
--{
--namespace UDisks2
--{
--class DeviceBackend : public QObject
--{
-- Q_OBJECT
--
--public:
-- static DeviceBackend *backendForUDI(const QString &udi, bool create = true);
-- static void destroyBackend(const QString &udi);
--
-- DeviceBackend(const QString &udi);
-- ~DeviceBackend() override;
--
-- QVariant prop(const QString &key) const;
-- bool propertyExists(const QString &key) const;
-- QVariantMap allProperties() const;
--
-- QStringList interfaces() const;
-- const QString &udi() const;
--
-- void invalidateProperties();
--Q_SIGNALS:
-- void propertyChanged(const QMap<QString, int> &changeMap);
-- void changed();
--
--private Q_SLOTS:
-- void slotInterfacesAdded(const QDBusObjectPath &object_path, const VariantMapMap &interfaces_and_properties);
-- void slotInterfacesRemoved(const QDBusObjectPath &object_path, const QStringList &interfaces);
-- void slotPropertiesChanged(const QString &ifaceName, const QVariantMap &changedProps, const QStringList &invalidatedProps);
--
--private:
-- void initInterfaces();
-- QString introspect() const;
-- void checkCache(const QString &key) const;
-- void cacheProperty(const QString &key, const QVariant &value) const;
--
-- // NOTE: make sure to insert items only through cacheProperty
-- mutable QVariantMap m_propertyCache;
-- QStringList m_interfaces;
-- QString m_udi;
--
-- static QThreadStorage<QMap<QString, DeviceBackend *>> s_backends;
--};
--
--} /* namespace UDisks2 */
--} /* namespace Backends */
--} /* namespace Solid */
--
--#endif /* UDISKSDEVICEBACKEND_H */
-diff --git a/src/solid/devices/backends/udisks2/udisksgenericinterface.cpp b/src/solid/devices/backends/udisks2/udisksgenericinterface.cpp
-index 288503225b71bf3b54b5afd2b1142f0ee8abb412..1fa6a1e21999deebf79b0b1a1ba5bcfc87cea254 100644
---- a/src/solid/devices/backends/udisks2/udisksgenericinterface.cpp
-+++ b/src/solid/devices/backends/udisks2/udisksgenericinterface.cpp
-@@ -14,7 +14,7 @@ using namespace Solid::Backends::UDisks2;
- GenericInterface::GenericInterface(Device *device)
- : DeviceInterface(device)
- {
-- connect(device, SIGNAL(propertyChanged(QMap<QString, int>)), this, SIGNAL(propertyChanged(QMap<QString, int>)));
-+ connect(device, &Device::propertyChanged, this, &GenericInterface::propertyChanged);
- }
-
- GenericInterface::~GenericInterface()
-diff --git a/src/solid/devices/backends/udisks2/udisksmanager.cpp b/src/solid/devices/backends/udisks2/udisksmanager.cpp
-index 799face79eb057d188388d5745792b591fb9a422..71f453c76a150744d8cbb4c4a1dcf0a1519749fc 100644
---- a/src/solid/devices/backends/udisks2/udisksmanager.cpp
-+++ b/src/solid/devices/backends/udisks2/udisksmanager.cpp
-@@ -5,8 +5,10 @@
- */
-
- #include "udisksmanager.h"
-+#include "dbus/manager.h"
- #include "udisks_debug.h"
--#include "udisksdevicebackend.h"
-+#include "udisksopticaldisc.h"
-+#include "udisksutils.h"
-
- #include <QDBusConnection>
- #include <QDBusConnectionInterface>
-@@ -14,14 +16,17 @@
- #include <QDBusObjectPath>
- #include <QDomDocument>
-
-+#include <algorithm>
-+
- #include "../shared/rootdevice.h"
-+#include "solid/genericinterface.h"
-
- using namespace Solid::Backends::UDisks2;
- using namespace Solid::Backends::Shared;
-
- Manager::Manager(QObject *parent)
- : Solid::Ifaces::DeviceManager(parent)
-- , m_manager(QStringLiteral(UD2_DBUS_SERVICE), QStringLiteral(UD2_DBUS_PATH), QDBusConnection::systemBus())
-+ , m_manager(org::freedesktop::DBus::ObjectManager(QStringLiteral(UD2_DBUS_SERVICE), QStringLiteral(UD2_DBUS_PATH), QDBusConnection::systemBus()))
- {
- m_supportedInterfaces = {
- Solid::DeviceInterface::GenericInterface,
-@@ -38,33 +43,59 @@ Manager::Manager(QObject *parent)
- qDBusRegisterMetaType<VariantMapMap>();
- qDBusRegisterMetaType<DBUSManagerStruct>();
-
-- bool serviceFound = m_manager.isValid();
-- if (!serviceFound) {
-- // find out whether it will be activated automatically
-- QDBusMessage message = QDBusMessage::createMethodCall(QStringLiteral("org.freedesktop.DBus"), //
-- QStringLiteral("/org/freedesktop/DBus"),
-- QStringLiteral("org.freedesktop.DBus"),
-- QStringLiteral("ListActivatableNames"));
--
-- QDBusReply<QStringList> reply = QDBusConnection::systemBus().call(message);
-- if (reply.isValid() && reply.value().contains(QStringLiteral(UD2_DBUS_SERVICE))) {
-- QDBusConnection::systemBus().interface()->startService(QStringLiteral(UD2_DBUS_SERVICE));
-- serviceFound = true;
-- }
-- }
-+ connect(&m_manager, &org::freedesktop::DBus::ObjectManager::InterfacesAdded, this, &Manager::slotInterfacesAdded);
-+ connect(&m_manager, &org::freedesktop::DBus::ObjectManager::InterfacesRemoved, this, &Manager::slotInterfacesRemoved);
-
-- if (serviceFound) {
-- connect(&m_manager, SIGNAL(InterfacesAdded(QDBusObjectPath, VariantMapMap)), this, SLOT(slotInterfacesAdded(QDBusObjectPath, VariantMapMap)));
-- connect(&m_manager, SIGNAL(InterfacesRemoved(QDBusObjectPath, QStringList)), this, SLOT(slotInterfacesRemoved(QDBusObjectPath, QStringList)));
-- }
-+ QDBusConnection::systemBus()
-+ .connect(QStringLiteral(UD2_DBUS_SERVICE), QString() /*any path*/, QStringLiteral(DBUS_INTERFACE_PROPS), QStringLiteral("PropertiesChanged"), this, SLOT(slotPropertiesChanged(QDBusMessage)));
- }
-
- Manager::~Manager()
- {
-- while (!m_deviceCache.isEmpty()) {
-- QString udi = m_deviceCache.takeFirst();
-- DeviceBackend::destroyBackend(udi);
-+}
-+
-+bool Manager::hasInterface(const QString &udi, const QString &interface)
-+{
-+ return deviceCache().value(udi).contains(interface);
-+}
-+
-+QMap<QString, PropertyMap> Manager::allProperties()
-+{
-+ return deviceCache();
-+}
-+
-+PropertyMap Manager::deviceProperties(const QString &udi)
-+{
-+ return deviceCache().value(udi);
-+}
-+
-+QVariant Manager::deviceProperty(const QString &udi, const QString &name, Manager::FetchMode fetchMode)
-+{
-+ const auto &props = m_cache.value(udi);
-+
-+ // Loop through all interfaces looking for a property.
-+ for (auto it = props.begin(), end = props.end(); it != end; ++it) {
-+ const QString iface = it.key();
-+ const auto valueIt = it->constFind(name);
-+ if (valueIt != it->constEnd()) {
-+ if (!valueIt->isValid() && fetchMode == FetchIfNeeded) {
-+ QDBusMessage call = QDBusMessage::createMethodCall(QStringLiteral(UD2_DBUS_SERVICE), udi, QStringLiteral(DBUS_INTERFACE_PROPS), QStringLiteral("Get"));
-+ call.setArguments({iface, name});
-+ QDBusReply<QVariant> reply = QDBusConnection::systemBus().call(call);
-+
-+ /* We don't check for error here and store the item in the cache anyway so next time we don't have to
-+ * do the DBus call to find out it does not exist but just check whether
-+ * prop(key).isValid() */
-+ const QVariant value = Utils::sanitizeValue(reply.value());
-+ m_cache[udi][iface][name] = value;
-+ return value;
-+ }
-+
-+ return *valueIt;
-+ }
- }
-+
-+ return QVariant();
- }
-
- QObject *Manager::createDevice(const QString &udi)
-@@ -78,7 +109,7 @@ QObject *Manager::createDevice(const QString &udi)
-
- return root;
- } else if (deviceCache().contains(udi)) {
-- return new Device(udi);
-+ return new Device(this, udi);
- } else {
- return nullptr;
- }
-@@ -87,79 +118,71 @@ QObject *Manager::createDevice(const QString &udi)
- QStringList Manager::devicesFromQuery(const QString &parentUdi, Solid::DeviceInterface::Type type)
- {
- QStringList result;
-- const QStringList deviceList = deviceCache();
-+
-+ const auto devices = deviceCache();
-
- if (!parentUdi.isEmpty()) {
-- for (const QString &udi : deviceList) {
-- Device device(udi);
-+ for (auto it = devices.keyBegin(), end = devices.keyEnd(); it != end; ++it) {
-+ Device device(this, *it);
- if (device.queryDeviceInterface(type) && device.parentUdi() == parentUdi) {
-- result << udi;
-+ result << *it;
- }
- }
-
- return result;
- } else if (type != Solid::DeviceInterface::Unknown) {
-- for (const QString &udi : deviceList) {
-- Device device(udi);
-+ for (auto it = devices.keyBegin(), end = devices.keyEnd(); it != end; ++it) {
-+ Device device(this, *it);
- if (device.queryDeviceInterface(type)) {
-- result << udi;
-+ result << *it;
- }
- }
-
- return result;
- }
-
-- return deviceCache();
-+ return devices.keys();
- }
-
- QStringList Manager::allDevices()
- {
-- m_deviceCache.clear();
--
-- introspect(QStringLiteral(UD2_DBUS_PATH_BLOCKDEVICES), true /*checkOptical*/);
-- introspect(QStringLiteral(UD2_DBUS_PATH_DRIVES));
-+ m_devices.clear();
-+ m_cache.clear();
-+
-+ org::freedesktop::DBus::ObjectManager manager(QStringLiteral(UD2_DBUS_SERVICE), QStringLiteral(UD2_DBUS_PATH), QDBusConnection::systemBus());
-+ QDBusPendingReply<DBUSManagerStruct> reply = manager.GetManagedObjects();
-+ reply.waitForFinished();
-+ if (reply.isError()) {
-+ qCWarning(UDISKS2) << "Failed to fetch all devices" << reply.error().name() << reply.error().message();
-+ return m_devices;
-+ }
-
-- return m_deviceCache;
--}
-+ const auto items = reply.value();
-+ for (auto it = items.begin(), end = items.end(); it != end; ++it) {
-+ const QString udi = it.key().path();
-
--void Manager::introspect(const QString &path, bool checkOptical)
--{
-- QDBusMessage call =
-- QDBusMessage::createMethodCall(QStringLiteral(UD2_DBUS_SERVICE), path, QStringLiteral(DBUS_INTERFACE_INTROSPECT), QStringLiteral("Introspect"));
-- QDBusPendingReply<QString> reply = QDBusConnection::systemBus().call(call);
--
-- if (reply.isValid()) {
-- QDomDocument dom;
-- dom.setContent(reply.value());
-- QDomNodeList nodeList = dom.documentElement().elementsByTagName(QStringLiteral("node"));
-- for (int i = 0; i < nodeList.count(); i++) {
-- QDomElement nodeElem = nodeList.item(i).toElement();
-- if (!nodeElem.isNull() && nodeElem.hasAttribute(QStringLiteral("name"))) {
-- const QString name = nodeElem.attribute(QStringLiteral("name"));
-- const QString udi = path + QStringLiteral("/") + name;
--
-- // Optimization, a loop device cannot really have a physical drive associated with it
-- if (checkOptical && !name.startsWith(QLatin1String("loop"))) {
-- Device device(udi);
-- if (device.mightBeOpticalDisc()) {
-- QDBusConnection::systemBus().connect(QStringLiteral(UD2_DBUS_SERVICE), //
-- udi,
-- QStringLiteral(DBUS_INTERFACE_PROPS),
-- QStringLiteral("PropertiesChanged"),
-- this,
-- SLOT(slotMediaChanged(QDBusMessage)));
-- if (!device.isOpticalDisc()) { // skip empty CD disc
-- continue;
-- }
-- }
-- }
-+ if (!udi.startsWith(QLatin1String(UD2_DBUS_PATH_BLOCK_DEVICES)) && !udi.startsWith(QLatin1String(UD2_DBUS_PATH_DRIVES))) {
-+ continue;
-+ }
-
-- m_deviceCache.append(udi);
-- }
-+ VariantMapMap mapMap = it.value();
-+ for (QVariantMap &map : mapMap) {
-+ map = Utils::sanitizeValue(map);
- }
-- } else {
-- qCWarning(UDISKS2) << "Failed enumerating UDisks2 objects:" << reply.error().name() << "\n" << reply.error().message();
-+ m_devices.append(udi);
-+ m_cache.insert(udi, mapMap);
- }
-+
-+ // Filter out empty optical drives.
-+ m_devices.erase(std::remove_if(m_devices.begin(),
-+ m_devices.end(),
-+ [this](const QString &udi) {
-+ Device device(this, udi);
-+ return device.mightBeOpticalDisc() && !device.isOpticalDisc();
-+ }),
-+ m_devices.end());
-+
-+ return m_devices;
- }
-
- QSet<Solid::DeviceInterface::Type> Manager::supportedInterfaces() const
-@@ -183,33 +206,56 @@ void Manager::slotInterfacesAdded(const QDBusObjectPath &object_path, const Vari
-
- qCDebug(UDISKS2) << udi << "has new interfaces:" << interfaces_and_properties.keys();
-
-- // If device gained an org.freedesktop.UDisks2.Block interface, we
-- // should check if it is an optical drive, in order to properly
-- // register mediaChanged event handler with newly-plugged external
-- // drives
-- if (interfaces_and_properties.contains(QStringLiteral("org.freedesktop.UDisks2.Block"))) {
-- Device device(udi);
-- if (device.mightBeOpticalDisc()) {
-- QDBusConnection::systemBus().connect(QStringLiteral(UD2_DBUS_SERVICE), //
-- udi,
-- QStringLiteral(DBUS_INTERFACE_PROPS),
-- QStringLiteral("PropertiesChanged"),
-- this,
-- SLOT(slotMediaChanged(QDBusMessage)));
-+ auto cachedIt = m_cache.find(udi);
-+ if (cachedIt == m_cache.end()) {
-+ cachedIt = m_cache.insert(udi, VariantMapMap{});
-+ }
-+
-+ // We need to re-fetch all existing interfaces to ensure by the time we emit "add" for FileSystem
-+ // the rest is up to date (e.g. if Loop gets updated after we gained FileSystem) some propertes aren't updated yet.
-+ // We'll skip Block as every device we are interested in will be a Block device.
-+ QStringList oldInterfaces = cachedIt->keys();
-+ oldInterfaces.removeOne(QStringLiteral(UD2_DBUS_INTERFACE_BLOCK));
-+
-+ for (auto it = interfaces_and_properties.begin(), end = interfaces_and_properties.end(); it != end; ++it) {
-+ // Filters generic DBus interfaces.
-+ if (!it.key().startsWith(QLatin1String(UD2_DBUS_SERVICE))) {
-+ continue;
- }
-+ cachedIt->insert(it.key(), Utils::sanitizeValue(it.value()));
- }
-
-- updateBackend(udi);
-+ for (const QString &interface : oldInterfaces) {
-+ QDBusMessage call = QDBusMessage::createMethodCall(QStringLiteral(UD2_DBUS_SERVICE), udi, QStringLiteral(DBUS_INTERFACE_PROPS), QStringLiteral("GetAll"));
-+ call.setArguments({interface});
-+ QDBusReply<QVariantMap> reply = QDBusConnection::systemBus().call(call);
-+ if (reply.isValid()) {
-+ cachedIt->insert(interface, Utils::sanitizeValue(reply.value()));
-+ }
-+ }
-
-- // new device, we don't know it yet
-- if (!m_deviceCache.contains(udi)) {
-- m_deviceCache.append(udi);
-- Q_EMIT deviceAdded(udi);
-+ bool isNewDevice = !m_devices.contains(udi);
-+ if (isNewDevice) {
-+ // Check if it is an empty optical drive, and if so, ignore it.
-+ Device device(this, udi);
-+ if (device.mightBeOpticalDisc() && !device.isOpticalDisc()) {
-+ qCDebug(UDISKS2) << "\tIt's a new empty optical drive, ignoring";
-+ isNewDevice = false;
-+ } else {
-+ qCDebug(UDISKS2) << "\tIt's a new device, emitting added";
-+ m_devices.append(udi);
-+ }
- }
-- // re-emit in case of 2-stage devices like N9 or some Android phones
-- else if (m_deviceCache.contains(udi) && interfaces_and_properties.keys().contains(QStringLiteral(UD2_DBUS_INTERFACE_FILESYSTEM))) {
-+
-+ if (isNewDevice) {
-+ Q_EMIT deviceAdded(udi);
-+ } else if (interfaces_and_properties.contains(QLatin1String(UD2_DBUS_INTERFACE_FILESYSTEM))) {
-+ // re-emit in case of 2-stage devices like N9 or some Android phones
-+ Q_EMIT deviceRemoved(udi);
- Q_EMIT deviceAdded(udi);
- }
-+
-+ // TODO invalidate drive? updateBackend did that
- }
-
- void Manager::slotInterfacesRemoved(const QDBusObjectPath &object_path, const QStringList &interfaces)
-@@ -224,23 +270,27 @@ void Manager::slotInterfacesRemoved(const QDBusObjectPath &object_path, const QS
- return;
- }
-
-+ auto cachedIt = m_cache.find(udi);
-+ if (cachedIt == m_cache.end()) {
-+ return;
-+ }
-+
- qCDebug(UDISKS2) << udi << "lost interfaces:" << interfaces;
-
-+ for (const QString &iface : interfaces) {
-+ cachedIt->remove(iface);
-+ }
-+
- /*
- * Determine left interfaces. The device backend may have processed the
- * InterfacesRemoved signal already, but the result set is the same
- * independent if the backend or the manager processes the signal first.
- */
-- Device device(udi);
-- const QStringList ifaceList = device.interfaces();
-- QSet<QString> leftInterfaces(ifaceList.begin(), ifaceList.end());
-- leftInterfaces.subtract(QSet<QString>(interfaces.begin(), interfaces.end()));
--
-- if (leftInterfaces.isEmpty()) {
-- // remove the device if the last interface is removed
-+ if (cachedIt->isEmpty()) {
-+ qCDebug(UDISKS2) << "\tThere are no more interface, emitting device removal";
- Q_EMIT deviceRemoved(udi);
-- m_deviceCache.removeAll(udi);
-- DeviceBackend::destroyBackend(udi);
-+ m_cache.remove(udi);
-+ m_devices.removeOne(udi);
- } else {
- /*
- * Changes in the interface composition may change if a device
-@@ -252,65 +302,87 @@ void Manager::slotInterfacesRemoved(const QDBusObjectPath &object_path, const QS
- }
- }
-
--void Manager::slotMediaChanged(const QDBusMessage &msg)
-+void Manager::slotPropertiesChanged(const QDBusMessage &msg)
- {
-- const QVariantMap properties = qdbus_cast<QVariantMap>(msg.arguments().at(1));
-+ const QString udi = msg.path();
-
-- if (!properties.contains(QStringLiteral("Size"))) { // react only on Size changes
-+ if (udi.isEmpty() || !udi.startsWith(QLatin1String(UD2_UDI_DISKS_PREFIX)) || udi.startsWith(QLatin1String(UD2_DBUS_PATH_JOBS))) {
- return;
- }
-
-- const QString udi = msg.path();
-- updateBackend(udi);
-- qulonglong size = properties.value(QStringLiteral("Size")).toULongLong();
-- qCDebug(UDISKS2) << "MEDIA CHANGED in" << udi << "; size is:" << size;
--
-- Device device(udi);
-- if (!device.interfaces().contains(u"org.freedesktop.UDisks2.Filesystem")) {
-- if (!m_deviceCache.contains(udi) && size > 0) { // we don't know the optdisc, got inserted
-- m_deviceCache.append(udi);
-- Q_EMIT deviceAdded(udi);
-- }
--
-- if (m_deviceCache.contains(udi) && size == 0) { // we know the optdisc, got removed
-- Q_EMIT deviceRemoved(udi);
-- m_deviceCache.removeAll(udi);
-- DeviceBackend::destroyBackend(udi);
-- }
-+ const auto args = msg.arguments();
-+ if (Q_UNLIKELY(args.size() != 3)) {
-+ return;
- }
--}
-
--const QStringList &Manager::deviceCache()
--{
-- if (m_deviceCache.isEmpty()) {
-- allDevices();
-+ const QString iface = qdbus_cast<QString>(args.at(0));
-+ const QVariantMap changed = qdbus_cast<QVariantMap>(args.at(1));
-+ const QStringList invalidated = qdbus_cast<QStringList>(args.at(2));
-+
-+ auto cachedIt = m_cache.find(udi);
-+ if (cachedIt == m_cache.end()) {
-+ return;
- }
-
-- return m_deviceCache;
--}
-+ const bool knownDevice = m_devices.contains(udi);
-
--void Manager::updateBackend(const QString &udi)
--{
-- DeviceBackend *backend = DeviceBackend::backendForUDI(udi);
-- if (!backend) {
-- return;
-+ // Update cache of internal devices even if we don't advertise them at this time.
-+ QMap<QString, int> changeMap;
-+
-+ for (const QString &prop : invalidated) {
-+ // Invalid QVariant() marks property that exists but needs to be fetched first.
-+ (*cachedIt)[iface].insert(prop, QVariant());
-+ changeMap.insert(prop, Solid::GenericInterface::PropertyModified);
- }
-
-- // This doesn't emit "changed" signals. Signals are emitted later by DeviceBackend's slots
-- backend->allProperties();
-+ for (auto it = changed.begin(), end = changed.end(); it != end; ++it) {
-+ (*cachedIt)[iface].insert(it.key(), Utils::sanitizeValue(it.value()));
-+ changeMap.insert(it.key(), Solid::GenericInterface::PropertyModified);
-+ }
-
-- QVariant driveProp = backend->prop(QStringLiteral("Drive"));
-- if (!driveProp.isValid()) {
-- return;
-+ // Only announce the change if the device is advertised.
-+ if (knownDevice && !changeMap.isEmpty()) {
-+ Q_EMIT propertyChanged(udi, changeMap);
- }
-
-- QDBusObjectPath drivePath = qdbus_cast<QDBusObjectPath>(driveProp);
-- DeviceBackend *driveBackend = DeviceBackend::backendForUDI(drivePath.path(), false);
-- if (!driveBackend) {
-- return;
-+ // Special handling for optical media insertion/removal.
-+ if (iface == QLatin1String(UD2_DBUS_INTERFACE_BLOCK) && (changed.contains(QStringLiteral("Size")) || invalidated.contains(QStringLiteral("Size")))) {
-+ qulonglong size = deviceProperty(udi, QStringLiteral("Size")).toULongLong();
-+
-+ const bool mediaInserted = !knownDevice && size > 0;
-+ const bool mediaRemoved = knownDevice && size == 0;
-+
-+ if (mediaInserted || mediaRemoved) {
-+ Device device(this, udi);
-+ if (device.mightBeOpticalDisc()) {
-+ if (!knownDevice && size > 0) { // we don't know the optical disc, got inserted.
-+ const OpticalDisc disc(&device);
-+ // If it is a data disc, wait for its FileSystem interface to be announced instead,
-+ // otherwise we'll add this disc twice. But if we don't add it here, we will miss
-+ // Audio CDs that will never have a FileSystem interface.
-+ if (!disc.availableContent().testFlag(Solid::OpticalDisc::Data)) {
-+ m_devices.append(udi);
-+ Q_EMIT deviceAdded(udi);
-+ }
-+ } else if (knownDevice && size == 0) { // we know the optical disc, got removed.
-+ Q_EMIT deviceRemoved(udi);
-+ // Keeping the cache as we never fetch all device properties again after the initial query.
-+ m_devices.removeOne(udi);
-+ }
-+ }
-+ }
-+ }
-+
-+ // TODO invalidate drive? updateBackend did that
-+}
-+
-+QMap<QString, PropertyMap> Manager::deviceCache()
-+{
-+ if (m_cache.isEmpty()) {
-+ allDevices();
- }
-
-- driveBackend->invalidateProperties();
-+ return m_cache;
- }
-
- #include "moc_udisksmanager.cpp"
-diff --git a/src/solid/devices/backends/udisks2/udisksmanager.h b/src/solid/devices/backends/udisks2/udisksmanager.h
-index e73cfa8628b27b408674d51d0fa573f1d3def177..5b52fd0fe89729d87feeb2ed4e68b0cbd1a85856 100644
---- a/src/solid/devices/backends/udisks2/udisksmanager.h
-+++ b/src/solid/devices/backends/udisks2/udisksmanager.h
-@@ -16,6 +16,8 @@
-
- #include <QSet>
-
-+using PropertyMap = QMap<QString, QVariantMap>;
-+
- namespace Solid
- {
- namespace Backends
-@@ -27,6 +29,11 @@ class Manager : public Solid::Ifaces::DeviceManager
- Q_OBJECT
-
- public:
-+ enum FetchMode {
-+ FetchIfNeeded,
-+ CachedOnly,
-+ };
-+
- Manager(QObject *parent);
- QObject *createDevice(const QString &udi) override;
- QStringList devicesFromQuery(const QString &parentUdi, Solid::DeviceInterface::Type type) override;
-@@ -35,18 +42,29 @@ public:
- QString udiPrefix() const override;
- ~Manager() override;
-
-+ bool hasInterface(const QString &udi, const QString &interface);
-+ QMap<QString, PropertyMap> allProperties();
-+ PropertyMap deviceProperties(const QString &udi);
-+ QVariant deviceProperty(const QString &udi, const QString &name, FetchMode fetchMode = FetchIfNeeded);
-+
-+Q_SIGNALS:
-+ void propertyChanged(const QString &udi, const QMap<QString, int> &changes);
-+
- private Q_SLOTS:
- void slotInterfacesAdded(const QDBusObjectPath &object_path, const VariantMapMap &interfaces_and_properties);
- void slotInterfacesRemoved(const QDBusObjectPath &object_path, const QStringList &interfaces);
-- void slotMediaChanged(const QDBusMessage &msg);
-+ void slotPropertiesChanged(const QDBusMessage &msg);
-
- private:
-- const QStringList &deviceCache();
-- void introspect(const QString &path, bool checkOptical = false);
-+ QMap<QString, PropertyMap> deviceCache();
- void updateBackend(const QString &udi);
- QSet<Solid::DeviceInterface::Type> m_supportedInterfaces;
- org::freedesktop::DBus::ObjectManager m_manager;
-- QStringList m_deviceCache;
-+
-+ // Optical media can be removed from the list of "known" devices
-+ // but we still want to cache their properties for when the media is inserted back.
-+ QStringList m_devices;
-+ QMap<QString, PropertyMap> m_cache;
- };
-
- }
-diff --git a/src/solid/devices/backends/udisks2/udisksopticaldisc.cpp b/src/solid/devices/backends/udisks2/udisksopticaldisc.cpp
-index f88f7c7ebf1a56929039f69668e35ddcfee07121..7204a23055a4487ac87762545d763c4920e65626 100644
---- a/src/solid/devices/backends/udisks2/udisksopticaldisc.cpp
-+++ b/src/solid/devices/backends/udisks2/udisksopticaldisc.cpp
-@@ -331,7 +331,7 @@ OpticalDisc::OpticalDisc(Device *dev)
- /*qDebug() << "\tProperties:" << */ m_udevDevice.deviceProperties(); // initialize the properties DB so that it doesn't crash further down, #298416
- #endif
-
-- m_drive = new Device(m_device->drivePath());
-+ m_drive = new Device(m_device->manager(), m_device->drivePath());
- }
-
- OpticalDisc::~OpticalDisc()
-diff --git a/src/solid/devices/backends/udisks2/udisksopticaldrive.cpp b/src/solid/devices/backends/udisks2/udisksopticaldrive.cpp
-index 18bc4328ff1d324b2f83c659b54291460fc208a2..15a7e1f45870d426e19f02195fd8280bef8c66c0 100644
---- a/src/solid/devices/backends/udisks2/udisksopticaldrive.cpp
-+++ b/src/solid/devices/backends/udisks2/udisksopticaldrive.cpp
-@@ -34,7 +34,7 @@ OpticalDrive::OpticalDrive(Device *device)
- {
- m_device->registerAction(QStringLiteral("eject"), this, SLOT(slotEjectRequested()), SLOT(slotEjectDone(int, QString)));
-
-- connect(m_device, SIGNAL(changed()), this, SLOT(slotChanged()));
-+ connect(m_device, &Device::changed, this, &OpticalDrive::slotChanged);
- }
-
- OpticalDrive::~OpticalDrive()
-@@ -70,7 +70,7 @@ bool OpticalDrive::eject()
- continue;
- }
-
-- Device device(udi);
-+ Device device(m_device->manager(), udi);
- if (device.drivePath() == path && device.isMounted()) {
- // qDebug() << "Got mounted block device:" << udi;
- blockPath = udi;
-diff --git a/src/solid/devices/backends/udisks2/udisksstorageaccess.cpp b/src/solid/devices/backends/udisks2/udisksstorageaccess.cpp
-index 16d49406c8a0337c7343735c1831f551d17058d9..579452df9438c5050287cfb50e8e019fcac418ab 100644
---- a/src/solid/devices/backends/udisks2/udisksstorageaccess.cpp
-+++ b/src/solid/devices/backends/udisks2/udisksstorageaccess.cpp
-@@ -8,12 +8,14 @@
- #include "udisksstorageaccess.h"
- #include "udisks2.h"
- #include "udisks_debug.h"
-+#include "udisksutils.h"
-
- #include <QDBusConnection>
- #include <QDBusInterface>
- #include <QDBusMetaType>
- #include <QDir>
- #include <QGuiApplication>
-+#include <QMetaObject>
- #include <QWindow>
-
- #include <config-solid.h>
-@@ -53,14 +55,12 @@ StorageAccess::StorageAccess(Device *device)
- , m_repairInProgress(false)
- , m_passphraseRequested(false)
- {
-- qDBusRegisterMetaType<AvailableAnswer>();
--
- connect(device, SIGNAL(changed()), this, SLOT(checkAccessibility()));
- updateCache();
-
- // Delay connecting to DBus signals to avoid the related time penalty
- // in hot paths such as predicate matching
-- QTimer::singleShot(0, this, SLOT(connectDBusSignals()));
-+ QMetaObject::invokeMethod(this, &StorageAccess::connectDBusSignals, Qt::QueuedConnection);
- }
-
- StorageAccess::~StorageAccess()
-@@ -91,7 +91,7 @@ bool StorageAccess::isAccessible() const
- if (path.isEmpty() || path == QLatin1String("/")) {
- return false;
- }
-- Device holderDevice(path);
-+ Device holderDevice(m_device->manager(), path);
- return holderDevice.isMounted();
- }
-
-@@ -193,7 +193,7 @@ static QString baseMountPoint(const QByteArray &dev)
- struct libmnt_iter *itr = mnt_new_iter(MNT_ITER_BACKWARD);
- struct libmnt_fs *fs;
-
-- const QByteArray devicePath = dev.endsWith('\x00') ? dev.chopped(1) : dev;
-+ const QByteArray devicePath = Utils::sanitizeValue(dev);
-
- while (mnt_table_next_fs(table, itr, &fs) == 0) {
- if (mnt_fs_get_srcpath(fs) == devicePath //
-@@ -223,14 +223,10 @@ QString StorageAccess::filePath() const
- if (path.isEmpty() || path == QLatin1String("/")) {
- return QString();
- }
-- Device holderDevice(path);
-+ Device holderDevice(m_device->manager(), path);
- const auto mntPoints = qdbus_cast<QByteArrayList>(holderDevice.prop(QStringLiteral("MountPoints")));
- if (!mntPoints.isEmpty()) {
-- QByteArray first = mntPoints.first();
-- if (first.endsWith('\x00')) {
-- first.chop(1);
-- }
-- return QFile::decodeName(first); // FIXME Solid doesn't support multiple mount points
-+ return QFile::decodeName(Utils::sanitizeValue(mntPoints.first())); // FIXME Solid doesn't support multiple mount points
- } else {
- return QString();
- }
-@@ -241,11 +237,7 @@ QString StorageAccess::filePath() const
- return {};
- }
-
-- QByteArray first = mntPoints.first();
-- if (first.endsWith('\x00')) {
-- first.chop(1);
-- }
-- const QString potentialMountPoint = QFile::decodeName(first);
-+ const QString potentialMountPoint = QFile::decodeName(Utils::sanitizeValue(mntPoints.first()));
-
- if (mntPoints.size() == 1) {
- return potentialMountPoint;
-@@ -324,7 +316,6 @@ void StorageAccess::slotDBusReply(const QDBusMessage &reply)
- mount();
- } else { // Don't broadcast setupDone unless the setup is really done. (Fix kde#271156)
- m_setupInProgress = false;
-- m_device->invalidateCache();
- m_device->broadcastActionDone(QStringLiteral("setup"));
-
- checkAccessibility();
-@@ -340,7 +331,7 @@ void StorageAccess::slotDBusReply(const QDBusMessage &reply)
- // try to "eject" (aka safely remove) from the (parent) drive, e.g. SD card from a reader
- QString drivePath = m_device->drivePath();
- if (!drivePath.isEmpty() || drivePath != QStringLiteral("/")) {
-- Device drive(drivePath);
-+ Device drive(m_device->manager(), drivePath);
- QDBusConnection c = QDBusConnection::systemBus();
-
- if (drive.prop(QStringLiteral("MediaRemovable")).toBool() //
-@@ -365,7 +356,6 @@ void StorageAccess::slotDBusReply(const QDBusMessage &reply)
- }
-
- m_teardownInProgress = false;
-- m_device->invalidateCache();
- m_device->broadcastActionDone(QStringLiteral("teardown"));
-
- checkAccessibility();
-diff --git a/src/solid/devices/backends/udisks2/udisksutils.cpp b/src/solid/devices/backends/udisks2/udisksutils.cpp
-new file mode 100644
-index 0000000000000000000000000000000000000000..b6d6d0ef963f60dfa9e23c3d812ff356d216f32b
---- /dev/null
-+++ b/src/solid/devices/backends/udisks2/udisksutils.cpp
-@@ -0,0 +1,41 @@
-+/*
-+ SPDX-FileCopyrightText: 2012 Lukáš Tinkl <ltinkl at redhat.com>
-+
-+ SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
-+*/
-+
-+#include "udisksutils.h"
-+
-+#include <QDebug>
-+
-+using namespace Solid::Backends::UDisks2;
-+
-+QByteArray Utils::sanitizeValue(const QByteArray &value)
-+{
-+ QByteArray blob = value;
-+ // UDisks2 sends us null terminated strings, make sure to strip the extranous \0 in favor of the implicit \0.
-+ // Otherwise comparision becomes unnecessarily complicated because 'foo\0' != 'foo'. QByteArrays are implicitly
-+ // terminated already.
-+ while (blob.endsWith('\0')) {
-+ blob.chop(1);
-+ }
-+ return blob;
-+}
-+
-+QVariant Utils::sanitizeValue(const QVariant &value)
-+{
-+ if (value.userType() == QMetaType::QByteArray) {
-+ return sanitizeValue(value.toByteArray());
-+ } else {
-+ return value;
-+ }
-+}
-+
-+QVariantMap Utils::sanitizeValue(const QVariantMap &map)
-+{
-+ QVariantMap ret = map;
-+ for (QVariant &value : ret) {
-+ value = sanitizeValue(value);
-+ }
-+ return ret;
-+}
-diff --git a/src/solid/devices/backends/udisks2/udisksutils.h b/src/solid/devices/backends/udisks2/udisksutils.h
-new file mode 100644
-index 0000000000000000000000000000000000000000..751055cdbd22dac8cfb8abb8536237f408d57050
---- /dev/null
-+++ b/src/solid/devices/backends/udisks2/udisksutils.h
-@@ -0,0 +1,34 @@
-+/*
-+ SPDX-FileCopyrightText: 2024 Kai Uwe Broulik <kde at broulik.de>
-+
-+ SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
-+*/
-+
-+#ifndef UDISKSUTILS_H
-+#define UDISKSUTILS_H
-+
-+#include <QByteArray>
-+#include <QVariant>
-+#include <QVariantMap>
-+
-+namespace Solid
-+{
-+namespace Backends
-+{
-+namespace UDisks2
-+{
-+
-+namespace Utils
-+{
-+
-+QByteArray sanitizeValue(const QByteArray &value);
-+QVariant sanitizeValue(const QVariant &value);
-+QVariantMap sanitizeValue(const QVariantMap &map);
-+
-+} // Utils
-+
-+} // UDisks2
-+} // Backends
-+} // Solid
-+
-+#endif // UDISKSUTILS_H
diff --git a/debian/patches/series b/debian/patches/series
deleted file mode 100644
index ae2c1e3..0000000
--- a/debian/patches/series
+++ /dev/null
@@ -1 +0,0 @@
-kai_udisks.diff
More information about the Neon-commits
mailing list