Utils: Add support for QDirListing

qtbase added another way to list directories in 7c663d04d7635da519a4a72ae4c75e6355d5c67e. We add support
for it here.

Change-Id: Id328c0c826c2dc424106835ab66fc21066824777
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Marcus Tillmanns
2024-09-09 12:07:21 +02:00
parent 994e3b908c
commit 81d4e8a374
3 changed files with 79 additions and 0 deletions

View File

@@ -15,6 +15,38 @@
namespace Utils {
namespace Internal {
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
inline std::pair<QDir::Filters, QDirIterator::IteratorFlags> convertQDirListingIteratorFlags(
QDirListing::IteratorFlags flags)
{
QDir::Filters filters = QDir::Files | QDir::Dirs | QDir::System | QDir::NoDotAndDotDot;
QDirIterator::IteratorFlags iteratorFlags = QDirIterator::NoIteratorFlags;
if (flags & QDirListing::IteratorFlag::ExcludeFiles)
filters.setFlag(QDir::Files, false);
if (flags & QDirListing::IteratorFlag::ExcludeDirs)
filters.setFlag(QDir::Dirs, false);
if (flags & QDirListing::IteratorFlag::ExcludeSpecial)
filters.setFlag(QDir::System, false);
if (flags & QDirListing::IteratorFlag::CaseSensitive)
filters.setFlag(QDir::CaseSensitive, true);
if (flags & QDirListing::IteratorFlag::IncludeHidden)
filters.setFlag(QDir::Hidden, true);
if (flags & QDirListing::IteratorFlag::IncludeDotAndDotDot) {
filters.setFlag(QDir::NoDot, false);
filters.setFlag(QDir::NoDotDot, false);
}
if (flags & QDirListing::IteratorFlag::Recursive)
iteratorFlags.setFlag(QDirIterator::Subdirectories, true);
if (flags & QDirListing::IteratorFlag::FollowDirSymlinks)
iteratorFlags.setFlag(QDirIterator::FollowSymlinks, true);
return {filters, iteratorFlags};
}
#endif
class DirIterator : public QAbstractFileEngineIterator
{
public:

View File

@@ -66,6 +66,19 @@ public:
}
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
QAbstractFileEngine::IteratorUniquePtr beginEntryList(
const QString &path,
QDirListing::IteratorFlags itFlags,
const QStringList &filterNames) override
{
// We do not support recursive or following symlinks for the Fixed List engine.
Q_ASSERT(itFlags.testFlag(QDirListing::IteratorFlag::Recursive) == false);
const auto [filters, _] = convertQDirListingIteratorFlags(itFlags);
return std::make_unique<DirIterator>(m_children, path, filters, filterNames);
}
IteratorUniquePtr beginEntryList(const QString &path,
QDir::Filters filters,
const QStringList &filterNames) override

View File

@@ -72,6 +72,11 @@ public:
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
IteratorUniquePtr beginEntryList(const QString &path, QDir::Filters filters,
const QStringList &filterNames) final;
IteratorUniquePtr beginEntryList(
const QString &path,
QDirListing::IteratorFlags filters,
const QStringList &filterNames) final;
IteratorUniquePtr endEntryList() final { return {}; }
#else
Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) final;
@@ -379,6 +384,26 @@ bool FSEngineImpl::cloneTo(QAbstractFileEngine *target)
}
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
QAbstractFileEngine::IteratorUniquePtr FSEngineImpl::beginEntryList(
const QString &path, QDirListing::IteratorFlags itFlags, const QStringList &filterNames)
{
const auto [filters, iteratorFlags] = convertQDirListingIteratorFlags(itFlags);
FilePaths paths{m_filePath.pathAppended(".")};
m_filePath.iterateDirectory(
[&paths](const FilePath &p, const FilePathInfo &fi) {
paths.append(p);
FilePathInfoCache::CachedData *data
= new FilePathInfoCache::CachedData{fi, QDateTime::currentDateTime().addSecs(60)};
g_filePathInfoCache.cache(p, data);
return IterationPolicy::Continue;
},
{filterNames, filters, iteratorFlags});
return std::make_unique<DirIterator>(std::move(paths), path, filters, filterNames);
}
QAbstractFileEngine::IteratorUniquePtr FSEngineImpl::beginEntryList(const QString &path,
QDir::Filters filters,
const QStringList &filterNames)
@@ -462,6 +487,15 @@ public:
return std::make_unique<FileIteratorWrapper>(
QFSFileEngine::beginEntryList(path, filters, filterNames));
}
IteratorUniquePtr beginEntryList(
const QString &path,
QDirListing::IteratorFlags filters,
const QStringList &filterNames) override
{
return std::make_unique<FileIteratorWrapper>(
QFSFileEngine::beginEntryList(path, filters, filterNames));
}
#else
Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) final
{