diff --git a/src/libs/utils/fsengine/diriterator.h b/src/libs/utils/fsengine/diriterator.h index 54e9d5d2dd3..ba332b94847 100644 --- a/src/libs/utils/fsengine/diriterator.h +++ b/src/libs/utils/fsengine/diriterator.h @@ -8,6 +8,7 @@ #include #include +#include #include @@ -17,14 +18,32 @@ namespace Internal { class DirIterator : public QAbstractFileEngineIterator { public: +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + DirIterator(FilePaths paths, + const QString &path, + QDir::Filters filters, + const QStringList &filterNames) + : QAbstractFileEngineIterator(path, filters, filterNames) +#else DirIterator(FilePaths paths) : QAbstractFileEngineIterator({}, {}) +#endif , m_filePaths(std::move(paths)) , it(m_filePaths.begin()) {} // QAbstractFileEngineIterator interface public: +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + bool advance() override + { + if (!m_filePaths.empty() && m_filePaths.end() != it + 1) { + ++it; + return true; + } + return false; + } +#else QString next() override { if (it == m_filePaths.end()) @@ -35,6 +54,7 @@ public: } bool hasNext() const override { return !m_filePaths.empty() && m_filePaths.end() != it + 1; } +#endif // QT_VERSION_CHECK(6, 8, 0) QString currentFileName() const override { diff --git a/src/libs/utils/fsengine/fileiteratordevicesappender.h b/src/libs/utils/fsengine/fileiteratordevicesappender.h index e2afcf50fe7..4e5b8ca632b 100644 --- a/src/libs/utils/fsengine/fileiteratordevicesappender.h +++ b/src/libs/utils/fsengine/fileiteratordevicesappender.h @@ -6,11 +6,13 @@ #include "../filepath.h" #include "../hostosinfo.h" +#include #include namespace Utils { namespace Internal { +#if QT_VERSION < QT_VERSION_CHECK(6, 8, 0) // Based on http://bloglitb.blogspot.com/2011/12/access-to-private-members-safer.htm template struct PrivateAccess @@ -25,6 +27,7 @@ struct QAFEITag }; template struct PrivateAccess; +#endif class FileIteratorWrapper : public QAbstractFileEngineIterator { @@ -37,11 +40,38 @@ class FileIteratorWrapper : public QAbstractFileEngineIterator public: FileIteratorWrapper(std::unique_ptr &&baseIterator) - : QAbstractFileEngineIterator(baseIterator->filters(), baseIterator->nameFilters()) + : QAbstractFileEngineIterator( +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + baseIterator->path(), +#endif + baseIterator->filters(), baseIterator->nameFilters()) , m_baseIterator(std::move(baseIterator)) - {} + { +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + // Can be called in the constructor since the iterator path + // has already been set + setStatus(); +#endif + } public: +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + bool advance() override + { + if (m_status == State::Ended) + return false; + + const bool res = m_baseIterator->advance(); + if (m_status == State::IteratingRoot && !res) { + // m_baseIterator finished, but we need to advance one last time, so that + // currentFileName() returns FilePath::specialRootPath(). + m_status = State::Ended; + return true; + } + + return res; + } +#else QString next() override { if (m_status == State::Ended) @@ -71,6 +101,7 @@ public: return res; } +#endif QString currentFileName() const override { return m_status == State::Ended ? FilePath::specialRootPath() @@ -94,6 +125,7 @@ private: return p; } +#if QT_VERSION < QT_VERSION_CHECK(6, 8, 0) void setPath() const { if (!m_hasSetPath) { @@ -102,10 +134,15 @@ private: m_hasSetPath = true; } } +#endif private: std::unique_ptr m_baseIterator; + +#if QT_VERSION < QT_VERSION_CHECK(6, 8, 0) mutable bool m_hasSetPath{false}; +#endif + mutable State m_status{State::NotIteratingRoot}; }; diff --git a/src/libs/utils/fsengine/fixedlistfsengine.h b/src/libs/utils/fsengine/fixedlistfsengine.h index 3518b5d0b5a..6875dd63822 100644 --- a/src/libs/utils/fsengine/fixedlistfsengine.h +++ b/src/libs/utils/fsengine/fixedlistfsengine.h @@ -9,6 +9,7 @@ #include "../stringutils.h" #include +#include namespace Utils { namespace Internal { @@ -63,10 +64,20 @@ public: return QAbstractFileEngine::fileName(file); } + +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + IteratorUniquePtr beginEntryList(const QString &path, + QDir::Filters filters, + const QStringList &filterNames) override + { + return std::make_unique(m_children, path, filters, filterNames); + } +#else Iterator *beginEntryList(QDir::Filters /*filters*/, const QStringList & /*filterNames*/) override { return new DirIterator(m_children); } +#endif }; } // namespace Internal diff --git a/src/libs/utils/fsengine/fsengine_impl.cpp b/src/libs/utils/fsengine/fsengine_impl.cpp index 05147709d47..295f0cac747 100644 --- a/src/libs/utils/fsengine/fsengine_impl.cpp +++ b/src/libs/utils/fsengine/fsengine_impl.cpp @@ -295,8 +295,14 @@ bool FSEngineImpl::cloneTo(QAbstractFileEngine *target) return QAbstractFileEngine::cloneTo(target); } +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) +QAbstractFileEngine::IteratorUniquePtr FSEngineImpl::beginEntryList(const QString &path, + QDir::Filters filters, + const QStringList &filterNames) +#else QAbstractFileEngine::Iterator *FSEngineImpl::beginEntryList(QDir::Filters filters, const QStringList &filterNames) +#endif { FilePaths paths{m_filePath.pathAppended(".")}; m_filePath.iterateDirectory( @@ -310,12 +316,11 @@ QAbstractFileEngine::Iterator *FSEngineImpl::beginEntryList(QDir::Filters filter }, {filterNames, filters}); +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + return std::make_unique(std::move(paths), path, filters, filterNames); +#else return new DirIterator(std::move(paths)); -} - -QAbstractFileEngine::Iterator *FSEngineImpl::endEntryList() -{ - return nullptr; +#endif } qint64 FSEngineImpl::read(char *data, qint64 maxlen) diff --git a/src/libs/utils/fsengine/fsengine_impl.h b/src/libs/utils/fsengine/fsengine_impl.h index 6fcba8ac523..8ba1ca0affa 100644 --- a/src/libs/utils/fsengine/fsengine_impl.h +++ b/src/libs/utils/fsengine/fsengine_impl.h @@ -8,6 +8,7 @@ #include #include +#include namespace Utils { namespace Internal { @@ -46,13 +47,25 @@ public: QString fileName(FileName file) const override; uint ownerId(FileOwner) const override; QString owner(FileOwner) const override; + +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + using FileTime = QFile::FileTime; +#endif bool setFileTime(const QDateTime &newDate, FileTime time) override; QDateTime fileTime(FileTime time) const override; void setFileName(const QString &file) override; int handle() const override; bool cloneTo(QAbstractFileEngine *target) override; + +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + IteratorUniquePtr beginEntryList(const QString &path, QDir::Filters filters, + const QStringList &filterNames) override; + IteratorUniquePtr endEntryList() override { return {}; } +#else Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) override; - Iterator *endEntryList() override; + Iterator *endEntryList() override { return nullptr; } +#endif + qint64 read(char *data, qint64 maxlen) override; qint64 readLine(char *data, qint64 maxlen) override; qint64 write(const char *data, qint64 len) override; diff --git a/src/libs/utils/fsengine/fsenginehandler.cpp b/src/libs/utils/fsengine/fsenginehandler.cpp index 2f828537d19..29fe759a861 100644 --- a/src/libs/utils/fsengine/fsenginehandler.cpp +++ b/src/libs/utils/fsengine/fsenginehandler.cpp @@ -46,10 +46,15 @@ static bool isRootPath(const QString &fileName) return fileName.size() == 1 && fileName[0] == '/'; } -QAbstractFileEngine *FSEngineHandler::create(const QString &fileName) const +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) +std::unique_ptr +#else +QAbstractFileEngine * +#endif +FSEngineHandler::create(const QString &fileName) const { if (fileName.startsWith(':')) - return nullptr; + return {}; static const QString rootPath = FilePath::specialRootPath(); static const FilePath rootFilePath = FilePath::fromString(rootPath); @@ -62,7 +67,11 @@ QAbstractFileEngine *FSEngineHandler::create(const QString &fileName) const return rootFilePath.pathAppended(scheme); }); +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + return std::make_unique(removeDoubleSlash(fileName), paths); +#else return new FixedListFSEngine(removeDoubleSlash(fileName), paths); +#endif } if (fixedFileName.startsWith(rootPath)) { @@ -74,20 +83,35 @@ QAbstractFileEngine *FSEngineHandler::create(const QString &fileName) const return root.scheme() == scheme; }); +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + return std::make_unique(removeDoubleSlash(fileName), + filteredRoots); +#else return new FixedListFSEngine(removeDoubleSlash(fileName), filteredRoots); +#endif } } FilePath fixedPath = FilePath::fromString(fixedFileName); - if (fixedPath.needsDevice()) + if (fixedPath.needsDevice()) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + return std::make_unique(removeDoubleSlash(fileName)); +#else return new FSEngineImpl(removeDoubleSlash(fileName)); +#endif + } } - if (isRootPath(fixedFileName)) + if (isRootPath(fixedFileName)) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + return std::make_unique(fileName); +#else return new RootInjectFSEngine(fileName); +#endif + } - return nullptr; + return {}; } } // Utils::Internal diff --git a/src/libs/utils/fsengine/fsenginehandler.h b/src/libs/utils/fsengine/fsenginehandler.h index 6fdb6a7ab9d..68421ddd92e 100644 --- a/src/libs/utils/fsengine/fsenginehandler.h +++ b/src/libs/utils/fsengine/fsenginehandler.h @@ -10,7 +10,11 @@ namespace Utils::Internal { class FSEngineHandler : public QAbstractFileEngineHandler { public: +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + std::unique_ptr create(const QString &fileName) const override; +#else QAbstractFileEngine *create(const QString &fileName) const override; +#endif }; } // Utils::Internal diff --git a/src/libs/utils/fsengine/rootinjectfsengine.h b/src/libs/utils/fsengine/rootinjectfsengine.h index d57747dab96..9eb6a8a8322 100644 --- a/src/libs/utils/fsengine/rootinjectfsengine.h +++ b/src/libs/utils/fsengine/rootinjectfsengine.h @@ -16,12 +16,22 @@ public: using QFSFileEngine::QFSFileEngine; public: +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + IteratorUniquePtr beginEntryList(const QString &path, + QDir::Filters filters, + const QStringList &filterNames) override + { + return std::make_unique( + QFSFileEngine::beginEntryList(path, filters, filterNames)); + } +#else Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) override { std::unique_ptr baseIterator( QFSFileEngine::beginEntryList(filters, filterNames)); return new FileIteratorWrapper(std::move(baseIterator)); } +#endif }; } // namespace Internal diff --git a/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp b/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp index 8abfed59160..123d4aee2dc 100644 --- a/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp +++ b/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp @@ -473,16 +473,25 @@ ComponentCompleteDisabler::~ComponentCompleteDisabler() class QrcEngineHandler : public QAbstractFileEngineHandler { public: +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + std::unique_ptr create(const QString &fileName) const final; +#else QAbstractFileEngine *create(const QString &fileName) const final; +#endif }; -QAbstractFileEngine *QrcEngineHandler::create(const QString &fileName) const +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) +std::unique_ptr +#else +QAbstractFileEngine * +#endif +QrcEngineHandler::create(const QString &fileName) const { if (fileName.startsWith(":/qt-project.org")) - return nullptr; + return {}; if (fileName.startsWith(":/qtquickplugin")) - return nullptr; + return {}; if (fileName.startsWith(":/")) { const QStringList searchPaths = qmlDesignerRCPath().split(';'); @@ -493,18 +502,22 @@ QAbstractFileEngine *QrcEngineHandler::create(const QString &fileName) const fixedPath.replace(":" + qrcDefintion.first(), qrcDefintion.last() + '/'); if (fileName == fixedPath) - return nullptr; + return {}; if (QFileInfo::exists(fixedPath)) { fixedPath.replace("//", "/"); fixedPath.replace('\\', '/'); +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + return std::make_unique(fixedPath); +#else return new QFSFileEngine(fixedPath); +#endif } } } } - return nullptr; + return {}; } static QrcEngineHandler* s_qrcEngineHandler = nullptr;