File udisks2-support-for-devicemanager.patch of Package clementine
From d4e932db9a4e768737803afb331c1dd1acd3c9fe Mon Sep 17 00:00:00 2001
From: Valeriy <jazzvoid@gmail.com>
Date: Tue, 17 May 2016 22:56:16 +0300
Subject: [PATCH 1/7] udisks2 support for devicemanager (refs #3264)
---
CMakeLists.txt | 4 +
src/CMakeLists.txt | 28 +++
src/config.h.in | 1 +
src/core/metatypes.cpp | 3 +
src/dbus/metatypes.h | 8 +-
src/dbus/org.freedesktop.DBus.ObjectManager.xml | 19 ++
src/dbus/org.freedesktop.UDisks2.Block.xml | 9 +
src/dbus/org.freedesktop.UDisks2.Drive.xml | 17 ++
src/dbus/org.freedesktop.UDisks2.Filesystem.xml | 18 ++
src/devices/devicemanager.cpp | 9 +
src/devices/udisks2lister.cpp | 286 ++++++++++++++++++++++++
src/devices/udisks2lister.h | 77 +++++++
12 files changed, 478 insertions(+), 1 deletion(-)
create mode 100644 src/dbus/org.freedesktop.DBus.ObjectManager.xml
create mode 100644 src/dbus/org.freedesktop.UDisks2.Block.xml
create mode 100644 src/dbus/org.freedesktop.UDisks2.Drive.xml
create mode 100644 src/dbus/org.freedesktop.UDisks2.Filesystem.xml
create mode 100644 src/devices/udisks2lister.cpp
create mode 100644 src/devices/udisks2lister.h
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6da158e..4bc74eb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -254,6 +254,10 @@ optional_component(DEVICEKIT ON "Devices: DeviceKit backend"
DEPENDS "D-Bus support" HAVE_DBUS
)
+optional_component(UDISKS2 ON "Devices: UDisks2 backend"
+ DEPENDS "D-Bus support" HAVE_DBUS
+)
+
optional_component(SPOTIFY_BLOB ON "Spotify support: non-GPL binary helper"
DEPENDS "protobuf" PROTOBUF_FOUND PROTOBUF_PROTOC_EXECUTABLE
DEPENDS "libspotify" SPOTIFY_FOUND
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 4f0832b..ca6625a 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -964,6 +964,29 @@ if(HAVE_DBUS)
dbus/udisksdevice)
endif(HAVE_DEVICEKIT)
+ if(HAVE_UDISKS2)
+ set_source_files_properties(dbus/org.freedesktop.DBus.ObjectManager.xml
+ PROPERTIES NO_NAMESPACE dbus/objectmanager INCLUDE dbus/metatypes.h)
+ set_source_files_properties(dbus/org.freedesktop.UDisks2.Filesystem.xml
+ PROPERTIES NO_NAMESPACE dbus/udisks2filesystem INCLUDE dbus/metatypes.h)
+ set_source_files_properties(dbus/org.freedesktop.UDisks2.Block.xml
+ PROPERTIES NO_NAMESPACE dbus/udisks2block INCLUDE dbus/metatypes.h)
+ set_source_files_properties(dbus/org.freedesktop.UDisks2.Drive.xml
+ PROPERTIES NO_NAMESPACE dbus/udisks2drive INCLUDE dbus/metatypes.h)
+ qt4_add_dbus_interface(SOURCES
+ dbus/org.freedesktop.DBus.ObjectManager.xml
+ dbus/objectmanager)
+ qt4_add_dbus_interface(SOURCES
+ dbus/org.freedesktop.UDisks2.Filesystem.xml
+ dbus/udisks2filesystem)
+ qt4_add_dbus_interface(SOURCES
+ dbus/org.freedesktop.UDisks2.Block.xml
+ dbus/udisks2block)
+ qt4_add_dbus_interface(SOURCES
+ dbus/org.freedesktop.UDisks2.Drive.xml
+ dbus/udisks2drive)
+ endif(HAVE_UDISKS2)
+
# Wiimotedev interface classes
if(ENABLE_WIIMOTEDEV)
qt4_add_dbus_interface(SOURCES
@@ -999,6 +1022,11 @@ optional_source(HAVE_DEVICEKIT
HEADERS devices/devicekitlister.h
)
+optional_source(HAVE_UDISKS2
+ SOURCES devices/udisks2lister.cpp
+ HEADERS devices/udisks2lister.h
+)
+
# Libgpod device backend
optional_source(HAVE_LIBGPOD
INCLUDE_DIRECTORIES ${LIBGPOD_INCLUDE_DIRS}
diff --git a/src/config.h.in b/src/config.h.in
index f22fe9b..2bd31b7 100644
--- a/src/config.h.in
+++ b/src/config.h.in
@@ -41,6 +41,7 @@
#cmakedefine HAVE_SKYDRIVE
#cmakedefine HAVE_SPARKLE
#cmakedefine HAVE_SPOTIFY_DOWNLOADER
+#cmakedefine HAVE_UDISKS2
#cmakedefine HAVE_VK
#cmakedefine HAVE_WIIMOTEDEV
#cmakedefine TAGLIB_HAS_OPUS
diff --git a/src/core/metatypes.cpp b/src/core/metatypes.cpp
index 62e2460..00b3553 100644
--- a/src/core/metatypes.cpp
+++ b/src/core/metatypes.cpp
@@ -125,5 +125,8 @@ void RegisterMetaTypes() {
qDBusRegisterMetaType<MprisPlaylist>();
qDBusRegisterMetaType<MaybePlaylist>();
qDBusRegisterMetaType<MprisPlaylistList>();
+
+ qDBusRegisterMetaType<InterfacesAndProperties>();
+ qDBusRegisterMetaType<ManagedObjectList>();
#endif
}
diff --git a/src/dbus/metatypes.h b/src/dbus/metatypes.h
index 4e00245..83bc5e6 100644
--- a/src/dbus/metatypes.h
+++ b/src/dbus/metatypes.h
@@ -20,6 +20,12 @@
#include <QMetaType>
-Q_DECLARE_METATYPE(QList<QByteArray>);
+Q_DECLARE_METATYPE(QList<QByteArray>)
+
+typedef QMap<QString, QVariantMap> InterfacesAndProperties;
+typedef QMap<QDBusObjectPath, InterfacesAndProperties> ManagedObjectList;
+
+Q_DECLARE_METATYPE(InterfacesAndProperties)
+Q_DECLARE_METATYPE(ManagedObjectList)
#endif // DBUS_METATYPES_H_
diff --git a/src/dbus/org.freedesktop.DBus.ObjectManager.xml b/src/dbus/org.freedesktop.DBus.ObjectManager.xml
new file mode 100644
index 0000000..efc389d
--- /dev/null
+++ b/src/dbus/org.freedesktop.DBus.ObjectManager.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+ <interface name="org.freedesktop.DBus.ObjectManager">
+ <method name="GetManagedObjects">
+ <arg name="objects" type="a{oa{sa{sv}}}" direction="out"/>
+ <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="ManagedObjectList"/>
+ </method>
+ <signal name="InterfacesAdded">
+ <arg name="object" type="o"/>
+ <arg name="interfaces" type="a{sa{sv}}"/>
+ <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="InterfacesAndProperties"/>
+ </signal>
+ <signal name="InterfacesRemoved">
+ <arg type="o" name="object_path"/>
+ <arg type="as" name="interfaces"/>
+ </signal>
+ </interface>
+</node>
diff --git a/src/dbus/org.freedesktop.UDisks2.Block.xml b/src/dbus/org.freedesktop.UDisks2.Block.xml
new file mode 100644
index 0000000..f0e3a06
--- /dev/null
+++ b/src/dbus/org.freedesktop.UDisks2.Block.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+ <interface name="org.freedesktop.UDisks2.Block">
+ <property type="o" name="Drive" access="read"/>
+ <property type="s" name="IdLabel" access="read"/>
+ <property type="s" name="IdUUID" access="read"/>
+ </interface>
+</node>
diff --git a/src/dbus/org.freedesktop.UDisks2.Drive.xml b/src/dbus/org.freedesktop.UDisks2.Drive.xml
new file mode 100644
index 0000000..5312b22
--- /dev/null
+++ b/src/dbus/org.freedesktop.UDisks2.Drive.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+ <interface name="org.freedesktop.UDisks2.Drive">
+ <method name="Eject">
+ <arg type="a{sv}" name="options" direction="in"/>
+ <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QVariantMap"/>
+ </method>
+ <property type="s" name="Vendor" access="read"/>
+ <property type="s" name="Model" access="read"/>
+ <property type="s" name="Revision" access="read"/>
+ <property type="s" name="Serial" access="read"/>
+ <property type="s" name="Id" access="read"/>
+ <property type="b" name="MediaRemovable" access="read"/>
+ <property type="t" name="Size" access="read"/>
+ </interface>
+</node>
diff --git a/src/dbus/org.freedesktop.UDisks2.Filesystem.xml b/src/dbus/org.freedesktop.UDisks2.Filesystem.xml
new file mode 100644
index 0000000..1781919
--- /dev/null
+++ b/src/dbus/org.freedesktop.UDisks2.Filesystem.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+ <interface name="org.freedesktop.UDisks2.Filesystem">
+ <method name="Mount">
+ <arg type="a{sv}" name="options" direction="in"/>
+ <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QVariantMap"/>
+ <arg type="s" name="mount_path" direction="out"/>
+ </method>
+ <method name="Unmount">
+ <arg type="a{sv}" name="options" direction="in"/>
+ <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QVariantMap"/>
+ </method>
+ <property type="aay" name="MountPoints" access="read">
+ <annotation name="org.qtproject.QtDBus.QtTypeName" value="QList<QByteArray>"/>
+ </property>
+ </interface>
+</node>
diff --git a/src/devices/devicemanager.cpp b/src/devices/devicemanager.cpp
index 6396b56..32ba336 100644
--- a/src/devices/devicemanager.cpp
+++ b/src/devices/devicemanager.cpp
@@ -59,6 +59,9 @@
#ifdef HAVE_LIBMTP
#include "mtpdevice.h"
#endif
+#ifdef HAVE_UDISKS2
+#include "udisks2lister.h"
+#endif
using std::bind;
@@ -191,6 +194,9 @@ DeviceManager::DeviceManager(Application* app, QObject* parent)
#ifdef HAVE_DEVICEKIT
AddLister(new DeviceKitLister);
#endif
+#ifdef HAVE_UDISKS2
+ AddLister(new Udisks2Lister);
+#endif
#ifdef HAVE_GIO
AddLister(new GioLister);
#endif
@@ -228,7 +234,10 @@ void DeviceManager::LoadAllDevices() {
for (const DeviceDatabaseBackend::Device& device : devices) {
DeviceInfo info;
info.InitFromDb(device);
+
+ beginInsertRows(QModelIndex(), devices_.count(), devices_.count());
devices_ << info;
+ endInsertRows();
}
}
diff --git a/src/devices/udisks2lister.cpp b/src/devices/udisks2lister.cpp
new file mode 100644
index 0000000..9925146
--- /dev/null
+++ b/src/devices/udisks2lister.cpp
@@ -0,0 +1,286 @@
+#include "udisks2lister.h"
+
+#include <QDBusConnection>
+
+#include "core/logging.h"
+#include "core/utilities.h"
+
+#include "dbus/udisks2filesystem.h"
+#include "dbus/udisks2block.h"
+#include "dbus/udisks2drive.h"
+
+const QString Udisks2Lister::udisks2service_ = "org.freedesktop.UDisks2";
+
+Udisks2Lister::Udisks2Lister() {
+
+}
+
+Udisks2Lister::~Udisks2Lister() {
+ qLog(Debug) << __PRETTY_FUNCTION__;
+}
+
+QStringList Udisks2Lister::DeviceUniqueIDs() {
+ QReadLocker locker(&device_data_lock_);
+ return device_data_.keys();
+}
+
+QVariantList Udisks2Lister::DeviceIcons(const QString &id) {
+ return QVariantList();
+}
+
+QString Udisks2Lister::DeviceManufacturer(const QString &id) {
+ QReadLocker locker(&device_data_lock_);
+ if (!device_data_.contains(id))
+ return "";
+ return device_data_[id].vendor;
+}
+
+QString Udisks2Lister::DeviceModel(const QString &id) {
+ QReadLocker locker(&device_data_lock_);
+ if (!device_data_.contains(id))
+ return "";
+ return device_data_[id].model;
+}
+
+quint64 Udisks2Lister::DeviceCapacity(const QString &id) {
+ QReadLocker locker(&device_data_lock_);
+ if (!device_data_.contains(id))
+ return 0;
+ return device_data_[id].capacity;
+}
+
+quint64 Udisks2Lister::DeviceFreeSpace(const QString &id) {
+ QReadLocker locker(&device_data_lock_);
+ if (!device_data_.contains(id))
+ return 0;
+ return device_data_[id].free_space;
+}
+
+QVariantMap Udisks2Lister::DeviceHardwareInfo(const QString &id) {
+ QReadLocker locker(&device_data_lock_);
+ if (!device_data_.contains(id))
+ return QVariantMap();
+
+ QVariantMap result;
+
+ const auto &data = device_data_[id];
+ result[QT_TR_NOOP("DBus path")] = data.dbus_path;
+ result[QT_TR_NOOP("Serial number")] = data.serial;
+ result[QT_TR_NOOP("Mount points")] = data.mount_paths.join(", ");
+ result[QT_TR_NOOP("Parition label")] = data.label;
+ result[QT_TR_NOOP("UUID")] = data.uuid;
+
+ return result;
+}
+
+QString Udisks2Lister::MakeFriendlyName(const QString &id) {
+ QReadLocker locker(&device_data_lock_);
+ if (!device_data_.contains(id))
+ return "";
+ return device_data_[id].friendly_name;
+}
+
+QList<QUrl> Udisks2Lister::MakeDeviceUrls(const QString &id) {
+ QReadLocker locker(&device_data_lock_);
+ if (!device_data_.contains(id))
+ return QList<QUrl>();
+ return QList<QUrl>() << QUrl::fromLocalFile(device_data_[id].mount_paths.at(0));
+}
+
+void Udisks2Lister::UnmountDevice(const QString &id) {
+ QReadLocker locker(&device_data_lock_);
+ if (!device_data_.contains(id))
+ return;
+
+ OrgFreedesktopUDisks2FilesystemInterface filesystem(
+ udisks2service_,
+ device_data_[id].dbus_path,
+ QDBusConnection::systemBus());
+
+ if (filesystem.isValid())
+ {
+ auto umountResult = filesystem.Unmount(QVariantMap());
+ umountResult.waitForFinished();
+
+ OrgFreedesktopUDisks2DriveInterface drive(
+ udisks2service_,
+ device_data_[id].dbus_drive_path,
+ QDBusConnection::systemBus());
+
+ if (drive.isValid())
+ {
+ auto ejectResult = drive.Eject(QVariantMap());
+ ejectResult.waitForFinished();
+ }
+ }
+}
+
+void Udisks2Lister::UpdateDeviceFreeSpace(const QString &id) {
+ QWriteLocker locker(&device_data_lock_);
+ device_data_[id].free_space = Utilities::FileSystemFreeSpace(device_data_[id].mount_paths.at(0));
+
+ emit DeviceChanged(id);
+}
+
+void Udisks2Lister::Init() {
+ udisks2_interface_.reset(new OrgFreedesktopDBusObjectManagerInterface(
+ udisks2service_,
+ "/org/freedesktop/UDisks2",
+ QDBusConnection::systemBus()));
+
+ QDBusPendingReply<ManagedObjectList> reply = udisks2_interface_->GetManagedObjects();
+ reply.waitForFinished();
+
+ if (!reply.isValid()) {
+ qLog(Warning) << "Error enumerating udisks2 devices:"
+ << reply.error().name() << reply.error().message();
+ udisks2_interface_.reset();
+ return;
+ }
+
+ for (const QDBusObjectPath &path : reply.value().keys()) {
+ auto partitionData = ReadPartitionData(path, false);
+
+ if (!partitionData.dbus_path.isEmpty())
+ {
+ QWriteLocker locker(&device_data_lock_);
+ device_data_[partitionData.unique_id()] = partitionData;
+ }
+ }
+
+ for (const auto &id : device_data_.keys()) {
+ emit DeviceAdded(id);
+ }
+
+ connect(udisks2_interface_.get(), SIGNAL(InterfacesAdded(QDBusObjectPath, InterfacesAndProperties)),
+ SLOT(DBusInterfaceAdded(QDBusObjectPath, InterfacesAndProperties)));
+ connect(udisks2_interface_.get(), SIGNAL(InterfacesRemoved(QDBusObjectPath, QStringList)),
+ SLOT(DBusInterfaceRemoved(QDBusObjectPath, QStringList)));
+}
+
+void Udisks2Lister::DBusInterfaceAdded(const QDBusObjectPath &path,
+ const InterfacesAndProperties &interfaces) {
+ // FIXME handle unmount jobs too
+ for (auto interface = interfaces.constBegin(); interface != interfaces.constEnd(); ++interface)
+ {
+ if (interface.key() != "org.freedesktop.UDisks2.Job"
+ || interface.value()["Operation"] != "filesystem-mount")
+ continue;
+
+ const QDBusArgument &objects = interface.value()["Objects"].value<QDBusArgument>();
+
+ QList<QDBusObjectPath> mountedParititons;
+ objects.beginArray();
+ while (!objects.atEnd()) {
+ QDBusObjectPath extractedPath;
+ objects >> extractedPath;
+ mountedParititons.push_back(extractedPath);
+ }
+ objects.endArray();
+
+ qLog(Debug) << "Udisks2 something mounted: " << mountedParititons.at(0).path();
+
+ {
+ QMutexLocker locker(&jobs_lock_);
+ mounting_jobs_[path.path()] = mountedParititons;
+ }
+ }
+}
+
+void Udisks2Lister::DBusInterfaceRemoved(const QDBusObjectPath &path, const QStringList &ifaces) {
+ if (!isPendingJob(path))
+ RemoveDevice(path);
+}
+
+bool Udisks2Lister::isPendingJob(const QDBusObjectPath &path)
+{
+ // should be actually done with a succcess signal from job, I guess, but it makes it kinda complicated
+ QMutexLocker locker(&jobs_lock_);
+
+ if (!mounting_jobs_.contains(path.path()))
+ return false;
+
+ const auto &mountpaths = mounting_jobs_[path.path()];
+ for (const auto &partition : mountpaths) {
+ auto data = ReadPartitionData(partition, true);
+ if (!data.dbus_path.isEmpty()) {
+ QWriteLocker locker(&device_data_lock_);
+ device_data_[data.unique_id()] = data;
+ DeviceAdded(data.unique_id());
+ }
+ }
+ mounting_jobs_.remove(path.path());
+ return true;
+}
+
+void Udisks2Lister::RemoveDevice(const QDBusObjectPath &path)
+{
+ QWriteLocker locker(&device_data_lock_);
+ QString id;
+ for (const auto &data : device_data_) {
+ if (data.dbus_path == path.path())
+ id = data.unique_id();
+ }
+
+ if (id.isEmpty())
+ return;
+
+ device_data_.remove(id);
+ DeviceRemoved(id);
+}
+
+Udisks2Lister::PartitionData Udisks2Lister::ReadPartitionData(const QDBusObjectPath &path,
+ bool beingMounted) {
+ PartitionData result;
+ OrgFreedesktopUDisks2FilesystemInterface filesystem(
+ udisks2service_,
+ path.path(),
+ QDBusConnection::systemBus());
+ OrgFreedesktopUDisks2BlockInterface block(
+ udisks2service_,
+ path.path(),
+ QDBusConnection::systemBus());
+
+ if (filesystem.isValid()
+ && block.isValid()
+ && (beingMounted || !filesystem.mountPoints().empty())) {
+
+ OrgFreedesktopUDisks2DriveInterface drive(
+ udisks2service_,
+ block.drive().path(),
+ QDBusConnection::systemBus());
+
+ if (drive.isValid()
+ && drive.mediaRemovable()) {
+ result.dbus_path = path.path();
+ result.dbus_drive_path = block.drive().path();
+
+ result.serial = drive.serial();
+ result.vendor = drive.vendor();
+ result.model = drive.model();
+
+ result.label = block.idLabel();
+ result.uuid = block.idUUID();
+ result.capacity = drive.size();
+
+ if (!result.label.isEmpty())
+ result.friendly_name = result.label;
+ else
+ result.friendly_name = result.model + " " + result.uuid;
+
+ for (const auto &path : filesystem.mountPoints())
+ result.mount_paths.push_back(path);
+
+ result.free_space = Utilities::FileSystemFreeSpace(result.mount_paths.at(0));
+ }
+ }
+
+ return result;
+}
+
+QString Udisks2Lister::PartitionData::unique_id() const {
+ return QString("Udisks2/%1/%2/%3/%4/%5")
+ .arg(serial, vendor, model)
+ .arg(capacity)
+ .arg(uuid);
+}
diff --git a/src/devices/udisks2lister.h b/src/devices/udisks2lister.h
new file mode 100644
index 0000000..639db40
--- /dev/null
+++ b/src/devices/udisks2lister.h
@@ -0,0 +1,77 @@
+#pragma once
+
+#include <memory>
+
+#include "devicelister.h"
+
+#include "dbus/objectmanager.h"
+
+class Udisks2Lister : public DeviceLister {
+ Q_OBJECT
+
+public:
+ Udisks2Lister();
+ ~Udisks2Lister();
+
+ QStringList DeviceUniqueIDs();
+ QVariantList DeviceIcons(const QString &id);
+ QString DeviceManufacturer(const QString &id);
+ QString DeviceModel(const QString &id);
+ quint64 DeviceCapacity(const QString &id);
+ quint64 DeviceFreeSpace(const QString &id);
+ QVariantMap DeviceHardwareInfo(const QString &id);
+
+ QString MakeFriendlyName(const QString &id);
+ QList<QUrl> MakeDeviceUrls(const QString &id);
+
+ void UnmountDevice(const QString &id);
+
+public slots:
+ void UpdateDeviceFreeSpace(const QString &id);
+
+protected:
+ void Init();
+
+private slots:
+ void DBusInterfaceAdded(const QDBusObjectPath &path, const InterfacesAndProperties &ifaces);
+ void DBusInterfaceRemoved(const QDBusObjectPath &path, const QStringList &ifaces);
+
+private:
+ bool isPendingJob(const QDBusObjectPath &path);
+ void RemoveDevice(const QDBusObjectPath &path);
+
+ QMutex jobs_lock_;
+ QMap<QString, QList<QDBusObjectPath>> mounting_jobs_;
+
+private:
+ class PartitionData {
+ public:
+ QString unique_id() const;
+
+ QString dbus_path;
+ QString friendly_name;
+
+ // Device
+ QString serial;
+ QString vendor;
+ QString model;
+ quint64 capacity = 0;
+ QString dbus_drive_path;
+
+ // Paritition
+ QString label;
+ QString uuid;
+ quint64 free_space = 0;
+ QStringList mount_paths;
+ };
+
+ PartitionData ReadPartitionData(const QDBusObjectPath &path, bool beingMounted);
+
+ QReadWriteLock device_data_lock_;
+ QMap<QString, PartitionData> device_data_;
+
+private:
+ std::unique_ptr<OrgFreedesktopDBusObjectManagerInterface> udisks2_interface_;
+
+ static const QString udisks2service_;
+};
From 68001ff7e87f9ca1996a84eee928c31acd1ec564 Mon Sep 17 00:00:00 2001
From: Valeriy <jazzvoid@gmail.com>
Date: Sat, 21 May 2016 23:29:18 +0300
Subject: [PATCH 2/7] udisks2: handle unmount jobs too, more verbose logging
---
src/devices/udisks2lister.cpp | 74 +++++++++++++++++++++++++++++++++----------
src/devices/udisks2lister.h | 13 ++++++--
2 files changed, 67 insertions(+), 20 deletions(-)
diff --git a/src/devices/udisks2lister.cpp b/src/devices/udisks2lister.cpp
index 9925146..df6fb62 100644
--- a/src/devices/udisks2lister.cpp
+++ b/src/devices/udisks2lister.cpp
@@ -160,11 +160,17 @@ void Udisks2Lister::Init() {
void Udisks2Lister::DBusInterfaceAdded(const QDBusObjectPath &path,
const InterfacesAndProperties &interfaces) {
- // FIXME handle unmount jobs too
for (auto interface = interfaces.constBegin(); interface != interfaces.constEnd(); ++interface)
{
- if (interface.key() != "org.freedesktop.UDisks2.Job"
- || interface.value()["Operation"] != "filesystem-mount")
+ if (interface.key() != "org.freedesktop.UDisks2.Job")
+ continue;
+
+ bool isMountJob = false;
+ if (interface.value()["Operation"] == "filesystem-mount")
+ isMountJob = true;
+ else if (interface.value()["Operation"] == "filesystem-unmount")
+ isMountJob = false;
+ else
continue;
const QDBusArgument &objects = interface.value()["Objects"].value<QDBusArgument>();
@@ -178,11 +184,19 @@ void Udisks2Lister::DBusInterfaceAdded(const QDBusObjectPath &path,
}
objects.endArray();
- qLog(Debug) << "Udisks2 something mounted: " << mountedParititons.at(0).path();
+ if (mountedParititons.isEmpty()) {
+ qLog(Warning) << "Empty Udisks2 mount/umount job " << path.path();
+ return;
+ }
+
+ qLog(Debug) << "Adding Udisks job " << path.path()
+ << " | Operation = " << interface.value()["Operation"].toString()
+ << " with first path: " << mountedParititons.at(0).path();
{
QMutexLocker locker(&jobs_lock_);
- mounting_jobs_[path.path()] = mountedParititons;
+ mounting_jobs_[path.path()].isMount = isMountJob;
+ mounting_jobs_[path.path()].mount_paths = mountedParititons;
}
}
}
@@ -192,39 +206,65 @@ void Udisks2Lister::DBusInterfaceRemoved(const QDBusObjectPath &path, const QStr
RemoveDevice(path);
}
-bool Udisks2Lister::isPendingJob(const QDBusObjectPath &path)
-{
+bool Udisks2Lister::isPendingJob(const QDBusObjectPath &jobPath) {
// should be actually done with a succcess signal from job, I guess, but it makes it kinda complicated
QMutexLocker locker(&jobs_lock_);
- if (!mounting_jobs_.contains(path.path()))
+ if (!mounting_jobs_.contains(jobPath.path()))
return false;
- const auto &mountpaths = mounting_jobs_[path.path()];
- for (const auto &partition : mountpaths) {
+ const auto &mountPaths = mounting_jobs_[jobPath.path()].mount_paths;
+ const auto &isMount = mounting_jobs_[jobPath.path()].isMount;
+ for (const auto &partition : mountPaths) {
auto data = ReadPartitionData(partition, true);
if (!data.dbus_path.isEmpty()) {
- QWriteLocker locker(&device_data_lock_);
- device_data_[data.unique_id()] = data;
- DeviceAdded(data.unique_id());
+ if (isMount) {
+ qLog(Debug) << "UDisks2 mount job finished: Drive = " << data.dbus_drive_path
+ << " | Partition = " << data.dbus_path;
+ QWriteLocker locker(&device_data_lock_);
+ device_data_[data.unique_id()] = data;
+ DeviceAdded(data.unique_id());
+ } else {
+ QWriteLocker locker(&device_data_lock_);
+ QString id;
+ for (auto &data : device_data_) {
+ if (data.mount_paths.contains(partition.path())) {
+ qLog(Debug) << "UDisks2 umount job finished, found corresponding device: Drive = " << data.dbus_drive_path
+ << " | Partition = " << data.dbus_path;
+ data.mount_paths.removeOne(partition.path());
+ if (data.mount_paths.empty())
+ id = data.unique_id();
+ break;
+ }
+ }
+
+ if (!id.isEmpty())
+ {
+ qLog(Debug) << "Partition " << data.dbus_path << " has no more mount points, removing it from device list";
+ device_data_.remove(id);
+ DeviceRemoved(id);
+ }
+ }
}
}
- mounting_jobs_.remove(path.path());
+ mounting_jobs_.remove(jobPath.path());
return true;
}
-void Udisks2Lister::RemoveDevice(const QDBusObjectPath &path)
-{
+void Udisks2Lister::RemoveDevice(const QDBusObjectPath &devicePath) {
QWriteLocker locker(&device_data_lock_);
QString id;
for (const auto &data : device_data_) {
- if (data.dbus_path == path.path())
+ if (data.dbus_path == devicePath.path()) {
id = data.unique_id();
+ break;
+ }
}
if (id.isEmpty())
return;
+ qLog(Debug) << "UDisks2 device removed: " << devicePath.path();
device_data_.remove(id);
DeviceRemoved(id);
}
diff --git a/src/devices/udisks2lister.h b/src/devices/udisks2lister.h
index 639db40..37320ed 100644
--- a/src/devices/udisks2lister.h
+++ b/src/devices/udisks2lister.h
@@ -37,11 +37,18 @@ private slots:
void DBusInterfaceRemoved(const QDBusObjectPath &path, const QStringList &ifaces);
private:
- bool isPendingJob(const QDBusObjectPath &path);
- void RemoveDevice(const QDBusObjectPath &path);
+ bool isPendingJob(const QDBusObjectPath &jobPath);
+ void RemoveDevice(const QDBusObjectPath &devicePath);
+
+ class MountJob
+ {
+ public:
+ bool isMount = true;
+ QList<QDBusObjectPath> mount_paths;
+ };
QMutex jobs_lock_;
- QMap<QString, QList<QDBusObjectPath>> mounting_jobs_;
+ QMap<QString, MountJob> mounting_jobs_;
private:
class PartitionData {
From ed986d38638be1cce632239466c349d1334228fa Mon Sep 17 00:00:00 2001
From: Valeriy <jazzvoid@gmail.com>
Date: Sun, 22 May 2016 23:44:22 +0300
Subject: [PATCH 3/7] UDisks2.Job interface support
---
src/CMakeLists.txt | 5 ++
src/dbus/org.freedesktop.UDisks2.Job.xml | 11 +++
src/devices/udisks2lister.cpp | 139 +++++++++++++++++++------------
src/devices/udisks2lister.h | 11 ++-
4 files changed, 109 insertions(+), 57 deletions(-)
create mode 100644 src/dbus/org.freedesktop.UDisks2.Job.xml
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index ca6625a..d7e9083 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -973,6 +973,8 @@ if(HAVE_DBUS)
PROPERTIES NO_NAMESPACE dbus/udisks2block INCLUDE dbus/metatypes.h)
set_source_files_properties(dbus/org.freedesktop.UDisks2.Drive.xml
PROPERTIES NO_NAMESPACE dbus/udisks2drive INCLUDE dbus/metatypes.h)
+ set_source_files_properties(dbus/org.freedesktop.UDisks2.Job.xml
+ PROPERTIES NO_NAMESPACE dbus/udisks2job INCLUDE dbus/metatypes.h)
qt4_add_dbus_interface(SOURCES
dbus/org.freedesktop.DBus.ObjectManager.xml
dbus/objectmanager)
@@ -985,6 +987,9 @@ if(HAVE_DBUS)
qt4_add_dbus_interface(SOURCES
dbus/org.freedesktop.UDisks2.Drive.xml
dbus/udisks2drive)
+ qt4_add_dbus_interface(SOURCES
+ dbus/org.freedesktop.UDisks2.Job.xml
+ dbus/udisks2job)
endif(HAVE_UDISKS2)
# Wiimotedev interface classes
diff --git a/src/dbus/org.freedesktop.UDisks2.Job.xml b/src/dbus/org.freedesktop.UDisks2.Job.xml
new file mode 100644
index 0000000..2cd4253
--- /dev/null
+++ b/src/dbus/org.freedesktop.UDisks2.Job.xml
@@ -0,0 +1,11 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+ <interface name="org.freedesktop.UDisks2.Job">
+ <property name="Operation" type="s" access="read"/>
+ <property name="Objects" type="ao" access="read"/>
+ <signal name="Completed">
+ <arg name="success" type="b"/>
+ <arg name="message" type="s"/>
+ </signal>
+ </interface>
+</node>
diff --git a/src/devices/udisks2lister.cpp b/src/devices/udisks2lister.cpp
index df6fb62..023de06 100644
--- a/src/devices/udisks2lister.cpp
+++ b/src/devices/udisks2lister.cpp
@@ -8,6 +8,7 @@
#include "dbus/udisks2filesystem.h"
#include "dbus/udisks2block.h"
#include "dbus/udisks2drive.h"
+#include "dbus/udisks2job.h"
const QString Udisks2Lister::udisks2service_ = "org.freedesktop.UDisks2";
@@ -165,6 +166,16 @@ void Udisks2Lister::DBusInterfaceAdded(const QDBusObjectPath &path,
if (interface.key() != "org.freedesktop.UDisks2.Job")
continue;
+ std::shared_ptr<OrgFreedesktopUDisks2JobInterface> job = std::make_shared<OrgFreedesktopUDisks2JobInterface>(
+ udisks2service_,
+ path.path(),
+ QDBusConnection::systemBus());
+
+ if (!job->isValid())
+ continue;
+
+ // For some reason access through Job interface returns all properties
+ // as invalid for unmount job so we're doing this the hard way
bool isMountJob = false;
if (interface.value()["Operation"] == "filesystem-mount")
isMountJob = true;
@@ -173,30 +184,24 @@ void Udisks2Lister::DBusInterfaceAdded(const QDBusObjectPath &path,
else
continue;
- const QDBusArgument &objects = interface.value()["Objects"].value<QDBusArgument>();
-
- QList<QDBusObjectPath> mountedParititons;
- objects.beginArray();
- while (!objects.atEnd()) {
- QDBusObjectPath extractedPath;
- objects >> extractedPath;
- mountedParititons.push_back(extractedPath);
- }
- objects.endArray();
+ QList<QDBusObjectPath> mountedParititons
+ = GetMountedPartitionsFromDBusArgument(interface.value()["Objects"].value<QDBusArgument>());
if (mountedParititons.isEmpty()) {
qLog(Warning) << "Empty Udisks2 mount/umount job " << path.path();
- return;
+ continue;
}
- qLog(Debug) << "Adding Udisks job " << path.path()
- << " | Operation = " << interface.value()["Operation"].toString()
- << " with first path: " << mountedParititons.at(0).path();
-
{
QMutexLocker locker(&jobs_lock_);
- mounting_jobs_[path.path()].isMount = isMountJob;
- mounting_jobs_[path.path()].mount_paths = mountedParititons;
+ qLog(Debug) << "Adding pending job | DBus Path = " << job->path()
+ << " | IsMountJob = " << isMountJob
+ << " | First partition = " << mountedParititons.at(0).path();
+ mounting_jobs_[path].dbus_interface = job;
+ mounting_jobs_[path].isMount = isMountJob;
+ mounting_jobs_[path].mounted_partitions = mountedParititons;
+ connect(job.get(), SIGNAL(Completed(bool, const QString&)),
+ SLOT(JobCompleted(bool, const QString&)));
}
}
}
@@ -207,47 +212,12 @@ void Udisks2Lister::DBusInterfaceRemoved(const QDBusObjectPath &path, const QStr
}
bool Udisks2Lister::isPendingJob(const QDBusObjectPath &jobPath) {
- // should be actually done with a succcess signal from job, I guess, but it makes it kinda complicated
QMutexLocker locker(&jobs_lock_);
- if (!mounting_jobs_.contains(jobPath.path()))
+ if (!mounting_jobs_.contains(jobPath))
return false;
- const auto &mountPaths = mounting_jobs_[jobPath.path()].mount_paths;
- const auto &isMount = mounting_jobs_[jobPath.path()].isMount;
- for (const auto &partition : mountPaths) {
- auto data = ReadPartitionData(partition, true);
- if (!data.dbus_path.isEmpty()) {
- if (isMount) {
- qLog(Debug) << "UDisks2 mount job finished: Drive = " << data.dbus_drive_path
- << " | Partition = " << data.dbus_path;
- QWriteLocker locker(&device_data_lock_);
- device_data_[data.unique_id()] = data;
- DeviceAdded(data.unique_id());
- } else {
- QWriteLocker locker(&device_data_lock_);
- QString id;
- for (auto &data : device_data_) {
- if (data.mount_paths.contains(partition.path())) {
- qLog(Debug) << "UDisks2 umount job finished, found corresponding device: Drive = " << data.dbus_drive_path
- << " | Partition = " << data.dbus_path;
- data.mount_paths.removeOne(partition.path());
- if (data.mount_paths.empty())
- id = data.unique_id();
- break;
- }
- }
-
- if (!id.isEmpty())
- {
- qLog(Debug) << "Partition " << data.dbus_path << " has no more mount points, removing it from device list";
- device_data_.remove(id);
- DeviceRemoved(id);
- }
- }
- }
- }
- mounting_jobs_.remove(jobPath.path());
+ mounting_jobs_.remove(jobPath);
return true;
}
@@ -269,6 +239,67 @@ void Udisks2Lister::RemoveDevice(const QDBusObjectPath &devicePath) {
DeviceRemoved(id);
}
+QList<QDBusObjectPath> Udisks2Lister::GetMountedPartitionsFromDBusArgument(const QDBusArgument &input) {
+ QList<QDBusObjectPath> result;
+
+ input.beginArray();
+ while (!input.atEnd()) {
+ QDBusObjectPath extractedPath;
+ input >> extractedPath;
+ result.push_back(extractedPath);
+ }
+ input.endArray();
+
+ return result;
+}
+
+void Udisks2Lister::JobCompleted(bool success, const QString &message) {
+ auto job = qobject_cast<OrgFreedesktopUDisks2JobInterface*>(sender());
+ QDBusObjectPath jobPath(job->path());
+
+ if (!job->isValid()
+ || !success
+ || !mounting_jobs_.contains(jobPath))
+ return;
+
+ qLog(Debug) << "Pending Job Completed | Path = " << job->path()
+ << " | Mount? = " << mounting_jobs_[jobPath].isMount
+ << " | Success = " << success;
+
+ for (const auto &mountedObject : mounting_jobs_[jobPath].mounted_partitions) {
+ auto data = ReadPartitionData(mountedObject, false);
+ if (data.dbus_path.isEmpty())
+ continue;
+
+ if (mounting_jobs_[jobPath].isMount) {
+ qLog(Debug) << "UDisks2 mount job finished: Drive = " << data.dbus_drive_path
+ << " | Partition = " << data.dbus_path;
+ QWriteLocker locker(&device_data_lock_);
+ device_data_[data.unique_id()] = data;
+ DeviceAdded(data.unique_id());
+ } else {
+ QWriteLocker locker(&device_data_lock_);
+ QString id;
+ for (auto &data : device_data_) {
+ if (data.mount_paths.contains(mountedObject.path())) {
+ qLog(Debug) << "UDisks2 umount job finished, found corresponding device: Drive = " << data.dbus_drive_path
+ << " | Partition = " << data.dbus_path;
+ data.mount_paths.removeOne(mountedObject.path());
+ if (data.mount_paths.empty())
+ id = data.unique_id();
+ break;
+ }
+ }
+
+ if (!id.isEmpty()) {
+ qLog(Debug) << "Partition " << data.dbus_path << " has no more mount points, removing it from device list";
+ device_data_.remove(id);
+ DeviceRemoved(id);
+ }
+ }
+ }
+}
+
Udisks2Lister::PartitionData Udisks2Lister::ReadPartitionData(const QDBusObjectPath &path,
bool beingMounted) {
PartitionData result;
diff --git a/src/devices/udisks2lister.h b/src/devices/udisks2lister.h
index 37320ed..62d2835 100644
--- a/src/devices/udisks2lister.h
+++ b/src/devices/udisks2lister.h
@@ -6,6 +6,8 @@
#include "dbus/objectmanager.h"
+class OrgFreedesktopUDisks2JobInterface;
+
class Udisks2Lister : public DeviceLister {
Q_OBJECT
@@ -35,20 +37,23 @@ public slots:
private slots:
void DBusInterfaceAdded(const QDBusObjectPath &path, const InterfacesAndProperties &ifaces);
void DBusInterfaceRemoved(const QDBusObjectPath &path, const QStringList &ifaces);
+ void JobCompleted(bool success, const QString &message);
private:
bool isPendingJob(const QDBusObjectPath &jobPath);
void RemoveDevice(const QDBusObjectPath &devicePath);
+ QList<QDBusObjectPath> GetMountedPartitionsFromDBusArgument(const QDBusArgument &input);
- class MountJob
+ class Udisks2Job
{
public:
bool isMount = true;
- QList<QDBusObjectPath> mount_paths;
+ QList<QDBusObjectPath> mounted_partitions;
+ std::shared_ptr<OrgFreedesktopUDisks2JobInterface> dbus_interface;
};
QMutex jobs_lock_;
- QMap<QString, MountJob> mounting_jobs_;
+ QMap<QDBusObjectPath, Udisks2Job> mounting_jobs_;
private:
class PartitionData {
From cc6a99ef92b6f86c4db2310357a7a90a3f26a392 Mon Sep 17 00:00:00 2001
From: Valeriy <jazzvoid@gmail.com>
Date: Mon, 30 May 2016 18:24:02 +0300
Subject: [PATCH 4/7] handle our unmount responses because those unmount jobs
expire too fast for jobs use dbus interface when possible clean up the code a
bit
---
src/dbus/metatypes.h | 1 +
src/devices/udisks2lister.cpp | 98 ++++++++++++++++++++++++-------------------
src/devices/udisks2lister.h | 20 +++++----
3 files changed, 68 insertions(+), 51 deletions(-)
diff --git a/src/dbus/metatypes.h b/src/dbus/metatypes.h
index 83bc5e6..3ec6de1 100644
--- a/src/dbus/metatypes.h
+++ b/src/dbus/metatypes.h
@@ -19,6 +19,7 @@
#define DBUS_METATYPES_H_
#include <QMetaType>
+#include <QDBusObjectPath>
Q_DECLARE_METATYPE(QList<QByteArray>)
diff --git a/src/devices/udisks2lister.cpp b/src/devices/udisks2lister.cpp
index 023de06..0af1884 100644
--- a/src/devices/udisks2lister.cpp
+++ b/src/devices/udisks2lister.cpp
@@ -5,6 +5,7 @@
#include "core/logging.h"
#include "core/utilities.h"
+#include "dbus/objectmanager.h"
#include "dbus/udisks2filesystem.h"
#include "dbus/udisks2block.h"
#include "dbus/udisks2drive.h"
@@ -100,19 +101,29 @@ void Udisks2Lister::UnmountDevice(const QString &id) {
if (filesystem.isValid())
{
- auto umountResult = filesystem.Unmount(QVariantMap());
- umountResult.waitForFinished();
+ auto unmountResult = filesystem.Unmount(QVariantMap());
+ unmountResult.waitForFinished();
+
+ if (unmountResult.isError()) {
+ qLog(Warning) << "Failed to unmount " << id << ": " << unmountResult.error();
+ return;
+ }
OrgFreedesktopUDisks2DriveInterface drive(
udisks2service_,
device_data_[id].dbus_drive_path,
QDBusConnection::systemBus());
- if (drive.isValid())
- {
+ if (drive.isValid()) {
auto ejectResult = drive.Eject(QVariantMap());
ejectResult.waitForFinished();
+
+ if (ejectResult.isError())
+ qLog(Warning) << "Failed to eject " << id << ": " << ejectResult.error();
}
+
+ device_data_.remove(id);
+ DeviceRemoved(id);
}
}
@@ -140,7 +151,7 @@ void Udisks2Lister::Init() {
}
for (const QDBusObjectPath &path : reply.value().keys()) {
- auto partitionData = ReadPartitionData(path, false);
+ auto partitionData = ReadPartitionData(path);
if (!partitionData.dbus_path.isEmpty())
{
@@ -174,20 +185,17 @@ void Udisks2Lister::DBusInterfaceAdded(const QDBusObjectPath &path,
if (!job->isValid())
continue;
- // For some reason access through Job interface returns all properties
- // as invalid for unmount job so we're doing this the hard way
bool isMountJob = false;
- if (interface.value()["Operation"] == "filesystem-mount")
+ if (job->operation() == "filesystem-mount")
isMountJob = true;
- else if (interface.value()["Operation"] == "filesystem-unmount")
+ else if (job->operation() == "filesystem-unmount")
isMountJob = false;
else
continue;
- QList<QDBusObjectPath> mountedParititons
- = GetMountedPartitionsFromDBusArgument(interface.value()["Objects"].value<QDBusArgument>());
+ auto mountedPartitions = job->objects();
- if (mountedParititons.isEmpty()) {
+ if (mountedPartitions.isEmpty()) {
qLog(Warning) << "Empty Udisks2 mount/umount job " << path.path();
continue;
}
@@ -196,10 +204,10 @@ void Udisks2Lister::DBusInterfaceAdded(const QDBusObjectPath &path,
QMutexLocker locker(&jobs_lock_);
qLog(Debug) << "Adding pending job | DBus Path = " << job->path()
<< " | IsMountJob = " << isMountJob
- << " | First partition = " << mountedParititons.at(0).path();
+ << " | First partition = " << mountedPartitions.at(0).path();
mounting_jobs_[path].dbus_interface = job;
mounting_jobs_[path].isMount = isMountJob;
- mounting_jobs_[path].mounted_partitions = mountedParititons;
+ mounting_jobs_[path].mounted_partitions = mountedPartitions;
connect(job.get(), SIGNAL(Completed(bool, const QString&)),
SLOT(JobCompleted(bool, const QString&)));
}
@@ -267,41 +275,45 @@ void Udisks2Lister::JobCompleted(bool success, const QString &message) {
<< " | Success = " << success;
for (const auto &mountedObject : mounting_jobs_[jobPath].mounted_partitions) {
- auto data = ReadPartitionData(mountedObject, false);
- if (data.dbus_path.isEmpty())
+ auto partitionData = ReadPartitionData(mountedObject);
+ if (partitionData.dbus_path.isEmpty())
continue;
- if (mounting_jobs_[jobPath].isMount) {
- qLog(Debug) << "UDisks2 mount job finished: Drive = " << data.dbus_drive_path
+ mounting_jobs_[jobPath].isMount ?
+ HandleFinishedMountJob(partitionData) : HandleFinishedUnmountJob(partitionData, mountedObject);
+ }
+}
+
+void Udisks2Lister::HandleFinishedMountJob(const Udisks2Lister::PartitionData &partitionData) {
+ qLog(Debug) << "UDisks2 mount job finished: Drive = " << partitionData.dbus_drive_path
+ << " | Partition = " << partitionData.dbus_path;
+ QWriteLocker locker(&device_data_lock_);
+ device_data_[partitionData.unique_id()] = partitionData;
+ DeviceAdded(partitionData.unique_id());
+}
+
+void Udisks2Lister::HandleFinishedUnmountJob(const Udisks2Lister::PartitionData &partitionData, const QDBusObjectPath &mountedObject) {
+ QWriteLocker locker(&device_data_lock_);
+ QString id;
+ for (auto &data : device_data_) {
+ if (data.mount_paths.contains(mountedObject.path())) {
+ qLog(Debug) << "UDisks2 umount job finished, found corresponding device: Drive = " << data.dbus_drive_path
<< " | Partition = " << data.dbus_path;
- QWriteLocker locker(&device_data_lock_);
- device_data_[data.unique_id()] = data;
- DeviceAdded(data.unique_id());
- } else {
- QWriteLocker locker(&device_data_lock_);
- QString id;
- for (auto &data : device_data_) {
- if (data.mount_paths.contains(mountedObject.path())) {
- qLog(Debug) << "UDisks2 umount job finished, found corresponding device: Drive = " << data.dbus_drive_path
- << " | Partition = " << data.dbus_path;
- data.mount_paths.removeOne(mountedObject.path());
- if (data.mount_paths.empty())
- id = data.unique_id();
- break;
- }
- }
-
- if (!id.isEmpty()) {
- qLog(Debug) << "Partition " << data.dbus_path << " has no more mount points, removing it from device list";
- device_data_.remove(id);
- DeviceRemoved(id);
- }
+ data.mount_paths.removeOne(mountedObject.path());
+ if (data.mount_paths.empty())
+ id = data.unique_id();
+ break;
}
}
+
+ if (!id.isEmpty()) {
+ qLog(Debug) << "Partition " << partitionData.dbus_path << " has no more mount points, removing it from device list";
+ device_data_.remove(id);
+ DeviceRemoved(id);
+ }
}
-Udisks2Lister::PartitionData Udisks2Lister::ReadPartitionData(const QDBusObjectPath &path,
- bool beingMounted) {
+Udisks2Lister::PartitionData Udisks2Lister::ReadPartitionData(const QDBusObjectPath &path) {
PartitionData result;
OrgFreedesktopUDisks2FilesystemInterface filesystem(
udisks2service_,
@@ -314,7 +326,7 @@ Udisks2Lister::PartitionData Udisks2Lister::ReadPartitionData(const QDBusObjectP
if (filesystem.isValid()
&& block.isValid()
- && (beingMounted || !filesystem.mountPoints().empty())) {
+ && !filesystem.mountPoints().empty()) {
OrgFreedesktopUDisks2DriveInterface drive(
udisks2service_,
diff --git a/src/devices/udisks2lister.h b/src/devices/udisks2lister.h
index 62d2835..feac8da 100644
--- a/src/devices/udisks2lister.h
+++ b/src/devices/udisks2lister.h
@@ -2,10 +2,15 @@
#include <memory>
-#include "devicelister.h"
+#include <QReadWriteLock>
+#include <QMutex>
+#include <QStringList>
+#include <QDBusArgument>
-#include "dbus/objectmanager.h"
+#include "devicelister.h"
+#include "dbus/metatypes.h"
+class OrgFreedesktopDBusObjectManagerInterface;
class OrgFreedesktopUDisks2JobInterface;
class Udisks2Lister : public DeviceLister {
@@ -44,9 +49,7 @@ private slots:
void RemoveDevice(const QDBusObjectPath &devicePath);
QList<QDBusObjectPath> GetMountedPartitionsFromDBusArgument(const QDBusArgument &input);
- class Udisks2Job
- {
- public:
+ struct Udisks2Job {
bool isMount = true;
QList<QDBusObjectPath> mounted_partitions;
std::shared_ptr<OrgFreedesktopUDisks2JobInterface> dbus_interface;
@@ -56,8 +59,7 @@ private slots:
QMap<QDBusObjectPath, Udisks2Job> mounting_jobs_;
private:
- class PartitionData {
- public:
+ struct PartitionData {
QString unique_id() const;
QString dbus_path;
@@ -77,7 +79,9 @@ private slots:
QStringList mount_paths;
};
- PartitionData ReadPartitionData(const QDBusObjectPath &path, bool beingMounted);
+ PartitionData ReadPartitionData(const QDBusObjectPath &path);
+ void HandleFinishedMountJob(const Udisks2Lister::PartitionData &partitionData);
+ void HandleFinishedUnmountJob(const Udisks2Lister::PartitionData &partitionData, const QDBusObjectPath &mountedObject);
QReadWriteLock device_data_lock_;
QMap<QString, PartitionData> device_data_;
From 0172f7265bd087f65026d584e4679fab54f167fb Mon Sep 17 00:00:00 2001
From: Valeriy <jazzvoid@gmail.com>
Date: Tue, 31 May 2016 18:19:46 +0300
Subject: [PATCH 5/7] fix code style
---
src/devices/udisks2lister.cpp | 32 ++++++++++++++++----------------
src/devices/udisks2lister.h | 37 ++++++++++++++++++++-----------------
2 files changed, 36 insertions(+), 33 deletions(-)
diff --git a/src/devices/udisks2lister.cpp b/src/devices/udisks2lister.cpp
index 0af1884..ccea4fc 100644
--- a/src/devices/udisks2lister.cpp
+++ b/src/devices/udisks2lister.cpp
@@ -11,14 +11,14 @@
#include "dbus/udisks2drive.h"
#include "dbus/udisks2job.h"
-const QString Udisks2Lister::udisks2service_ = "org.freedesktop.UDisks2";
+constexpr char Udisks2Lister::udisks2_service_[];
Udisks2Lister::Udisks2Lister() {
}
Udisks2Lister::~Udisks2Lister() {
- qLog(Debug) << __PRETTY_FUNCTION__;
+
}
QStringList Udisks2Lister::DeviceUniqueIDs() {
@@ -95,7 +95,7 @@ void Udisks2Lister::UnmountDevice(const QString &id) {
return;
OrgFreedesktopUDisks2FilesystemInterface filesystem(
- udisks2service_,
+ udisks2_service_,
device_data_[id].dbus_path,
QDBusConnection::systemBus());
@@ -110,7 +110,7 @@ void Udisks2Lister::UnmountDevice(const QString &id) {
}
OrgFreedesktopUDisks2DriveInterface drive(
- udisks2service_,
+ udisks2_service_,
device_data_[id].dbus_drive_path,
QDBusConnection::systemBus());
@@ -136,7 +136,7 @@ void Udisks2Lister::UpdateDeviceFreeSpace(const QString &id) {
void Udisks2Lister::Init() {
udisks2_interface_.reset(new OrgFreedesktopDBusObjectManagerInterface(
- udisks2service_,
+ udisks2_service_,
"/org/freedesktop/UDisks2",
QDBusConnection::systemBus()));
@@ -178,18 +178,18 @@ void Udisks2Lister::DBusInterfaceAdded(const QDBusObjectPath &path,
continue;
std::shared_ptr<OrgFreedesktopUDisks2JobInterface> job = std::make_shared<OrgFreedesktopUDisks2JobInterface>(
- udisks2service_,
+ udisks2_service_,
path.path(),
QDBusConnection::systemBus());
if (!job->isValid())
continue;
- bool isMountJob = false;
+ bool is_mount_job = false;
if (job->operation() == "filesystem-mount")
- isMountJob = true;
+ is_mount_job = true;
else if (job->operation() == "filesystem-unmount")
- isMountJob = false;
+ is_mount_job = false;
else
continue;
@@ -203,10 +203,10 @@ void Udisks2Lister::DBusInterfaceAdded(const QDBusObjectPath &path,
{
QMutexLocker locker(&jobs_lock_);
qLog(Debug) << "Adding pending job | DBus Path = " << job->path()
- << " | IsMountJob = " << isMountJob
+ << " | IsMountJob = " << is_mount_job
<< " | First partition = " << mountedPartitions.at(0).path();
mounting_jobs_[path].dbus_interface = job;
- mounting_jobs_[path].isMount = isMountJob;
+ mounting_jobs_[path].is_mount = is_mount_job;
mounting_jobs_[path].mounted_partitions = mountedPartitions;
connect(job.get(), SIGNAL(Completed(bool, const QString&)),
SLOT(JobCompleted(bool, const QString&)));
@@ -271,7 +271,7 @@ void Udisks2Lister::JobCompleted(bool success, const QString &message) {
return;
qLog(Debug) << "Pending Job Completed | Path = " << job->path()
- << " | Mount? = " << mounting_jobs_[jobPath].isMount
+ << " | Mount? = " << mounting_jobs_[jobPath].is_mount
<< " | Success = " << success;
for (const auto &mountedObject : mounting_jobs_[jobPath].mounted_partitions) {
@@ -279,7 +279,7 @@ void Udisks2Lister::JobCompleted(bool success, const QString &message) {
if (partitionData.dbus_path.isEmpty())
continue;
- mounting_jobs_[jobPath].isMount ?
+ mounting_jobs_[jobPath].is_mount ?
HandleFinishedMountJob(partitionData) : HandleFinishedUnmountJob(partitionData, mountedObject);
}
}
@@ -316,11 +316,11 @@ void Udisks2Lister::HandleFinishedUnmountJob(const Udisks2Lister::PartitionData
Udisks2Lister::PartitionData Udisks2Lister::ReadPartitionData(const QDBusObjectPath &path) {
PartitionData result;
OrgFreedesktopUDisks2FilesystemInterface filesystem(
- udisks2service_,
+ udisks2_service_,
path.path(),
QDBusConnection::systemBus());
OrgFreedesktopUDisks2BlockInterface block(
- udisks2service_,
+ udisks2_service_,
path.path(),
QDBusConnection::systemBus());
@@ -329,7 +329,7 @@ Udisks2Lister::PartitionData Udisks2Lister::ReadPartitionData(const QDBusObjectP
&& !filesystem.mountPoints().empty()) {
OrgFreedesktopUDisks2DriveInterface drive(
- udisks2service_,
+ udisks2_service_,
block.drive().path(),
QDBusConnection::systemBus());
diff --git a/src/devices/udisks2lister.h b/src/devices/udisks2lister.h
index feac8da..1143d74 100644
--- a/src/devices/udisks2lister.h
+++ b/src/devices/udisks2lister.h
@@ -1,11 +1,12 @@
-#pragma once
+#ifndef UDISKS2LISTER_H
+#define UDISKS2LISTER_H
#include <memory>
-#include <QReadWriteLock>
+#include <QDBusArgument>
#include <QMutex>
+#include <QReadWriteLock>
#include <QStringList>
-#include <QDBusArgument>
#include "devicelister.h"
#include "dbus/metatypes.h"
@@ -20,24 +21,24 @@ class Udisks2Lister : public DeviceLister {
Udisks2Lister();
~Udisks2Lister();
- QStringList DeviceUniqueIDs();
- QVariantList DeviceIcons(const QString &id);
- QString DeviceManufacturer(const QString &id);
- QString DeviceModel(const QString &id);
- quint64 DeviceCapacity(const QString &id);
- quint64 DeviceFreeSpace(const QString &id);
- QVariantMap DeviceHardwareInfo(const QString &id);
+ QStringList DeviceUniqueIDs() override;
+ QVariantList DeviceIcons(const QString &id) override;
+ QString DeviceManufacturer(const QString &id) override;
+ QString DeviceModel(const QString &id) override;
+ quint64 DeviceCapacity(const QString &id) override;
+ quint64 DeviceFreeSpace(const QString &id) override;
+ QVariantMap DeviceHardwareInfo(const QString &id) override;
- QString MakeFriendlyName(const QString &id);
- QList<QUrl> MakeDeviceUrls(const QString &id);
+ QString MakeFriendlyName(const QString &id) override;
+ QList<QUrl> MakeDeviceUrls(const QString &id) override;
- void UnmountDevice(const QString &id);
+ void UnmountDevice(const QString &id) override;
public slots:
- void UpdateDeviceFreeSpace(const QString &id);
+ void UpdateDeviceFreeSpace(const QString &id) override;
protected:
- void Init();
+ void Init() override;
private slots:
void DBusInterfaceAdded(const QDBusObjectPath &path, const InterfacesAndProperties &ifaces);
@@ -50,7 +51,7 @@ private slots:
QList<QDBusObjectPath> GetMountedPartitionsFromDBusArgument(const QDBusArgument &input);
struct Udisks2Job {
- bool isMount = true;
+ bool is_mount = true;
QList<QDBusObjectPath> mounted_partitions;
std::shared_ptr<OrgFreedesktopUDisks2JobInterface> dbus_interface;
};
@@ -89,5 +90,7 @@ private slots:
private:
std::unique_ptr<OrgFreedesktopDBusObjectManagerInterface> udisks2_interface_;
- static const QString udisks2service_;
+ static constexpr char udisks2_service_[] = "org.freedesktop.UDisks2";
};
+
+#endif // UDISKS2LISTER_H
From 1812f089b02b1abb98545968e40fc63b4ac330a2 Mon Sep 17 00:00:00 2001
From: Valeriy <jazzvoid@gmail.com>
Date: Tue, 31 May 2016 18:31:00 +0300
Subject: [PATCH 6/7] feed udisks2lister.* through format.py add copyright
headers
---
src/devices/udisks2lister.cpp | 235 +++++++++++++++++++++---------------------
src/devices/udisks2lister.h | 77 +++++++++-----
2 files changed, 166 insertions(+), 146 deletions(-)
diff --git a/src/devices/udisks2lister.cpp b/src/devices/udisks2lister.cpp
index ccea4fc..289383e 100644
--- a/src/devices/udisks2lister.cpp
+++ b/src/devices/udisks2lister.cpp
@@ -1,71 +1,78 @@
+/* This file is part of Clementine.
+ Copyright 2016, Valeriy Malov <jazzvoid@gmail.com>
+
+ Clementine is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Clementine is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Clementine. If not, see <http://www.gnu.org/licenses/>.
+*/
+
#include "udisks2lister.h"
#include <QDBusConnection>
#include "core/logging.h"
#include "core/utilities.h"
-
#include "dbus/objectmanager.h"
-#include "dbus/udisks2filesystem.h"
#include "dbus/udisks2block.h"
#include "dbus/udisks2drive.h"
+#include "dbus/udisks2filesystem.h"
#include "dbus/udisks2job.h"
constexpr char Udisks2Lister::udisks2_service_[];
-Udisks2Lister::Udisks2Lister() {
+Udisks2Lister::Udisks2Lister() {}
-}
-
-Udisks2Lister::~Udisks2Lister() {
-
-}
+Udisks2Lister::~Udisks2Lister() {}
QStringList Udisks2Lister::DeviceUniqueIDs() {
QReadLocker locker(&device_data_lock_);
return device_data_.keys();
}
-QVariantList Udisks2Lister::DeviceIcons(const QString &id) {
+QVariantList Udisks2Lister::DeviceIcons(const QString& id) {
return QVariantList();
}
-QString Udisks2Lister::DeviceManufacturer(const QString &id) {
+QString Udisks2Lister::DeviceManufacturer(const QString& id) {
QReadLocker locker(&device_data_lock_);
- if (!device_data_.contains(id))
- return "";
+ if (!device_data_.contains(id)) return "";
return device_data_[id].vendor;
}
-QString Udisks2Lister::DeviceModel(const QString &id) {
+QString Udisks2Lister::DeviceModel(const QString& id) {
QReadLocker locker(&device_data_lock_);
- if (!device_data_.contains(id))
- return "";
+ if (!device_data_.contains(id)) return "";
return device_data_[id].model;
}
-quint64 Udisks2Lister::DeviceCapacity(const QString &id) {
+quint64 Udisks2Lister::DeviceCapacity(const QString& id) {
QReadLocker locker(&device_data_lock_);
- if (!device_data_.contains(id))
- return 0;
+ if (!device_data_.contains(id)) return 0;
return device_data_[id].capacity;
}
-quint64 Udisks2Lister::DeviceFreeSpace(const QString &id) {
+quint64 Udisks2Lister::DeviceFreeSpace(const QString& id) {
QReadLocker locker(&device_data_lock_);
- if (!device_data_.contains(id))
- return 0;
+ if (!device_data_.contains(id)) return 0;
return device_data_[id].free_space;
}
-QVariantMap Udisks2Lister::DeviceHardwareInfo(const QString &id) {
+QVariantMap Udisks2Lister::DeviceHardwareInfo(const QString& id) {
QReadLocker locker(&device_data_lock_);
- if (!device_data_.contains(id))
- return QVariantMap();
+ if (!device_data_.contains(id)) return QVariantMap();
QVariantMap result;
- const auto &data = device_data_[id];
+ const auto& data = device_data_[id];
result[QT_TR_NOOP("DBus path")] = data.dbus_path;
result[QT_TR_NOOP("Serial number")] = data.serial;
result[QT_TR_NOOP("Mount points")] = data.mount_paths.join(", ");
@@ -75,51 +82,48 @@ QVariantMap Udisks2Lister::DeviceHardwareInfo(const QString &id) {
return result;
}
-QString Udisks2Lister::MakeFriendlyName(const QString &id) {
+QString Udisks2Lister::MakeFriendlyName(const QString& id) {
QReadLocker locker(&device_data_lock_);
- if (!device_data_.contains(id))
- return "";
+ if (!device_data_.contains(id)) return "";
return device_data_[id].friendly_name;
}
-QList<QUrl> Udisks2Lister::MakeDeviceUrls(const QString &id) {
+QList<QUrl> Udisks2Lister::MakeDeviceUrls(const QString& id) {
QReadLocker locker(&device_data_lock_);
- if (!device_data_.contains(id))
- return QList<QUrl>();
- return QList<QUrl>() << QUrl::fromLocalFile(device_data_[id].mount_paths.at(0));
+ if (!device_data_.contains(id)) return QList<QUrl>();
+ return QList<QUrl>() << QUrl::fromLocalFile(
+ device_data_[id].mount_paths.at(0));
}
-void Udisks2Lister::UnmountDevice(const QString &id) {
+void Udisks2Lister::UnmountDevice(const QString& id) {
QReadLocker locker(&device_data_lock_);
- if (!device_data_.contains(id))
- return;
+ if (!device_data_.contains(id)) return;
OrgFreedesktopUDisks2FilesystemInterface filesystem(
- udisks2_service_,
- device_data_[id].dbus_path,
- QDBusConnection::systemBus());
+ udisks2_service_, device_data_[id].dbus_path,
+ QDBusConnection::systemBus());
- if (filesystem.isValid())
- {
+ if (filesystem.isValid()) {
auto unmountResult = filesystem.Unmount(QVariantMap());
unmountResult.waitForFinished();
if (unmountResult.isError()) {
- qLog(Warning) << "Failed to unmount " << id << ": " << unmountResult.error();
+ qLog(Warning) << "Failed to unmount " << id << ": "
+ << unmountResult.error();
return;
}
- OrgFreedesktopUDisks2DriveInterface drive(
- udisks2_service_,
- device_data_[id].dbus_drive_path,
- QDBusConnection::systemBus());
+ OrgFreedesktopUDisks2DriveInterface drive(udisks2_service_,
+ device_data_[id].dbus_drive_path,
+ QDBusConnection::systemBus());
if (drive.isValid()) {
auto ejectResult = drive.Eject(QVariantMap());
ejectResult.waitForFinished();
if (ejectResult.isError())
- qLog(Warning) << "Failed to eject " << id << ": " << ejectResult.error();
+ qLog(Warning) << "Failed to eject " << id << ": "
+ << ejectResult.error();
}
device_data_.remove(id);
@@ -127,20 +131,21 @@ void Udisks2Lister::UnmountDevice(const QString &id) {
}
}
-void Udisks2Lister::UpdateDeviceFreeSpace(const QString &id) {
+void Udisks2Lister::UpdateDeviceFreeSpace(const QString& id) {
QWriteLocker locker(&device_data_lock_);
- device_data_[id].free_space = Utilities::FileSystemFreeSpace(device_data_[id].mount_paths.at(0));
+ device_data_[id].free_space =
+ Utilities::FileSystemFreeSpace(device_data_[id].mount_paths.at(0));
emit DeviceChanged(id);
}
void Udisks2Lister::Init() {
udisks2_interface_.reset(new OrgFreedesktopDBusObjectManagerInterface(
- udisks2_service_,
- "/org/freedesktop/UDisks2",
- QDBusConnection::systemBus()));
+ udisks2_service_, "/org/freedesktop/UDisks2",
+ QDBusConnection::systemBus()));
- QDBusPendingReply<ManagedObjectList> reply = udisks2_interface_->GetManagedObjects();
+ QDBusPendingReply<ManagedObjectList> reply =
+ udisks2_interface_->GetManagedObjects();
reply.waitForFinished();
if (!reply.isValid()) {
@@ -150,40 +155,38 @@ void Udisks2Lister::Init() {
return;
}
- for (const QDBusObjectPath &path : reply.value().keys()) {
+ for (const QDBusObjectPath& path : reply.value().keys()) {
auto partitionData = ReadPartitionData(path);
- if (!partitionData.dbus_path.isEmpty())
- {
+ if (!partitionData.dbus_path.isEmpty()) {
QWriteLocker locker(&device_data_lock_);
device_data_[partitionData.unique_id()] = partitionData;
}
}
- for (const auto &id : device_data_.keys()) {
+ for (const auto& id : device_data_.keys()) {
emit DeviceAdded(id);
}
- connect(udisks2_interface_.get(), SIGNAL(InterfacesAdded(QDBusObjectPath, InterfacesAndProperties)),
+ connect(udisks2_interface_.get(),
+ SIGNAL(InterfacesAdded(QDBusObjectPath, InterfacesAndProperties)),
SLOT(DBusInterfaceAdded(QDBusObjectPath, InterfacesAndProperties)));
- connect(udisks2_interface_.get(), SIGNAL(InterfacesRemoved(QDBusObjectPath, QStringList)),
+ connect(udisks2_interface_.get(),
+ SIGNAL(InterfacesRemoved(QDBusObjectPath, QStringList)),
SLOT(DBusInterfaceRemoved(QDBusObjectPath, QStringList)));
}
-void Udisks2Lister::DBusInterfaceAdded(const QDBusObjectPath &path,
- const InterfacesAndProperties &interfaces) {
- for (auto interface = interfaces.constBegin(); interface != interfaces.constEnd(); ++interface)
- {
- if (interface.key() != "org.freedesktop.UDisks2.Job")
- continue;
+void Udisks2Lister::DBusInterfaceAdded(
+ const QDBusObjectPath& path, const InterfacesAndProperties& interfaces) {
+ for (auto interface = interfaces.constBegin();
+ interface != interfaces.constEnd(); ++interface) {
+ if (interface.key() != "org.freedesktop.UDisks2.Job") continue;
- std::shared_ptr<OrgFreedesktopUDisks2JobInterface> job = std::make_shared<OrgFreedesktopUDisks2JobInterface>(
- udisks2_service_,
- path.path(),
- QDBusConnection::systemBus());
+ std::shared_ptr<OrgFreedesktopUDisks2JobInterface> job =
+ std::make_shared<OrgFreedesktopUDisks2JobInterface>(
+ udisks2_service_, path.path(), QDBusConnection::systemBus());
- if (!job->isValid())
- continue;
+ if (!job->isValid()) continue;
bool is_mount_job = false;
if (job->operation() == "filesystem-mount")
@@ -214,40 +217,39 @@ void Udisks2Lister::DBusInterfaceAdded(const QDBusObjectPath &path,
}
}
-void Udisks2Lister::DBusInterfaceRemoved(const QDBusObjectPath &path, const QStringList &ifaces) {
- if (!isPendingJob(path))
- RemoveDevice(path);
+void Udisks2Lister::DBusInterfaceRemoved(const QDBusObjectPath& path,
+ const QStringList& ifaces) {
+ if (!isPendingJob(path)) RemoveDevice(path);
}
-bool Udisks2Lister::isPendingJob(const QDBusObjectPath &jobPath) {
+bool Udisks2Lister::isPendingJob(const QDBusObjectPath& jobPath) {
QMutexLocker locker(&jobs_lock_);
- if (!mounting_jobs_.contains(jobPath))
- return false;
+ if (!mounting_jobs_.contains(jobPath)) return false;
mounting_jobs_.remove(jobPath);
return true;
}
-void Udisks2Lister::RemoveDevice(const QDBusObjectPath &devicePath) {
+void Udisks2Lister::RemoveDevice(const QDBusObjectPath& devicePath) {
QWriteLocker locker(&device_data_lock_);
QString id;
- for (const auto &data : device_data_) {
+ for (const auto& data : device_data_) {
if (data.dbus_path == devicePath.path()) {
id = data.unique_id();
break;
}
}
- if (id.isEmpty())
- return;
+ if (id.isEmpty()) return;
qLog(Debug) << "UDisks2 device removed: " << devicePath.path();
device_data_.remove(id);
DeviceRemoved(id);
}
-QList<QDBusObjectPath> Udisks2Lister::GetMountedPartitionsFromDBusArgument(const QDBusArgument &input) {
+QList<QDBusObjectPath> Udisks2Lister::GetMountedPartitionsFromDBusArgument(
+ const QDBusArgument& input) {
QList<QDBusObjectPath> result;
input.beginArray();
@@ -261,80 +263,74 @@ QList<QDBusObjectPath> Udisks2Lister::GetMountedPartitionsFromDBusArgument(const
return result;
}
-void Udisks2Lister::JobCompleted(bool success, const QString &message) {
+void Udisks2Lister::JobCompleted(bool success, const QString& message) {
auto job = qobject_cast<OrgFreedesktopUDisks2JobInterface*>(sender());
QDBusObjectPath jobPath(job->path());
- if (!job->isValid()
- || !success
- || !mounting_jobs_.contains(jobPath))
- return;
+ if (!job->isValid() || !success || !mounting_jobs_.contains(jobPath)) return;
qLog(Debug) << "Pending Job Completed | Path = " << job->path()
<< " | Mount? = " << mounting_jobs_[jobPath].is_mount
<< " | Success = " << success;
- for (const auto &mountedObject : mounting_jobs_[jobPath].mounted_partitions) {
+ for (const auto& mountedObject : mounting_jobs_[jobPath].mounted_partitions) {
auto partitionData = ReadPartitionData(mountedObject);
- if (partitionData.dbus_path.isEmpty())
- continue;
+ if (partitionData.dbus_path.isEmpty()) continue;
- mounting_jobs_[jobPath].is_mount ?
- HandleFinishedMountJob(partitionData) : HandleFinishedUnmountJob(partitionData, mountedObject);
+ mounting_jobs_[jobPath].is_mount
+ ? HandleFinishedMountJob(partitionData)
+ : HandleFinishedUnmountJob(partitionData, mountedObject);
}
}
-void Udisks2Lister::HandleFinishedMountJob(const Udisks2Lister::PartitionData &partitionData) {
- qLog(Debug) << "UDisks2 mount job finished: Drive = " << partitionData.dbus_drive_path
+void Udisks2Lister::HandleFinishedMountJob(
+ const Udisks2Lister::PartitionData& partitionData) {
+ qLog(Debug) << "UDisks2 mount job finished: Drive = "
+ << partitionData.dbus_drive_path
<< " | Partition = " << partitionData.dbus_path;
QWriteLocker locker(&device_data_lock_);
device_data_[partitionData.unique_id()] = partitionData;
DeviceAdded(partitionData.unique_id());
}
-void Udisks2Lister::HandleFinishedUnmountJob(const Udisks2Lister::PartitionData &partitionData, const QDBusObjectPath &mountedObject) {
+void Udisks2Lister::HandleFinishedUnmountJob(
+ const Udisks2Lister::PartitionData& partitionData,
+ const QDBusObjectPath& mountedObject) {
QWriteLocker locker(&device_data_lock_);
QString id;
- for (auto &data : device_data_) {
+ for (auto& data : device_data_) {
if (data.mount_paths.contains(mountedObject.path())) {
- qLog(Debug) << "UDisks2 umount job finished, found corresponding device: Drive = " << data.dbus_drive_path
- << " | Partition = " << data.dbus_path;
+ qLog(Debug)
+ << "UDisks2 umount job finished, found corresponding device: Drive = "
+ << data.dbus_drive_path << " | Partition = " << data.dbus_path;
data.mount_paths.removeOne(mountedObject.path());
- if (data.mount_paths.empty())
- id = data.unique_id();
+ if (data.mount_paths.empty()) id = data.unique_id();
break;
}
}
if (!id.isEmpty()) {
- qLog(Debug) << "Partition " << partitionData.dbus_path << " has no more mount points, removing it from device list";
+ qLog(Debug) << "Partition " << partitionData.dbus_path
+ << " has no more mount points, removing it from device list";
device_data_.remove(id);
DeviceRemoved(id);
}
}
-Udisks2Lister::PartitionData Udisks2Lister::ReadPartitionData(const QDBusObjectPath &path) {
+Udisks2Lister::PartitionData Udisks2Lister::ReadPartitionData(
+ const QDBusObjectPath& path) {
PartitionData result;
OrgFreedesktopUDisks2FilesystemInterface filesystem(
- udisks2_service_,
- path.path(),
- QDBusConnection::systemBus());
- OrgFreedesktopUDisks2BlockInterface block(
- udisks2_service_,
- path.path(),
- QDBusConnection::systemBus());
-
- if (filesystem.isValid()
- && block.isValid()
- && !filesystem.mountPoints().empty()) {
+ udisks2_service_, path.path(), QDBusConnection::systemBus());
+ OrgFreedesktopUDisks2BlockInterface block(udisks2_service_, path.path(),
+ QDBusConnection::systemBus());
+ if (filesystem.isValid() && block.isValid() &&
+ !filesystem.mountPoints().empty()) {
OrgFreedesktopUDisks2DriveInterface drive(
- udisks2_service_,
- block.drive().path(),
- QDBusConnection::systemBus());
+ udisks2_service_, block.drive().path(), QDBusConnection::systemBus());
- if (drive.isValid()
- && drive.mediaRemovable()) {
+ if (drive.isValid() && drive.mediaRemovable()) {
result.dbus_path = path.path();
result.dbus_drive_path = block.drive().path();
@@ -351,10 +347,11 @@ Udisks2Lister::PartitionData Udisks2Lister::ReadPartitionData(const QDBusObjectP
else
result.friendly_name = result.model + " " + result.uuid;
- for (const auto &path : filesystem.mountPoints())
+ for (const auto& path : filesystem.mountPoints())
result.mount_paths.push_back(path);
- result.free_space = Utilities::FileSystemFreeSpace(result.mount_paths.at(0));
+ result.free_space =
+ Utilities::FileSystemFreeSpace(result.mount_paths.at(0));
}
}
diff --git a/src/devices/udisks2lister.h b/src/devices/udisks2lister.h
index 1143d74..8cf03f3 100644
--- a/src/devices/udisks2lister.h
+++ b/src/devices/udisks2lister.h
@@ -1,3 +1,20 @@
+/* This file is part of Clementine.
+ Copyright 2016, Valeriy Malov <jazzvoid@gmail.com>
+
+ Clementine is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Clementine is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Clementine. If not, see <http://www.gnu.org/licenses/>.
+*/
+
#ifndef UDISKS2LISTER_H
#define UDISKS2LISTER_H
@@ -17,38 +34,41 @@ class OrgFreedesktopUDisks2JobInterface;
class Udisks2Lister : public DeviceLister {
Q_OBJECT
-public:
+ public:
Udisks2Lister();
~Udisks2Lister();
QStringList DeviceUniqueIDs() override;
- QVariantList DeviceIcons(const QString &id) override;
- QString DeviceManufacturer(const QString &id) override;
- QString DeviceModel(const QString &id) override;
- quint64 DeviceCapacity(const QString &id) override;
- quint64 DeviceFreeSpace(const QString &id) override;
- QVariantMap DeviceHardwareInfo(const QString &id) override;
+ QVariantList DeviceIcons(const QString& id) override;
+ QString DeviceManufacturer(const QString& id) override;
+ QString DeviceModel(const QString& id) override;
+ quint64 DeviceCapacity(const QString& id) override;
+ quint64 DeviceFreeSpace(const QString& id) override;
+ QVariantMap DeviceHardwareInfo(const QString& id) override;
- QString MakeFriendlyName(const QString &id) override;
- QList<QUrl> MakeDeviceUrls(const QString &id) override;
+ QString MakeFriendlyName(const QString& id) override;
+ QList<QUrl> MakeDeviceUrls(const QString& id) override;
- void UnmountDevice(const QString &id) override;
+ void UnmountDevice(const QString& id) override;
-public slots:
- void UpdateDeviceFreeSpace(const QString &id) override;
+ public slots:
+ void UpdateDeviceFreeSpace(const QString& id) override;
-protected:
+ protected:
void Init() override;
-private slots:
- void DBusInterfaceAdded(const QDBusObjectPath &path, const InterfacesAndProperties &ifaces);
- void DBusInterfaceRemoved(const QDBusObjectPath &path, const QStringList &ifaces);
- void JobCompleted(bool success, const QString &message);
+ private slots:
+ void DBusInterfaceAdded(const QDBusObjectPath& path,
+ const InterfacesAndProperties& ifaces);
+ void DBusInterfaceRemoved(const QDBusObjectPath& path,
+ const QStringList& ifaces);
+ void JobCompleted(bool success, const QString& message);
-private:
- bool isPendingJob(const QDBusObjectPath &jobPath);
- void RemoveDevice(const QDBusObjectPath &devicePath);
- QList<QDBusObjectPath> GetMountedPartitionsFromDBusArgument(const QDBusArgument &input);
+ private:
+ bool isPendingJob(const QDBusObjectPath& jobPath);
+ void RemoveDevice(const QDBusObjectPath& devicePath);
+ QList<QDBusObjectPath> GetMountedPartitionsFromDBusArgument(
+ const QDBusArgument& input);
struct Udisks2Job {
bool is_mount = true;
@@ -59,7 +79,7 @@ private slots:
QMutex jobs_lock_;
QMap<QDBusObjectPath, Udisks2Job> mounting_jobs_;
-private:
+ private:
struct PartitionData {
QString unique_id() const;
@@ -80,17 +100,20 @@ private slots:
QStringList mount_paths;
};
- PartitionData ReadPartitionData(const QDBusObjectPath &path);
- void HandleFinishedMountJob(const Udisks2Lister::PartitionData &partitionData);
- void HandleFinishedUnmountJob(const Udisks2Lister::PartitionData &partitionData, const QDBusObjectPath &mountedObject);
+ PartitionData ReadPartitionData(const QDBusObjectPath& path);
+ void HandleFinishedMountJob(
+ const Udisks2Lister::PartitionData& partitionData);
+ void HandleFinishedUnmountJob(
+ const Udisks2Lister::PartitionData& partitionData,
+ const QDBusObjectPath& mountedObject);
QReadWriteLock device_data_lock_;
QMap<QString, PartitionData> device_data_;
-private:
+ private:
std::unique_ptr<OrgFreedesktopDBusObjectManagerInterface> udisks2_interface_;
static constexpr char udisks2_service_[] = "org.freedesktop.UDisks2";
};
-#endif // UDISKS2LISTER_H
+#endif // UDISKS2LISTER_H
From ecaa9de7883eb0d68b5efcf3616a3b6865cffcb6 Mon Sep 17 00:00:00 2001
From: Valeriy <jazzvoid@gmail.com>
Date: Tue, 31 May 2016 20:31:39 +0300
Subject: [PATCH 7/7] fix variable names
---
src/devices/udisks2lister.cpp | 80 ++++++++++++++++++++++---------------------
src/devices/udisks2lister.h | 10 +++---
2 files changed, 46 insertions(+), 44 deletions(-)
diff --git a/src/devices/udisks2lister.cpp b/src/devices/udisks2lister.cpp
index 289383e..c5c72ef 100644
--- a/src/devices/udisks2lister.cpp
+++ b/src/devices/udisks2lister.cpp
@@ -104,12 +104,12 @@ void Udisks2Lister::UnmountDevice(const QString& id) {
QDBusConnection::systemBus());
if (filesystem.isValid()) {
- auto unmountResult = filesystem.Unmount(QVariantMap());
- unmountResult.waitForFinished();
+ auto unmount_result = filesystem.Unmount(QVariantMap());
+ unmount_result.waitForFinished();
- if (unmountResult.isError()) {
+ if (unmount_result.isError()) {
qLog(Warning) << "Failed to unmount " << id << ": "
- << unmountResult.error();
+ << unmount_result.error();
return;
}
@@ -118,12 +118,12 @@ void Udisks2Lister::UnmountDevice(const QString& id) {
QDBusConnection::systemBus());
if (drive.isValid()) {
- auto ejectResult = drive.Eject(QVariantMap());
- ejectResult.waitForFinished();
+ auto eject_result = drive.Eject(QVariantMap());
+ eject_result.waitForFinished();
- if (ejectResult.isError())
+ if (eject_result.isError())
qLog(Warning) << "Failed to eject " << id << ": "
- << ejectResult.error();
+ << eject_result.error();
}
device_data_.remove(id);
@@ -156,11 +156,11 @@ void Udisks2Lister::Init() {
}
for (const QDBusObjectPath& path : reply.value().keys()) {
- auto partitionData = ReadPartitionData(path);
+ auto partition_data = ReadPartitionData(path);
- if (!partitionData.dbus_path.isEmpty()) {
+ if (!partition_data.dbus_path.isEmpty()) {
QWriteLocker locker(&device_data_lock_);
- device_data_[partitionData.unique_id()] = partitionData;
+ device_data_[partition_data.unique_id()] = partition_data;
}
}
@@ -189,16 +189,17 @@ void Udisks2Lister::DBusInterfaceAdded(
if (!job->isValid()) continue;
bool is_mount_job = false;
- if (job->operation() == "filesystem-mount")
+ if (job->operation() == "filesystem-mount") {
is_mount_job = true;
- else if (job->operation() == "filesystem-unmount")
+ } else if (job->operation() == "filesystem-unmount") {
is_mount_job = false;
- else
+ } else {
continue;
+ }
- auto mountedPartitions = job->objects();
+ auto mounted_partitions = job->objects();
- if (mountedPartitions.isEmpty()) {
+ if (mounted_partitions.isEmpty()) {
qLog(Warning) << "Empty Udisks2 mount/umount job " << path.path();
continue;
}
@@ -207,10 +208,10 @@ void Udisks2Lister::DBusInterfaceAdded(
QMutexLocker locker(&jobs_lock_);
qLog(Debug) << "Adding pending job | DBus Path = " << job->path()
<< " | IsMountJob = " << is_mount_job
- << " | First partition = " << mountedPartitions.at(0).path();
+ << " | First partition = " << mounted_partitions.at(0).path();
mounting_jobs_[path].dbus_interface = job;
mounting_jobs_[path].is_mount = is_mount_job;
- mounting_jobs_[path].mounted_partitions = mountedPartitions;
+ mounting_jobs_[path].mounted_partitions = mounted_partitions;
connect(job.get(), SIGNAL(Completed(bool, const QString&)),
SLOT(JobCompleted(bool, const QString&)));
}
@@ -222,20 +223,20 @@ void Udisks2Lister::DBusInterfaceRemoved(const QDBusObjectPath& path,
if (!isPendingJob(path)) RemoveDevice(path);
}
-bool Udisks2Lister::isPendingJob(const QDBusObjectPath& jobPath) {
+bool Udisks2Lister::isPendingJob(const QDBusObjectPath& job_path) {
QMutexLocker locker(&jobs_lock_);
- if (!mounting_jobs_.contains(jobPath)) return false;
+ if (!mounting_jobs_.contains(job_path)) return false;
- mounting_jobs_.remove(jobPath);
+ mounting_jobs_.remove(job_path);
return true;
}
-void Udisks2Lister::RemoveDevice(const QDBusObjectPath& devicePath) {
+void Udisks2Lister::RemoveDevice(const QDBusObjectPath& device_path) {
QWriteLocker locker(&device_data_lock_);
QString id;
for (const auto& data : device_data_) {
- if (data.dbus_path == devicePath.path()) {
+ if (data.dbus_path == device_path.path()) {
id = data.unique_id();
break;
}
@@ -243,7 +244,7 @@ void Udisks2Lister::RemoveDevice(const QDBusObjectPath& devicePath) {
if (id.isEmpty()) return;
- qLog(Debug) << "UDisks2 device removed: " << devicePath.path();
+ qLog(Debug) << "UDisks2 device removed: " << device_path.path();
device_data_.remove(id);
DeviceRemoved(id);
}
@@ -273,44 +274,45 @@ void Udisks2Lister::JobCompleted(bool success, const QString& message) {
<< " | Mount? = " << mounting_jobs_[jobPath].is_mount
<< " | Success = " << success;
- for (const auto& mountedObject : mounting_jobs_[jobPath].mounted_partitions) {
- auto partitionData = ReadPartitionData(mountedObject);
- if (partitionData.dbus_path.isEmpty()) continue;
+ for (const auto& mounted_object :
+ mounting_jobs_[jobPath].mounted_partitions) {
+ auto partition_data = ReadPartitionData(mounted_object);
+ if (partition_data.dbus_path.isEmpty()) continue;
mounting_jobs_[jobPath].is_mount
- ? HandleFinishedMountJob(partitionData)
- : HandleFinishedUnmountJob(partitionData, mountedObject);
+ ? HandleFinishedMountJob(partition_data)
+ : HandleFinishedUnmountJob(partition_data, mounted_object);
}
}
void Udisks2Lister::HandleFinishedMountJob(
- const Udisks2Lister::PartitionData& partitionData) {
+ const Udisks2Lister::PartitionData& partition_data) {
qLog(Debug) << "UDisks2 mount job finished: Drive = "
- << partitionData.dbus_drive_path
- << " | Partition = " << partitionData.dbus_path;
+ << partition_data.dbus_drive_path
+ << " | Partition = " << partition_data.dbus_path;
QWriteLocker locker(&device_data_lock_);
- device_data_[partitionData.unique_id()] = partitionData;
- DeviceAdded(partitionData.unique_id());
+ device_data_[partition_data.unique_id()] = partition_data;
+ DeviceAdded(partition_data.unique_id());
}
void Udisks2Lister::HandleFinishedUnmountJob(
- const Udisks2Lister::PartitionData& partitionData,
- const QDBusObjectPath& mountedObject) {
+ const Udisks2Lister::PartitionData& partition_data,
+ const QDBusObjectPath& mounted_object) {
QWriteLocker locker(&device_data_lock_);
QString id;
for (auto& data : device_data_) {
- if (data.mount_paths.contains(mountedObject.path())) {
+ if (data.mount_paths.contains(mounted_object.path())) {
qLog(Debug)
<< "UDisks2 umount job finished, found corresponding device: Drive = "
<< data.dbus_drive_path << " | Partition = " << data.dbus_path;
- data.mount_paths.removeOne(mountedObject.path());
+ data.mount_paths.removeOne(mounted_object.path());
if (data.mount_paths.empty()) id = data.unique_id();
break;
}
}
if (!id.isEmpty()) {
- qLog(Debug) << "Partition " << partitionData.dbus_path
+ qLog(Debug) << "Partition " << partition_data.dbus_path
<< " has no more mount points, removing it from device list";
device_data_.remove(id);
DeviceRemoved(id);
diff --git a/src/devices/udisks2lister.h b/src/devices/udisks2lister.h
index 8cf03f3..3a2a012 100644
--- a/src/devices/udisks2lister.h
+++ b/src/devices/udisks2lister.h
@@ -65,8 +65,8 @@ class Udisks2Lister : public DeviceLister {
void JobCompleted(bool success, const QString& message);
private:
- bool isPendingJob(const QDBusObjectPath& jobPath);
- void RemoveDevice(const QDBusObjectPath& devicePath);
+ bool isPendingJob(const QDBusObjectPath& job_path);
+ void RemoveDevice(const QDBusObjectPath& device_path);
QList<QDBusObjectPath> GetMountedPartitionsFromDBusArgument(
const QDBusArgument& input);
@@ -102,10 +102,10 @@ class Udisks2Lister : public DeviceLister {
PartitionData ReadPartitionData(const QDBusObjectPath& path);
void HandleFinishedMountJob(
- const Udisks2Lister::PartitionData& partitionData);
+ const Udisks2Lister::PartitionData& partition_data);
void HandleFinishedUnmountJob(
- const Udisks2Lister::PartitionData& partitionData,
- const QDBusObjectPath& mountedObject);
+ const Udisks2Lister::PartitionData& partition_data,
+ const QDBusObjectPath& mounted_object);
QReadWriteLock device_data_lock_;
QMap<QString, PartitionData> device_data_;