fix ghost devices in the udisks2 Solid backend
This commit is contained in:
parent
8d3faf2202
commit
3966b2d0bd
@ -471,10 +471,10 @@ index 0000000..19cb70a
|
|||||||
+#endif // UDISKS2BLOCK_H
|
+#endif // UDISKS2BLOCK_H
|
||||||
diff --git a/solid/solid/backends/udisks2/udisksdevice.cpp b/solid/solid/backends/udisks2/udisksdevice.cpp
|
diff --git a/solid/solid/backends/udisks2/udisksdevice.cpp b/solid/solid/backends/udisks2/udisksdevice.cpp
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000..b888360
|
index 0000000..2a4313a
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/solid/solid/backends/udisks2/udisksdevice.cpp
|
+++ b/solid/solid/backends/udisks2/udisksdevice.cpp
|
||||||
@@ -0,0 +1,834 @@
|
@@ -0,0 +1,833 @@
|
||||||
+/*
|
+/*
|
||||||
+ Copyright 2010 Michael Zanetti <mzanetti@kde.org>
|
+ Copyright 2010 Michael Zanetti <mzanetti@kde.org>
|
||||||
+ Copyright 2010-2012 Lukáš Tinkl <ltinkl@redhat.com>
|
+ Copyright 2010-2012 Lukáš Tinkl <ltinkl@redhat.com>
|
||||||
@ -581,7 +581,60 @@ index 0000000..b888360
|
|||||||
+
|
+
|
||||||
+Device::~Device()
|
+Device::~Device()
|
||||||
+{
|
+{
|
||||||
|
+}
|
||||||
+
|
+
|
||||||
|
+QString Device::udi() const
|
||||||
|
+{
|
||||||
|
+ if (m_backend) {
|
||||||
|
+ return m_backend->udi();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return QString();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+QVariant Device::prop(const QString &key) const
|
||||||
|
+{
|
||||||
|
+ if (m_backend) {
|
||||||
|
+ return m_backend->prop(key);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return QVariant();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+bool Device::propertyExists(const QString &key) const
|
||||||
|
+{
|
||||||
|
+ if (m_backend) {
|
||||||
|
+ return m_backend->propertyExists(key);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+QVariantMap Device::allProperties() const
|
||||||
|
+{
|
||||||
|
+ if (m_backend) {
|
||||||
|
+ return m_backend->allProperties();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return QVariantMap();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+bool Device::hasInterface(const QString &name) const
|
||||||
|
+{
|
||||||
|
+ if (m_backend) {
|
||||||
|
+ return m_backend->interfaces().contains(name);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+QStringList Device::interfaces() const
|
||||||
|
+{
|
||||||
|
+ if (m_backend) {
|
||||||
|
+ return m_backend->interfaces();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return QStringList();
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+QObject* Device::createDeviceInterface(const Solid::DeviceInterface::Type& type)
|
+QObject* Device::createDeviceInterface(const Solid::DeviceInterface::Type& type)
|
||||||
@ -1105,15 +1158,6 @@ index 0000000..b888360
|
|||||||
+ return prop("Vendor").toString();
|
+ return prop("Vendor").toString();
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+QString Device::udi() const
|
|
||||||
+{
|
|
||||||
+ if (m_backend) {
|
|
||||||
+ return m_backend->udi;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return QString();
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+QString Device::parentUdi() const
|
+QString Device::parentUdi() const
|
||||||
+{
|
+{
|
||||||
+ QString parent;
|
+ QString parent;
|
||||||
@ -1128,51 +1172,6 @@ index 0000000..b888360
|
|||||||
+ return parent;
|
+ return parent;
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+QVariant Device::prop(const QString &key) const
|
|
||||||
+{
|
|
||||||
+ if (m_backend) {
|
|
||||||
+ return m_backend->prop(key);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return QVariant();
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+bool Device::propertyExists(const QString &key) const
|
|
||||||
+{
|
|
||||||
+ if (m_backend) {
|
|
||||||
+ return m_backend->propertyExists(key);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return false;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+QVariantMap Device::allProperties() const
|
|
||||||
+{
|
|
||||||
+ if (m_backend) {
|
|
||||||
+ return m_backend->allProperties();
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return QVariantMap();
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+bool Device::hasInterface(const QString &name) const
|
|
||||||
+{
|
|
||||||
+ if (m_backend) {
|
|
||||||
+ return m_backend->interfaces().contains(name);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return false;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+QStringList Device::interfaces() const
|
|
||||||
+{
|
|
||||||
+ if (m_backend) {
|
|
||||||
+ return m_backend->interfaces();
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return QStringList();
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+QString Device::errorToString(const QString & error) const
|
+QString Device::errorToString(const QString & error) const
|
||||||
+{
|
+{
|
||||||
+ if (error == UD2_ERROR_UNAUTHORIZED || error == UD2_ERROR_NOT_AUTHORIZED)
|
+ if (error == UD2_ERROR_UNAUTHORIZED || error == UD2_ERROR_NOT_AUTHORIZED)
|
||||||
@ -1311,10 +1310,10 @@ index 0000000..b888360
|
|||||||
+}
|
+}
|
||||||
diff --git a/solid/solid/backends/udisks2/udisksdevice.h b/solid/solid/backends/udisks2/udisksdevice.h
|
diff --git a/solid/solid/backends/udisks2/udisksdevice.h b/solid/solid/backends/udisks2/udisksdevice.h
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000..90bb042
|
index 0000000..6038178
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/solid/solid/backends/udisks2/udisksdevice.h
|
+++ b/solid/solid/backends/udisks2/udisksdevice.h
|
||||||
@@ -0,0 +1,103 @@
|
@@ -0,0 +1,104 @@
|
||||||
+/*
|
+/*
|
||||||
+ Copyright 2010 Michael Zanetti <mzanetti@kde.org>
|
+ Copyright 2010 Michael Zanetti <mzanetti@kde.org>
|
||||||
+ Copyright 2010-2012 Lukáš Tinkl <ltinkl@redhat.com>
|
+ Copyright 2010-2012 Lukáš Tinkl <ltinkl@redhat.com>
|
||||||
@ -1406,11 +1405,12 @@ index 0000000..90bb042
|
|||||||
+ void changed();
|
+ void changed();
|
||||||
+ void propertyChanged(const QMap<QString,int> &changes);
|
+ void propertyChanged(const QMap<QString,int> &changes);
|
||||||
+
|
+
|
||||||
|
+protected:
|
||||||
|
+ QPointer<DeviceBackend> m_backend;
|
||||||
|
+
|
||||||
+private:
|
+private:
|
||||||
+ QString storageDescription() const;
|
+ QString storageDescription() const;
|
||||||
+ QString volumeDescription() const;
|
+ QString volumeDescription() const;
|
||||||
+
|
|
||||||
+ DeviceBackend *m_backend;
|
|
||||||
+};
|
+};
|
||||||
+
|
+
|
||||||
+}
|
+}
|
||||||
@ -1420,10 +1420,10 @@ index 0000000..90bb042
|
|||||||
+#endif // UDISKS2DEVICE_H
|
+#endif // UDISKS2DEVICE_H
|
||||||
diff --git a/solid/solid/backends/udisks2/udisksdevicebackend.cpp b/solid/solid/backends/udisks2/udisksdevicebackend.cpp
|
diff --git a/solid/solid/backends/udisks2/udisksdevicebackend.cpp b/solid/solid/backends/udisks2/udisksdevicebackend.cpp
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000..ffa98db
|
index 0000000..8131cb5
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/solid/solid/backends/udisks2/udisksdevicebackend.cpp
|
+++ b/solid/solid/backends/udisks2/udisksdevicebackend.cpp
|
||||||
@@ -0,0 +1,205 @@
|
@@ -0,0 +1,239 @@
|
||||||
+/*
|
+/*
|
||||||
+ Copyright 2010 Michael Zanetti <mzanetti@kde.org>
|
+ Copyright 2010 Michael Zanetti <mzanetti@kde.org>
|
||||||
+ Copyright 2010-2012 Lukáš Tinkl <ltinkl@redhat.com>
|
+ Copyright 2010-2012 Lukáš Tinkl <ltinkl@redhat.com>
|
||||||
@ -1477,16 +1477,25 @@ index 0000000..ffa98db
|
|||||||
+ return backend;
|
+ return backend;
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+DeviceBackend::DeviceBackend(const QString& udi)
|
+void DeviceBackend::destroyBackend(const QString& udi)
|
||||||
+ : udi(udi)
|
|
||||||
+{
|
+{
|
||||||
+ qDebug() << "Creating backend for device" << udi;
|
+ if (s_backends.contains(udi)) {
|
||||||
+ m_device = new QDBusInterface(UD2_DBUS_SERVICE, udi,
|
+ DeviceBackend *backend = s_backends.value(udi);
|
||||||
|
+ s_backends.remove(udi);
|
||||||
|
+ delete backend;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+DeviceBackend::DeviceBackend(const QString& udi)
|
||||||
|
+ : m_udi(udi)
|
||||||
|
+{
|
||||||
|
+ qDebug() << "Creating backend for device" << m_udi;
|
||||||
|
+ m_device = new QDBusInterface(UD2_DBUS_SERVICE, m_udi,
|
||||||
+ QString(), // no interface, we aggregate them
|
+ QString(), // no interface, we aggregate them
|
||||||
+ QDBusConnection::systemBus(), this);
|
+ QDBusConnection::systemBus(), this);
|
||||||
+
|
+
|
||||||
+ if (m_device->isValid()) {
|
+ if (m_device->isValid()) {
|
||||||
+ QDBusConnection::systemBus().connect(UD2_DBUS_SERVICE, udi, DBUS_INTERFACE_PROPS, "PropertiesChanged", this,
|
+ QDBusConnection::systemBus().connect(UD2_DBUS_SERVICE, m_udi, DBUS_INTERFACE_PROPS, "PropertiesChanged", this,
|
||||||
+ SLOT(slotPropertiesChanged(QString,QVariantMap,QStringList)));
|
+ SLOT(slotPropertiesChanged(QString,QVariantMap,QStringList)));
|
||||||
+ QDBusConnection::systemBus().connect(UD2_DBUS_SERVICE, UD2_DBUS_PATH, DBUS_INTERFACE_MANAGER, "InterfacesAdded",
|
+ QDBusConnection::systemBus().connect(UD2_DBUS_SERVICE, UD2_DBUS_PATH, DBUS_INTERFACE_MANAGER, "InterfacesAdded",
|
||||||
+ this, SLOT(slotInterfacesAdded(QDBusObjectPath,QVariantMapMap)));
|
+ this, SLOT(slotInterfacesAdded(QDBusObjectPath,QVariantMapMap)));
|
||||||
@ -1499,20 +1508,33 @@ index 0000000..ffa98db
|
|||||||
+
|
+
|
||||||
+DeviceBackend::~DeviceBackend()
|
+DeviceBackend::~DeviceBackend()
|
||||||
+{
|
+{
|
||||||
|
+ qDebug() << "Destroying backend for device" << m_udi;
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+void DeviceBackend::initInterfaces()
|
+void DeviceBackend::initInterfaces()
|
||||||
+{
|
+{
|
||||||
+ m_interfaces.clear();
|
+ m_interfaces.clear();
|
||||||
|
+
|
||||||
+ const QString xmlData = introspect();
|
+ const QString xmlData = introspect();
|
||||||
|
+ if (xmlData.isEmpty()) {
|
||||||
|
+ qDebug() << m_udi << "has no interfaces!";
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
+ QDomDocument dom;
|
+ QDomDocument dom;
|
||||||
+ dom.setContent(xmlData);
|
+ dom.setContent(xmlData);
|
||||||
|
+
|
||||||
+ QDomNodeList ifaceNodeList = dom.elementsByTagName("interface");
|
+ QDomNodeList ifaceNodeList = dom.elementsByTagName("interface");
|
||||||
+ for (int i = 0; i < ifaceNodeList.count(); i++) {
|
+ for (int i = 0; i < ifaceNodeList.count(); i++) {
|
||||||
+ QDomElement ifaceElem = ifaceNodeList.item(i).toElement();
|
+ QDomElement ifaceElem = ifaceNodeList.item(i).toElement();
|
||||||
+ if (!ifaceElem.isNull())
|
+ /* Accept only org.freedesktop.UDisks2.* interfaces so that when the device is unplugged,
|
||||||
|
+ * m_interfaces goes empty and we can easily verify that the device is gone. */
|
||||||
|
+ if (!ifaceElem.isNull() && ifaceElem.attribute("name").startsWith(UD2_DBUS_SERVICE)) {
|
||||||
+ m_interfaces.append(ifaceElem.attribute("name"));
|
+ m_interfaces.append(ifaceElem.attribute("name"));
|
||||||
+ }
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ qDebug() << m_udi << "has interfaces:" << m_interfaces;
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+QStringList DeviceBackend::interfaces() const
|
+QStringList DeviceBackend::interfaces() const
|
||||||
@ -1520,42 +1542,30 @@ index 0000000..ffa98db
|
|||||||
+ return m_interfaces;
|
+ return m_interfaces;
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+
|
+const QString& DeviceBackend::udi() const
|
||||||
+QString DeviceBackend::introspect() const
|
|
||||||
+{
|
+{
|
||||||
+ QDBusMessage call = QDBusMessage::createMethodCall(UD2_DBUS_SERVICE, udi,
|
+ return m_udi;
|
||||||
+ DBUS_INTERFACE_INTROSPECT, "Introspect");
|
|
||||||
+ QDBusPendingReply<QString> reply = QDBusConnection::systemBus().call(call);
|
|
||||||
+
|
|
||||||
+ if (reply.isValid())
|
|
||||||
+ return reply.value();
|
|
||||||
+ else {
|
|
||||||
+ return QString();
|
|
||||||
+ }
|
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+QVariant DeviceBackend::prop(const QString& key)
|
+QVariant DeviceBackend::prop(const QString& key) const
|
||||||
+{
|
+{
|
||||||
+ checkCache(key);
|
+ checkCache(key);
|
||||||
+ return m_propertyCache.value(key);
|
+ return m_propertyCache.value(key);
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+bool DeviceBackend::propertyExists(const QString& key)
|
+bool DeviceBackend::propertyExists(const QString& key) const
|
||||||
+{
|
+{
|
||||||
+ checkCache(key);
|
+ checkCache(key);
|
||||||
+ return m_propertyCache.contains(key);
|
+ /* checkCache() will put an invalid QVariant in cache when the property
|
||||||
|
+ * does not exist, so check for validity, not for an actual presence. */
|
||||||
|
+ return m_propertyCache.value(key).isValid();
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+
|
|
||||||
+QVariantMap DeviceBackend::allProperties() const
|
+QVariantMap DeviceBackend::allProperties() const
|
||||||
+{
|
+{
|
||||||
+ QDBusMessage call = QDBusMessage::createMethodCall(UD2_DBUS_SERVICE, udi, DBUS_INTERFACE_PROPS, "GetAll");
|
+ QDBusMessage call = QDBusMessage::createMethodCall(UD2_DBUS_SERVICE, m_udi, DBUS_INTERFACE_PROPS, "GetAll");
|
||||||
+
|
+
|
||||||
+ Q_FOREACH (const QString & iface, m_interfaces) {
|
+ Q_FOREACH (const QString & iface, m_interfaces) {
|
||||||
+ if (iface.startsWith("org.freedesktop.DBus")) {
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ call.setArguments(QVariantList() << iface);
|
+ call.setArguments(QVariantList() << iface);
|
||||||
+ QDBusPendingReply<QVariantMap> reply = QDBusConnection::systemBus().call(call);
|
+ QDBusPendingReply<QVariantMap> reply = QDBusConnection::systemBus().call(call);
|
||||||
+
|
+
|
||||||
@ -1570,6 +1580,19 @@ index 0000000..ffa98db
|
|||||||
+ return m_propertyCache;
|
+ return m_propertyCache;
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
|
+QString DeviceBackend::introspect() const
|
||||||
|
+{
|
||||||
|
+ QDBusMessage call = QDBusMessage::createMethodCall(UD2_DBUS_SERVICE, m_udi,
|
||||||
|
+ DBUS_INTERFACE_INTROSPECT, "Introspect");
|
||||||
|
+ QDBusPendingReply<QString> reply = QDBusConnection::systemBus().call(call);
|
||||||
|
+
|
||||||
|
+ if (reply.isValid())
|
||||||
|
+ return reply.value();
|
||||||
|
+ else {
|
||||||
|
+ return QString();
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
+void DeviceBackend::checkCache(const QString& key) const
|
+void DeviceBackend::checkCache(const QString& key) const
|
||||||
+{
|
+{
|
||||||
+ if (m_propertyCache.isEmpty()) { // recreate the cache
|
+ if (m_propertyCache.isEmpty()) { // recreate the cache
|
||||||
@ -1581,17 +1604,19 @@ index 0000000..ffa98db
|
|||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ QVariant reply = m_device->property(key.toUtf8());
|
+ QVariant reply = m_device->property(key.toUtf8());
|
||||||
+
|
|
||||||
+ if (reply.isValid()) {
|
|
||||||
+ m_propertyCache.insert(key, reply);
|
+ m_propertyCache.insert(key, reply);
|
||||||
+ } else {
|
+
|
||||||
+ qWarning() << "got invalid reply for cache:" << key;
|
+ if (!reply.isValid()) {
|
||||||
|
+ /* 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() */
|
||||||
|
+ qDebug() << m_udi << ": property" << key << "does not exist";
|
||||||
+ }
|
+ }
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+void DeviceBackend::slotPropertiesChanged(const QString& ifaceName, const QVariantMap& changedProps, const QStringList& invalidatedProps)
|
+void DeviceBackend::slotPropertiesChanged(const QString& ifaceName, const QVariantMap& changedProps, const QStringList& invalidatedProps)
|
||||||
+{
|
+{
|
||||||
+ qDebug() << udi << "'s interface" << ifaceName << "changed props:";
|
+ qDebug() << m_udi << "'s interface" << ifaceName << "changed props:";
|
||||||
+
|
+
|
||||||
+ QMap<QString, int> changeMap;
|
+ QMap<QString, int> changeMap;
|
||||||
+
|
+
|
||||||
@ -1616,25 +1641,34 @@ index 0000000..ffa98db
|
|||||||
+
|
+
|
||||||
+void DeviceBackend::slotInterfacesAdded(const QDBusObjectPath& object_path, const QVariantMapMap& interfaces_and_properties)
|
+void DeviceBackend::slotInterfacesAdded(const QDBusObjectPath& object_path, const QVariantMapMap& interfaces_and_properties)
|
||||||
+{
|
+{
|
||||||
+ if (object_path.path() == udi) {
|
+ if (object_path.path() != m_udi) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ Q_FOREACH(const QString & iface, interfaces_and_properties.keys()) {
|
||||||
|
+ /* Don't store generic DBus interfaces */
|
||||||
|
+ if (iface.startsWith(UD2_DBUS_SERVICE)) {
|
||||||
+ m_interfaces.append(interfaces_and_properties.keys());
|
+ m_interfaces.append(interfaces_and_properties.keys());
|
||||||
+ }
|
+ }
|
||||||
|
+ }
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+void DeviceBackend::slotInterfacesRemoved(const QDBusObjectPath& object_path, const QStringList& interfaces)
|
+void DeviceBackend::slotInterfacesRemoved(const QDBusObjectPath& object_path, const QStringList& interfaces)
|
||||||
+{
|
+{
|
||||||
+ if (object_path.path() == udi) {
|
+ if (object_path.path() != m_udi) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
+ Q_FOREACH(const QString & iface, interfaces) {
|
+ Q_FOREACH(const QString & iface, interfaces) {
|
||||||
+ m_interfaces.removeAll(iface);
|
+ m_interfaces.removeAll(iface);
|
||||||
+ }
|
+ }
|
||||||
+ }
|
|
||||||
+}
|
+}
|
||||||
diff --git a/solid/solid/backends/udisks2/udisksdevicebackend.h b/solid/solid/backends/udisks2/udisksdevicebackend.h
|
diff --git a/solid/solid/backends/udisks2/udisksdevicebackend.h b/solid/solid/backends/udisks2/udisksdevicebackend.h
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000..4953ad5
|
index 0000000..829fa41
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/solid/solid/backends/udisks2/udisksdevicebackend.h
|
+++ b/solid/solid/backends/udisks2/udisksdevicebackend.h
|
||||||
@@ -0,0 +1,83 @@
|
@@ -0,0 +1,84 @@
|
||||||
+/*
|
+/*
|
||||||
+ Copyright 2010 Michael Zanetti <mzanetti@kde.org>
|
+ Copyright 2010 Michael Zanetti <mzanetti@kde.org>
|
||||||
+ Copyright 2010-2012 Lukáš Tinkl <ltinkl@redhat.com>
|
+ Copyright 2010-2012 Lukáš Tinkl <ltinkl@redhat.com>
|
||||||
@ -1678,21 +1712,17 @@ index 0000000..4953ad5
|
|||||||
+
|
+
|
||||||
+ public:
|
+ public:
|
||||||
+ static DeviceBackend* backendForUDI(const QString &udi);
|
+ static DeviceBackend* backendForUDI(const QString &udi);
|
||||||
|
+ static void destroyBackend(const QString &udi);
|
||||||
+
|
+
|
||||||
+ DeviceBackend(const QString &udi);
|
+ DeviceBackend(const QString &udi);
|
||||||
+ ~DeviceBackend();
|
+ ~DeviceBackend();
|
||||||
+
|
+
|
||||||
+ void initInterfaces();
|
+ QVariant prop(const QString &key) const;
|
||||||
+ QString introspect() const;
|
+ bool propertyExists(const QString &key) const;
|
||||||
+
|
|
||||||
+ QVariant prop(const QString &key);
|
|
||||||
+ bool propertyExists(const QString &key);
|
|
||||||
+ QVariantMap allProperties() const;
|
+ QVariantMap allProperties() const;
|
||||||
+ void checkCache(const QString &key) const;
|
|
||||||
+
|
+
|
||||||
+ QStringList interfaces() const;
|
+ QStringList interfaces() const;
|
||||||
+
|
+ const QString & udi() const;
|
||||||
+ QString udi;
|
|
||||||
+
|
+
|
||||||
+ Q_SIGNALS:
|
+ Q_SIGNALS:
|
||||||
+ void propertyChanged(const QMap<QString, int> &changeMap);
|
+ void propertyChanged(const QMap<QString, int> &changeMap);
|
||||||
@ -1704,10 +1734,15 @@ index 0000000..4953ad5
|
|||||||
+ void slotPropertiesChanged(const QString &ifaceName, const QVariantMap &changedProps, const QStringList &invalidatedProps);
|
+ void slotPropertiesChanged(const QString &ifaceName, const QVariantMap &changedProps, const QStringList &invalidatedProps);
|
||||||
+
|
+
|
||||||
+ private:
|
+ private:
|
||||||
|
+ void initInterfaces();
|
||||||
|
+ QString introspect() const;
|
||||||
|
+ void checkCache(const QString &key) const;
|
||||||
|
+
|
||||||
+ QDBusInterface *m_device;
|
+ QDBusInterface *m_device;
|
||||||
+
|
+
|
||||||
+ mutable QVariantMap m_propertyCache;
|
+ mutable QVariantMap m_propertyCache;
|
||||||
+ QStringList m_interfaces;
|
+ QStringList m_interfaces;
|
||||||
|
+ QString m_udi;
|
||||||
+
|
+
|
||||||
+ static QMap<QString, DeviceBackend*> s_backends;
|
+ static QMap<QString, DeviceBackend*> s_backends;
|
||||||
+
|
+
|
||||||
@ -2036,10 +2071,10 @@ index 0000000..d225f32
|
|||||||
+#endif // SOLID_BACKENDS_UDISKS2_GENERICINTERFACE_H
|
+#endif // SOLID_BACKENDS_UDISKS2_GENERICINTERFACE_H
|
||||||
diff --git a/solid/solid/backends/udisks2/udisksmanager.cpp b/solid/solid/backends/udisks2/udisksmanager.cpp
|
diff --git a/solid/solid/backends/udisks2/udisksmanager.cpp b/solid/solid/backends/udisks2/udisksmanager.cpp
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000..69e053f
|
index 0000000..35b0d23
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/solid/solid/backends/udisks2/udisksmanager.cpp
|
+++ b/solid/solid/backends/udisks2/udisksmanager.cpp
|
||||||
@@ -0,0 +1,238 @@
|
@@ -0,0 +1,248 @@
|
||||||
+/*
|
+/*
|
||||||
+ Copyright 2012 Lukáš Tinkl <ltinkl@redhat.com>
|
+ Copyright 2012 Lukáš Tinkl <ltinkl@redhat.com>
|
||||||
+
|
+
|
||||||
@ -2061,6 +2096,7 @@ index 0000000..69e053f
|
|||||||
+*/
|
+*/
|
||||||
+
|
+
|
||||||
+#include "udisksmanager.h"
|
+#include "udisksmanager.h"
|
||||||
|
+#include "udisksdevicebackend.h"
|
||||||
+
|
+
|
||||||
+#include <QtCore/QCoreApplication>
|
+#include <QtCore/QCoreApplication>
|
||||||
+#include <QtCore/QDebug>
|
+#include <QtCore/QDebug>
|
||||||
@ -2118,7 +2154,10 @@ index 0000000..69e053f
|
|||||||
+
|
+
|
||||||
+Manager::~Manager()
|
+Manager::~Manager()
|
||||||
+{
|
+{
|
||||||
+ QDBusConnection::systemBus().disconnectFromBus("Solid::UDisks2");
|
+ while (!m_deviceCache.isEmpty()) {
|
||||||
|
+ QString udi = m_deviceCache.takeFirst();
|
||||||
|
+ DeviceBackend::destroyBackend(udi);
|
||||||
|
+ }
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+QObject* Manager::createDevice(const QString& udi)
|
+QObject* Manager::createDevice(const QString& udi)
|
||||||
@ -2170,7 +2209,11 @@ index 0000000..69e053f
|
|||||||
+
|
+
|
||||||
+QStringList Manager::allDevices()
|
+QStringList Manager::allDevices()
|
||||||
+{
|
+{
|
||||||
+ m_deviceCache.clear();
|
+ /* Clear the cache, destroy all backends */
|
||||||
|
+ while (!m_deviceCache.isEmpty()) {
|
||||||
|
+ QString udi= m_deviceCache.takeFirst();
|
||||||
|
+ DeviceBackend::destroyBackend(udi);
|
||||||
|
+ }
|
||||||
+
|
+
|
||||||
+ introspect("/org/freedesktop/UDisks2/block_devices", true /*checkOptical*/);
|
+ introspect("/org/freedesktop/UDisks2/block_devices", true /*checkOptical*/);
|
||||||
+ introspect("/org/freedesktop/UDisks2/drives");
|
+ introspect("/org/freedesktop/UDisks2/drives");
|
||||||
@ -2245,6 +2288,7 @@ index 0000000..69e053f
|
|||||||
+ if (!udi.isEmpty() && (interfaces.isEmpty() || device.interfaces().isEmpty() || device.interfaces().contains(UD2_DBUS_INTERFACE_FILESYSTEM))) {
|
+ if (!udi.isEmpty() && (interfaces.isEmpty() || device.interfaces().isEmpty() || device.interfaces().contains(UD2_DBUS_INTERFACE_FILESYSTEM))) {
|
||||||
+ Q_EMIT deviceRemoved(udi);
|
+ Q_EMIT deviceRemoved(udi);
|
||||||
+ m_deviceCache.removeAll(udi);
|
+ m_deviceCache.removeAll(udi);
|
||||||
|
+ DeviceBackend::destroyBackend(udi);
|
||||||
+ }
|
+ }
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
@ -2267,6 +2311,7 @@ index 0000000..69e053f
|
|||||||
+ if (m_deviceCache.contains(udi) && size == 0) { // we know the optdisc, got removed
|
+ if (m_deviceCache.contains(udi) && size == 0) { // we know the optdisc, got removed
|
||||||
+ Q_EMIT deviceRemoved(udi);
|
+ Q_EMIT deviceRemoved(udi);
|
||||||
+ m_deviceCache.removeAll(udi);
|
+ m_deviceCache.removeAll(udi);
|
||||||
|
+ DeviceBackend::destroyBackend(udi);
|
||||||
+ }
|
+ }
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
@ -2734,7 +2779,7 @@ index 0000000..0cdcc66
|
|||||||
+#endif // UDISKS2OPTICALDISC_H
|
+#endif // UDISKS2OPTICALDISC_H
|
||||||
diff --git a/solid/solid/backends/udisks2/udisksopticaldrive.cpp b/solid/solid/backends/udisks2/udisksopticaldrive.cpp
|
diff --git a/solid/solid/backends/udisks2/udisksopticaldrive.cpp b/solid/solid/backends/udisks2/udisksopticaldrive.cpp
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000..74a901e
|
index 0000000..4df18b1
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/solid/solid/backends/udisks2/udisksopticaldrive.cpp
|
+++ b/solid/solid/backends/udisks2/udisksopticaldrive.cpp
|
||||||
@@ -0,0 +1,226 @@
|
@@ -0,0 +1,226 @@
|
||||||
@ -2803,7 +2848,7 @@ index 0000000..74a901e
|
|||||||
+ m_device->broadcastActionRequested("eject");
|
+ m_device->broadcastActionRequested("eject");
|
||||||
+
|
+
|
||||||
+ const QString path = m_device->udi();
|
+ const QString path = m_device->udi();
|
||||||
+ QDBusConnection c = QDBusConnection::systemBus();
|
+ QDBusConnection c = QDBusConnection::connectToBus(QDBusConnection::SystemBus, "Solid::Udisks2::OpticalDrive::" + path);
|
||||||
+
|
+
|
||||||
+ // if the device is mounted, unmount first
|
+ // if the device is mounted, unmount first
|
||||||
+ QString blockPath;
|
+ QString blockPath;
|
||||||
@ -3952,13 +3997,14 @@ index 0000000..2ca04d2
|
|||||||
+
|
+
|
||||||
+#endif // UDISKS2STORAGEVOLUME_H
|
+#endif // UDISKS2STORAGEVOLUME_H
|
||||||
diff --git a/solid/solid/managerbase.cpp b/solid/solid/managerbase.cpp
|
diff --git a/solid/solid/managerbase.cpp b/solid/solid/managerbase.cpp
|
||||||
index fb5a67c..c7005ff 100644
|
index fb5a67c..dc1700d 100644
|
||||||
--- a/solid/solid/managerbase.cpp
|
--- a/solid/solid/managerbase.cpp
|
||||||
+++ b/solid/solid/managerbase.cpp
|
+++ b/solid/solid/managerbase.cpp
|
||||||
@@ -30,8 +30,11 @@
|
@@ -29,9 +29,11 @@
|
||||||
|
|
||||||
#if defined (Q_OS_MAC)
|
#if defined (Q_OS_MAC)
|
||||||
#include "backends/iokit/iokitmanager.h"
|
#include "backends/iokit/iokitmanager.h"
|
||||||
#elif defined (Q_OS_UNIX)
|
-#elif defined (Q_OS_UNIX)
|
||||||
-#include "backends/hal/halmanager.h"
|
-#include "backends/hal/halmanager.h"
|
||||||
+#if defined (WITH_SOLID_UDISKS2)
|
+#if defined (WITH_SOLID_UDISKS2)
|
||||||
+#include "backends/udisks2/udisksmanager.h"
|
+#include "backends/udisks2/udisksmanager.h"
|
||||||
@ -3968,7 +4014,7 @@ index fb5a67c..c7005ff 100644
|
|||||||
#include "backends/upower/upowermanager.h"
|
#include "backends/upower/upowermanager.h"
|
||||||
|
|
||||||
#if defined (HUPNP_FOUND)
|
#if defined (HUPNP_FOUND)
|
||||||
@@ -71,22 +74,17 @@ void Solid::ManagerBasePrivate::loadBackends()
|
@@ -71,22 +73,17 @@ void Solid::ManagerBasePrivate::loadBackends()
|
||||||
# elif defined(Q_WS_WIN) && defined(HAVE_WBEM) && !defined(_WIN32_WCE)
|
# elif defined(Q_WS_WIN) && defined(HAVE_WBEM) && !defined(_WIN32_WCE)
|
||||||
m_backends << new Solid::Backends::Wmi::WmiManager(0);
|
m_backends << new Solid::Backends::Wmi::WmiManager(0);
|
||||||
|
|
||||||
@ -3995,20 +4041,15 @@ index fb5a67c..c7005ff 100644
|
|||||||
# endif
|
# endif
|
||||||
|
|
||||||
# if defined (HUPNP_FOUND)
|
# if defined (HUPNP_FOUND)
|
||||||
@@ -99,5 +97,3 @@ QList<QObject*> Solid::ManagerBasePrivate::managerBackends() const
|
|
||||||
{
|
|
||||||
return m_backends;
|
|
||||||
}
|
|
||||||
-
|
|
||||||
-
|
|
||||||
diff --git a/solid/tests/CMakeLists.txt b/solid/tests/CMakeLists.txt
|
diff --git a/solid/tests/CMakeLists.txt b/solid/tests/CMakeLists.txt
|
||||||
index ef507d1..9212741 100644
|
index ef507d1..b9f3720 100644
|
||||||
--- a/solid/tests/CMakeLists.txt
|
--- a/solid/tests/CMakeLists.txt
|
||||||
+++ b/solid/tests/CMakeLists.txt
|
+++ b/solid/tests/CMakeLists.txt
|
||||||
@@ -16,20 +16,6 @@ target_link_libraries(fakehardwaretest solid_static ${QT_QTCORE_LIBRARY} ${QT_QT
|
@@ -15,21 +15,6 @@ endif(WIN32)
|
||||||
|
target_link_libraries(fakehardwaretest solid_static ${QT_QTCORE_LIBRARY} ${QT_QTDBUS_LIBRARY} ${QT_QTXML_LIBRARY} ${QT_QTTEST_LIBRARY} )
|
||||||
add_definitions(-DTEST_DATA="\\"${CMAKE_CURRENT_SOURCE_DIR}/../solid/backends/fakehw/fakecomputer.xml\\"")
|
add_definitions(-DTEST_DATA="\\"${CMAKE_CURRENT_SOURCE_DIR}/../solid/backends/fakehw/fakecomputer.xml\\"")
|
||||||
|
|
||||||
|
-
|
||||||
-########### halbasictest ###############
|
-########### halbasictest ###############
|
||||||
-
|
-
|
||||||
-if(NOT WIN32 AND NOT APPLE)
|
-if(NOT WIN32 AND NOT APPLE)
|
||||||
|
@ -596,8 +596,9 @@ rm -rf %{buildroot}
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Mon Dec 03 2012 Than Ngo <than@redhat.com> - 4.9.4-1
|
* Mon Dec 03 2012 Than Ngo <than@redhat.com> - 6:4.9.4-1
|
||||||
- 4.9.4
|
- 4.9.4
|
||||||
|
- update udisks2 backend patch to fix ghost devices
|
||||||
|
|
||||||
* Fri Nov 30 2012 Dan Vrátil <dvratil@redhat.com> - 6:4.9.3-7
|
* Fri Nov 30 2012 Dan Vrátil <dvratil@redhat.com> - 6:4.9.3-7
|
||||||
- update udisks2 backend patch
|
- update udisks2 backend patch
|
||||||
|
Loading…
Reference in New Issue
Block a user