From d4e932db9a4e768737803afb331c1dd1acd3c9fe Mon Sep 17 00:00:00 2001 From: Valeriy 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 +- .../org.freedesktop.DBus.ObjectManager.xml | 19 ++ src/dbus/org.freedesktop.UDisks2.Block.xml | 9 + src/dbus/org.freedesktop.UDisks2.Drive.xml | 17 ++ .../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 6da158efd..4bc74eb24 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 4f0832b5b..ca6625abf 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 f22fe9bc8..2bd31b705 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 62e246012..00b3553d9 100644 --- a/src/core/metatypes.cpp +++ b/src/core/metatypes.cpp @@ -125,5 +125,8 @@ void RegisterMetaTypes() { qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); + + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); #endif } diff --git a/src/dbus/metatypes.h b/src/dbus/metatypes.h index 4e0024574..83bc5e615 100644 --- a/src/dbus/metatypes.h +++ b/src/dbus/metatypes.h @@ -20,6 +20,12 @@ #include -Q_DECLARE_METATYPE(QList); +Q_DECLARE_METATYPE(QList) + +typedef QMap InterfacesAndProperties; +typedef QMap 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 000000000..efc389dd2 --- /dev/null +++ b/src/dbus/org.freedesktop.DBus.ObjectManager.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/dbus/org.freedesktop.UDisks2.Block.xml b/src/dbus/org.freedesktop.UDisks2.Block.xml new file mode 100644 index 000000000..f0e3a06c4 --- /dev/null +++ b/src/dbus/org.freedesktop.UDisks2.Block.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dbus/org.freedesktop.UDisks2.Drive.xml b/src/dbus/org.freedesktop.UDisks2.Drive.xml new file mode 100644 index 000000000..5312b2250 --- /dev/null +++ b/src/dbus/org.freedesktop.UDisks2.Drive.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/dbus/org.freedesktop.UDisks2.Filesystem.xml b/src/dbus/org.freedesktop.UDisks2.Filesystem.xml new file mode 100644 index 000000000..1781919ab --- /dev/null +++ b/src/dbus/org.freedesktop.UDisks2.Filesystem.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/devices/devicemanager.cpp b/src/devices/devicemanager.cpp index 6396b56cb..32ba33657 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 000000000..99251468a --- /dev/null +++ b/src/devices/udisks2lister.cpp @@ -0,0 +1,286 @@ +#include "udisks2lister.h" + +#include + +#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 Udisks2Lister::MakeDeviceUrls(const QString &id) { + QReadLocker locker(&device_data_lock_); + if (!device_data_.contains(id)) + return QList(); + return QList() << 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 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(); + + QList 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 000000000..639db404b --- /dev/null +++ b/src/devices/udisks2lister.h @@ -0,0 +1,77 @@ +#pragma once + +#include + +#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 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> 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 device_data_; + +private: + std::unique_ptr udisks2_interface_; + + static const QString udisks2service_; +}; From 68001ff7e87f9ca1996a84eee928c31acd1ec564 Mon Sep 17 00:00:00 2001 From: Valeriy 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 99251468a..df6fb6203 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(); @@ -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 639db404b..37320edd1 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 mount_paths; + }; QMutex jobs_lock_; - QMap> mounting_jobs_; + QMap mounting_jobs_; private: class PartitionData { From ed986d38638be1cce632239466c349d1334228fa Mon Sep 17 00:00:00 2001 From: Valeriy 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 ca6625abf..d7e9083ee 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 000000000..2cd42533d --- /dev/null +++ b/src/dbus/org.freedesktop.UDisks2.Job.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/devices/udisks2lister.cpp b/src/devices/udisks2lister.cpp index df6fb6203..023de0602 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 job = std::make_shared( + 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(); - - QList mountedParititons; - objects.beginArray(); - while (!objects.atEnd()) { - QDBusObjectPath extractedPath; - objects >> extractedPath; - mountedParititons.push_back(extractedPath); - } - objects.endArray(); + QList mountedParititons + = GetMountedPartitionsFromDBusArgument(interface.value()["Objects"].value()); 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 Udisks2Lister::GetMountedPartitionsFromDBusArgument(const QDBusArgument &input) { + QList 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(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 37320edd1..62d283520 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 @@ protected: 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 GetMountedPartitionsFromDBusArgument(const QDBusArgument &input); - class MountJob + class Udisks2Job { public: bool isMount = true; - QList mount_paths; + QList mounted_partitions; + std::shared_ptr dbus_interface; }; QMutex jobs_lock_; - QMap mounting_jobs_; + QMap mounting_jobs_; private: class PartitionData { From cc6a99ef92b6f86c4db2310357a7a90a3f26a392 Mon Sep 17 00:00:00 2001 From: Valeriy 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 | 102 +++++++++++++++++++--------------- src/devices/udisks2lister.h | 20 ++++--- 3 files changed, 70 insertions(+), 53 deletions(-) diff --git a/src/dbus/metatypes.h b/src/dbus/metatypes.h index 83bc5e615..3ec6de1d3 100644 --- a/src/dbus/metatypes.h +++ b/src/dbus/metatypes.h @@ -19,6 +19,7 @@ #define DBUS_METATYPES_H_ #include +#include Q_DECLARE_METATYPE(QList) diff --git a/src/devices/udisks2lister.cpp b/src/devices/udisks2lister.cpp index 023de0602..0af188462 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 mountedParititons - = GetMountedPartitionsFromDBusArgument(interface.value()["Objects"].value()); + 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 - << " | 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); - } - } + mounting_jobs_[jobPath].isMount ? + HandleFinishedMountJob(partitionData) : HandleFinishedUnmountJob(partitionData, mountedObject); } } -Udisks2Lister::PartitionData Udisks2Lister::ReadPartitionData(const QDBusObjectPath &path, - bool beingMounted) { +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; + 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) { 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 62d283520..feac8da0a 100644 --- a/src/devices/udisks2lister.h +++ b/src/devices/udisks2lister.h @@ -2,10 +2,15 @@ #include +#include +#include +#include +#include + #include "devicelister.h" +#include "dbus/metatypes.h" -#include "dbus/objectmanager.h" - +class OrgFreedesktopDBusObjectManagerInterface; class OrgFreedesktopUDisks2JobInterface; class Udisks2Lister : public DeviceLister { @@ -44,9 +49,7 @@ private: void RemoveDevice(const QDBusObjectPath &devicePath); QList GetMountedPartitionsFromDBusArgument(const QDBusArgument &input); - class Udisks2Job - { - public: + struct Udisks2Job { bool isMount = true; QList mounted_partitions; std::shared_ptr dbus_interface; @@ -56,8 +59,7 @@ private: QMap mounting_jobs_; private: - class PartitionData { - public: + struct PartitionData { QString unique_id() const; QString dbus_path; @@ -77,7 +79,9 @@ private: 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 device_data_; From 0172f7265bd087f65026d584e4679fab54f167fb Mon Sep 17 00:00:00 2001 From: Valeriy 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 | 39 +++++++++++++++++++---------------- 2 files changed, 37 insertions(+), 34 deletions(-) diff --git a/src/devices/udisks2lister.cpp b/src/devices/udisks2lister.cpp index 0af188462..ccea4fc5d 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 job = std::make_shared( - 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 feac8da0a..1143d7420 100644 --- a/src/devices/udisks2lister.h +++ b/src/devices/udisks2lister.h @@ -1,11 +1,12 @@ -#pragma once +#ifndef UDISKS2LISTER_H +#define UDISKS2LISTER_H #include -#include -#include -#include #include +#include +#include +#include #include "devicelister.h" #include "dbus/metatypes.h" @@ -20,24 +21,24 @@ 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); + 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 MakeDeviceUrls(const QString &id); + QString MakeFriendlyName(const QString &id) override; + QList 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: QList GetMountedPartitionsFromDBusArgument(const QDBusArgument &input); struct Udisks2Job { - bool isMount = true; + bool is_mount = true; QList mounted_partitions; std::shared_ptr dbus_interface; }; @@ -89,5 +90,7 @@ private: private: std::unique_ptr 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 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 ccea4fc5d..289383ec2 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 + + 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 . +*/ + #include "udisks2lister.h" #include #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 Udisks2Lister::MakeDeviceUrls(const QString &id) { +QList Udisks2Lister::MakeDeviceUrls(const QString& id) { QReadLocker locker(&device_data_lock_); - if (!device_data_.contains(id)) - return QList(); - return QList() << QUrl::fromLocalFile(device_data_[id].mount_paths.at(0)); + if (!device_data_.contains(id)) return QList(); + return QList() << 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 reply = udisks2_interface_->GetManagedObjects(); + QDBusPendingReply 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 job = std::make_shared( - udisks2_service_, - path.path(), - QDBusConnection::systemBus()); + std::shared_ptr job = + std::make_shared( + 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 Udisks2Lister::GetMountedPartitionsFromDBusArgument(const QDBusArgument &input) { +QList Udisks2Lister::GetMountedPartitionsFromDBusArgument( + const QDBusArgument& input) { QList result; input.beginArray(); @@ -261,80 +263,74 @@ QList 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(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 1143d7420..8cf03f30a 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 + + 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 . +*/ + #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 MakeDeviceUrls(const QString &id) override; + QString MakeFriendlyName(const QString& id) override; + QList 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 GetMountedPartitionsFromDBusArgument(const QDBusArgument &input); + private: + bool isPendingJob(const QDBusObjectPath& jobPath); + void RemoveDevice(const QDBusObjectPath& devicePath); + QList GetMountedPartitionsFromDBusArgument( + const QDBusArgument& input); struct Udisks2Job { bool is_mount = true; @@ -59,7 +79,7 @@ private: QMutex jobs_lock_; QMap mounting_jobs_; -private: + private: struct PartitionData { QString unique_id() const; @@ -80,17 +100,20 @@ private: 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 device_data_; -private: + private: std::unique_ptr 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 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 289383ec2..c5c72ef1c 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 8cf03f30a..3a2a01207 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 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 device_data_;