Resolves #868530 - cache information about solid device in 'Places'

panel in  open/save dialog
- update solid/udisks2 backend, switch to cmake-define
This commit is contained in:
Lukáš Tinkl 2012-10-29 18:26:23 +01:00
parent 01e36094ea
commit 032b78558d
2 changed files with 165 additions and 177 deletions

View File

@ -1,5 +1,5 @@
diff --git a/solid/solid/CMakeLists.txt b/solid/solid/CMakeLists.txt diff --git a/solid/solid/CMakeLists.txt b/solid/solid/CMakeLists.txt
index 0aa7a43..0a74053 100644 index 0aa7a43..5cd1484 100644
--- a/solid/solid/CMakeLists.txt --- a/solid/solid/CMakeLists.txt
+++ b/solid/solid/CMakeLists.txt +++ b/solid/solid/CMakeLists.txt
@@ -1,6 +1,7 @@ @@ -1,6 +1,7 @@
@ -10,55 +10,12 @@ index 0aa7a43..0a74053 100644
if(WIN32) if(WIN32)
include_directories( ${KDEWIN_INCLUDES} ) include_directories( ${KDEWIN_INCLUDES} )
@@ -39,7 +40,6 @@ configure_file(config-processor.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-proce @@ -264,19 +265,38 @@ if(NOT WIN32 AND NOT APPLE)
file(MAKE_DIRECTORY
${CMAKE_CURRENT_BINARY_DIR}/backends/fakehw
- ${CMAKE_CURRENT_BINARY_DIR}/backends/hal
${CMAKE_CURRENT_BINARY_DIR}/backends/udev
${CMAKE_CURRENT_BINARY_DIR}/backends/wmi
)
@@ -225,33 +225,6 @@ if(NOT WIN32 AND NOT APPLE)
endif( UDEV_FOUND )
- message(STATUS "Building Solid HAL backend." )
- set(solid_LIB_SRCS ${solid_LIB_SRCS}
- backends/hal/halacadapter.cpp
- backends/hal/halaudiointerface.cpp
- backends/hal/halbattery.cpp
- backends/hal/halblock.cpp
- backends/hal/halbutton.cpp
- backends/hal/halcamera.cpp
- backends/hal/halcdrom.cpp
- backends/hal/haldeviceinterface.cpp
- backends/hal/haldvbinterface.cpp
- backends/hal/halfstabhandling.cpp
- backends/hal/halgenericinterface.cpp
- backends/hal/haldevice.cpp
- backends/hal/halmanager.cpp
- backends/hal/halnetworkinterface.cpp
- backends/hal/halserialinterface.cpp
- backends/hal/halopticaldisc.cpp
- backends/hal/halportablemediaplayer.cpp
- backends/hal/halprocessor.cpp
- backends/hal/halstorageaccess.cpp
- backends/hal/halstorage.cpp
- backends/hal/halvideo.cpp
- backends/hal/halvolume.cpp
- backends/hal/halsmartcardreader.cpp
- )
-
message(STATUS "Building Solid UPower backend." )
set(solid_LIB_SRCS ${solid_LIB_SRCS}
backends/upower/upowermanager.cpp
@@ -264,18 +237,19 @@ if(NOT WIN32 AND NOT APPLE)
# FIXME: this should work on more Unix systems # FIXME: this should work on more Unix systems
if (CMAKE_SYSTEM_NAME MATCHES Linux) if (CMAKE_SYSTEM_NAME MATCHES Linux)
- message(STATUS "Building Solid UDisks backend." ) - message(STATUS "Building Solid UDisks backend." )
+ message(STATUS "Building Solid UDisks2 backend." ) - set(solid_LIB_SRCS ${solid_LIB_SRCS}
set(solid_LIB_SRCS ${solid_LIB_SRCS}
- backends/udisks/udisksmanager.cpp - backends/udisks/udisksmanager.cpp
- backends/udisks/udisksdevice.cpp - backends/udisks/udisksdevice.cpp
- backends/udisks/udisksblock.cpp - backends/udisks/udisksblock.cpp
@ -69,6 +26,12 @@ index 0aa7a43..0a74053 100644
- backends/udisks/udisksstoragedrive.cpp - backends/udisks/udisksstoragedrive.cpp
- backends/udisks/udisksstorageaccess.cpp - backends/udisks/udisksstorageaccess.cpp
- backends/udisks/udisksgenericinterface.cpp - backends/udisks/udisksgenericinterface.cpp
- )
+
+ if ( WITH_SOLID_UDISKS2 )
+ message(STATUS "Building Solid UDisks2 backend." )
+ add_definitions(-DWITH_SOLID_UDISKS2)
+ set(solid_LIB_SRCS ${solid_LIB_SRCS}
+ backends/udisks2/udisksmanager.cpp + backends/udisks2/udisksmanager.cpp
+ backends/udisks2/udisksdevice.cpp + backends/udisks2/udisksdevice.cpp
+ backends/udisks2/udisksblock.cpp + backends/udisks2/udisksblock.cpp
@ -80,9 +43,25 @@ index 0aa7a43..0a74053 100644
+ backends/udisks2/udisksstorageaccess.cpp + backends/udisks2/udisksstorageaccess.cpp
+ backends/udisks2/udisksgenericinterface.cpp + backends/udisks2/udisksgenericinterface.cpp
+ backends/udisks2/dbus/manager.cpp + backends/udisks2/dbus/manager.cpp
) + )
+ else ( WITH_SOLID_UDISKS2 )
+ message(STATUS "Building Solid UDisks backend." )
+ set(solid_LIB_SRCS ${solid_LIB_SRCS}
+ backends/udisks/udisksmanager.cpp
+ backends/udisks/udisksdevice.cpp
+ backends/udisks/udisksblock.cpp
+ backends/udisks/udisksstoragevolume.cpp
+ backends/udisks/udisksdeviceinterface.cpp
+ backends/udisks/udisksopticaldisc.cpp
+ backends/udisks/udisksopticaldrive.cpp
+ backends/udisks/udisksstoragedrive.cpp
+ backends/udisks/udisksstorageaccess.cpp
+ backends/udisks/udisksgenericinterface.cpp
+ )
+ endif ( WITH_SOLID_UDISKS2 )
endif (CMAKE_SYSTEM_NAME MATCHES Linux) endif (CMAKE_SYSTEM_NAME MATCHES Linux)
message(STATUS "Building Solid fstab backend." )
diff --git a/solid/solid/backends/udisks2/dbus/manager.cpp b/solid/solid/backends/udisks2/dbus/manager.cpp diff --git a/solid/solid/backends/udisks2/dbus/manager.cpp b/solid/solid/backends/udisks2/dbus/manager.cpp
new file mode 100644 new file mode 100644
index 0000000..7ea4aa8 index 0000000..7ea4aa8
@ -209,10 +188,10 @@ index 0000000..8f25cb6
+</node> +</node>
diff --git a/solid/solid/backends/udisks2/udisks2.h b/solid/solid/backends/udisks2/udisks2.h diff --git a/solid/solid/backends/udisks2/udisks2.h b/solid/solid/backends/udisks2/udisks2.h
new file mode 100644 new file mode 100644
index 0000000..25a1dc0 index 0000000..8dda86a
--- /dev/null --- /dev/null
+++ b/solid/solid/backends/udisks2/udisks2.h +++ b/solid/solid/backends/udisks2/udisks2.h
@@ -0,0 +1,77 @@ @@ -0,0 +1,78 @@
+/* +/*
+ Copyright 2012 Lukáš Tinkl <ltinkl@redhat.com> + Copyright 2012 Lukáš Tinkl <ltinkl@redhat.com>
+ +
@ -268,6 +247,7 @@ index 0000000..25a1dc0
+#define UD2_DBUS_INTERFACE_FILESYSTEM "org.freedesktop.UDisks2.Filesystem" +#define UD2_DBUS_INTERFACE_FILESYSTEM "org.freedesktop.UDisks2.Filesystem"
+#define UD2_DBUS_INTERFACE_ENCRYPTED "org.freedesktop.UDisks2.Encrypted" +#define UD2_DBUS_INTERFACE_ENCRYPTED "org.freedesktop.UDisks2.Encrypted"
+#define UD2_DBUS_INTERFACE_SWAP "org.freedesktop.UDisks2.Swapspace" +#define UD2_DBUS_INTERFACE_SWAP "org.freedesktop.UDisks2.Swapspace"
+#define UD2_DBUS_INTERFACE_LOOP "org.freedesktop.UDisks2.Loop"
+ +
+/* errors */ +/* errors */
+#define UD2_ERROR_UNAUTHORIZED "org.freedesktop.PolicyKit.Error.NotAuthorized" +#define UD2_ERROR_UNAUTHORIZED "org.freedesktop.PolicyKit.Error.NotAuthorized"
@ -292,10 +272,10 @@ index 0000000..25a1dc0
+#endif // SOLID_BACKENDS_UDISKS2_H +#endif // SOLID_BACKENDS_UDISKS2_H
diff --git a/solid/solid/backends/udisks2/udisksblock.cpp b/solid/solid/backends/udisks2/udisksblock.cpp diff --git a/solid/solid/backends/udisks2/udisksblock.cpp b/solid/solid/backends/udisks2/udisksblock.cpp
new file mode 100644 new file mode 100644
index 0000000..474f3d6 index 0000000..f3cd1e8
--- /dev/null --- /dev/null
+++ b/solid/solid/backends/udisks2/udisksblock.cpp +++ b/solid/solid/backends/udisks2/udisksblock.cpp
@@ -0,0 +1,84 @@ @@ -0,0 +1,88 @@
+/* +/*
+ Copyright 2012 Lukáš Tinkl <ltinkl@redhat.com> + Copyright 2012 Lukáš Tinkl <ltinkl@redhat.com>
+ +
@ -321,9 +301,9 @@ index 0000000..474f3d6
+#include <QFile> +#include <QFile>
+#include <QtDBus/QDBusConnection> +#include <QtDBus/QDBusConnection>
+#include <QtDBus/QDBusPendingReply> +#include <QtDBus/QDBusPendingReply>
+#include <QtXml/QDomDocument>
+ +
+#include "udisksblock.h" +#include "udisksblock.h"
+#include "dbus/manager.h"
+ +
+using namespace Solid::Backends::UDisks2; +using namespace Solid::Backends::UDisks2;
+ +
@ -335,15 +315,20 @@ index 0000000..474f3d6
+ +
+ // we have a drive (non-block device for udisks), so let's find the corresponding (real) block device + // we have a drive (non-block device for udisks), so let's find the corresponding (real) block device
+ if (m_devNum == 0 || m_devFile.isEmpty()) { + if (m_devNum == 0 || m_devFile.isEmpty()) {
+ org::freedesktop::DBus::ObjectManager manager(UD2_DBUS_SERVICE, UD2_DBUS_PATH, QDBusConnection::systemBus()); + const QString path = "/org/freedesktop/UDisks2/block_devices";
+ QDBusPendingReply<DBUSManagerStruct> reply = manager.GetManagedObjects(); + QDBusMessage call = QDBusMessage::createMethodCall(UD2_DBUS_SERVICE, path,
+ DBUS_INTERFACE_INTROSPECT, "Introspect");
+ QDBusPendingReply<QString> reply = QDBusConnection::systemBus().asyncCall(call);
+ reply.waitForFinished(); + reply.waitForFinished();
+ if (!reply.isError()) { // enum devices
+ Q_FOREACH(const QDBusObjectPath &path, reply.value().keys()) {
+ const QString udi = path.path();
+ +
+ if (udi == UD2_DBUS_PATH_MANAGER || udi == UD2_UDI_DISKS_PREFIX || udi.startsWith(UD2_DBUS_PATH_JOBS)) + if (reply.isValid()) {
+ continue; + QDomDocument dom;
+ dom.setContent(reply.value());
+ QDomNodeList nodeList = dom.documentElement().elementsByTagName("node");
+ for (int i = 0; i < nodeList.count(); i++) {
+ QDomElement nodeElem = nodeList.item(i).toElement();
+ if (!nodeElem.isNull() && nodeElem.hasAttribute("name")) {
+ const QString udi = path + "/" + nodeElem.attribute("name");
+ +
+ Device device(udi); + Device device(udi);
+ if (device.drivePath() == dev->udi()) { + if (device.drivePath() == dev->udi()) {
@ -353,10 +338,9 @@ index 0000000..474f3d6
+ } + }
+ } + }
+ } + }
+ else // show error
+ {
+ qWarning() << "Failed enumerating UDisks2 objects:" << reply.error().name() << "\n" << reply.error().message();
+ } + }
+ else
+ qWarning() << "Failed enumerating UDisks2 objects:" << reply.error().name() << "\n" << reply.error().message();
+ } + }
+ +
+ //qDebug() << "devnum:" << m_devNum << "dev file:" << m_devFile; + //qDebug() << "devnum:" << m_devNum << "dev file:" << m_devFile;
@ -444,10 +428,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..22b0c45 index 0000000..a3f780f
--- /dev/null --- /dev/null
+++ b/solid/solid/backends/udisks2/udisksdevice.cpp +++ b/solid/solid/backends/udisks2/udisksdevice.cpp
@@ -0,0 +1,910 @@ @@ -0,0 +1,927 @@
+/* +/*
+ 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>
@ -651,11 +635,15 @@ index 0000000..22b0c45
+ +
+QString Device::description() const +QString Device::description() const
+{ +{
+ const QString hintName = prop("HintName").toString(); + const QString hintName = property("HintName").toString(); // non-cached
+ if (!hintName.isEmpty()) + if (!hintName.isEmpty())
+ return hintName; + return hintName;
+ +
+ if (queryDeviceInterface(Solid::DeviceInterface::StorageDrive)) + if (isLoop())
+ return QObject::tr("Loop Device");
+ else if (isSwap())
+ return QObject::tr("Swap Space");
+ else if (queryDeviceInterface(Solid::DeviceInterface::StorageDrive))
+ return storageDescription(); + return storageDescription();
+ else if (queryDeviceInterface(Solid::DeviceInterface::StorageVolume)) + else if (queryDeviceInterface(Solid::DeviceInterface::StorageVolume))
+ return volumeDescription(); + return volumeDescription();
@ -668,7 +656,7 @@ index 0000000..22b0c45
+ QString description; + QString description;
+ const UDisks2::StorageDrive storageDrive(const_cast<Device*>(this)); + const UDisks2::StorageDrive storageDrive(const_cast<Device*>(this));
+ Solid::StorageDrive::DriveType drive_type = storageDrive.driveType(); + Solid::StorageDrive::DriveType drive_type = storageDrive.driveType();
+ bool drive_is_hotpluggable = storageDrive.isHotpluggable(); + const bool drive_is_hotpluggable = storageDrive.isHotpluggable();
+ +
+ if (drive_type == Solid::StorageDrive::CdromDrive) + if (drive_type == Solid::StorageDrive::CdromDrive)
+ { + {
@ -740,7 +728,7 @@ index 0000000..22b0c45
+ return description; + return description;
+ } + }
+ +
+ bool drive_is_removable = storageDrive.isRemovable(); + const bool drive_is_removable = storageDrive.isRemovable();
+ +
+ if (drive_type == Solid::StorageDrive::HardDisk && !drive_is_removable) + if (drive_type == Solid::StorageDrive::HardDisk && !drive_is_removable)
+ { + {
@ -973,19 +961,23 @@ index 0000000..22b0c45
+ +
+QString Device::icon() const +QString Device::icon() const
+{ +{
+ QString iconName = prop( "HintIconName" ).toString(); + QString iconName = property( "HintIconName" ).toString(); // non-cached
+ +
+ if ( !iconName.isEmpty() ) + if ( !iconName.isEmpty() )
+ { + {
+ return iconName; + return iconName;
+ } + }
+ else if (isLoop() || isSwap())
+ {
+ return "drive-harddisk";
+ }
+ else if (isDrive()) { + else if (isDrive()) {
+ const bool isRemovable = prop("Removable").toBool(); + const bool isRemovable = prop("Removable").toBool();
+ const QString conn = prop("ConnectionBus").toString(); + const QString conn = prop("ConnectionBus").toString();
+ +
+ if (isOpticalDrive()) + if (isOpticalDrive())
+ return "drive-optical"; + return "drive-optical";
+ else if (isRemovable && !isOpticalDisc()) { + else if (isRemovable && !prop("Optical").toBool()) {
+ if (conn == "usb") + if (conn == "usb")
+ return "drive-removable-media-usb"; + return "drive-removable-media-usb";
+ else + else
@ -993,14 +985,18 @@ index 0000000..22b0c45
+ } + }
+ } + }
+ else if (isBlock()) { + else if (isBlock()) {
+ Device drive(drivePath()); + const QString drv = drivePath();
+ if (drv.isEmpty() || drv == "/")
+ return "drive-harddisk"; // stuff like loop devices or swap which don't have the Drive prop set
+
+ Device drive(drv);
+ +
+ // handle media + // handle media
+ const QString media = drive.prop("Media").toString(); + const QString media = drive.prop("Media").toString();
+ +
+ if ( !media.isEmpty() ) + if ( !media.isEmpty() )
+ { + {
+ if ( isOpticalDisc() ) // optical stuff + if ( drive.prop("Optical").toBool() ) // optical stuff
+ { + {
+ bool isWritable = drive.prop("OpticalBlank").toBool(); + bool isWritable = drive.prop("OpticalBlank").toBool();
+ +
@ -1107,8 +1103,7 @@ index 0000000..22b0c45
+ if (reply.isValid()) { + if (reply.isValid()) {
+ m_cache.insert(key, reply); + m_cache.insert(key, reply);
+ } else { + } else {
+ //qDebug() << "got invalid reply for cache:" << key; + qWarning() << "got invalid reply for cache:" << key;
+ //m_cache.insert(key, QVariant());
+ } + }
+} +}
+ +
@ -1140,11 +1135,12 @@ index 0000000..22b0c45
+ +
+QVariantMap Device::allProperties() const +QVariantMap Device::allProperties() const
+{ +{
+ 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")) + if (iface.startsWith("org.freedesktop.DBus"))
+ continue; + continue;
+ QDBusMessage call = QDBusMessage::createMethodCall(UD2_DBUS_SERVICE, m_udi, DBUS_INTERFACE_PROPS, "GetAll"); + call.setArguments(QVariantList() << iface);
+ call << iface;
+ QDBusPendingReply<QVariantMap> reply = QDBusConnection::systemBus().asyncCall(call); + QDBusPendingReply<QVariantMap> reply = QDBusConnection::systemBus().asyncCall(call);
+ reply.waitForFinished(); + reply.waitForFinished();
+ +
@ -1354,16 +1350,21 @@ index 0000000..22b0c45
+ return hasInterface(UD2_DBUS_INTERFACE_SWAP); + return hasInterface(UD2_DBUS_INTERFACE_SWAP);
+} +}
+ +
+bool Device::isLoop() const
+{
+ return hasInterface(UD2_DBUS_INTERFACE_LOOP);
+}
+
+QString Device::drivePath() const +QString Device::drivePath() const
+{ +{
+ return prop("Drive").value<QDBusObjectPath>().path(); + return prop("Drive").value<QDBusObjectPath>().path();
+} +}
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..cf8e2f5 index 0000000..7e27634
--- /dev/null --- /dev/null
+++ b/solid/solid/backends/udisks2/udisksdevice.h +++ b/solid/solid/backends/udisks2/udisksdevice.h
@@ -0,0 +1,112 @@ @@ -0,0 +1,113 @@
+/* +/*
+ 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>
@ -1445,6 +1446,7 @@ index 0000000..cf8e2f5
+ bool isEncryptedContainer() const; + bool isEncryptedContainer() const;
+ bool isEncryptedCleartext() const; + bool isEncryptedCleartext() const;
+ bool isSwap() const; + bool isSwap() const;
+ bool isLoop() const;
+ +
+ QString drivePath() const; + QString drivePath() const;
+ +
@ -1793,10 +1795,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..46d934e index 0000000..fab5208
--- /dev/null --- /dev/null
+++ b/solid/solid/backends/udisks2/udisksmanager.cpp +++ b/solid/solid/backends/udisks2/udisksmanager.cpp
@@ -0,0 +1,228 @@ @@ -0,0 +1,269 @@
+/* +/*
+ Copyright 2012 Lukáš Tinkl <ltinkl@redhat.com> + Copyright 2012 Lukáš Tinkl <ltinkl@redhat.com>
+ +
@ -1822,6 +1824,7 @@ index 0000000..46d934e
+#include <QtCore/QCoreApplication> +#include <QtCore/QCoreApplication>
+#include <QtCore/QDebug> +#include <QtCore/QDebug>
+#include <QtDBus> +#include <QtDBus>
+#include <QtXml/QDomDocument>
+ +
+#include "../shared/rootdevice.h" +#include "../shared/rootdevice.h"
+ +
@ -1927,6 +1930,7 @@ index 0000000..46d934e
+{ +{
+ m_deviceCache.clear(); + m_deviceCache.clear();
+ +
+#if 0
+ QDBusPendingReply<DBUSManagerStruct> reply = m_manager.GetManagedObjects(); + QDBusPendingReply<DBUSManagerStruct> reply = m_manager.GetManagedObjects();
+ reply.waitForFinished(); + reply.waitForFinished();
+ if (!reply.isError()) { // enum devices + if (!reply.isError()) { // enum devices
@ -1955,9 +1959,47 @@ index 0000000..46d934e
+ qWarning() << "Failed enumerating UDisks2 objects:" << reply.error().name() << "\n" << reply.error().message(); + qWarning() << "Failed enumerating UDisks2 objects:" << reply.error().name() << "\n" << reply.error().message();
+ } + }
+ +
+#endif
+
+ introspect("/org/freedesktop/UDisks2/block_devices", true /*checkOptical*/);
+ introspect("/org/freedesktop/UDisks2/drives");
+
+ return m_deviceCache; + return m_deviceCache;
+} +}
+ +
+void Manager::introspect(const QString & path, bool checkOptical)
+{
+ QDBusMessage call = QDBusMessage::createMethodCall(UD2_DBUS_SERVICE, path,
+ DBUS_INTERFACE_INTROSPECT, "Introspect");
+ QDBusPendingReply<QString> reply = QDBusConnection::systemBus().asyncCall(call);
+ reply.waitForFinished();
+
+ if (reply.isValid()) {
+ QDomDocument dom;
+ dom.setContent(reply.value());
+ QDomNodeList nodeList = dom.documentElement().elementsByTagName("node");
+ for (int i = 0; i < nodeList.count(); i++) {
+ QDomElement nodeElem = nodeList.item(i).toElement();
+ if (!nodeElem.isNull() && nodeElem.hasAttribute("name")) {
+ const QString udi = path + "/" + nodeElem.attribute("name");
+
+ if (checkOptical) {
+ Device device(udi);
+ if (device.mightBeOpticalDisc()) {
+ QDBusConnection::systemBus().connect(UD2_DBUS_SERVICE, udi, DBUS_INTERFACE_PROPS, "PropertiesChanged", this,
+ SLOT(slotMediaChanged(QDBusMessage)));
+ if (!device.isOpticalDisc()) // skip empty CD disc
+ continue;
+ }
+ }
+
+ m_deviceCache.append(udi);
+ }
+ }
+ }
+ else
+ qWarning() << "Failed enumerating UDisks2 objects:" << reply.error().name() << "\n" << reply.error().message();
+}
+ +
+QSet< Solid::DeviceInterface::Type > Manager::supportedInterfaces() const +QSet< Solid::DeviceInterface::Type > Manager::supportedInterfaces() const
+{ +{
@ -2025,12 +2067,13 @@ index 0000000..46d934e
+ +
+ return m_deviceCache; + return m_deviceCache;
+} +}
+
diff --git a/solid/solid/backends/udisks2/udisksmanager.h b/solid/solid/backends/udisks2/udisksmanager.h diff --git a/solid/solid/backends/udisks2/udisksmanager.h b/solid/solid/backends/udisks2/udisksmanager.h
new file mode 100644 new file mode 100644
index 0000000..7cf0a72 index 0000000..fb929ce
--- /dev/null --- /dev/null
+++ b/solid/solid/backends/udisks2/udisksmanager.h +++ b/solid/solid/backends/udisks2/udisksmanager.h
@@ -0,0 +1,69 @@ @@ -0,0 +1,70 @@
+/* +/*
+ 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>
@ -2091,6 +2134,7 @@ index 0000000..7cf0a72
+ +
+private: +private:
+ const QStringList &deviceCache(); + const QStringList &deviceCache();
+ void introspect(const QString & path, bool checkOptical = false);
+ QSet<Solid::DeviceInterface::Type> m_supportedInterfaces; + QSet<Solid::DeviceInterface::Type> m_supportedInterfaces;
+ org::freedesktop::DBus::ObjectManager m_manager; + org::freedesktop::DBus::ObjectManager m_manager;
+ QStringList m_deviceCache; + QStringList m_deviceCache;
@ -3666,94 +3710,30 @@ 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..d832f31 100644 index fb5a67c..beaeac5 100644
--- a/solid/solid/managerbase.cpp --- a/solid/solid/managerbase.cpp
+++ b/solid/solid/managerbase.cpp +++ b/solid/solid/managerbase.cpp
@@ -21,7 +21,7 @@ @@ -31,7 +31,11 @@
#include "managerbase_p.h"
#include <stdlib.h>
-#if !defined (Q_WS_WIN) && !defined (Q_OS_MAC)
+#if !defined (Q_OS_WIN) && !defined (Q_OS_MAC)
#include <config-solid.h>
#endif
@@ -30,8 +30,7 @@
#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"
-#include "backends/udisks/udisksmanager.h" +#if defined (WITH_SOLID_UDISKS2)
+#include "backends/udisks2/udisksmanager.h" +#include "backends/udisks2/udisksmanager.h"
+#else
#include "backends/udisks/udisksmanager.h"
+#endif
#include "backends/upower/upowermanager.h" #include "backends/upower/upowermanager.h"
#if defined (HUPNP_FOUND) #if defined (HUPNP_FOUND)
@@ -44,7 +43,7 @@ @@ -83,7 +87,11 @@ void Solid::ManagerBasePrivate::loadBackends()
#include "backends/fstab/fstabmanager.h"
-#elif defined (Q_WS_WIN) && defined(HAVE_WBEM) && !defined(_WIN32_WCE)
+#elif defined (Q_OS_WIN) && defined(HAVE_WBEM) && !defined(_WIN32_WCE)
#include "backends/wmi/wmimanager.h"
#endif
@@ -68,25 +67,16 @@ void Solid::ManagerBasePrivate::loadBackends()
# if defined(Q_OS_MAC)
m_backends << new Solid::Backends::IOKit::IOKitManager(0);
-# elif defined(Q_WS_WIN) && defined(HAVE_WBEM) && !defined(_WIN32_WCE)
+# elif defined(Q_OS_WIN) && defined(HAVE_WBEM) && !defined(_WIN32_WCE)
m_backends << new Solid::Backends::Wmi::WmiManager(0);
-# elif defined(Q_OS_UNIX) && !defined(Q_OS_LINUX)
- m_backends << new Solid::Backends::Hal::HalManager(0);
-
# elif defined(Q_OS_LINUX)
- bool solidHalLegacyEnabled
- = QString::fromLocal8Bit(qgetenv("SOLID_HAL_LEGACY")).toInt()==1;
- if (solidHalLegacyEnabled) {
- m_backends << new Solid::Backends::Hal::HalManager(0);
- } else {
# if defined(UDEV_FOUND) # if defined(UDEV_FOUND)
m_backends << new Solid::Backends::UDev::UDevManager(0); m_backends << new Solid::Backends::UDev::UDevManager(0);
# endif # endif
- m_backends << new Solid::Backends::UDisks::UDisksManager(0) +# if defined(WITH_SOLID_UDISKS2)
+ m_backends << new Solid::Backends::UDisks2::Manager(0) + m_backends << new Solid::Backends::UDisks2::Manager(0)
+# else
m_backends << new Solid::Backends::UDisks::UDisksManager(0)
+# endif
<< new Solid::Backends::UPower::UPowerManager(0) << new Solid::Backends::UPower::UPowerManager(0)
<< new Solid::Backends::Fstab::FstabManager(0); << new Solid::Backends::Fstab::FstabManager(0);
- }
# endif
# if defined (HUPNP_FOUND)
@@ -99,5 +89,3 @@ QList<QObject*> Solid::ManagerBasePrivate::managerBackends() const
{
return m_backends;
} }
-
-
diff --git a/solid/tests/CMakeLists.txt b/solid/tests/CMakeLists.txt
index ef507d1..b9f3720 100644
--- a/solid/tests/CMakeLists.txt
+++ b/solid/tests/CMakeLists.txt
@@ -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\\"")
-
-########### halbasictest ###############
-
-if(NOT WIN32 AND NOT APPLE)
-set(halbasictest_SRCS halbasictest.cpp )
-
-kde4_add_executable(halbasictest ${halbasictest_SRCS})
-
-if(WIN32)
- set_target_properties(halbasictest PROPERTIES COMPILE_FLAGS -DSOLID_EXPORT=)
-endif(WIN32)
-
-target_link_libraries(halbasictest solid_static ${KDEWIN_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTDBUS_LIBRARY} ${QT_QTXML_LIBRARY} ${QT_QTTEST_LIBRARY} )
-endif(NOT WIN32 AND NOT APPLE)
-
########### solidhwtest ###############
set(solidhwtest_SRCS

View File

@ -25,7 +25,7 @@
Summary: KDE Libraries Summary: KDE Libraries
Version: 4.9.2 Version: 4.9.2
Release: 8%{?dist} Release: 9%{?dist}
Name: kdelibs Name: kdelibs
Epoch: 6 Epoch: 6
@ -121,7 +121,7 @@ Patch42: 0003-Implement-automatic-scanning-of-source-code-for-requ.patch
# make forcefully hal-free build # make forcefully hal-free build
Patch45: kdelibs-4.7.3-halectomy.patch Patch45: kdelibs-4.7.3-halectomy.patch
# udisks2 Solid backend, halectomy # udisks2 Solid backend
Patch47: kdelibs-udisks2-backend.patch Patch47: kdelibs-udisks2-backend.patch
## upstreamable ## upstreamable
@ -350,6 +350,9 @@ mkdir -p %{_target_platform}
pushd %{_target_platform} pushd %{_target_platform}
%{cmake_kde4} \ %{cmake_kde4} \
-DKDE_DISTRIBUTION_TEXT="%{version}-%{release} Fedora" \ -DKDE_DISTRIBUTION_TEXT="%{version}-%{release} Fedora" \
%if 0%{?rhel} > 6 || 0%{?fedora} > 17
-DWITH_SOLID_UDISKS2:BOOL=ON \
%endif
.. ..
popd popd
@ -590,6 +593,11 @@ rm -rf %{buildroot}
%changelog %changelog
* Mon Oct 29 2012 Lukáš Tinkl <ltinkl@redhat.com> 6:4.9.2-9
- Resolves #868530 - cache information about solid device in 'Places'
panel in open/save dialog
- update solid/udisks2 backend, switch to cmake-define
* Thu Oct 25 2012 Dan Vrátil <dvratil@redhat.com> 6:4.9.2-8 * Thu Oct 25 2012 Dan Vrátil <dvratil@redhat.com> 6:4.9.2-8
- Resolves #868530 - cache information about solid device in 'Places' - Resolves #868530 - cache information about solid device in 'Places'
panel in open/save dialog panel in open/save dialog