7#include <QtCore/qlibraryinfo.h>
8#include <QtCore/qthread.h>
9#include <QtCore/qwaitcondition.h>
19 if (path.at(0) ==
'/')
21 if (path.at(0) ==
':' && path.size() >= 2 && path.at(1) ==
'/')
24 if (path.length() >= 2 && path.at(1) ==
':')
32 return QDir::cleanPath(isRelative(path) ? (QDir::currentPath() +
'/' + path) : path);
37 return QFileSystemEntry::isRootPath(path);
44 const QStringList &filterNames,
const QStringList &m_entries);
51 const QStringList m_entries;
56 QDirListing::IteratorFlags filters,
57 const QStringList &filterNames,
58 const QStringList &entries)
69 if (m_index >= m_entries.size())
78 if (m_index == 0 || m_index > m_entries.size())
80 return m_entries.at(m_index - 1);
83QQmlPreviewFileEngine::QQmlPreviewFileEngine(
const QString &file,
const QString &absolute,
85 m_name(file), m_absolute(absolute), m_loader(loader)
90void QQmlPreviewFileEngine::setFileName(
const QString &file)
93 m_absolute = absolutePath(file);
96 m_contents.setData(QByteArray());
101bool QQmlPreviewFileEngine::open(QIODevice::OpenMode flags,
102 std::optional<QFile::Permissions> permissions)
105 case QQmlPreviewFileLoader::File:
106 return m_contents.open(flags);
107 case QQmlPreviewFileLoader::Directory:
109 case QQmlPreviewFileLoader::Fallback:
110 return m_fallback->open(flags, permissions);
112 Q_UNREACHABLE_RETURN(
false);
116bool QQmlPreviewFileEngine::close()
119 case QQmlPreviewFileLoader::Fallback:
120 return m_fallback->close();
121 case QQmlPreviewFileLoader::File:
124 case QQmlPreviewFileLoader::Directory:
127 Q_UNREACHABLE_RETURN(
false);
131qint64 QQmlPreviewFileEngine::size()
const
133 return m_fallback ? m_fallback->size() : m_contents.size();
136qint64 QQmlPreviewFileEngine::pos()
const
138 return m_fallback ? m_fallback->pos() : m_contents.pos();
141bool QQmlPreviewFileEngine::seek(qint64 newPos)
143 return m_fallback? m_fallback->seek(newPos) : m_contents.seek(newPos);
146qint64 QQmlPreviewFileEngine::read(
char *data, qint64 maxlen)
148 return m_fallback ? m_fallback->read(data, maxlen) : m_contents.read(data, maxlen);
151QAbstractFileEngine::FileFlags QQmlPreviewFileEngine::fileFlags(
152 QAbstractFileEngine::FileFlags type)
const
155 return m_fallback->fileFlags(type);
157 QAbstractFileEngine::FileFlags ret;
159 if (type & PermsMask) {
160 ret |= QAbstractFileEngine::FileFlags(
161 ReadOwnerPerm | ReadUserPerm | ReadGroupPerm | ReadOtherPerm);
164 if (type & TypesMask) {
165 if (m_result == QQmlPreviewFileLoader::Directory)
166 ret |= DirectoryType;
171 if (type & FlagsMask) {
173 if (isRootPath(m_name))
180QString QQmlPreviewFileEngine::fileName(QAbstractFileEngine::FileName file)
const
183 return m_fallback->fileName(file);
185 if (file == BaseName) {
186 int slashPos = m_name.lastIndexOf(
'/');
189 return m_name.mid(slashPos + 1);
190 }
else if (file == PathName || file == AbsolutePathName) {
191 const QString path = (file == AbsolutePathName) ? m_absolute : m_name;
192 const int slashPos = path.lastIndexOf(
'/');
195 else if (slashPos == 0)
197 return path.left(slashPos);
198 }
else if (file == CanonicalName || file == CanonicalPathName) {
199 if (file == CanonicalPathName) {
200 const int slashPos = m_absolute.lastIndexOf(
'/');
202 return m_absolute.left(slashPos);
209uint QQmlPreviewFileEngine::ownerId(QAbstractFileEngine::FileOwner owner)
const
211 return m_fallback ? m_fallback->ownerId(owner) :
static_cast<uint>(-2);
214QAbstractFileEngine::IteratorUniquePtr QQmlPreviewFileEngine::beginEntryList(
215 const QString &path, QDirListing::IteratorFlags filters,
const QStringList &filterNames)
217 return m_fallback ? m_fallback->beginEntryList(path, filters, filterNames)
218 : std::make_unique<QQmlPreviewFileEngineIterator>(
219 path, filters, filterNames, m_entries);
222QAbstractFileEngine::IteratorUniquePtr QQmlPreviewFileEngine::endEntryList()
224 return m_fallback ? m_fallback->endEntryList() :
nullptr;
227bool QQmlPreviewFileEngine::flush()
229 return m_fallback ? m_fallback->flush() :
true;
232bool QQmlPreviewFileEngine::syncToDisk()
234 return m_fallback ? m_fallback->syncToDisk() :
false;
237bool QQmlPreviewFileEngine::isSequential()
const
239 return m_fallback ? m_fallback->isSequential() : m_contents.isSequential();
242bool QQmlPreviewFileEngine::remove()
244 return m_fallback ? m_fallback->remove() :
false;
247bool QQmlPreviewFileEngine::copy(
const QString &newName)
249 return m_fallback ? m_fallback->copy(newName) :
false;
252bool QQmlPreviewFileEngine::rename(
const QString &newName)
254 return m_fallback ? m_fallback->rename(newName) :
false;
257bool QQmlPreviewFileEngine::renameOverwrite(
const QString &newName)
259 return m_fallback ? m_fallback->renameOverwrite(newName) :
false;
262bool QQmlPreviewFileEngine::link(
const QString &newName)
264 return m_fallback ? m_fallback->link(newName) :
false;
267bool QQmlPreviewFileEngine::mkdir(
const QString &dirName,
bool createParentDirectories,
268 std::optional<QFile::Permissions> permissions)
const
270 return m_fallback ? m_fallback->mkdir(dirName, createParentDirectories, permissions) :
false;
273bool QQmlPreviewFileEngine::rmdir(
const QString &dirName,
bool recurseParentDirectories)
const
275 return m_fallback ? m_fallback->rmdir(dirName, recurseParentDirectories) :
false;
278bool QQmlPreviewFileEngine::setSize(qint64 size)
281 case QQmlPreviewFileLoader::Fallback:
282 return m_fallback->setSize(size);
283 case QQmlPreviewFileLoader::File:
284 if (size < 0 || size > std::numeric_limits<
int>::max())
286 m_contents.buffer().resize(
static_cast<
int>(size));
288 case QQmlPreviewFileLoader::Directory:
291 Q_UNREACHABLE_RETURN(
false);
295bool QQmlPreviewFileEngine::caseSensitive()
const
297 return m_fallback ? m_fallback->caseSensitive() :
true;
300bool QQmlPreviewFileEngine::isRelativePath()
const
302 return m_fallback ? m_fallback->isRelativePath() : isRelative(m_name);
305bool QQmlPreviewFileEngine::setPermissions(uint perms)
307 return m_fallback ? m_fallback->setPermissions(perms) :
false;
310QByteArray QQmlPreviewFileEngine::id()
const
312 return m_fallback ? m_fallback->id() : QByteArray();
315QString QQmlPreviewFileEngine::owner(FileOwner owner)
const
317 return m_fallback ? m_fallback->owner(owner) : QString();
320QDateTime QQmlPreviewFileEngine::fileTime(QFile::FileTime time)
const
324 return m_fallback ? m_fallback->fileTime(time) : QDateTime::currentDateTime();
327int QQmlPreviewFileEngine::handle()
const
329 return m_fallback ? m_fallback->handle() : -1;
332qint64 QQmlPreviewFileEngine::readLine(
char *data, qint64 maxlen)
334 return m_fallback ? m_fallback->readLine(data, maxlen) : m_contents.readLine(data, maxlen);
337qint64 QQmlPreviewFileEngine::write(
const char *data, qint64 len)
339 return m_fallback ? m_fallback->write(data, len) : m_contents.write(data, len);
342bool QQmlPreviewFileEngine::extension(Extension extension,
const ExtensionOption *option, ExtensionReturn *output)
344 return m_fallback ? m_fallback->extension(extension, option, output) :
false;
347bool QQmlPreviewFileEngine::supportsExtension(Extension extension)
const
349 return m_fallback ? m_fallback->supportsExtension(extension) :
false;
352void QQmlPreviewFileEngine::load()
const
360 QMutexLocker loadLocker(m_loader->loadMutex());
362 m_result = m_loader->load(m_absolute);
364 case QQmlPreviewFileLoader::File:
365 m_contents.setData(m_loader->contents());
367 case QQmlPreviewFileLoader::Directory:
368 m_entries = m_loader->entries();
370 case QQmlPreviewFileLoader::Fallback:
371 m_fallback = QAbstractFileEngine::create(m_name);
373 case QQmlPreviewFileLoader::Unknown:
385 const QString &fileName)
const
387 using namespace Qt::StringLiterals;
388 static QList<QLatin1StringView> prohibitedSuffixes {
390 ".qmlc"_L1,
".jsc"_L1,
".mjsc"_L1,
393 ".dll"_L1,
".so"_L1,
".dylib"_L1
396 for (QLatin1StringView suffix : prohibitedSuffixes) {
397 if (fileName.endsWith(suffix))
401 if (isRootPath(fileName))
404 QString relative = fileName;
405 while (relative.endsWith(
'/'))
408 if (relative.isEmpty() || relative ==
":")
411 const QString absolute = relative.startsWith(
':') ? relative : absolutePath(relative);
413 if (m_loader->isBlacklisted(absolute))
416 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)