diff options
author | Katja Marttila <katja.marttila@qt.io> | 2023-01-26 14:34:57 +0200 |
---|---|---|
committer | Katja Marttila <katja.marttila@qt.io> | 2023-02-09 13:55:24 +0200 |
commit | 871832b8b67eb55208031f4b7edb6c02b824ad00 (patch) | |
tree | f97c7285958bcd9f4054596fffce0c53d8ba0182 /src/libs/kdtools/updatefinder.h | |
parent | c9d7f2a3f72ced2dd576057b84bf03c6ece260af (diff) |
Optimize Updates.xml parsing
Updates.xml file elements are read and based on that the installer
calculates for example applicable updates. The files were parsed one by
one which was not very optimal at least in Windows when reading a lot of
files. Fixing the reading so that all files can be read and parsed
using QtConcurrent.
Also changing the class structure so that the private class is removed
and private functions used instead. Another option would have been to
create header file to the private class due to the Q_OBJECT definition
in ParseXMLFilesTask.
Task-number: QTIFW-2805
Change-Id: I40d1c75b87f4bf1f5a8fcd874edf84023891bdcc
Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
Diffstat (limited to 'src/libs/kdtools/updatefinder.h')
-rw-r--r-- | src/libs/kdtools/updatefinder.h | 80 |
1 files changed, 77 insertions, 3 deletions
diff --git a/src/libs/kdtools/updatefinder.h b/src/libs/kdtools/updatefinder.h index 5a3f50f62..626a700fd 100644 --- a/src/libs/kdtools/updatefinder.h +++ b/src/libs/kdtools/updatefinder.h @@ -1,7 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB) -** Copyright (C) 2022 The Qt Company Ltd. +** Copyright (C) 2023 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -32,19 +32,68 @@ #include "task.h" #include "packagesource.h" +#include "filedownloader.h" +#include "updatesinfo_p.h" +#include "abstracttask.h" #include <memory> +using namespace QInstaller; namespace KDUpdater { class LocalPackageHub; class Update; +class ParseXmlFilesTask : public AbstractTask<void> +{ + Q_OBJECT + Q_DISABLE_COPY(ParseXmlFilesTask) + +public: + ParseXmlFilesTask(UpdatesInfo *info) + : m_info(info) + {} + + void doTask(QFutureInterface<void> &fi) override + { + fi.reportStarted(); + fi.setExpectedResultCount(1); + + if (fi.isCanceled()) { + fi.reportFinished(); + return; // ignore already canceled + } + m_info->parseFile(); + + fi.reportFinished(); + } + +private: + UpdatesInfo *const m_info; +}; + + class KDTOOLS_EXPORT UpdateFinder : public Task { Q_OBJECT class Private; + struct Data { + Data() + : downloader(0) {} + explicit Data(const QInstaller::PackageSource &i, KDUpdater::FileDownloader *d = 0) + : info(i), downloader(d) {} + + QInstaller::PackageSource info; + KDUpdater::FileDownloader *downloader; + }; + + enum struct Resolution { + AddPackage, + KeepExisting, + RemoveExisting + }; + public: UpdateFinder(); ~UpdateFinder(); @@ -59,10 +108,35 @@ private: bool doStop() override; bool doPause() override; bool doResume() override; + void clear(); + void computeUpdates(); + void cancelComputeUpdates(); + bool downloadUpdateXMLFiles(); + bool parseUpdateXMLFiles(); + bool removeInvalidObjects(); + bool computeApplicableUpdates(); + + QList<UpdateInfo> applicableUpdates(UpdatesInfo *updatesInfo); + void createUpdateObjects(const PackageSource &source, const QList<UpdateInfo> &updateInfoList); + Resolution checkPriorityAndVersion(const QInstaller::PackageSource &source, const QVariantHash &data) const; + bool waitForJobToFinish(const int ¤tCount, const int &totalsCount); + +private slots: + void parseUpdatesXmlTaskFinished(); + void slotDownloadDone(); private: - Private *d; - Q_PRIVATE_SLOT(d, void slotDownloadDone()) + QSet<PackageSource> m_packageSources; + std::weak_ptr<LocalPackageHub> m_localPackageHub; + QHash<QString, Update *> m_updates; + + bool m_cancel; + int m_downloadCompleteCount; + int m_downloadsToComplete; + QHash<UpdatesInfo *, Data> m_updatesInfoList; + int m_updatesXmlTasks; + int m_updatesXmlTasksToComplete; + QList<ParseXmlFilesTask*> m_xmlFileTasks; }; } // namespace KDUpdater |