File indexing completed on 2024-04-28 03:56:27

0001 /*
0002     SPDX-FileCopyrightText: 2023 Aleix Pol Gonzalez <aleixpol@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-or-later
0005 */
0006 
0007 #include "resultsstream.h"
0008 #include "enginebase_p.h"
0009 #include "knewstuffcore_debug.h"
0010 
0011 using namespace KNSCore;
0012 
0013 class KNSCore::ResultsStreamPrivate
0014 {
0015 public:
0016     QList<QSharedPointer<KNSCore::Provider>> providers;
0017     EngineBase *engine;
0018     Provider::SearchRequest request;
0019 };
0020 
0021 ResultsStream::ResultsStream(const Provider::SearchRequest &request, EngineBase *base)
0022     : d(new ResultsStreamPrivate)
0023 {
0024     d->engine = base;
0025     d->request = request;
0026     d->providers = base->d->providers.values();
0027     auto finished = [this](const KNSCore::Provider::SearchRequest &request, const KNSCore::Entry::List &entries) {
0028         d->providers.removeAll(static_cast<Provider *>(sender()));
0029         if (entries.isEmpty() && d->providers.isEmpty()) {
0030             finish();
0031         }
0032 
0033         if (request == d->request) {
0034             Q_EMIT entriesFound(entries);
0035         }
0036     };
0037     auto failed = [this](const KNSCore::Provider::SearchRequest &request) {
0038         if (request == d->request) {
0039             finish();
0040         }
0041     };
0042     for (const auto &provider : d->providers) {
0043         connect(provider.data(), &Provider::loadingFinished, this, finished);
0044         connect(provider.data(), &Provider::entryDetailsLoaded, this, [this](const KNSCore::Entry &entry) {
0045             if (d->request.filter == KNSCore::Provider::ExactEntryId && d->request.searchTerm == entry.uniqueId()) {
0046                 if (entry.isValid()) {
0047                     Q_EMIT entriesFound({entry});
0048                 }
0049                 finish();
0050             }
0051         });
0052         connect(provider.data(), &Provider::loadingFailed, this, failed);
0053     }
0054 }
0055 
0056 ResultsStream::~ResultsStream() = default;
0057 
0058 void ResultsStream::fetch()
0059 {
0060     if (d->request.filter != Provider::Installed) {
0061         // when asking for installed entries, never use the cache
0062         Entry::List cacheEntries = d->engine->cache()->requestFromCache(d->request);
0063         if (!cacheEntries.isEmpty()) {
0064             Q_EMIT entriesFound(cacheEntries);
0065             return;
0066         }
0067     }
0068 
0069     for (const QSharedPointer<KNSCore::Provider> &p : std::as_const(d->providers)) {
0070         if (p->isInitialized()) {
0071             p->loadEntries(d->request);
0072         } else {
0073             connect(p.get(), &KNSCore::Provider::providerInitialized, this, [this, p] {
0074                 disconnect(p.get(), &KNSCore::Provider::providerInitialized, this, nullptr);
0075                 p->loadEntries(d->request);
0076             });
0077         }
0078     }
0079 }
0080 
0081 void ResultsStream::fetchMore()
0082 {
0083     d->request.page++;
0084     fetch();
0085 }
0086 
0087 void ResultsStream::finish()
0088 {
0089     Q_EMIT finished();
0090     deleteLater();
0091 }
0092 
0093 #include "moc_resultsstream.cpp"