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

Commit b8d96da

Browse files
committed
Merge branch 'jb43642' into 'master'
Expose drive's connection bus from partition model See merge request mer-core/nemo-qml-plugin-systemsettings!86
2 parents 1009667 + 00ef929 commit b8d96da

10 files changed

+122
-17
lines changed

src/partition.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,11 @@ Partition::StorageType Partition::storageType() const
101101
return d ? d->storageType : Invalid;
102102
}
103103

104+
Partition::ConnectionBus Partition::connectionBus() const
105+
{
106+
return d ? d->connectionBus : UnknownBus;
107+
}
108+
104109
QString Partition::devicePath() const
105110
{
106111
return d ? d->devicePath : QString();

src/partition.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,13 @@ class SYSTEMSETTINGS_EXPORT Partition
5656
Any = System | User | Mass | External
5757
};
5858

59+
enum ConnectionBus {
60+
SDIO,
61+
USB,
62+
IEEE1394,
63+
UnknownBus
64+
};
65+
5966
enum Status {
6067
Unmounted,
6168
Mounting,
@@ -108,6 +115,7 @@ class SYSTEMSETTINGS_EXPORT Partition
108115
QString cryptoBackingDevicePath() const;
109116

110117
StorageType storageType() const;
118+
ConnectionBus connectionBus() const;
111119

112120
QString devicePath() const;
113121
QString deviceName() const;

src/partition_p.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class PartitionPrivate : public QSharedData
4545
, bytesTotal(0)
4646
, bytesFree(0)
4747
, storageType(Partition::Invalid)
48+
, connectionBus(Partition::UnknownBus)
4849
, status(Partition::Unmounted)
4950
, readOnly(true)
5051
, canMount(false)
@@ -75,6 +76,7 @@ class PartitionPrivate : public QSharedData
7576
qint64 bytesTotal;
7677
qint64 bytesFree;
7778
Partition::StorageType storageType;
79+
Partition::ConnectionBus connectionBus;
7880
Partition::Status status;
7981
bool readOnly;
8082
bool canMount;

src/partitionmanager.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,14 @@ PartitionManagerPrivate::PartitionManagerPrivate()
6464

6565
QExplicitlySharedDataPointer<PartitionPrivate> root(new PartitionPrivate(this));
6666
root->storageType = Partition::System;
67+
root->connectionBus = Partition::SDIO;
6768
root->mountPath = QStringLiteral("/");
6869

6970
m_partitions.append(root);
7071

7172
QExplicitlySharedDataPointer<PartitionPrivate> home(new PartitionPrivate(this));
7273
home->storageType = Partition::User;
74+
home->connectionBus = Partition::SDIO;
7375
home->mountPath = QStringLiteral("/home");
7476

7577
m_partitions.append(home);
@@ -146,14 +148,20 @@ QVector<Partition> PartitionManagerPrivate::partitions(const Partition::StorageT
146148
return partitions;
147149
}
148150

149-
void PartitionManagerPrivate::add(Partitions &partitions)
151+
void PartitionManagerPrivate::add(QExplicitlySharedDataPointer<PartitionPrivate> partition)
150152
{
151-
m_partitions.append(partitions);
152-
refresh(partitions, partitions);
153-
154-
for (const auto partition : partitions) {
155-
emit partitionAdded(Partition(partition));
153+
int insertIndex = 0;
154+
for (const auto existingPartition : m_partitions) {
155+
if (existingPartition->connectionBus <= partition->connectionBus)
156+
++insertIndex;
157+
else
158+
break;
156159
}
160+
161+
m_partitions.insert(insertIndex, partition);
162+
Partitions addedPartitions = { partition };
163+
refresh(addedPartitions, addedPartitions);
164+
emit partitionAdded(Partition(partition));
157165
}
158166

159167
void PartitionManagerPrivate::remove(const Partitions &partitions)

src/partitionmanager_p.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class PartitionManagerPrivate : public QObject, public QSharedData
5959
Partition root() const;
6060
QVector<Partition> partitions(Partition::StorageTypes types) const;
6161

62-
void add(Partitions &partitions);
62+
void add(QExplicitlySharedDataPointer<PartitionPrivate> partition);
6363
void remove(const Partitions &partitions);
6464

6565
void refresh();

src/partitionmodel.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ QHash<int, QByteArray> PartitionModel::roleNames() const
261261
{ IsSupportedFileSystemType, "isSupportedFileSystemType"},
262262
{ IsEncryptedRoles, "isEncrypted"},
263263
{ CryptoBackingDevicePath, "cryptoBackingDevicePath"},
264+
{ ConnectionBusRole, "connectionBus"},
264265
};
265266

266267
return roleNames;
@@ -315,6 +316,8 @@ QVariant PartitionModel::data(const QModelIndex &index, int role) const
315316
return partition.isEncrypted();
316317
case CryptoBackingDevicePath:
317318
return partition.cryptoBackingDevicePath();
319+
case ConnectionBusRole:
320+
return partition.connectionBus();
318321
default:
319322
return QVariant();
320323
}

src/partitionmodel.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ class SYSTEMSETTINGS_EXPORT PartitionModel : public QAbstractListModel
6565
IsCryptoDeviceRoles,
6666
IsSupportedFileSystemType,
6767
IsEncryptedRoles,
68-
CryptoBackingDevicePath
68+
CryptoBackingDevicePath,
69+
ConnectionBusRole,
6970
};
7071

7172
// For Status role
@@ -95,6 +96,14 @@ class SYSTEMSETTINGS_EXPORT PartitionModel : public QAbstractListModel
9596
Any = Partition::Any
9697
};
9798

99+
enum ConnectionBus {
100+
SDIO = Partition::SDIO,
101+
USB = Partition::USB,
102+
IEEE1394 = Partition::IEEE1394,
103+
UnknownBus = Partition::UnknownBus
104+
};
105+
Q_ENUM(ConnectionBus)
106+
98107
enum Error {
99108
ErrorFailed = Partition::ErrorFailed,
100109
ErrorCancelled = Partition::ErrorCancelled,

src/udisks2block.cpp

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ UDisks2::Block::Block(const QString &path, const UDisks2::InterfacePropertyMap &
2020
, m_pendingFileSystem(nullptr)
2121
, m_pendingBlock(nullptr)
2222
, m_pendingEncrypted(nullptr)
23+
, m_pendingDrive(nullptr)
2324
{
2425
if (!m_connection.connect(
2526
UDISKS2_SERVICE,
@@ -50,6 +51,7 @@ UDisks2::Block::Block(const QString &path, const UDisks2::InterfacePropertyMap &
5051
QVariantMap blockProperties = NemoDBus::demarshallArgument<QVariantMap>(message.arguments().at(0));
5152
qCInfo(lcMemoryCardLog) << "Block properties:" << blockProperties;
5253
m_data = blockProperties;
54+
getDriveProperties();
5355
} else {
5456
QDBusError error = watcher->error();
5557
qCWarning(lcMemoryCardLog) << "Error reading block properties:" << error.name() << error.message();
@@ -63,6 +65,7 @@ UDisks2::Block::Block(const QString &path, const UDisks2::InterfacePropertyMap &
6365
QVariantMap map = interfacePropertyMap.value(UDISKS2_FILESYSTEM_INTERFACE);
6466
updateMountPoint(map);
6567
}
68+
getDriveProperties();
6669

6770
// We have either org.freedesktop.UDisks2.Filesystem or org.freedesktop.UDisks2.Encrypted interface.
6871
complete();
@@ -103,6 +106,7 @@ UDisks2::Block &UDisks2::Block::operator=(const UDisks2::Block &other)
103106

104107
m_interfacePropertyMap = other.m_interfacePropertyMap;
105108
m_data = other.m_data;
109+
m_drive = other.m_drive;
106110
m_mountable = other.m_mountable;
107111
m_mountPath = other.m_mountPath;
108112
m_encrypted = other.m_encrypted;
@@ -138,6 +142,25 @@ QString UDisks2::Block::drive() const
138142
return value(QStringLiteral("Drive")).toString();
139143
}
140144

145+
QString UDisks2::Block::connectionBus() const
146+
{
147+
QString bus = NemoDBus::demarshallDBusArgument(m_drive.value(QStringLiteral("ConnectionBus"))).toString();
148+
149+
// Do a bit of guesswork as we're missing connection between unlocked crypto block to crypto backing block device
150+
// from where we could see the drive where this block belongs to.
151+
if (bus != QLatin1String("/") && hasCryptoBackingDevice()) {
152+
QString cryptoBackingPath = cryptoBackingDevicePath();
153+
if (cryptoBackingPath.contains(QLatin1String("mmcblk"))) {
154+
return QStringLiteral("sdio");
155+
} else if (cryptoBackingPath.startsWith(QLatin1String("/dev/sd"))) {
156+
return QStringLiteral("usb");
157+
}
158+
return QStringLiteral("ieee1394");
159+
}
160+
161+
return bus;
162+
}
163+
141164
qint64 UDisks2::Block::deviceNumber() const
142165
{
143166
return value(QStringLiteral("DeviceNumber")).toLongLong();
@@ -153,6 +176,11 @@ qint64 UDisks2::Block::size() const
153176
return value(QStringLiteral("Size")).toLongLong();
154177
}
155178

179+
bool UDisks2::Block::isCryptoBlock() const
180+
{
181+
return isEncrypted() || hasCryptoBackingDevice();
182+
}
183+
156184
bool UDisks2::Block::hasCryptoBackingDevice() const
157185
{
158186
const QString cryptoBackingDev = cryptoBackingDeviceObjectPath();
@@ -274,7 +302,7 @@ bool UDisks2::Block::hasData() const
274302
void UDisks2::Block::dumpInfo() const
275303
{
276304
qCInfo(lcMemoryCardLog) << "Block device:" << device() << "Preferred device:" << preferredDevice();
277-
qCInfo(lcMemoryCardLog) << "- drive:" << drive() << "dNumber:" << deviceNumber();
305+
qCInfo(lcMemoryCardLog) << "- drive:" << drive() << "device number:" << deviceNumber() << "connection bus:" << connectionBus();
278306
qCInfo(lcMemoryCardLog) << "- id:" << id() << "size:" << size();
279307
qCInfo(lcMemoryCardLog) << "- isreadonly:" << isReadOnly() << "idtype:" << idType();
280308
qCInfo(lcMemoryCardLog) << "- idversion:" << idVersion() << "idlabel:" << idLabel();
@@ -313,7 +341,7 @@ void UDisks2::Block::updateProperties(const QDBusMessage &message)
313341

314342
bool UDisks2::Block::isCompleted() const
315343
{
316-
return !m_pendingFileSystem && !m_pendingBlock && !m_pendingEncrypted;
344+
return !m_pendingFileSystem && !m_pendingBlock && !m_pendingEncrypted && !m_pendingDrive;
317345
}
318346

319347
void UDisks2::Block::updateMountPoint(const QVariant &mountPoints)
@@ -403,3 +431,30 @@ void UDisks2::Block::getEncryptedInterface()
403431
complete();
404432
});
405433
}
434+
435+
void UDisks2::Block::getDriveProperties()
436+
{
437+
QDBusInterface drivePropertyInterface(UDISKS2_SERVICE,
438+
drive(),
439+
DBUS_OBJECT_PROPERTIES_INTERFACE,
440+
m_connection);
441+
QDBusPendingCall pendingCall = drivePropertyInterface.asyncCall(DBUS_GET_ALL, UDISKS2_DRIVE_INTERFACE);
442+
m_pendingDrive = new QDBusPendingCallWatcher(pendingCall, this);
443+
connect(m_pendingDrive, &QDBusPendingCallWatcher::finished, this, [this](QDBusPendingCallWatcher *watcher) {
444+
if (watcher->isValid() && watcher->isFinished()) {
445+
QDBusPendingReply<> reply = *watcher;
446+
QDBusMessage message = reply.reply();
447+
QVariantMap driveProperties = NemoDBus::demarshallArgument<QVariantMap>(message.arguments().at(0));
448+
qCInfo(lcMemoryCardLog) << "Drive properties:" << driveProperties;
449+
m_drive = driveProperties;
450+
} else {
451+
QDBusError error = watcher->error();
452+
qCWarning(lcMemoryCardLog) << "Error reading drive properties:" << error.name() << error.message();
453+
m_drive.clear();
454+
}
455+
456+
m_pendingDrive->deleteLater();
457+
m_pendingDrive = nullptr;
458+
complete();
459+
});
460+
}

src/udisks2block_p.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ namespace UDisks2 {
4545
class Block : public QObject
4646
{
4747
Q_OBJECT
48+
Q_PROPERTY(QString connectionBus READ connectionBus NOTIFY updated)
4849

4950
public:
5051
Block(const QString &path, const UDisks2::InterfacePropertyMap &interfacePropertyMap, QObject *parent = nullptr);
@@ -57,12 +58,15 @@ class Block : public QObject
5758
QString device() const;
5859
QString preferredDevice() const;
5960
QString drive() const;
61+
QString connectionBus() const;
6062

6163
qint64 deviceNumber() const;
6264
QString id() const;
6365

6466
qint64 size() const;
6567

68+
bool isCryptoBlock() const;
69+
6670
bool hasCryptoBackingDevice() const;
6771
QString cryptoBackingDevicePath() const;
6872
QString cryptoBackingDeviceObjectPath() const;
@@ -114,10 +118,12 @@ private slots:
114118

115119
void getFileSystemInterface();
116120
void getEncryptedInterface();
121+
void getDriveProperties();
117122

118123
QString m_path;
119124
UDisks2::InterfacePropertyMap m_interfacePropertyMap;
120125
QVariantMap m_data;
126+
QVariantMap m_drive;
121127
QDBusConnection m_connection;
122128
QString m_mountPath;
123129
bool m_mountable;
@@ -128,6 +134,7 @@ private slots:
128134
QDBusPendingCallWatcher *m_pendingFileSystem;
129135
QDBusPendingCallWatcher *m_pendingBlock;
130136
QDBusPendingCallWatcher *m_pendingEncrypted;
137+
QDBusPendingCallWatcher *m_pendingDrive;
131138
};
132139

133140
}

src/udisks2monitor.cpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -335,9 +335,20 @@ void UDisks2::Monitor::setPartitionProperties(QExplicitlySharedDataPointer<Parti
335335
} else {
336336
partition->status = Partition::Mounted;
337337
}
338-
partition->isCryptoDevice = blockDevice->isEncrypted() || blockDevice->hasCryptoBackingDevice();
338+
partition->isCryptoDevice = blockDevice->isCryptoBlock();
339339
partition->isEncrypted = blockDevice->isEncrypted();
340340
partition->cryptoBackingDevicePath = blockDevice->cryptoBackingDevicePath();
341+
342+
QString connectionBus = blockDevice->connectionBus();
343+
if (connectionBus == QLatin1String("sdio")) {
344+
partition->connectionBus = Partition::SDIO;
345+
} else if (connectionBus == QLatin1String("usb")) {
346+
partition->connectionBus = Partition::USB;
347+
} else if (connectionBus == QLatin1String("ieee1394")) {
348+
partition->connectionBus = Partition::IEEE1394;
349+
} else {
350+
partition->connectionBus = Partition::UnknownBus;
351+
}
341352
}
342353

343354
void UDisks2::Monitor::updatePartitionProperties(const UDisks2::Block *blockDevice)
@@ -603,8 +614,7 @@ void UDisks2::Monitor::createPartition(const UDisks2::Block *block)
603614
partition->bytesTotal = block->size();
604615
setPartitionProperties(partition, block);
605616
partition->valid = true;
606-
PartitionManagerPrivate::Partitions addedPartitions = { partition };
607-
m_manager->add(addedPartitions);
617+
m_manager->add(partition);
608618
}
609619

610620
UDisks2::Block *UDisks2::Monitor::createBlockDevice(const QString &dbusObjectPath, const UDisks2::InterfacePropertyMap &interfacePropertyMap)
@@ -673,8 +683,7 @@ UDisks2::Block *UDisks2::Monitor::createBlockDevice(const QString &dbusObjectPat
673683

674684
connect(block, &UDisks2::Block::formatted, this, [this]() {
675685
UDisks2::Block *block = qobject_cast<UDisks2::Block *>(sender());
676-
QString blockPath = block->path();
677-
if (m_blockDevices.contains(blockPath)) {
686+
if (m_blockDevices.contains(block->path())) {
678687
for (auto partition : m_manager->m_partitions) {
679688
if (partition->devicePath == block->device()) {
680689
partition->status = Partition::Formatted;
@@ -689,8 +698,7 @@ UDisks2::Block *UDisks2::Monitor::createBlockDevice(const QString &dbusObjectPat
689698
// When block info updated
690699
connect(block, &UDisks2::Block::updated, this, [this]() {
691700
UDisks2::Block *block = qobject_cast<UDisks2::Block *>(sender());
692-
QString blockPath = block->path();
693-
if (m_blockDevices.contains(blockPath)) {
701+
if (m_blockDevices.contains(block->path())) {
694702
updatePartitionProperties(block);
695703
}
696704
});

0 commit comments

Comments
 (0)