diff --git a/src/solid/devices/backends/fstab/fstabdevice.h b/src/solid/devices/backends/fstab/fstabdevice.h --- a/src/solid/devices/backends/fstab/fstabdevice.h +++ b/src/solid/devices/backends/fstab/fstabdevice.h @@ -74,6 +74,7 @@ QString m_product; QString m_vendor; QString m_description; + QString m_iconName; QPointer m_storageAccess; }; diff --git a/src/solid/devices/backends/fstab/fstabdevice.cpp b/src/solid/devices/backends/fstab/fstabdevice.cpp --- a/src/solid/devices/backends/fstab/fstabdevice.cpp +++ b/src/solid/devices/backends/fstab/fstabdevice.cpp @@ -24,6 +24,8 @@ #include "fstabstorageaccess.h" #include "fstabservice.h" #include +#include +#include using namespace Solid::Backends::Fstab; @@ -42,7 +44,26 @@ m_vendor = m_device.mid(m_device.indexOf(":/") + 1); } - m_description = m_vendor + " on " + m_product; + const QStringList &gvfsOptions = FstabHandling::options(m_device).filter("x-gvfs-"); + + for (const QString &option : gvfsOptions) { + if (option.startsWith(QLatin1String("x-gvfs-name="))) { + const QStringRef &encoded = option.midRef(option.indexOf(QLatin1String("="), 11) + 1); + m_description = QUrl::fromPercentEncoding(encoded.toLatin1()); + } else if (option.startsWith(QLatin1String("x-gvfs-icon="))) { + const QStringRef &encoded = option.midRef(option.indexOf(QLatin1String("="), 11) + 1); + m_iconName = QUrl::fromPercentEncoding(encoded.toLatin1()); + } + } + + if (m_description.isEmpty()) { + m_description = QCoreApplication::translate("", "%1 on %2", + "%1 is sharename, %2 is servername").arg(m_product).arg(m_vendor); + } + + if (m_iconName.isEmpty()) { + m_iconName = QStringLiteral("network-server"); + } } FstabDevice::~FstabDevice() @@ -71,7 +92,7 @@ QString FstabDevice::icon() const { - return QString::fromLatin1("network-server"); + return m_iconName; } QStringList FstabDevice::emblems() const diff --git a/src/solid/devices/backends/fstab/fstabhandling.h b/src/solid/devices/backends/fstab/fstabhandling.h --- a/src/solid/devices/backends/fstab/fstabhandling.h +++ b/src/solid/devices/backends/fstab/fstabhandling.h @@ -43,6 +43,7 @@ static QStringList deviceList(); static QStringList currentMountPoints(const QString &device); static QStringList mountPoints(const QString &device); + static QStringList options(const QString &device); static QProcess *callSystemCommand(const QString &commandName, const QStringList &args, QObject *obj, const char *slot); @@ -60,6 +61,7 @@ QStringMultiHash m_mtabCache; QStringMultiHash m_fstabCache; + QStringMultiHash m_fstabOptionsCache; bool m_fstabCacheValid; bool m_mtabCacheValid; diff --git a/src/solid/devices/backends/fstab/fstabhandling.cpp b/src/solid/devices/backends/fstab/fstabhandling.cpp --- a/src/solid/devices/backends/fstab/fstabhandling.cpp +++ b/src/solid/devices/backends/fstab/fstabhandling.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include @@ -129,6 +130,7 @@ } globalFstabCache->m_fstabCache.clear(); + globalFstabCache->m_fstabOptionsCache.clear(); #if HAVE_SETMNTENT @@ -142,8 +144,13 @@ if (_k_isFstabNetworkFileSystem(fe->mnt_type, fe->mnt_fsname)) { const QString device = QFile::decodeName(fe->mnt_fsname); const QString mountpoint = QFile::decodeName(fe->mnt_dir); + const QString mountOptions = QFile::decodeName(fe->mnt_opts); + const auto &options = mountOptions.splitRef(QLatin1Char(','), QString::SkipEmptyParts); globalFstabCache->m_fstabCache.insert(device, mountpoint); + for (const QStringRef &option : options) { + globalFstabCache->m_fstabOptionsCache.insert(device, option.toString()); + } } } @@ -213,6 +220,13 @@ return mountpoints; } +QStringList Solid::Backends::Fstab::FstabHandling::options(const QString &device) +{ + _k_updateFstabMountPointsCache(); + + return globalFstabCache->m_fstabOptionsCache.values(device); +} + QProcess *Solid::Backends::Fstab::FstabHandling::callSystemCommand(const QString &commandName, const QStringList &args, QObject *obj, const char *slot) diff --git a/src/solid/devices/backends/fstab/fstabstorageaccess.h b/src/solid/devices/backends/fstab/fstabstorageaccess.h --- a/src/solid/devices/backends/fstab/fstabstorageaccess.h +++ b/src/solid/devices/backends/fstab/fstabstorageaccess.h @@ -83,6 +83,7 @@ QProcess *m_process; QString m_filePath; bool m_isAccessible; + bool m_isIgnored; }; } diff --git a/src/solid/devices/backends/fstab/fstabstorageaccess.cpp b/src/solid/devices/backends/fstab/fstabstorageaccess.cpp --- a/src/solid/devices/backends/fstab/fstabstorageaccess.cpp +++ b/src/solid/devices/backends/fstab/fstabstorageaccess.cpp @@ -45,6 +45,12 @@ m_isAccessible = true; } + const QStringList &options = FstabHandling::options(device->device()); + // GVFS by default doesn't show devices outside of /media, $HOME (and some other locations) + // which you can force by setting x-gvfs-show but since we always show everything + // only x-gvfs-hide is honored here. + m_isIgnored = options.contains(QLatin1String("comment=x-gvfs-hide")); + connect(device, SIGNAL(mtabChanged(QString)), this, SLOT(onMtabChanged(QString))); QTimer::singleShot(0, this, SLOT(connectDBusSignals())); } @@ -81,7 +87,7 @@ bool FstabStorageAccess::isIgnored() const { - return false; + return m_isIgnored; } bool FstabStorageAccess::setup()