Solid

fstabdevice.cpp
1/*
2 SPDX-FileCopyrightText: 2010 Mario Bensi <mbensi@ipsquad.net>
3
4 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5*/
6
7#include "fstabdevice.h"
8#include "fstab_debug.h"
9#include "fstabhandling.h"
10#include "fstabnetworkshare.h"
11#include "fstabservice.h"
12#include <QCoreApplication>
13#include <QDir>
14#include <QUrl>
15
16using namespace Solid::Backends::Fstab;
17
18FstabDevice::FstabDevice(QString uid)
19 : Solid::Ifaces::Device()
20 , m_uid(uid)
21{
22 m_device = m_uid.mid(parentUdi().length() + 1);
23
24 const QString &fstype = FstabHandling::fstype(m_device);
25 qCDebug(FSTAB_LOG) << "Adding " << m_device << "type:" << fstype;
26
27 if (m_device.startsWith(QLatin1String("//"))) {
28 m_vendor = m_device.mid(2, m_device.indexOf(QLatin1String("/"), 2) - 2);
29 m_product = m_device.mid(m_device.indexOf(QLatin1String("/"), 2) + 1);
30 m_storageType = StorageType::NetworkShare;
31 } else if (fstype.startsWith(QLatin1String("nfs"))) {
32 m_vendor = m_device.left(m_device.indexOf(QLatin1String(":/")));
33 m_product = m_device.mid(m_device.indexOf(QLatin1String(":/")) + 1);
34 m_storageType = StorageType::NetworkShare;
35 } else if (fstype.startsWith(QLatin1String("fuse.")) || fstype == QLatin1String("overlay")) {
36 m_vendor = fstype;
37 m_product = m_device.mid(m_device.indexOf(fstype) + fstype.length());
39 if (m_product.startsWith(home)) {
40 m_product = QStringLiteral("~") + m_product.mid(home.length());
41 }
42 if ((fstype == QLatin1String("fuse.encfs")) || (fstype == QLatin1String("fuse.cryfs")) || (fstype == QLatin1String("fuse.gocryptfs"))) {
43 m_storageType = StorageType::Encrypted;
44 }
45 }
46
47 const QStringList &gvfsOptions = FstabHandling::options(m_device);
48 for (const QString &option : gvfsOptions) {
49 if (const auto tag = QLatin1String("x-gvfs-name="); option.startsWith(tag)) {
50 const QStringView encoded = QStringView(option).mid(tag.size());
51 m_displayName = QUrl::fromPercentEncoding(encoded.toLatin1());
52 } else if (const auto tag = QLatin1String("x-gvfs-icon="); option.startsWith(tag)) {
53 const QStringView encoded = QStringView(option).mid(tag.size());
54 m_iconName = QUrl::fromPercentEncoding(encoded.toLatin1());
55 }
56 }
57
58 if (m_storageType == StorageType::NetworkShare) {
59 m_description = QCoreApplication::translate("", "%1 on %2", "%1 is sharename, %2 is servername").arg(m_product, m_vendor);
60 } else {
61 m_description = QCoreApplication::translate("", "%1 (%2)", "%1 is mountpoint, %2 is fs type").arg(m_product, m_vendor);
62 }
63
64 if (m_displayName.isEmpty()) {
65 const QStringList currentMountPoints = FstabHandling::currentMountPoints(m_device);
66 if (currentMountPoints.isEmpty()) {
67 const QStringList mountPoints = FstabHandling::mountPoints(m_device);
68 m_displayName = mountPoints.isEmpty() ? m_description : mountPoints.first();
69 } else {
70 m_displayName = currentMountPoints.first();
71 }
72 }
73
74 if (m_iconName.isEmpty()) {
75 if (m_storageType == StorageType::NetworkShare) {
76 m_iconName = QStringLiteral("network-server");
77 } else if (m_storageType == StorageType::Encrypted) {
78 m_iconName = QStringLiteral("folder-decrypted");
79 } else {
80 const QStringList &mountPoints = FstabHandling::mountPoints(m_device);
81 const QString home = QDir::homePath();
82 if (mountPoints.contains(QLatin1String("/"))) {
83 m_iconName = QStringLiteral("drive-harddisk-root");
84 } else if (mountPoints.contains(home)) {
85 m_iconName = QStringLiteral("user-home");
86 } else {
87 m_iconName = QStringLiteral("folder");
88 }
89 }
90 }
91}
92
93FstabDevice::~FstabDevice()
94{
95}
96
97QString FstabDevice::udi() const
98{
99 return m_uid;
100}
101
102QString FstabDevice::parentUdi() const
103{
104 return QString::fromLatin1(FSTAB_UDI_PREFIX);
105}
106
107QString FstabDevice::vendor() const
108{
109 return m_vendor;
110}
111
112QString FstabDevice::product() const
113{
114 return m_product;
115}
116
117QString FstabDevice::icon() const
118{
119 return m_iconName;
120}
121
122QStringList FstabDevice::emblems() const
123{
124 if (!m_storageAccess) {
125 FstabDevice *d = const_cast<FstabDevice *>(this);
126 d->m_storageAccess = new FstabStorageAccess(d);
127 }
128 if (m_storageAccess->isAccessible()) {
129 return {QStringLiteral("emblem-mounted")};
130 } else {
131 return {QStringLiteral("emblem-unmounted")};
132 }
133}
134
135QString FstabDevice::displayName() const
136{
137 return m_displayName;
138}
139
140QString FstabDevice::description() const
141{
142 return m_description;
143}
144
145bool FstabDevice::isEncrypted() const
146{
147 return m_storageType == FstabDevice::StorageType::Encrypted;
148}
149
150bool FstabDevice::queryDeviceInterface(const Solid::DeviceInterface::Type &interfaceType) const
151{
152 if (interfaceType == Solid::DeviceInterface::StorageAccess) {
153 return true;
154 }
155 if ((m_storageType == StorageType::NetworkShare) && (interfaceType == Solid::DeviceInterface::NetworkShare)) {
156 return true;
157 }
158 return false;
159}
160
161QObject *FstabDevice::createDeviceInterface(const Solid::DeviceInterface::Type &interfaceType)
162{
163 if (interfaceType == Solid::DeviceInterface::StorageAccess) {
164 if (!m_storageAccess) {
165 m_storageAccess = new FstabStorageAccess(this);
166 }
167 return m_storageAccess;
168 } else if ((m_storageType == StorageType::NetworkShare) && (interfaceType == Solid::DeviceInterface::NetworkShare)) {
169 return new FstabNetworkShare(this);
170 }
171 return nullptr;
172}
173
174QString FstabDevice::device() const
175{
176 return m_device;
177}
178
179void FstabDevice::onMtabChanged(const QString &device)
180{
181 if (m_device == device) {
182 Q_EMIT mtabChanged(device);
183 }
184}
185
186#include "moc_fstabdevice.cpp"
Type
This enum type defines the type of device interface that a Device can have.
This class allows applications to deal with devices available in the underlying system.
QAction * home(const QObject *recvr, const char *slot, QObject *parent)
The single responsibility of this class is to create arguments valid for logind Inhibit call.
Definition fakebattery.h:16
QString translate(const char *context, const char *sourceText, const char *disambiguation, int n)
QString homePath()
T & first()
bool isEmpty() const const
Q_EMITQ_EMIT
QString arg(Args &&... args) const const
QString fromLatin1(QByteArrayView str)
qsizetype length() const const
QString mid(qsizetype position, qsizetype n) const const
bool startsWith(QChar c, Qt::CaseSensitivity cs) const const
bool contains(QLatin1StringView str, Qt::CaseSensitivity cs) const const
QStringView mid(qsizetype start, qsizetype length) const const
QByteArray toLatin1() const const
QString fromPercentEncoding(const QByteArray &input)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Fri Oct 11 2024 12:08:14 by doxygen 1.12.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.