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"