8#include <QtCore/qlibraryinfo.h>
9#include <QtCore/qthread.h>
10#include <QtCore/qwaitcondition.h>
20 if (path.at(0) ==
'/')
22 if (path.at(0) ==
':' && path.size() >= 2 && path.at(1) ==
'/')
25 if (path.length() >= 2 && path.at(1) ==
':')
33 return QDir::cleanPath(isRelative(path) ? (QDir::currentPath() +
'/' + path) : path);
38 return QFileSystemEntry::isRootPath(path);
45 const QStringList &filterNames,
const QStringList &m_entries);
52 const QStringList m_entries;
57 QDirListing::IteratorFlags filters,
58 const QStringList &filterNames,
59 const QStringList &entries)
70 if (m_index >= m_entries.size())
79 if (m_index == 0 || m_index > m_entries.size())
81 return m_entries.at(m_index - 1);
84QQmlPreviewFileEngine::QQmlPreviewFileEngine(
const QString &file,
const QString &absolute,
86 m_name(file), m_absolute(absolute), m_loader(loader)
91void QQmlPreviewFileEngine::setFileName(
const QString &file)
94 m_absolute = absolutePath(file);
97 m_contents.setData(QByteArray());
102bool QQmlPreviewFileEngine::open(QIODevice::OpenMode flags,
103 std::optional<QFile::Permissions> permissions)
106 case QQmlPreviewFileLoader::File:
107 return m_contents.open(flags);
108 case QQmlPreviewFileLoader::Directory:
110 case QQmlPreviewFileLoader::Fallback:
111 return m_fallback->open(flags, permissions);
113 Q_UNREACHABLE_RETURN(
false);
117bool QQmlPreviewFileEngine::close()
120 case QQmlPreviewFileLoader::Fallback:
121 return m_fallback->close();
122 case QQmlPreviewFileLoader::File:
125 case QQmlPreviewFileLoader::Directory:
128 Q_UNREACHABLE_RETURN(
false);
132qint64 QQmlPreviewFileEngine::size()
const
134 return m_fallback ? m_fallback->size() : m_contents.size();
137qint64 QQmlPreviewFileEngine::pos()
const
139 return m_fallback ? m_fallback->pos() : m_contents.pos();
142bool QQmlPreviewFileEngine::seek(qint64 newPos)
144 return m_fallback? m_fallback->seek(newPos) : m_contents.seek(newPos);
147qint64 QQmlPreviewFileEngine::read(
char *data, qint64 maxlen)
149 return m_fallback ? m_fallback->read(data, maxlen) : m_contents.read(data, maxlen);
152QAbstractFileEngine::FileFlags QQmlPreviewFileEngine::fileFlags(
153 QAbstractFileEngine::FileFlags type)
const
156 return m_fallback->fileFlags(type);
158 QAbstractFileEngine::FileFlags ret;
160 if (type & PermsMask) {
161 ret |= QAbstractFileEngine::FileFlags(
162 ReadOwnerPerm | ReadUserPerm | ReadGroupPerm | ReadOtherPerm);
165 if (type & TypesMask) {
166 if (m_result == QQmlPreviewFileLoader::Directory)
167 ret |= DirectoryType;
172 if (type & FlagsMask) {
174 if (isRootPath(m_name))
181QString QQmlPreviewFileEngine::fileName(QAbstractFileEngine::FileName file)
const
184 return m_fallback->fileName(file);
186 if (file == BaseName) {
187 int slashPos = m_name.lastIndexOf(
'/');
190 return m_name.mid(slashPos + 1);
191 }
else if (file == PathName || file == AbsolutePathName) {
192 const QString path = (file == AbsolutePathName) ? m_absolute : m_name;
193 const int slashPos = path.lastIndexOf(
'/');
196 else if (slashPos == 0)
198 return path.left(slashPos);
199 }
else if (file == CanonicalName || file == CanonicalPathName) {
200 if (file == CanonicalPathName) {
201 const int slashPos = m_absolute.lastIndexOf(
'/');
203 return m_absolute.left(slashPos);
210uint QQmlPreviewFileEngine::ownerId(QAbstractFileEngine::FileOwner owner)
const
212 return m_fallback ? m_fallback->ownerId(owner) :
static_cast<uint>(-2);
215QAbstractFileEngine::IteratorUniquePtr QQmlPreviewFileEngine::beginEntryList(
216 const QString &path, QDirListing::IteratorFlags filters,
const QStringList &filterNames)
218 return m_fallback ? m_fallback->beginEntryList(path, filters, filterNames)
219 : std::make_unique<QQmlPreviewFileEngineIterator>(
220 path, filters, filterNames, m_entries);
223QAbstractFileEngine::IteratorUniquePtr QQmlPreviewFileEngine::endEntryList()
225 return m_fallback ? m_fallback->endEntryList() :
nullptr;
228bool QQmlPreviewFileEngine::flush()
230 return m_fallback ? m_fallback->flush() :
true;
233bool QQmlPreviewFileEngine::syncToDisk()
235 return m_fallback ? m_fallback->syncToDisk() :
false;
238bool QQmlPreviewFileEngine::isSequential()
const
240 return m_fallback ? m_fallback->isSequential() : m_contents.isSequential();
243bool QQmlPreviewFileEngine::remove()
245 return m_fallback ? m_fallback->remove() :
false;
248bool QQmlPreviewFileEngine::copy(
const QString &newName)
250 return m_fallback ? m_fallback->copy(newName) :
false;
253bool QQmlPreviewFileEngine::rename(
const QString &newName)
255 return m_fallback ? m_fallback->rename(newName) :
false;
258bool QQmlPreviewFileEngine::renameOverwrite(
const QString &newName)
260 return m_fallback ? m_fallback->renameOverwrite(newName) :
false;
263bool QQmlPreviewFileEngine::link(
const QString &newName)
265 return m_fallback ? m_fallback->link(newName) :
false;
268bool QQmlPreviewFileEngine::mkdir(
const QString &dirName,
bool createParentDirectories,
269 std::optional<QFile::Permissions> permissions)
const
272 return m_fallback->mkdir(dirName, createParentDirectories, permissions);
274 if (isRelative(dirName))
279 return QAbstractFileEngine::create(QDir::rootPath())
280 ->mkdir(dirName, createParentDirectories, permissions);
283bool QQmlPreviewFileEngine::rmdir(
const QString &dirName,
bool recurseParentDirectories)
const
286 m_fallback->rmdir(dirName, recurseParentDirectories);
288 if (isRelative(dirName))
293 return QAbstractFileEngine::create(QDir::rootPath())
294 ->rmdir(dirName, recurseParentDirectories);
297bool QQmlPreviewFileEngine::setSize(qint64 size)
300 case QQmlPreviewFileLoader::Fallback:
301 return m_fallback->setSize(size);
302 case QQmlPreviewFileLoader::File:
303 if (size < 0 || size > std::numeric_limits<
int>::max())
305 m_contents.buffer().resize(
static_cast<
int>(size));
307 case QQmlPreviewFileLoader::Directory:
310 Q_UNREACHABLE_RETURN(
false);
314bool QQmlPreviewFileEngine::caseSensitive()
const
316 return m_fallback ? m_fallback->caseSensitive() :
true;
319bool QQmlPreviewFileEngine::isRelativePath()
const
321 return m_fallback ? m_fallback->isRelativePath() : isRelative(m_name);
324bool QQmlPreviewFileEngine::setPermissions(uint perms)
326 return m_fallback ? m_fallback->setPermissions(perms) :
false;
329QByteArray QQmlPreviewFileEngine::id()
const
331 return m_fallback ? m_fallback->id() : QByteArray();
334QString QQmlPreviewFileEngine::owner(FileOwner owner)
const
336 return m_fallback ? m_fallback->owner(owner) : QString();
339QDateTime QQmlPreviewFileEngine::fileTime(QFile::FileTime time)
const
343 return m_fallback ? m_fallback->fileTime(time) : QDateTime::currentDateTime();
346int QQmlPreviewFileEngine::handle()
const
348 return m_fallback ? m_fallback->handle() : -1;
351qint64 QQmlPreviewFileEngine::readLine(
char *data, qint64 maxlen)
353 return m_fallback ? m_fallback->readLine(data, maxlen) : m_contents.readLine(data, maxlen);
356qint64 QQmlPreviewFileEngine::write(
const char *data, qint64 len)
358 return m_fallback ? m_fallback->write(data, len) : m_contents.write(data, len);
361bool QQmlPreviewFileEngine::extension(Extension extension,
const ExtensionOption *option, ExtensionReturn *output)
363 return m_fallback ? m_fallback->extension(extension, option, output) :
false;
366bool QQmlPreviewFileEngine::supportsExtension(Extension extension)
const
368 return m_fallback ? m_fallback->supportsExtension(extension) :
false;
371void QQmlPreviewFileEngine::load()
const
379 QMutexLocker loadLocker(m_loader->loadMutex());
381 m_result = m_loader->load(m_absolute);
383 case QQmlPreviewFileLoader::File:
384 m_contents.setData(m_loader->contents());
386 case QQmlPreviewFileLoader::Directory:
387 m_entries = m_loader->entries();
389 case QQmlPreviewFileLoader::Fallback:
390 m_fallback = QAbstractFileEngine::create(m_name);
392 case QQmlPreviewFileLoader::Unknown:
404 const QString &fileName)
const
406 using namespace Qt::StringLiterals;
407 static QList<QLatin1StringView> prohibitedSuffixes {
409 ".qmlc"_L1,
".jsc"_L1,
".mjsc"_L1,
412 ".dll"_L1,
".so"_L1,
".dylib"_L1
415 for (QLatin1StringView suffix : prohibitedSuffixes) {
416 if (fileName.endsWith(suffix))
420 if (isRootPath(fileName))
423 QString relative = fileName;
424 while (relative.endsWith(
'/'))
427 if (relative.isEmpty() || relative ==
":")
430 const QString absolute = relative.startsWith(
':') ? relative : absolutePath(relative);
432 if (m_loader->isBlacklisted(absolute))
435 return std::make_unique<QQmlPreviewFileEngine>(relative, absolute, m_loader.data());
std::unique_ptr< QAbstractFileEngine > create(const QString &fileName) const override
If this file handler can handle fileName, this method creates a file engine and returns it wrapped in...
QString currentFileName() const override
This pure virtual function returns the name of the current directory entry, excluding the path.
QQmlPreviewFileEngineIterator(const QString &path, QDirListing::IteratorFlags filters, const QStringList &filterNames, const QStringList &m_entries)
~QQmlPreviewFileEngineIterator()
bool advance() override
This pure virtual function advances the iterator to the next directory entry; if the operation was su...
static QT_BEGIN_NAMESPACE bool isRelative(const QString &path)
static QString absolutePath(const QString &path)
bool isRootPath(const QString &path)