From acae8e227900e8821dc78634fb059cd77d685446 Mon Sep 17 00:00:00 2001 From: Raine Makelainen Date: Thu, 22 Aug 2019 16:36:21 +0300 Subject: [PATCH] [settings-storage] Expose externalStoragesPopulated property. Contributes to JB#46110 --- src/partitionmanager.cpp | 9 +++++++++ src/partitionmanager.h | 1 + src/partitionmanager_p.h | 2 ++ src/partitionmodel.cpp | 8 +++++++- src/partitionmodel.h | 3 +++ src/udisks2blockdevices.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/udisks2blockdevices_p.h | 7 +++++++ src/udisks2monitor.cpp | 4 +--- 8 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/partitionmanager.cpp b/src/partitionmanager.cpp index f128c3b..c4a3823 100644 --- a/src/partitionmanager.cpp +++ b/src/partitionmanager.cpp @@ -62,6 +62,8 @@ PartitionManagerPrivate::PartitionManagerPrivate() connect(m_udisksMonitor.data(), &UDisks2::Monitor::mountError, this, &PartitionManagerPrivate::mountError); connect(m_udisksMonitor.data(), &UDisks2::Monitor::unmountError, this, &PartitionManagerPrivate::unmountError); connect(m_udisksMonitor.data(), &UDisks2::Monitor::formatError, this, &PartitionManagerPrivate::formatError); + connect(UDisks2::BlockDevices::instance(), &UDisks2::BlockDevices::externalStoragesPopulated, + this, &PartitionManagerPrivate::externalStoragesPopulatedChanged); QVariantMap defaultDrive; defaultDrive.insert(QLatin1String("model"), QString()); @@ -371,6 +373,11 @@ QStringList PartitionManagerPrivate::supportedFileSystems() const return supportedFs; } +bool PartitionManagerPrivate::externalStoragesPopulated() const +{ + return UDisks2::BlockDevices::instance()->populated(); +} + PartitionManager::PartitionManager(QObject *parent) : QObject(parent) , d(PartitionManagerPrivate::instance()) @@ -378,6 +385,8 @@ PartitionManager::PartitionManager(QObject *parent) connect(d.data(), &PartitionManagerPrivate::partitionChanged, this, &PartitionManager::partitionChanged); connect(d.data(), &PartitionManagerPrivate::partitionAdded, this, &PartitionManager::partitionAdded); connect(d.data(), &PartitionManagerPrivate::partitionRemoved, this, &PartitionManager::partitionRemoved); + connect(d.data(), &PartitionManagerPrivate::externalStoragesPopulatedChanged, + this, &PartitionManager::externalStoragesPopulated); } PartitionManager::~PartitionManager() diff --git a/src/partitionmanager.h b/src/partitionmanager.h index 18d3669..5300886 100644 --- a/src/partitionmanager.h +++ b/src/partitionmanager.h @@ -54,6 +54,7 @@ class SYSTEMSETTINGS_EXPORT PartitionManager : public QObject void partitionChanged(const Partition &partition); void partitionAdded(const Partition &partition); void partitionRemoved(const Partition &partition); + void externalStoragesPopulated(); private: QExplicitlySharedDataPointer d; diff --git a/src/partitionmanager_p.h b/src/partitionmanager_p.h index a600c38..30130ed 100644 --- a/src/partitionmanager_p.h +++ b/src/partitionmanager_p.h @@ -75,11 +75,13 @@ class PartitionManagerPrivate : public QObject, public QSharedData QString objectPath(const QString &devicePath) const; QStringList supportedFileSystems() const; + bool externalStoragesPopulated() const; signals: void partitionChanged(const Partition &partition); void partitionAdded(const Partition &partition); void partitionRemoved(const Partition &partition); + void externalStoragesPopulatedChanged(); void status(const QString &deviceName, Partition::Status); void errorMessage(const QString &objectPath, const QString &errorName); diff --git a/src/partitionmodel.cpp b/src/partitionmodel.cpp index 0b0d439..06d8ef3 100644 --- a/src/partitionmodel.cpp +++ b/src/partitionmodel.cpp @@ -32,7 +32,6 @@ #include "partitionmodel.h" #include "partitionmanager_p.h" -#include "udisks2monitor_p.h" #include "logging_p.h" #include @@ -49,6 +48,8 @@ PartitionModel::PartitionModel(QObject *parent) connect(m_manager.data(), &PartitionManagerPrivate::partitionChanged, this, &PartitionModel::partitionChanged); connect(m_manager.data(), &PartitionManagerPrivate::partitionAdded, this, &PartitionModel::partitionAdded); connect(m_manager.data(), &PartitionManagerPrivate::partitionRemoved, this, &PartitionModel::partitionRemoved); + connect(m_manager.data(), &PartitionManagerPrivate::externalStoragesPopulatedChanged, + this, &PartitionModel::externalStoragesPopulatedChanged); connect(m_manager.data(), &PartitionManagerPrivate::errorMessage, this, &PartitionModel::errorMessage); @@ -108,6 +109,11 @@ QStringList PartitionModel::supportedFormatTypes() const return types; } +bool PartitionModel::externalStoragesPopulated() const +{ + return m_manager->externalStoragesPopulated(); +} + void PartitionModel::refresh() { m_manager->refresh(); diff --git a/src/partitionmodel.h b/src/partitionmodel.h index 249a3b0..27d3dd3 100644 --- a/src/partitionmodel.h +++ b/src/partitionmodel.h @@ -45,6 +45,7 @@ class SYSTEMSETTINGS_EXPORT PartitionModel : public QAbstractListModel Q_PROPERTY(int count READ rowCount NOTIFY countChanged) Q_PROPERTY(StorageTypes storageTypes READ storageTypes WRITE setStorageTypes NOTIFY storageTypesChanged) Q_PROPERTY(QStringList supportedFormatTypes READ supportedFormatTypes CONSTANT) + Q_PROPERTY(bool externalStoragesPopulated READ externalStoragesPopulated NOTIFY externalStoragesPopulatedChanged) public: enum { @@ -132,6 +133,7 @@ class SYSTEMSETTINGS_EXPORT PartitionModel : public QAbstractListModel void setStorageTypes(StorageTypes storageTypes); QStringList supportedFormatTypes() const; + bool externalStoragesPopulated() const; Q_INVOKABLE void refresh(); Q_INVOKABLE void refresh(int index); @@ -152,6 +154,7 @@ class SYSTEMSETTINGS_EXPORT PartitionModel : public QAbstractListModel signals: void countChanged(); void storageTypesChanged(); + void externalStoragesPopulatedChanged(); void errorMessage(const QString &objectPath, const QString &errorName); void lockError(Error error); diff --git a/src/udisks2blockdevices.cpp b/src/udisks2blockdevices.cpp index c340ae5..94d6e34 100644 --- a/src/udisks2blockdevices.cpp +++ b/src/udisks2blockdevices.cpp @@ -148,12 +148,26 @@ QStringList BlockDevices::devicePaths(const QStringList &dbusObjectPaths) const bool BlockDevices::createBlockDevice(const QString &dbusObjectPath, const InterfacePropertyMap &interfacePropertyMap) { if (!BlockDevices::isExternal(dbusObjectPath)) { + updatePopulatedCheck(); return false; } return doCreateBlockDevice(dbusObjectPath, interfacePropertyMap); } +void BlockDevices::createBlockDevices(const QList &devices) +{ + m_blockCount = devices.count(); + if (m_blockCount == 0) { + m_populated = true; + emit externalStoragesPopulated(); + } + + for (const QDBusObjectPath &dbusObjectPath : devices) { + createBlockDevice(dbusObjectPath.path(), UDisks2::InterfacePropertyMap()); + } +} + void BlockDevices::lock(const QString &dbusObjectPath) { Block *deviceMapped = find([dbusObjectPath](const Block *block) { @@ -210,6 +224,11 @@ void BlockDevices::removeInterfaces(const QString &dbusObjectPath, const QString } } +bool BlockDevices::populated() const +{ + return m_populated; +} + bool BlockDevices::isExternal(const QString &dbusObjectPath) { static const QRegularExpression externalBlockDevice(QStringLiteral("^/org/freedesktop/UDisks2/block_devices/%1$").arg(externalDevice)); @@ -223,15 +242,21 @@ void BlockDevices::blockCompleted() (completedBlock->hasInterface(UDISKS2_BLOCK_INTERFACE) && completedBlock->interfaceCount() == 1)) ){ qCInfo(lcMemoryCardLog) << "Start waiting for block" << completedBlock->device(); waitPartition(completedBlock); + updatePopulatedCheck(); return; } clearPartitionWait(completedBlock->partitionTable(), true); complete(completedBlock); + + // Check only after complete has been called. + updatePopulatedCheck(); } BlockDevices::BlockDevices(QObject *parent) : QObject(parent) + , m_blockCount(0) + , m_populated(false) { Q_ASSERT(!sharedInstance); @@ -333,6 +358,17 @@ void BlockDevices::timerEvent(QTimerEvent *e) } } +void BlockDevices::updatePopulatedCheck() +{ + if (!m_populated) { + --m_blockCount; + if (m_blockCount == 0) { + m_populated = true; + emit externalStoragesPopulated(); + } + } +} + BlockDevices::PartitionWaiter::PartitionWaiter(int timer, Block *block) : timer(timer) , block(block) diff --git a/src/udisks2blockdevices_p.h b/src/udisks2blockdevices_p.h index 587f6d9..384c8a6 100644 --- a/src/udisks2blockdevices_p.h +++ b/src/udisks2blockdevices_p.h @@ -35,6 +35,7 @@ #include #include #include +#include #include "udisks2block_p.h" @@ -63,12 +64,14 @@ class BlockDevices : public QObject QStringList devicePaths(const QStringList &dbusObjectPaths) const; bool createBlockDevice(const QString &dbusObjectPath, const InterfacePropertyMap &interfacePropertyMap); + void createBlockDevices(const QList &devices); void lock(const QString &dbusObjectPath); void waitPartition(Block *block); void clearPartitionWait(const QString &dbusObjectPath, bool destroyBlock); void removeInterfaces(const QString &dbusObjectPath, const QStringList &interfaces); + bool populated() const; void dumpBlocks() const; @@ -76,6 +79,7 @@ class BlockDevices : public QObject signals: void newBlock(Block *block); + void externalStoragesPopulated(); private slots: void blockCompleted(); @@ -97,9 +101,12 @@ private slots: void complete(Block *block, bool forceAccept = false); void timerEvent(QTimerEvent *e) override; + void updatePopulatedCheck(); QMap m_blockDevices; QMap m_partitionWaits; + int m_blockCount; + bool m_populated; static QPointer sharedInstance; }; diff --git a/src/udisks2monitor.cpp b/src/udisks2monitor.cpp index f5ca1d4..0eb5b22 100644 --- a/src/udisks2monitor.cpp +++ b/src/udisks2monitor.cpp @@ -665,9 +665,7 @@ void UDisks2::Monitor::getBlockDevices() if (watcher->isValid() && watcher->isFinished()) { QDBusPendingReply > reply = *watcher; const QList blockDevicePaths = reply.argumentAt<0>(); - for (const QDBusObjectPath &dbusObjectPath : blockDevicePaths) { - m_blockDevices->createBlockDevice(dbusObjectPath.path(), UDisks2::InterfacePropertyMap()); - } + m_blockDevices->createBlockDevices(blockDevicePaths); } else if (watcher->isError()) { QDBusError error = watcher->error(); qCWarning(lcMemoryCardLog) << "Unable to enumerate block devices:" << error.name() << error.message();