Linux/udisks2/multi-file zip extraction: handle auto-mount better

If mounting partition after FAT32 format fails, check if race
occurs in which the Linux distribution was faster in auto-mounting
the partition then we were in manually mounting it.
This commit is contained in:
Floris Bos 2021-11-20 13:08:52 +01:00
parent 506330f486
commit 0f3a6a2786
2 changed files with 46 additions and 0 deletions

View file

@ -160,6 +160,16 @@ bool UDisks2Api::formatDrive(const QString &device, bool mountAfterwards)
qDebug() << "Mounted new file system at:" << mp; qDebug() << "Mounted new file system at:" << mp;
return true; return true;
} }
else
{
/* Check if already auto-mounted */
auto mps = mountPoints(filesystem);
if (!mps.isEmpty())
{
qDebug() << "Was already auto-mounted at:" << mps;
return true;
}
}
QThread::sleep(1); QThread::sleep(1);
} }
@ -207,3 +217,36 @@ void UDisks2Api::unmountDrive(const QString &device)
_unmountDrive(devpath); _unmountDrive(devpath);
} }
QByteArrayList UDisks2Api::mountPoints(const QString &partitionDevice)
{
QString devpath = _resolveDevice(partitionDevice);
if (devpath.isEmpty())
return QByteArrayList();
QDBusInterface filesystem("org.freedesktop.UDisks2", devpath,
"org.freedesktop.UDisks2.Filesystem", QDBusConnection::systemBus());
return mountPoints(filesystem);
}
QByteArrayList UDisks2Api::mountPoints(const QDBusInterface &filesystem)
{
QByteArrayList mps;
QDBusMessage msg = QDBusMessage::createMethodCall("org.freedesktop.UDisks2", filesystem.path(),
"org.freedesktop.DBus.Properties", "Get");
QVariantList args = {"org.freedesktop.UDisks2.Filesystem", "MountPoints"};
msg.setArguments(args);
QDBusMessage reply = QDBusConnection::systemBus().call(msg);
for (auto arg : reply.arguments())
{
arg.value<QDBusVariant>().variant().value<QDBusArgument>() >> mps;
}
for (auto &str : mps)
{
if (!str.isEmpty() && str.back() == '\0')
str.chop(1);
}
return mps;
}

View file

@ -8,6 +8,7 @@
#include <QObject> #include <QObject>
#include <QFile> #include <QFile>
#include <QDBusInterface>
class UDisks2Api : public QObject class UDisks2Api : public QObject
{ {
@ -18,6 +19,8 @@ public:
bool formatDrive(const QString &device, bool mountAfterwards = true); bool formatDrive(const QString &device, bool mountAfterwards = true);
QString mountDevice(const QString &device); QString mountDevice(const QString &device);
void unmountDrive(const QString &device); void unmountDrive(const QString &device);
QByteArrayList mountPoints(const QString &partitionDevice);
QByteArrayList mountPoints(const QDBusInterface &filesystem);
protected: protected:
QString _resolveDevice(const QString &device); QString _resolveDevice(const QString &device);