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 @@ -23,7 +23,9 @@ #include "fstabnetworkshare.h" #include "fstabstorageaccess.h" #include "fstabservice.h" +#include #include +#include using namespace Solid::Backends::Fstab; @@ -35,14 +37,33 @@ m_device.remove(parentUdi() + "/"); if (m_device.startsWith("//")) { - m_product = m_device.mid(2, m_device.indexOf("/", 2) - 2); - m_vendor = m_device.mid(m_device.indexOf("/", 2) + 1); + m_vendor = m_device.mid(2, m_device.indexOf("/", 2) - 2); + m_product = m_device.mid(m_device.indexOf("/", 2) + 1); } else { - m_product = m_device.left(m_device.indexOf(":/")); - m_vendor = m_device.mid(m_device.indexOf(":/") + 1); + m_vendor = m_device.left(m_device.indexOf(":/")); + m_product = m_device.mid(m_device.indexOf(":/") + 2); } - m_description = m_vendor + " on " + m_product; + const QStringList& gvfsOptions = FstabHandling::options(m_device); + + foreach (const QString& option, gvfsOptions) { + if (option.startsWith(QLatin1String("x-gvfs-name="))) { + QStringRef encoded = option.midRef(12); + m_description = QUrl::fromPercentEncoding(encoded.toLatin1()); + } else if (option.startsWith(QLatin1String("x-gvfs-icon="))) { + QStringRef encoded = option.midRef(12); + 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 = QLatin1String("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 @@ -129,6 +129,7 @@ } globalFstabCache->m_fstabCache.clear(); + globalFstabCache->m_fstabOptionsCache.clear(); #if HAVE_SETMNTENT @@ -142,8 +143,12 @@ 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 QStringList options = QFile::decodeName(fe->mnt_opts).split(QLatin1Char(',')); globalFstabCache->m_fstabCache.insert(device, mountpoint); + while (!options.isEmpty()) { + globalFstabCache->m_fstabOptionsCache.insert(device, options.takeFirst()); + } } } @@ -213,6 +218,14 @@ return mountpoints; } +QStringList Solid::Backends::Fstab::FstabHandling::options(const QString &device) +{ + _k_updateFstabMountPointsCache(); + + QStringList options = globalFstabCache->m_fstabOptionsCache.values(device); + return options; +} + 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/fstabnetworkshare.cpp b/src/solid/devices/backends/fstab/fstabnetworkshare.cpp --- a/src/solid/devices/backends/fstab/fstabnetworkshare.cpp +++ b/src/solid/devices/backends/fstab/fstabnetworkshare.cpp @@ -35,8 +35,8 @@ } else if (m_fstabDevice->device().contains(":/")) { m_type = Solid::NetworkShare::Nfs; url = "nfs://"; + url += m_fstabDevice->vendor() + "/"; url += m_fstabDevice->product(); - url += m_fstabDevice->vendor(); } else { m_type = Solid::NetworkShare::Unknown; } 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 @@ -44,6 +44,7 @@ m_filePath = currentMountPoints.first(); m_isAccessible = true; } + m_isIgnored = FstabHandling::options(device->device()).contains(QLatin1String("x-gvfs-hide")); connect(device, SIGNAL(mtabChanged(QString)), this, SLOT(onMtabChanged(QString))); QTimer::singleShot(0, this, SLOT(connectDBusSignals())); @@ -81,7 +82,7 @@ bool FstabStorageAccess::isIgnored() const { - return false; + return m_isIgnored; } bool FstabStorageAccess::setup()