Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qfilesystemengine_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:critical reason:data-parser
4
5#ifndef QFILESYSTEMENGINE_P_H
6#define QFILESYSTEMENGINE_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include "qfile.h"
22#include <QtCore/qhashfunctions.h>
23#include <QtCore/private/qsystemerror_p.h>
24
25#include <array>
26#include <memory>
27#include <optional>
28
30
32{
33#if defined(Q_OS_WIN)
34 // FILE_ID_128 is 128-bit; store as two quint64 to avoid __int128.
35 using FileIdType = std::array<quint64, 2>;
36#else
37 using FileIdType = std::array<quint64, 1>; // 64-bit inode number
38#endif
39
40 quint64 volumeId = 0; // st_dev (Unix) / volume serial (Windows)
41 FileIdType fileId = {}; // st_ino (Unix) / file id (Windows)
42
43 bool isValid() const noexcept { return volumeId != 0 || fileId != FileIdType{}; }
44
45 Q_AUTOTEST_EXPORT QByteArray toByteArray() const;
46
47 friend bool operator==(const QFileSystemNativeId &lhs,
48 const QFileSystemNativeId &rhs) noexcept
49 { return lhs.volumeId == rhs.volumeId && lhs.fileId == rhs.fileId; }
50 friend bool operator!=(const QFileSystemNativeId &lhs,
51 const QFileSystemNativeId &rhs) noexcept
52 { return !(lhs == rhs); }
53
54 friend size_t qHash(const QFileSystemNativeId &id, size_t seed = 0) noexcept
55 { return qHashMulti(seed, id.volumeId, qHashRange(id.fileId.begin(), id.fileId.end())); }
56};
57
59bool qCheckFileNameFail(const char *msg, const char *file, int line, const char *function);
60
61template <typename E>
62bool qCheckFileName(const E &entry, const char *file, int line, const char *function)
63{
64 if constexpr (std::is_same_v<QFileSystemEntry, E>) {
65 return qCheckFileName(entry.nativeFilePath(), file, line, function);
66 } else {
67 typename E::value_type null = {};
68 if (Q_UNLIKELY(entry.isEmpty()))
69 return qCheckFileNameFail("Empty filename passed to function", file, line, function);
70 if (Q_UNLIKELY(entry.contains(null)))
71 return qCheckFileNameFail("Broken filename passed to function", file, line, function);
72 return true;
73 }
74}
75
76#define Q_CHECK_FILE_NAME(name, result)
77 do {
78 if (!qCheckFileName(name, QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC))
79 return (result);
80 } while (false)
81
82Q_CORE_EXPORT bool qt_isCaseSensitive(const QFileSystemEntry &entry, QFileSystemMetaData &data);
83
84class Q_AUTOTEST_EXPORT QFileSystemEngine
85{
86public:
87 using TriStateResult = QAbstractFileEngine::TriStateResult;
88
89 static bool isCaseSensitive(const QFileSystemEntry &entry, QFileSystemMetaData &data);
90
91 static QFileSystemEntry getLinkTarget(const QFileSystemEntry &link, QFileSystemMetaData &data);
92 static QFileSystemEntry getRawLinkPath(const QFileSystemEntry &link,
93 QFileSystemMetaData &data);
94 static QFileSystemEntry getJunctionTarget(const QFileSystemEntry &link, QFileSystemMetaData &data);
95 static QFileSystemEntry canonicalName(const QFileSystemEntry &entry, QFileSystemMetaData &data);
96 static QFileSystemEntry absoluteName(const QFileSystemEntry &entry);
97 static QByteArray id(const QFileSystemEntry &entry) { return nativeId(entry).toByteArray(); }
98 static QFileSystemNativeId nativeId(const QFileSystemEntry &entry);
99 static QString resolveUserName(const QFileSystemEntry &entry, QFileSystemMetaData &data);
100 static QString resolveGroupName(const QFileSystemEntry &entry, QFileSystemMetaData &data);
101
102#if defined(Q_OS_UNIX)
103 static QString resolveUserName(uint userId);
104 static QString resolveGroupName(uint groupId);
105#endif
106
107#if defined(Q_OS_DARWIN)
108 static QString bundleName(const QFileSystemEntry &entry);
109#else
110 static QString bundleName(const QFileSystemEntry &) { return QString(); }
111#endif
112
113 static bool fillMetaData(const QFileSystemEntry &entry, QFileSystemMetaData &data,
114 QFileSystemMetaData::MetaDataFlags what);
115#if defined(Q_OS_UNIX)
116 static TriStateResult cloneFile(int srcfd, int dstfd, const QFileSystemMetaData &knownData);
117 static bool fillMetaData(int fd, QFileSystemMetaData &data); // what = PosixStatFlags
118 static QByteArray id(int fd) { return nativeId(fd).toByteArray(); }
119 static QFileSystemNativeId nativeId(int fd);
120 static bool setFileTime(int fd, const QDateTime &newDate,
121 QFile::FileTime whatTime, QSystemError &error);
122 static bool setPermissions(int fd, QFile::Permissions permissions, QSystemError &error);
123#endif
124#if defined(Q_OS_WIN)
125 static QFileSystemEntry junctionTarget(const QFileSystemEntry &link, QFileSystemMetaData &data);
126 static bool uncListSharesOnServer(const QString &server, QStringList *list); //Used also by QFSFileEngineIterator::hasNext()
127 static bool fillMetaData(int fd, QFileSystemMetaData &data,
128 QFileSystemMetaData::MetaDataFlags what = QFileSystemMetaData::WinStatFlags);
129 static bool fillMetaData(HANDLE fHandle, QFileSystemMetaData &data,
130 QFileSystemMetaData::MetaDataFlags what);
131 static bool fillPermissions(const QFileSystemEntry &entry, QFileSystemMetaData &data,
132 QFileSystemMetaData::MetaDataFlags what);
133 static QByteArray id(HANDLE fHandle) { return nativeId(fHandle).toByteArray(); }
134 static QFileSystemNativeId nativeId(HANDLE fHandle);
135 static bool setFileTime(HANDLE fHandle, const QDateTime &newDate,
136 QFile::FileTime whatTime, QSystemError &error);
137 static QString owner(const QFileSystemEntry &entry, QAbstractFileEngine::FileOwner own);
138 static QString nativeAbsoluteFilePath(const QString &path);
139 static bool isDirPath(const QString &path, bool *existed);
140#endif
141 //homePath, rootPath and tempPath shall return clean paths
142 static QString homePath();
143 static QString rootPath();
144 static QString tempPath();
145
146 static bool createDirectory(const QFileSystemEntry &entry, bool createParents,
147 std::optional<QFile::Permissions> permissions = std::nullopt)
148 {
149 if (createParents)
150 return mkpath(entry, permissions);
151 return mkdir(entry, permissions);
152 }
153
154 static bool mkdir(const QFileSystemEntry &entry,
155 std::optional<QFile::Permissions> permissions = std::nullopt);
156 static bool mkpath(const QFileSystemEntry &entry,
157 std::optional<QFile::Permissions> permissions = std::nullopt);
158
159 static bool removeDirectory(const QFileSystemEntry &entry, bool removeEmptyParents)
160 {
161 if (removeEmptyParents)
162 return rmpath(entry);
163 return rmdir(entry);
164 }
165
166 static bool rmdir(const QFileSystemEntry &entry);
167 static bool rmpath(const QFileSystemEntry &entry);
168 static bool supportsRmdirRecursively() noexcept;
169 static bool rmdirRecursively(const QFileSystemEntry &entry, QSystemError &error);
170
171 static bool createLink(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
172
173 static bool copyFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
174 static bool supportsMoveFileToTrash();
175 static bool moveFileToTrash(const QFileSystemEntry &source, QFileSystemEntry &newLocation, QSystemError &error);
176 static bool renameFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
177 static bool renameOverwriteFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
178 static bool removeFile(const QFileSystemEntry &entry, QSystemError &error);
179
180 static bool setPermissions(const QFileSystemEntry &entry, QFile::Permissions permissions,
181 QSystemError &error);
182
183 // unused, therefore not implemented
184 static bool setFileTime(const QFileSystemEntry &entry, const QDateTime &newDate,
185 QFile::FileTime whatTime, QSystemError &error);
186
187 static bool setCurrentPath(const QFileSystemEntry &entry);
188 static QFileSystemEntry currentPath();
189
190 static std::unique_ptr<QAbstractFileEngine>
191 createLegacyEngine(QFileSystemEntry &entry, QFileSystemMetaData &data);
192 static std::unique_ptr<QAbstractFileEngine>
193 createLegacyEngine(const QString &fileName);
194
195private:
196 static QString slowCanonicalized(const QString &path);
197#if defined(Q_OS_WIN)
198 static void clearWinStatData(QFileSystemMetaData &data);
199#else
200 /*maybe inline*/ static
201 QFileSystemEntry canonicalNameViaRealpath(const QFileSystemEntry &entry, QFileSystemMetaData &data);
202#endif
203};
204
205QT_END_NAMESPACE
206
207#endif // include guard
The QAbstractFileEngineIterator class provides an iterator interface for custom file engines.
virtual ~QAbstractFileEnginePrivate()
QAbstractFileEnginePrivate(QAbstractFileEngine *q)
QAbstractFileEngine *const q_ptr
\inmodule QtCore \reentrant
\inmodule QtCore
Definition qdirlisting.h:71
QDirPrivate(const QDirPrivate &copy)
Definition qdir.cpp:106
@ UrlNormalizationMode
Definition qdir_p.h:34
@ RemotePath
Definition qdir_p.h:35
MetaDataClearing
Definition qdir_p.h:64
@ IncludingMetaData
Definition qdir_p.h:64
void clearCache(MetaDataClearing mode)
Definition qdir.cpp:471
void initFileLists(const QDir &dir) const
Definition qdir.cpp:456
bool exists() const
Definition qdir.cpp:123
QString resolveAbsoluteEntry() const
Definition qdir.cpp:179
bool operator()(const QDirSortItem &, const QDirSortItem &) const
Definition qdir.cpp:259
QDirSortItemComparator(QDir::SortFlags flags, QCollator *coll=nullptr)
Definition qdir.cpp:233
int compareStrings(const QString &a, const QString &b, Qt::CaseSensitivity cs) const
Definition qdir.cpp:249
\inmodule QtCore
\inmodule QtCore
Definition qmutex.h:347
Combined button and popup list for selecting options.
std::unique_ptr< QAbstractFileEngine > qt_custom_file_engine_handler_create(const QString &path)
static void appendIfMatchesNonDirListingFlags(const QDirListing::DirEntry &dirEntry, QDir::Filters filters, QFileInfoList &l)
Definition qdir.cpp:403
static qsizetype rootLength(QStringView name, QDirPrivate::PathNormalizations flags)
Definition qdir.cpp:57
static bool qt_cleanPath(QString *path)
Definition qdir.cpp:2537
QDebug operator<<(QDebug debug, QDir::Filters filters)
Definition qdir.cpp:2620
QDebug operator<<(QDebug debug, const QDir &dir)
Definition qdir.cpp:2671
static QDebug operator<<(QDebug debug, QDir::SortFlags sorting)
Definition qdir.cpp:2647
bool qt_isPathNormalized(const QString &path, QDirPrivate::PathNormalizations flags) noexcept
Definition qdir.cpp:2387
bool comparesEqual(const QDir &lhs, const QDir &rhs)
Definition qdir.cpp:1974
static bool treatAsAbsolute(const QString &path)
Definition qdir.cpp:869
static bool checkPermissions(const QDirListing::DirEntry &dirEntry, QDir::Filters filters)
Definition qdir.cpp:365
bool qt_normalizePathSegments(QString *path, QDirPrivate::PathNormalizations flags)
Definition qdir.cpp:2416
static qsizetype findStartOfNonNormalizedPath(const QChar *in, qsizetype i, qsizetype n, QDirPrivate::PathNormalizations flags) noexcept
Definition qdir.cpp:2362
static bool checkDotOrDotDot(const QDirListing::DirEntry &dirEntry, QDir::Filters filters)
Definition qdir.cpp:381
Q_AUTOTEST_EXPORT bool qt_normalizePathSegments(QString *path, QDirPrivate::PathNormalizations flags)
Definition qdir.cpp:2416
bool qt_isPathNormalized(const QString &path, QDirPrivate::PathNormalizations flags) noexcept
Definition qdir.cpp:2387
Q_DECL_COLD_FUNCTION bool qCheckFileNameFail(const char *msg, const char *file, int line, const char *function)
Q_CORE_EXPORT bool qt_isCaseSensitive(const QFileSystemEntry &entry, QFileSystemMetaData &data)
bool qCheckFileName(const E &entry, const char *file, int line, const char *function)
QFileInfo item
Definition qdir.cpp:221
QString suffix_cache
Definition qdir.cpp:220
QDirSortItem(const QFileInfo &fi, QDir::SortFlags sort)
Definition qdir.cpp:209
QDirSortItem()=default
QString filename_cache
Definition qdir.cpp:219
friend size_t qHash(const QFileSystemNativeId &id, size_t seed=0) noexcept
friend bool operator==(const QFileSystemNativeId &lhs, const QFileSystemNativeId &rhs) noexcept
friend bool operator!=(const QFileSystemNativeId &lhs, const QFileSystemNativeId &rhs) noexcept
bool isValid() const noexcept