6#include <QtCore/qdir.h>
7#include <QtCore/qset.h>
8#include <QtCore/qstringbuilder.h>
9#include <QtCore/private/qabstractfileengine_p.h>
10#ifdef QT_BUILD_CORE_LIB
11#include <QtCore/private/qresource_p.h>
13#include <QtCore/private/qduplicatetracker_p.h>
19#ifdef QT_NO_WARNING_OUTPUT
20 Q_UNUSED(msg); Q_UNUSED(file); Q_UNUSED(line); Q_UNUSED(function);
22 QMessageLogger(file, line, function).warning(
"%s", msg);
29
30
31
32
33
34
35
36
37
38
39
40
41
44
45
46
47
48
49QString QFileSystemEngine::slowCanonicalized(
const QString &path)
55 const QChar slash(u'/');
56 QString tmpPath = path;
57 qsizetype separatorPos = 0;
58 QSet<QString> nonSymlinks;
59 QDuplicateTracker<QString> known;
61 (
void)known.hasSeen(path);
64 if (separatorPos == 0) {
65 if (tmpPath.size() >= 2 && tmpPath.at(0) == slash && tmpPath.at(1) == slash) {
67 separatorPos = tmpPath.indexOf(slash, 2);
68 }
else if (tmpPath.size() >= 3 && tmpPath.at(1) == u':' && tmpPath.at(2) == slash) {
73 if (separatorPos != -1)
75 separatorPos = tmpPath.indexOf(slash, separatorPos + 1);
76 QString prefix = separatorPos == -1 ? tmpPath : tmpPath.left(separatorPos);
77 if (!nonSymlinks.contains(prefix)) {
80 QString target = fi.symLinkTarget();
81 if (separatorPos != -1) {
82 if (fi.isDir() && !target.endsWith(slash))
84 target.append(QStringView{tmpPath}.mid(separatorPos));
86 tmpPath = QDir::cleanPath(target);
89 if (known.hasSeen(tmpPath))
92 nonSymlinks.insert(prefix);
95 }
while (separatorPos != -1);
97 return QDir::cleanPath(tmpPath);
100static inline bool _q_checkEntry(QFileSystemEntry &entry, QFileSystemMetaData &data,
bool resolvingEntry)
102 if (resolvingEntry) {
103 if (!QFileSystemEngine::fillMetaData(entry, data, QFileSystemMetaData::ExistsAttribute)
113static inline bool _q_checkEntry(std::unique_ptr<QAbstractFileEngine> &engine,
bool resolvingEntry)
115 if (resolvingEntry) {
116 if (!(engine->fileFlags(QAbstractFileEngine::FlagsMask) & QAbstractFileEngine::ExistsFlag)) {
126 std::unique_ptr<QAbstractFileEngine> &engine,
127 bool resolvingEntry =
false)
129 QString
const &filePath = entry.filePath();
130 if ((engine = qt_custom_file_engine_handler_create(filePath)))
131 return _q_checkEntry(engine, resolvingEntry);
133#if defined(QT_BUILD_CORE_LIB)
134 for (qsizetype prefixSeparator = 0; prefixSeparator < filePath.size(); ++prefixSeparator) {
135 QChar
const ch = filePath[prefixSeparator];
140 if (prefixSeparator == 0) {
141 engine = std::make_unique<QResourceFileEngine>(filePath);
142 return _q_checkEntry(engine, resolvingEntry);
145 if (prefixSeparator == 1)
148 const QStringList &paths = QDir::searchPaths(filePath.left(prefixSeparator));
149 for (
int i = 0; i < paths.size(); i++) {
150 entry = QFileSystemEntry(QDir::cleanPath(
151 paths.at(i) % u'/' % QStringView{filePath}.mid(prefixSeparator + 1)));
153 if (_q_createLegacyEngine_recursive(entry, data, engine,
true))
170 return _q_checkEntry(entry, data, resolvingEntry);
176 return QFileSystemEngine::isCaseSensitive(entry, data);
180
181
182
183
184
185
186
187
188
189std::unique_ptr<QAbstractFileEngine>
190QFileSystemEngine::createLegacyEngine(QFileSystemEntry &entry, QFileSystemMetaData &data)
192 QFileSystemEntry copy = entry;
193 std::unique_ptr<QAbstractFileEngine> engine;
195 if (_q_createLegacyEngine_recursive(copy, data, engine))
204std::unique_ptr<QAbstractFileEngine>
205QFileSystemEngine::createLegacyEngine(
const QString &fileName)
207 QFileSystemEntry entry(fileName);
208 QFileSystemMetaData metaData;
209 return createLegacyEngine(entry, metaData);
213QString QFileSystemEngine::resolveUserName(
const QFileSystemEntry &entry, QFileSystemMetaData &metaData)
217 return QFileSystemEngine::owner(entry, QAbstractFileEngine::OwnerUser);
219 if (!metaData.hasFlags(QFileSystemMetaData::UserId))
220 QFileSystemEngine::fillMetaData(entry, metaData, QFileSystemMetaData::UserId);
221 if (!metaData.exists())
223 return resolveUserName(metaData.userId());
228QString QFileSystemEngine::resolveGroupName(
const QFileSystemEntry &entry, QFileSystemMetaData &metaData)
232 return QFileSystemEngine::owner(entry, QAbstractFileEngine::OwnerGroup);
234 if (!metaData.hasFlags(QFileSystemMetaData::GroupId))
235 QFileSystemEngine::fillMetaData(entry, metaData, QFileSystemMetaData::GroupId);
236 if (!metaData.exists())
238 return resolveGroupName(metaData.groupId());
243QFileSystemEntry QFileSystemEngine::getJunctionTarget(
const QFileSystemEntry &link,
244 QFileSystemMetaData &data)
247 return junctionTarget(link, data);
Combined button and popup list for selecting options.
static bool _q_createLegacyEngine_recursive(QFileSystemEntry &entry, QFileSystemMetaData &data, std::unique_ptr< QAbstractFileEngine > &engine, bool resolvingEntry=false)
QT_BEGIN_NAMESPACE bool qCheckFileNameFail(const char *msg, const char *file, int line, const char *function)
Q_CORE_EXPORT bool qt_isCaseSensitive(const QFileSystemEntry &entry, QFileSystemMetaData &data)
static bool _q_checkEntry(QFileSystemEntry &entry, QFileSystemMetaData &data, bool resolvingEntry)
static bool _q_checkEntry(std::unique_ptr< QAbstractFileEngine > &engine, bool resolvingEntry)