11#include "../kioworkers/file/stat_unix.h"
12#include "config-kiocore.h"
15#include "../aclhelpers_p.h"
18#include "../utils_p.h"
19#include "kiocoredebug.h"
20#include "kioglobal_p.h"
26#include <QDirIterator>
28#include <QMimeDatabase>
30#include <KConfigGroup>
31#include <KDesktopFile>
32#include <KLocalizedString>
33#include <kmountpoint.h>
36#include <ksambashare.h>
38#include <KFileSystemType>
39#include <KProtocolManager>
42#define KFILEITEM_DEBUG 0
47 KFileItemPrivate(
const KIO::UDSEntry &entry,
50 const QUrl &itemOrDirUrl,
52 bool delayedMimeTypes,
53 KFileItem::MimeTypeDetermination mimeTypeDetermination)
59 , m_strLowerCaseName()
62 , m_permissions(permissions)
65 , m_bIsLocalUrl(itemOrDirUrl.isLocalFile())
66 , m_bMimeTypeKnown(false)
67 , m_delayedMimeTypes(delayedMimeTypes)
68 , m_useIconNameCache(false)
70 , m_hiddenCache(HiddenUncached)
72 , m_bSkipMimeTypeFromContent(mimeTypeDetermination == KFileItem::SkipMimeTypeFromContent)
73 , m_bInitCalled(false)
75 if (entry.
count() != 0) {
76 readUDSEntry(urlIsDirectory);
78 Q_ASSERT(!urlIsDirectory);
79 m_strName = itemOrDirUrl.fileName();
80 m_strText = KIO::decodeFileName(m_strName);
87 void ensureInitialized()
const;
94 QString localPath()
const;
100 bool cmp(
const KFileItemPrivate &item)
const;
101 void printCompareDebug(
const KFileItemPrivate &item)
const;
108 void readUDSEntry(
bool _urlIsDirectory);
113 QString parsePermissions(mode_t perm)
const;
118 void determineMimeTypeHelper(
const QUrl &url)
const;
123 mutable KIO::UDSEntry m_entry;
143 mutable QString m_iconName;
148 mutable QString m_strLowerCaseName;
153 mutable QMimeType m_mimeType;
158 mutable mode_t m_fileMode;
162 mutable mode_t m_permissions;
167 mutable bool m_addACL : 1;
172 mutable bool m_bLink : 1;
176 bool m_bIsLocalUrl : 1;
178 mutable bool m_bMimeTypeKnown : 1;
179 mutable bool m_delayedMimeTypes : 1;
182 mutable bool m_useIconNameCache : 1;
206 bool m_bSkipMimeTypeFromContent : 1;
211 mutable bool m_bInitCalled : 1;
214 QString m_guessedMimeType;
215 mutable QString m_access;
218void KFileItemPrivate::ensureInitialized()
const
220 if (!m_bInitCalled) {
225void KFileItemPrivate::init()
const
231 const bool shouldStat = (m_fileMode == KFileItem::Unknown || m_permissions == KFileItem::Unknown || m_entry.count() == 0) && m_url.isLocalFile();
253 mode_t mode = stat_mode(buff);
254 if (Utils::isLinkMask(mode)) {
257 mode = stat_mode(buff);
259 mode = (QT_STAT_MASK - 1) | S_IRWXU | S_IRWXG | S_IRWXO;
263 const mode_t
type = mode & QT_STAT_MASK;
275 const auto uid = stat_uid(buff);
276 const auto gid = stat_gid(buff);
282 if (m_fileMode == KFileItem::Unknown) {
285 if (m_permissions == KFileItem::Unknown) {
286 m_permissions = mode & 07777;
291 appendACLAtoms(pathBA, m_entry, type);
295 if (errno != ENOENT) {
297 qCDebug(KIO_CORE) << QStringLiteral(
"KFileItem: error %1: %2").arg(errno).arg(
QString::fromLatin1(strerror(errno))) <<
"when refreshing"
303 m_bInitCalled =
true;
306void KFileItemPrivate::readUDSEntry(
bool _urlIsDirectory)
322 const bool UDS_URL_seen = !urlStr.
isEmpty();
324 m_url = QUrl(urlStr);
325 if (m_url.isLocalFile()) {
326 m_bIsLocalUrl =
true;
331 m_bMimeTypeKnown = !mimeTypeStr.
isEmpty();
332 if (m_bMimeTypeKnown) {
340 m_hidden = hiddenVal == 1 ? Hidden : (hiddenVal == 0 ? Shown : Auto);
341 m_hiddenCache = HiddenUncached;
343 if (_urlIsDirectory && !UDS_URL_seen && !m_strName.isEmpty() && m_strName != QLatin1String(
".")) {
344 auto path = m_url.path();
347 path = QStringLiteral(
"/");
349 m_url.setPath(Utils::concatPaths(path, m_strName));
355 if (m_fileMode != KFileItem::Unknown) {
356 m_bInitCalled =
true;
367 if (fieldVal != -1) {
373 return QFileInfo(m_url.toLocalFile()).size();
382 if (fieldVal != -1) {
391 switch (mappedWhich) {
392 case KFileItem::ModificationTime:
394 case KFileItem::AccessTime:
396 case KFileItem::CreationTime:
404 m_entry.replace(udsFieldForTime(mappedWhich), time_t_val);
418 const uint uds = udsFieldForTime(mappedWhich);
420 const long long fieldVal = m_entry.numberValue(uds, -1);
421 if (fieldVal != -1) {
429void KFileItemPrivate::printCompareDebug(
const KFileItemPrivate &item)
const
434 const KIO::UDSEntry &otherEntry = item.m_entry;
436 qDebug() <<
"Comparing" << m_url <<
"and" << item.m_url;
437 qDebug() <<
" name" << (m_strName == item.m_strName);
438 qDebug() <<
" local" << (m_bIsLocalUrl == item.m_bIsLocalUrl);
440 qDebug() <<
" mode" << (m_fileMode == item.m_fileMode);
441 qDebug() <<
" perm" << (m_permissions == item.m_permissions);
447 qDebug() <<
" UDS_DEFAULT_ACL_STRING"
450 qDebug() <<
" m_bLink" << (m_bLink == item.m_bLink);
451 qDebug() <<
" m_hidden" << (m_hidden == item.m_hidden);
453 qDebug() <<
" size" << (size() == item.size());
463inline bool KFileItemPrivate::cmp(
const KFileItemPrivate &item)
const
465 if (item.m_bInitCalled) {
470 item.ensureInitialized();
474 printCompareDebug(item);
478 return (m_strName == item.m_strName
479 && m_bIsLocalUrl == item.m_bIsLocalUrl
480 && m_fileMode == item.m_fileMode
481 && m_permissions == item.m_permissions
487 && m_bLink == item.m_bLink
488 && m_hidden == item.m_hidden
489 && size() == item.size()
500inline QString KFileItemPrivate::parsePermissions(mode_t perm)
const
504 static char buffer[12];
510 if ((perm & (S_IXUSR | S_ISUID)) == (S_IXUSR | S_ISUID)) {
512 }
else if ((perm & (S_IXUSR | S_ISUID)) == S_ISUID) {
514 }
else if ((perm & (S_IXUSR | S_ISUID)) == S_IXUSR) {
520 if ((perm & (S_IXGRP | S_ISGID)) == (S_IXGRP | S_ISGID)) {
522 }
else if ((perm & (S_IXGRP | S_ISGID)) == S_ISGID) {
524 }
else if ((perm & (S_IXGRP | S_ISGID)) == S_IXGRP) {
530 if ((perm & (S_IXOTH | S_ISVTX)) == (S_IXOTH | S_ISVTX)) {
532 }
else if ((perm & (S_IXOTH | S_ISVTX)) == S_ISVTX) {
534 }
else if ((perm & (S_IXOTH | S_ISVTX)) == S_IXOTH) {
544 }
else if (m_fileMode != KFileItem::Unknown) {
545 if (Utils::isDirMask(m_fileMode)) {
549 else if (S_ISSOCK(m_fileMode)) {
551 }
else if (S_ISCHR(m_fileMode)) {
553 }
else if (S_ISBLK(m_fileMode)) {
555 }
else if (S_ISFIFO(m_fileMode)) {
566 buffer[1] = (((perm & S_IRUSR) == S_IRUSR) ?
'r' :
'-');
567 buffer[2] = (((perm & S_IWUSR) == S_IWUSR) ?
'w' :
'-');
569 buffer[4] = (((perm & S_IRGRP) == S_IRGRP) ?
'r' :
'-');
570 buffer[5] = (((perm & S_IWGRP) == S_IWGRP) ?
'w' :
'-');
572 buffer[7] = (((perm & S_IROTH) == S_IROTH) ?
'r' :
'-');
573 buffer[8] = (((perm & S_IWOTH) == S_IWOTH) ?
'w' :
'-');
586void KFileItemPrivate::determineMimeTypeHelper(
const QUrl &url)
const
589 if (m_bSkipMimeTypeFromContent || isSlow()) {
590 const QString scheme = url.
scheme();
591 if (scheme.
startsWith(QLatin1String(
"http")) || scheme == QLatin1String(
"mailto")) {
592 m_mimeType = db.
mimeTypeForName(QLatin1String(
"application/octet-stream"));
609 : d(new KFileItemPrivate(
entry,
620 : d(new KFileItemPrivate(
KIO::UDSEntry(),
mode,
KFileItem::Unknown, url, false, false,
KFileItem::NormalMimeTypeDetermination))
622 d->m_bMimeTypeKnown = !mimeType.
simplified().isEmpty();
623 if (d->m_bMimeTypeKnown) {
625 d->m_mimeType = db.mimeTypeForName(mimeType);
630 : d(new KFileItemPrivate(
KIO::UDSEntry(),
KFileItem::Unknown,
KFileItem::Unknown, url, false, false, mimeTypeDetermination))
650 qCWarning(KIO_CORE) <<
"null item";
654 d->m_fileMode = KFileItem::Unknown;
655 d->m_permissions = KFileItem::Unknown;
656 d->m_hidden = KFileItemPrivate::Auto;
657 d->m_hiddenCache = KFileItemPrivate::HiddenUncached;
680 d->m_bMimeTypeKnown =
false;
681 d->m_iconName.clear();
689 d->m_delayedMimeTypes = b;
695 qCWarning(KIO_CORE) <<
"null item";
706 qCWarning(KIO_CORE) <<
"null item";
716 qCWarning(KIO_CORE) <<
"null item";
720 d->ensureInitialized();
723 if (!d->m_strName.isEmpty()) {
729 d->m_hiddenCache = KFileItemPrivate::HiddenUncached;
738 d->ensureInitialized();
751 if (d->m_bIsLocalUrl) {
756 size_t linkSize =
size();
758 if (linkSize > SIZE_MAX) {
759 qCWarning(KIO_CORE) <<
"file size bigger than SIZE_MAX, too big for readlink use!" << path;
762 size_t lowerBound = 256;
763 size_t higherBound = 1024;
764 size_t bufferSize = qBound(lowerBound, linkSize + 1, higherBound);
765 QByteArray linkTargetBuffer(bufferSize, Qt::Initialization::Uninitialized);
768 ssize_t n = readlink(pathBA.
constData(), linkTargetBuffer.
data(), linkTargetBuffer.
size());
769 if (n < 0 && errno != ERANGE) {
770 qCWarning(KIO_CORE) <<
"readlink failed!" << pathBA;
772 }
else if (n > 0 &&
static_cast<size_t>(n) != bufferSize) {
778 linkTargetBuffer.
resize(linkTargetBuffer.
size() * 2);
789QString KFileItemPrivate::localPath()
const
807 return d->localPath();
825 return d->recursiveSize();
848 return KACL(fieldVal);
853 return KACL(d->m_permissions);
865 return KACL(fieldVal);
877 return d->
time(which);
925 cachedStrings.
insert(gid, groupName);
927 return cachedStrings.
value(gid);
943bool KFileItemPrivate::isSlow()
const
945 if (m_slow == SlowUnknown) {
946 const QString path = localPath();
954 return m_slow == Slow;
957bool KFileItem::isSlow()
const
973 return that->determineMimeType().
name();
982 if (!d->m_mimeType.isValid() || !d->m_bMimeTypeKnown) {
988 d->determineMimeTypeHelper(url);
992 Q_ASSERT(d->m_mimeType.isValid());
995 d->m_bMimeTypeKnown =
true;
998 if (d->m_delayedMimeTypes) {
999 d->m_delayedMimeTypes =
false;
1000 d->m_useIconNameCache =
false;
1004 return d->m_mimeType;
1007bool KFileItem::isMimeTypeKnown()
const
1016 return d->m_bMimeTypeKnown && d->m_guessedMimeType.isEmpty();
1019static bool isDirectoryMounted(
const QUrl &url)
1031 if (info.isDir() && info.size() == 0) {
1037bool KFileItem::isFinalIconKnown()
const
1042 return d->m_bMimeTypeKnown && (!d->m_delayedMimeTypes);
1062 if (isLocalUrl && !d->isSlow() && mime.
inherits(QStringLiteral(
"application/x-desktop"))) {
1065 if (!comment.isEmpty()) {
1071 if (isLocalUrl && isDir() && !d->isSlow() && isDirectoryMounted(url)) {
1073 u.
setPath(Utils::concatPaths(u.
path(), QStringLiteral(
".directory")));
1076 if (!comment.isEmpty()) {
1083 if (!comment.isEmpty()) {
1098 QString icon = cfg.readIcon();
1103 bool isDirEmpty =
true;
1105 while (dirIt.hasNext()) {
1127 const QString icon = cfg.readIcon();
1128 if (cfg.hasLinkType()) {
1132 const QString u = cfg.readUrl();
1138 if (trashConfig.group(QStringLiteral(
"Status")).readEntry(
"Empty",
true)) {
1153 if (d->m_useIconNameCache && !d->m_iconName.isEmpty()) {
1154 return d->m_iconName;
1158 if (!d->m_iconName.isEmpty()) {
1159 d->m_useIconNameCache = d->m_bMimeTypeKnown;
1160 return d->m_iconName;
1168 if (!d->m_guessedMimeType.isEmpty()) {
1171 mime = currentMimeType();
1174 const bool delaySlowOperations = d->m_delayedMimeTypes;
1176 if (isLocalUrl && !delaySlowOperations) {
1177 const QString &localFile = url.toLocalFile();
1179 if (mime.
inherits(QStringLiteral(
"application/x-desktop"))) {
1180 d->m_iconName = iconFromDesktopFile(localFile);
1181 if (!d->m_iconName.isEmpty()) {
1182 d->m_useIconNameCache = d->m_bMimeTypeKnown;
1183 return d->m_iconName;
1188 if (isDirectoryMounted(url)) {
1189 d->m_iconName = iconFromDirectoryFile(localFile);
1190 if (!d->m_iconName.isEmpty()) {
1191 d->m_useIconNameCache = d->m_bMimeTypeKnown;
1192 return d->m_iconName;
1196 d->m_iconName = KIOPrivate::iconForStandardPath(localFile);
1197 if (!d->m_iconName.isEmpty()) {
1198 d->m_useIconNameCache = d->m_bMimeTypeKnown;
1199 return d->m_iconName;
1205 d->m_useIconNameCache = d->m_bMimeTypeKnown;
1206 return d->m_iconName;
1213static bool checkDesktopFile(
const KFileItem &item,
bool _determineMimeType)
1221 if (!item.isRegularFile()) {
1226 if (!item.isReadable()) {
1231 QMimeType mime = _determineMimeType ? item.determineMimeType() : item.currentMimeType();
1232 return mime.
inherits(QStringLiteral(
"application/x-desktop"));
1241 d->ensureInitialized();
1246 names.
append(QStringLiteral(
"emblem-symbolic-link"));
1249 if (!isReadable()) {
1250 names.
append(QStringLiteral(
"emblem-locked"));
1253 if (checkDesktopFile(*
this,
false)) {
1260 names.
append(QStringLiteral(
"emblem-important"));
1265 names.
append(QStringLiteral(
"hidden"));
1271 const QString path = url.toLocalFile();
1273 names.
append(QStringLiteral(
"emblem-shared"));
1291bool KFileItem::isReadable()
const
1297 d->ensureInitialized();
1299 if (d->m_permissions != KFileItem::Unknown) {
1300 const mode_t readMask = S_IRUSR | S_IRGRP | S_IROTH;
1302 if ((d->m_permissions & readMask) == 0) {
1307 if ((d->m_permissions & readMask) == readMask) {
1312 const auto uidOfItem =
userId();
1313 if (uidOfItem != -1) {
1315 if (((uint)uidOfItem) == currentUser.nativeId()) {
1316 return S_IRUSR & d->m_permissions;
1318 const auto gidOfItem =
groupId();
1319 if (gidOfItem != -1) {
1321 return S_IRGRP & d->m_permissions;
1324 return S_IROTH & d->m_permissions;
1329 return S_IRUSR & d->m_permissions;
1341bool KFileItem::isWritable()
const
1347 d->ensureInitialized();
1349 if (d->m_permissions != KFileItem::Unknown) {
1351 if ((d->m_permissions & (S_IWUSR | S_IWGRP | S_IWOTH)) == 0) {
1356 const auto uidOfItem =
userId();
1357 if (uidOfItem != -1) {
1359 if (((uint)uidOfItem) == currentUser.nativeId()) {
1360 return S_IWUSR & d->m_permissions;
1362 const auto gidOfItem =
groupId();
1363 if (gidOfItem != -1) {
1365 return S_IWGRP & d->m_permissions;
1368 if (S_IWOTH & d->m_permissions) {
1375 return S_IWUSR & d->m_permissions;
1380 if (d->m_bIsLocalUrl) {
1387bool KFileItem::isHidden()
const
1394 if (d->m_hidden != KFileItemPrivate::Auto) {
1395 return d->m_hidden == KFileItemPrivate::Hidden;
1397 if (d->m_hiddenCache != KFileItemPrivate::HiddenUncached) {
1398 return d->m_hiddenCache == KFileItemPrivate::HiddenCached;
1402 QString fileName = d->m_url.fileName();
1404 fileName = d->m_strName;
1408 d->m_hiddenCache = fileName.
length() > 1 && fileName[0] ==
QLatin1Char(
'.') ? KFileItemPrivate::HiddenCached : KFileItemPrivate::ShownCached;
1409 return d->m_hiddenCache == KFileItemPrivate::HiddenCached;
1412void KFileItem::setHidden()
1415 d->m_hidden = KFileItemPrivate::Hidden;
1419bool KFileItem::isDir()
const
1425 if (d->m_fileMode != KFileItem::Unknown) {
1427 return Utils::isDirMask(d->m_fileMode);
1430 if (d->m_bMimeTypeKnown && d->m_mimeType.isValid()) {
1433 return d->m_mimeType.inherits(QStringLiteral(
"inode/directory"));
1436 if (d->m_bSkipMimeTypeFromContent) {
1440 d->ensureInitialized();
1442 if (d->m_fileMode == KFileItem::Unknown) {
1447 return Utils::isDirMask(d->m_fileMode);
1450bool KFileItem::isFile()
const
1465 auto toDisplayUrl = [](
const QUrl &url) {
1467 if (url.isLocalFile()) {
1470 dest = url.toDisplayString();
1476 const QString comment = mimeComment();
1479 auto linkText = linkDest();
1480 if (!linkText.startsWith(QStringLiteral(
"anon_inode:"))) {
1482 if (d->m_url.isLocalFile()) {
1483 if (url.scheme().isEmpty()) {
1484 url.setScheme(QStringLiteral(
"file"));
1487 url = d->m_url.resolved(url);
1489 linkText = toDisplayUrl(url);
1492 if (comment.isEmpty()) {
1493 text +=
i18n(
"(Symbolic Link to %1)", linkText);
1495 text +=
i18n(
"(%1, Link to %2)", comment, linkText);
1497 }
else if (targetUrl() != url()) {
1498 text +=
i18n(
" (Points to %1)", toDisplayUrl(targetUrl()));
1499 }
else if (Utils::isRegFileMask(d->m_fileMode)) {
1502 text += QStringLiteral(
" (%1)").arg(comment);
1509 if (!d && !item.d) {
1513 if (!d || !item.d) {
1517 return d->cmp(*item.d);
1522 if (!d && !other.d) {
1526 if (!d || !other.d) {
1530 return d->m_url == other.d->m_url;
1544 return other.d->m_url.isValid();
1546 return d->m_url < other.d->m_url;
1554 return d->m_url < other;
1568 d->ensureInitialized();
1570 if (d->m_access.isNull() && d->m_permissions != KFileItem::Unknown) {
1571 d->m_access = d->parsePermissions(d->m_permissions);
1603 return {
QUrl(),
false};
1606 const QString local_path = localPath();
1610 return {d->m_url, d->m_bIsLocalUrl};
1620 s << a.d->m_strName;
1621 s << a.d->m_strText;
1642 qCWarning(KIO_CORE) <<
"null item";
1652 a.d->m_strName = strName;
1653 a.d->m_strText = strText;
1654 a.d->m_bIsLocalUrl = a.d->m_url.isLocalFile();
1655 a.d->m_bMimeTypeKnown =
false;
1676 d->ensureInitialized();
1678 return d->m_permissions;
1687 d->ensureInitialized();
1689 return d->m_fileMode;
1692bool KFileItem::isLink()
const
1698 d->ensureInitialized();
1703bool KFileItem::isLocalFile()
const
1709 return d->m_bIsLocalUrl;
1718 return d->m_strText;
1728 return d->m_strName;
1729 }
else if (d->m_strLowerCaseName.isNull()) {
1730 d->m_strLowerCaseName = d->m_strName.toLower();
1732 return d->m_strLowerCaseName;
1742 if (!targetUrlStr.
isEmpty()) {
1743 return QUrl(targetUrlStr);
1763 if (!d || d->m_url.isEmpty()) {
1767 if (!d->m_mimeType.isValid()) {
1771 d->m_mimeType = db.
mimeTypeForName(QStringLiteral(
"inode/directory"));
1772 return d->m_mimeType;
1775 if (d->m_delayedMimeTypes) {
1778 d->m_mimeType = db.
mimeTypeForName(QStringLiteral(
"application/octet-stream"));
1779 d->m_bMimeTypeKnown =
false;
1781 d->m_mimeType = mimeTypes.
first();
1783 d->m_bMimeTypeKnown = (mimeTypes.
count() == 1);
1787 d->determineMimeTypeHelper(url);
1788 d->m_bMimeTypeKnown =
true;
1791 return d->m_mimeType;
1800 d->ensureInitialized();
1807 return d ==
nullptr;
1815 if (!d->m_bInitCalled) {
1816 qCWarning(KIO_CORE) <<
"KFileItem: exists called when not initialised" << d->m_url;
1819 return d->m_fileMode != KFileItem::Unknown;
1828 d->ensureInitialized();
1830 if (d->m_permissions == KFileItem::Unknown) {
1834 const mode_t executableMask = S_IXGRP | S_IXUSR | S_IXOTH;
1835 if ((d->m_permissions & executableMask) == 0) {
1840 const auto uid =
userId();
1843 return S_IXUSR & d->m_permissions;
1849 return S_IXGRP & d->m_permissions;
1852 return S_IXOTH & d->m_permissions;
1858 return S_IXUSR & d->m_permissions;
1879 return item.name() == fileName;
1888 return item.url() == url;
1899 for (
const auto &item : *
this) {
1910 for (
const auto &item : *
this) {
1911 lst.
append(item.targetUrl());
1916bool KFileItem::isDesktopFile()
const
1918 return checkDesktopFile(*
this,
true);
1921bool KFileItem::isRegularFile()
const
1927 d->ensureInitialized();
1929 return Utils::isRegFileMask(d->m_fileMode);
1934 if (!d || isDir()) {
1938 const int lastDot = d->m_strText.
lastIndexOf(QStringLiteral(
"."));
1940 return d->m_strText.mid(lastDot + 1);
1951 stream <<
"[null KFileItem]";
1953 stream <<
"[KFileItem for " << item.url() <<
"]";
1958#include "moc_kfileitem.cpp"
The KACL class encapsulates a POSIX Access Control List.
QString readEntry(const char *key, const char *aDefault=nullptr) const
QString readComment() const
KConfigGroup desktopGroup() const
static bool isAuthorizedDesktopFile(const QString &path)
KFileItem findByUrl(const QUrl &url) const
Find a KFileItem by URL and return it.
KFileItem findByName(const QString &fileName) const
Find a KFileItem by name and return it.
KFileItemList()
Creates an empty list of file items.
QList< QUrl > targetUrlList() const
QList< QUrl > urlList() const
A KFileItem is a generic class to handle a file, local or remote.
KFileItem & operator=(const KFileItem &)
Copy assignment.
int userId() const
Returns the file's owner's user id.
int groupId() const
Returns the file's owner's group id.
QUrl mostLocalUrl(bool *local=nullptr) const
Tries to return a local URL for this file item if possible.
bool operator==(const KFileItem &other) const
Returns true if both items share the same URL.
void setUrl(const QUrl &url)
Sets the item's URL.
bool operator!=(const KFileItem &other) const
Returns true if both items do not share the same URL.
KIO::filesize_t size() const
Returns the size of the file, if known.
Q_INVOKABLE QString timeString(KFileItem::FileTimes which=ModificationTime) const
Requests the modification, access or creation time as a string, depending on which.
FileTimes
The timestamps associated with a file.
Q_INVOKABLE QDateTime time(KFileItem::FileTimes which) const
Requests the modification, access or creation time, depending on which.
bool cmp(const KFileItem &item) const
Somewhat like a comparison operator, but more explicit, and it can detect that two fileitems differ i...
bool hasExtendedACL() const
Tells if the file has extended access level information ( Posix ACL )
KACL defaultACL() const
Returns the default access control list for the directory.
mode_t permissions() const
Returns the permissions of the file (stat.st_mode containing only permissions).
KIO::filesize_t recursiveSize() const
For folders, its recursive size: the size of its files plus the recursiveSize of its folder.
KFileItem()
Null KFileItem.
KACL ACL() const
Returns the access control list for the file.
void refreshMimeType()
Re-reads MIME type information.
MostLocalUrlResult isMostLocalUrl() const
Returns a MostLocalUrlResult, with the local Url for this item if possible (otherwise an empty Url),...
bool exists() const
returns whether the KFileItem exists on-disk Call only after initialization (i.e KIO::stat or refresh...
bool isNull() const
Return true if default-constructed.
KIO::UDSEntry entry() const
Returns the UDS entry.
bool isExecutable() const
Return true if the file has executable permission.
QString suffix() const
Returns the file extension Similar to QFileInfo::suffix except it takes into account UDS_DISPLAY_NAME...
mode_t mode() const
Returns the file type (stat.st_mode containing only S_IFDIR, S_IFLNK, ...).
QString permissionsString() const
Returns the access permissions for the file as a string.
void setLocalPath(const QString &path)
Sets the item's local path (UDS_LOCAL_PATH).
void setDelayedMimeTypes(bool b)
Sets MIME type determination to be immediate or on demand.
void refresh()
Throw away and re-read (for local files) all information about the file.
bool operator<(const KFileItem &other) const
Returns true if this item's URL is lexically less than other's URL; otherwise returns false.
void setName(const QString &name)
Sets the item's name (i.e. the filename).
Universal Directory Service.
QString stringValue(uint field) const
long long numberValue(uint field, long long defaultValue=0) const
@ UDS_LOCAL_USER_ID
User ID of the file owner.
@ UDS_CREATION_TIME
The time the file was created. Required time format: seconds since UNIX epoch.
@ UDS_ICON_OVERLAY_NAMES
A comma-separated list of supplementary icon overlays which will be added to the list of overlays cre...
@ UDS_HIDDEN
Treat the file as a hidden file (if set to 1) or as a normal file (if set to 0).
@ UDS_URL
An alternative URL (If different from the caption).
@ UDS_GROUP
Group Name of the file owner Not present on local fs, use UDS_LOCAL_GROUP_ID.
@ UDS_LINK_DEST
Name of the file where the link points to Allows to check for a symlink (don't use S_ISLNK !...
@ UDS_LOCAL_GROUP_ID
Group ID of the file owner.
@ UDS_MIME_TYPE
A MIME type; the KIO worker should set it if it's known.
@ UDS_LOCAL_PATH
A local file path if the KIO worker display files sitting on the local filesystem (but in another hie...
@ UDS_FILE_TYPE
File type, part of the mode returned by stat (for a link, this returns the file type of the pointed i...
@ UDS_DISPLAY_TYPE
User-readable type of file (if not specified, the MIME type's description is used)
@ UDS_MODIFICATION_TIME
The last time the file was modified. Required time format: seconds since UNIX epoch.
@ UDS_COMMENT
A comment which will be displayed as is to the user.
@ UDS_SIZE
Size of the file.
@ UDS_DEVICE_ID
Device number for this file, used to detect hardlinks.
@ UDS_ACCESS_TIME
The last time the file was opened. Required time format: seconds since UNIX epoch.
@ UDS_DISPLAY_NAME
If set, contains the label to display instead of the 'real name' in UDS_NAME.
@ UDS_DEFAULT_ACL_STRING
The default access control list serialized into a single string.
@ UDS_NAME
Filename - as displayed in directory listings etc.
@ UDS_TARGET_URL
This file is a shortcut or mount, pointing to an URL in a different hierarchy.
@ UDS_ICON_NAME
Name of the icon, that should be used for displaying.
@ UDS_ACL_STRING
The access control list serialized into a single string.
@ UDS_RECURSIVE_SIZE
For folders, the recursize size of its content.
@ UDS_GUESSED_MIME_TYPE
A MIME type to be used for displaying only.
@ UDS_INODE
Inode number for this file, used to detect hardlinks.
@ UDS_USER
User Name of the file owner Not present on local fs, use UDS_LOCAL_USER_ID.
@ UDS_EXTENDED_ACL
Indicates that the entry has extended ACL entries.
@ UDS_ACCESS
Access permissions (part of the mode returned by stat)
bool contains(uint field) const
check existence of a field
int count() const
count fields
static KNFSShare * instance()
Returns the one and only instance of KNFSShare.
static bool supportsWriting(const QUrl &url)
Returns whether the protocol can store data to URLs.
static KSambaShare * instance()
QList< KUserGroup > groups(uint maxCount=KCOREADDONS_UINT_MAX) const
QString loginName() const
QString i18n(const char *text, const TYPE &arg...)
AKONADI_CALENDAR_EXPORT QString displayName(Akonadi::ETMCalendar *calendar, const Akonadi::Collection &collection)
KCOREADDONS_EXPORT Type fileSystemType(const QString &path)
A namespace for KIO globals.
KIOCORE_EXPORT QString convertSize(KIO::filesize_t size)
Converts size from bytes to the string representation.
qulonglong filesize_t
64-bit file size
@ StatDefaultDetails
Default StatDetail flag when creating a StatJob.
KIOCORE_EXPORT QString decodeFileName(const QString &str)
Decodes (from the filename to the text displayed) This doesn't do anything anymore,...
QString path(const QString &relativePath)
VehicleSection::Type type(QStringView coachNumber, QStringView coachClassification)
KCOREADDONS_EXPORT QString tildeCollapse(const QString &path)
const char * constData() const const
void resize(qsizetype newSize, char c)
qsizetype size() const const
void truncate(qsizetype pos)
QDateTime fromSecsSinceEpoch(qint64 secs)
QDateTime toLocalTime() const const
qint64 toSecsSinceEpoch() const const
QByteArray encodeName(const QString &fileName)
QString symLinkTarget() const const
bool isReadable() const const
bool isWritable() const const
void append(QList< T > &&value)
const_iterator cbegin() const const
const_iterator cend() const const
qsizetype count() const const
bool isEmpty() const const
void reserve(qsizetype size)
qsizetype size() const const
QString toString(QDate date, FormatType format) const const
bool contains(const Key &key) const const
iterator insert(const Key &key, const T &value)
T value(const Key &key, const T &defaultValue) const const
QMimeType mimeTypeForFile(const QFileInfo &fileInfo, MatchMode mode) const const
QMimeType mimeTypeForName(const QString &nameOrAlias) const const
QMimeType mimeTypeForUrl(const QUrl &url) const const
QList< QMimeType > mimeTypesForFileName(const QString &fileName) const const
bool inherits(const QString &mimeTypeName) const const
QString fromLatin1(QByteArrayView str)
QString fromUtf8(QByteArrayView str)
bool isEmpty() const const
qsizetype lastIndexOf(QChar ch, Qt::CaseSensitivity cs) const const
qsizetype length() const const
QString simplified() const const
bool startsWith(QChar c, Qt::CaseSensitivity cs) const const
QStringView mid(qsizetype start, qsizetype length) const const
QUrl adjusted(FormattingOptions options) const const
QUrl fromLocalFile(const QString &localFile)
bool isEmpty() const const
bool isValid() const const
QString path(ComponentFormattingOptions options) const const
QString scheme() const const
void setPath(const QString &path, ParsingMode mode)
QString toLocalFile() const const
QVariant fromValue(T &&value)
static KUserId currentUserId()