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
271 return m_fallback ? m_fallback->mkdir(dirName, createParentDirectories, permissions) :
false;
274bool QQmlPreviewFileEngine::rmdir(
const QString &dirName,
bool recurseParentDirectories)
const
276 return m_fallback ? m_fallback->rmdir(dirName, recurseParentDirectories) :
false;
279bool QQmlPreviewFileEngine::setSize(qint64 size)
282 case QQmlPreviewFileLoader::Fallback:
283 return m_fallback->setSize(size);
284 case QQmlPreviewFileLoader::File:
285 if (size < 0 || size > std::numeric_limits<
int>::max())
287 m_contents.buffer().resize(
static_cast<
int>(size));
289 case QQmlPreviewFileLoader::Directory:
292 Q_UNREACHABLE_RETURN(
false);
296bool QQmlPreviewFileEngine::caseSensitive()
const
298 return m_fallback ? m_fallback->caseSensitive() :
true;
301bool QQmlPreviewFileEngine::isRelativePath()
const
303 return m_fallback ? m_fallback->isRelativePath() : isRelative(m_name);
306bool QQmlPreviewFileEngine::setPermissions(uint perms)
308 return m_fallback ? m_fallback->setPermissions(perms) :
false;
311QByteArray QQmlPreviewFileEngine::id()
const
313 return m_fallback ? m_fallback->id() : QByteArray();
316QString QQmlPreviewFileEngine::owner(FileOwner owner)
const
318 return m_fallback ? m_fallback->owner(owner) : QString();
321QDateTime QQmlPreviewFileEngine::fileTime(QFile::FileTime time)
const
325 return m_fallback ? m_fallback->fileTime(time) : QDateTime::currentDateTime();
328int QQmlPreviewFileEngine::handle()
const
330 return m_fallback ? m_fallback->handle() : -1;
333qint64 QQmlPreviewFileEngine::readLine(
char *data, qint64 maxlen)
335 return m_fallback ? m_fallback->readLine(data, maxlen) : m_contents.readLine(data, maxlen);
338qint64 QQmlPreviewFileEngine::write(
const char *data, qint64 len)
340 return m_fallback ? m_fallback->write(data, len) : m_contents.write(data, len);
343bool QQmlPreviewFileEngine::extension(Extension extension,
const ExtensionOption *option, ExtensionReturn *output)
345 return m_fallback ? m_fallback->extension(extension, option, output) :
false;
348bool QQmlPreviewFileEngine::supportsExtension(Extension extension)
const
350 return m_fallback ? m_fallback->supportsExtension(extension) :
false;
353void QQmlPreviewFileEngine::load()
const
361 QMutexLocker loadLocker(m_loader->loadMutex());
363 m_result = m_loader->load(m_absolute);
365 case QQmlPreviewFileLoader::File:
366 m_contents.setData(m_loader->contents());
368 case QQmlPreviewFileLoader::Directory:
369 m_entries = m_loader->entries();
371 case QQmlPreviewFileLoader::Fallback:
372 m_fallback = QAbstractFileEngine::create(m_name);
374 case QQmlPreviewFileLoader::Unknown:
386 const QString &fileName)
const
388 using namespace Qt::StringLiterals;
389 static QList<QLatin1StringView> prohibitedSuffixes {
391 ".qmlc"_L1,
".jsc"_L1,
".mjsc"_L1,
394 ".dll"_L1,
".so"_L1,
".dylib"_L1
397 for (QLatin1StringView suffix : prohibitedSuffixes) {
398 if (fileName.endsWith(suffix))
402 if (isRootPath(fileName))
405 QString relative = fileName;
406 while (relative.endsWith(
'/'))
409 if (relative.isEmpty() || relative ==
":")
412 const QString absolute = relative.startsWith(
':') ? relative : absolutePath(relative);
414 if (m_loader->isBlacklisted(absolute))
417 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)