Skip to content
This repository was archived by the owner on Apr 28, 2022. It is now read-only.

Commit acae8e2

Browse files
committed
[settings-storage] Expose externalStoragesPopulated property. Contributes to JB#46110
1 parent 9b5b458 commit acae8e2

8 files changed

+66
-4
lines changed

src/partitionmanager.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ PartitionManagerPrivate::PartitionManagerPrivate()
6262
connect(m_udisksMonitor.data(), &UDisks2::Monitor::mountError, this, &PartitionManagerPrivate::mountError);
6363
connect(m_udisksMonitor.data(), &UDisks2::Monitor::unmountError, this, &PartitionManagerPrivate::unmountError);
6464
connect(m_udisksMonitor.data(), &UDisks2::Monitor::formatError, this, &PartitionManagerPrivate::formatError);
65+
connect(UDisks2::BlockDevices::instance(), &UDisks2::BlockDevices::externalStoragesPopulated,
66+
this, &PartitionManagerPrivate::externalStoragesPopulatedChanged);
6567

6668
QVariantMap defaultDrive;
6769
defaultDrive.insert(QLatin1String("model"), QString());
@@ -371,13 +373,20 @@ QStringList PartitionManagerPrivate::supportedFileSystems() const
371373
return supportedFs;
372374
}
373375

376+
bool PartitionManagerPrivate::externalStoragesPopulated() const
377+
{
378+
return UDisks2::BlockDevices::instance()->populated();
379+
}
380+
374381
PartitionManager::PartitionManager(QObject *parent)
375382
: QObject(parent)
376383
, d(PartitionManagerPrivate::instance())
377384
{
378385
connect(d.data(), &PartitionManagerPrivate::partitionChanged, this, &PartitionManager::partitionChanged);
379386
connect(d.data(), &PartitionManagerPrivate::partitionAdded, this, &PartitionManager::partitionAdded);
380387
connect(d.data(), &PartitionManagerPrivate::partitionRemoved, this, &PartitionManager::partitionRemoved);
388+
connect(d.data(), &PartitionManagerPrivate::externalStoragesPopulatedChanged,
389+
this, &PartitionManager::externalStoragesPopulated);
381390
}
382391

383392
PartitionManager::~PartitionManager()

src/partitionmanager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class SYSTEMSETTINGS_EXPORT PartitionManager : public QObject
5454
void partitionChanged(const Partition &partition);
5555
void partitionAdded(const Partition &partition);
5656
void partitionRemoved(const Partition &partition);
57+
void externalStoragesPopulated();
5758

5859
private:
5960
QExplicitlySharedDataPointer<PartitionManagerPrivate> d;

src/partitionmanager_p.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,13 @@ class PartitionManagerPrivate : public QObject, public QSharedData
7575
QString objectPath(const QString &devicePath) const;
7676

7777
QStringList supportedFileSystems() const;
78+
bool externalStoragesPopulated() const;
7879

7980
signals:
8081
void partitionChanged(const Partition &partition);
8182
void partitionAdded(const Partition &partition);
8283
void partitionRemoved(const Partition &partition);
84+
void externalStoragesPopulatedChanged();
8385

8486
void status(const QString &deviceName, Partition::Status);
8587
void errorMessage(const QString &objectPath, const QString &errorName);

src/partitionmodel.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
#include "partitionmodel.h"
3333
#include "partitionmanager_p.h"
3434

35-
#include "udisks2monitor_p.h"
3635
#include "logging_p.h"
3736

3837
#include <QDir>
@@ -49,6 +48,8 @@ PartitionModel::PartitionModel(QObject *parent)
4948
connect(m_manager.data(), &PartitionManagerPrivate::partitionChanged, this, &PartitionModel::partitionChanged);
5049
connect(m_manager.data(), &PartitionManagerPrivate::partitionAdded, this, &PartitionModel::partitionAdded);
5150
connect(m_manager.data(), &PartitionManagerPrivate::partitionRemoved, this, &PartitionModel::partitionRemoved);
51+
connect(m_manager.data(), &PartitionManagerPrivate::externalStoragesPopulatedChanged,
52+
this, &PartitionModel::externalStoragesPopulatedChanged);
5253

5354
connect(m_manager.data(), &PartitionManagerPrivate::errorMessage, this, &PartitionModel::errorMessage);
5455

@@ -108,6 +109,11 @@ QStringList PartitionModel::supportedFormatTypes() const
108109
return types;
109110
}
110111

112+
bool PartitionModel::externalStoragesPopulated() const
113+
{
114+
return m_manager->externalStoragesPopulated();
115+
}
116+
111117
void PartitionModel::refresh()
112118
{
113119
m_manager->refresh();

src/partitionmodel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class SYSTEMSETTINGS_EXPORT PartitionModel : public QAbstractListModel
4545
Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
4646
Q_PROPERTY(StorageTypes storageTypes READ storageTypes WRITE setStorageTypes NOTIFY storageTypesChanged)
4747
Q_PROPERTY(QStringList supportedFormatTypes READ supportedFormatTypes CONSTANT)
48+
Q_PROPERTY(bool externalStoragesPopulated READ externalStoragesPopulated NOTIFY externalStoragesPopulatedChanged)
4849

4950
public:
5051
enum {
@@ -132,6 +133,7 @@ class SYSTEMSETTINGS_EXPORT PartitionModel : public QAbstractListModel
132133
void setStorageTypes(StorageTypes storageTypes);
133134

134135
QStringList supportedFormatTypes() const;
136+
bool externalStoragesPopulated() const;
135137

136138
Q_INVOKABLE void refresh();
137139
Q_INVOKABLE void refresh(int index);
@@ -152,6 +154,7 @@ class SYSTEMSETTINGS_EXPORT PartitionModel : public QAbstractListModel
152154
signals:
153155
void countChanged();
154156
void storageTypesChanged();
157+
void externalStoragesPopulatedChanged();
155158

156159
void errorMessage(const QString &objectPath, const QString &errorName);
157160
void lockError(Error error);

src/udisks2blockdevices.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,26 @@ QStringList BlockDevices::devicePaths(const QStringList &dbusObjectPaths) const
148148
bool BlockDevices::createBlockDevice(const QString &dbusObjectPath, const InterfacePropertyMap &interfacePropertyMap)
149149
{
150150
if (!BlockDevices::isExternal(dbusObjectPath)) {
151+
updatePopulatedCheck();
151152
return false;
152153
}
153154

154155
return doCreateBlockDevice(dbusObjectPath, interfacePropertyMap);
155156
}
156157

158+
void BlockDevices::createBlockDevices(const QList<QDBusObjectPath> &devices)
159+
{
160+
m_blockCount = devices.count();
161+
if (m_blockCount == 0) {
162+
m_populated = true;
163+
emit externalStoragesPopulated();
164+
}
165+
166+
for (const QDBusObjectPath &dbusObjectPath : devices) {
167+
createBlockDevice(dbusObjectPath.path(), UDisks2::InterfacePropertyMap());
168+
}
169+
}
170+
157171
void BlockDevices::lock(const QString &dbusObjectPath)
158172
{
159173
Block *deviceMapped = find([dbusObjectPath](const Block *block) {
@@ -210,6 +224,11 @@ void BlockDevices::removeInterfaces(const QString &dbusObjectPath, const QString
210224
}
211225
}
212226

227+
bool BlockDevices::populated() const
228+
{
229+
return m_populated;
230+
}
231+
213232
bool BlockDevices::isExternal(const QString &dbusObjectPath)
214233
{
215234
static const QRegularExpression externalBlockDevice(QStringLiteral("^/org/freedesktop/UDisks2/block_devices/%1$").arg(externalDevice));
@@ -223,15 +242,21 @@ void BlockDevices::blockCompleted()
223242
(completedBlock->hasInterface(UDISKS2_BLOCK_INTERFACE) && completedBlock->interfaceCount() == 1)) ){
224243
qCInfo(lcMemoryCardLog) << "Start waiting for block" << completedBlock->device();
225244
waitPartition(completedBlock);
245+
updatePopulatedCheck();
226246
return;
227247
}
228248

229249
clearPartitionWait(completedBlock->partitionTable(), true);
230250
complete(completedBlock);
251+
252+
// Check only after complete has been called.
253+
updatePopulatedCheck();
231254
}
232255

233256
BlockDevices::BlockDevices(QObject *parent)
234257
: QObject(parent)
258+
, m_blockCount(0)
259+
, m_populated(false)
235260
{
236261
Q_ASSERT(!sharedInstance);
237262

@@ -333,6 +358,17 @@ void BlockDevices::timerEvent(QTimerEvent *e)
333358
}
334359
}
335360

361+
void BlockDevices::updatePopulatedCheck()
362+
{
363+
if (!m_populated) {
364+
--m_blockCount;
365+
if (m_blockCount == 0) {
366+
m_populated = true;
367+
emit externalStoragesPopulated();
368+
}
369+
}
370+
}
371+
336372
BlockDevices::PartitionWaiter::PartitionWaiter(int timer, Block *block)
337373
: timer(timer)
338374
, block(block)

src/udisks2blockdevices_p.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include <QMap>
3636
#include <QPointer>
3737
#include <functional>
38+
#include <QDBusObjectPath>
3839

3940
#include "udisks2block_p.h"
4041

@@ -63,19 +64,22 @@ class BlockDevices : public QObject
6364
QStringList devicePaths(const QStringList &dbusObjectPaths) const;
6465

6566
bool createBlockDevice(const QString &dbusObjectPath, const InterfacePropertyMap &interfacePropertyMap);
67+
void createBlockDevices(const QList<QDBusObjectPath> &devices);
6668
void lock(const QString &dbusObjectPath);
6769

6870
void waitPartition(Block *block);
6971
void clearPartitionWait(const QString &dbusObjectPath, bool destroyBlock);
7072

7173
void removeInterfaces(const QString &dbusObjectPath, const QStringList &interfaces);
74+
bool populated() const;
7275

7376
void dumpBlocks() const;
7477

7578
static bool isExternal(const QString &dbusObjectPath);
7679

7780
signals:
7881
void newBlock(Block *block);
82+
void externalStoragesPopulated();
7983

8084
private slots:
8185
void blockCompleted();
@@ -97,9 +101,12 @@ private slots:
97101
void complete(Block *block, bool forceAccept = false);
98102

99103
void timerEvent(QTimerEvent *e) override;
104+
void updatePopulatedCheck();
100105

101106
QMap<QString, Block *> m_blockDevices;
102107
QMap<QString, PartitionWaiter*> m_partitionWaits;
108+
int m_blockCount;
109+
bool m_populated;
103110

104111
static QPointer<BlockDevices> sharedInstance;
105112
};

src/udisks2monitor.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -665,9 +665,7 @@ void UDisks2::Monitor::getBlockDevices()
665665
if (watcher->isValid() && watcher->isFinished()) {
666666
QDBusPendingReply<QList<QDBusObjectPath> > reply = *watcher;
667667
const QList<QDBusObjectPath> blockDevicePaths = reply.argumentAt<0>();
668-
for (const QDBusObjectPath &dbusObjectPath : blockDevicePaths) {
669-
m_blockDevices->createBlockDevice(dbusObjectPath.path(), UDisks2::InterfacePropertyMap());
670-
}
668+
m_blockDevices->createBlockDevices(blockDevicePaths);
671669
} else if (watcher->isError()) {
672670
QDBusError error = watcher->error();
673671
qCWarning(lcMemoryCardLog) << "Unable to enumerate block devices:" << error.name() << error.message();

0 commit comments

Comments
 (0)