[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [discover/Plasma/5.12] libdiscover/backends/KNSBackend: KNS: don't start searches before initializin
From: Aleix Pol <null () kde ! org>
Date: 2018-06-29 16:00:02
Message-ID: E1fYvoY-0007Sp-BI () code ! kde ! org
[Download RAW message or body]
Git commit 11a05813b6e558f52459f98a4d1d15280c9ee842 by Aleix Pol.
Committed on 29/06/2018 at 15:57.
Pushed by apol into branch 'Plasma/5.12'.
KNS: don't start searches before initializing
This way we won't offer resources that will be invalidated if the kns
turns out to be broken.
BUG: 395966
M +37 -13 libdiscover/backends/KNSBackend/KNSBackend.cpp
M +2 -1 libdiscover/backends/KNSBackend/KNSBackend.h
https://commits.kde.org/discover/11a05813b6e558f52459f98a4d1d15280c9ee842
diff --git a/libdiscover/backends/KNSBackend/KNSBackend.cpp \
b/libdiscover/backends/KNSBackend/KNSBackend.cpp index a9099daf..95ce2fa9 100644
--- a/libdiscover/backends/KNSBackend/KNSBackend.cpp
+++ b/libdiscover/backends/KNSBackend/KNSBackend.cpp
@@ -165,6 +165,7 @@ void KNSBackend::markInvalid(const QString &message)
qWarning() << "invalid kns backend!" << m_name << "because:" << message;
m_isValid = false;
setFetching(false);
+ Q_EMIT initialized();
}
void KNSBackend::fetchInstalled()
@@ -188,7 +189,12 @@ void KNSBackend::setFetching(bool f)
if(m_fetching!=f) {
m_fetching = f;
emit fetchingChanged();
+
+ if (!m_fetching) {
+ Q_EMIT initialized();
+ }
}
+
}
bool KNSBackend::isValid() const
@@ -331,26 +337,43 @@ ResultsStream* KNSBackend::search(const \
AbstractResourcesBackend::Filters& filte if (filter.resourceUrl.scheme() == \
QLatin1String("kns")) { return findResourceByPackageName(filter.resourceUrl);
} else if (filter.state >= AbstractResource::Installed) {
- QVector<AbstractResource*> ret;
- foreach(AbstractResource* r, m_resourcesByName) {
- if(r->state()>=filter.state && (r->name().contains(filter.search, \
Qt::CaseInsensitive) || r->comment().contains(filter.search, \
Qt::CaseInsensitive)))
- ret += r;
+ auto stream = new ResultsStream(QStringLiteral("KNS-installed"));
+
+ const auto start = [this, stream, filter]() {
+ if (m_isValid) {
+ auto filterFunction = [&filter](AbstractResource* r) { return \
r->state()>=filter.state && (r->name().contains(filter.search, Qt::CaseInsensitive) \
|| r->comment().contains(filter.search, Qt::CaseInsensitive)); }; + \
const auto ret = kFilter<QVector<AbstractResource*>>(m_resourcesByName, \
filterFunction); +
+ if (!ret.isEmpty())
+ stream->resourcesFound(ret);
+ }
+ stream->finish();
+ };
+ if (isFetching()) {
+ connect(this, &KNSBackend::initialized, stream, start);
+ } else {
+ QTimer::singleShot(0, stream, start);
}
- return new ResultsStream(QStringLiteral("KNS-installed"), ret);
- } else if (filter.category && \
filter.category->matchesCategoryName(m_categories.constFirst())) {
- return searchStream(filter.search);
- } else if (!filter.category && !filter.search.isEmpty()) {
- return searchStream(filter.search);
+
+ return stream;
+ } else if ((!filter.category && !filter.search.isEmpty()) || (filter.category && \
filter.category->matchesCategoryName(m_categories.constFirst()))) { + auto r = \
new ResultsStream(QStringLiteral("KNS-search-")+name()); + searchStream(r, \
filter.search); + return r;
}
return voidStream();
}
-ResultsStream* KNSBackend::searchStream(const QString &searchText)
+void KNSBackend::searchStream(ResultsStream* stream, const QString &searchText)
{
Q_EMIT startingSearch();
- auto stream = new ResultsStream(QStringLiteral("KNS-search-")+name());
auto start = [this, stream, searchText]() {
+ Q_ASSERT(!isFetching());
+ if (!m_isValid) {
+ stream->finish();
+ return;
+ }
// No need to explicitly launch a search, setting the search term already \
does that for us m_engine->setSearchTerm(searchText);
m_onePage = false;
@@ -369,10 +392,11 @@ ResultsStream* KNSBackend::searchStream(const QString \
&searchText)
if (m_responsePending) {
connect(this, &KNSBackend::availableForQueries, stream, start, \
Qt::QueuedConnection); + } else if (isFetching()) {
+ connect(this, &KNSBackend::initialized, stream, start);
} else {
- start();
+ QTimer::singleShot(0, stream, start);
}
- return stream;
}
ResultsStream * KNSBackend::findResourceByPackageName(const QUrl& search)
diff --git a/libdiscover/backends/KNSBackend/KNSBackend.h \
b/libdiscover/backends/KNSBackend/KNSBackend.h index 4845485b..8002b1d2 100644
--- a/libdiscover/backends/KNSBackend/KNSBackend.h
+++ b/libdiscover/backends/KNSBackend/KNSBackend.h
@@ -70,6 +70,7 @@ Q_SIGNALS:
void searchFinished();
void startingSearch();
void availableForQueries();
+ void initialized();
public Q_SLOTS:
void receivedEntries(const KNSCore::EntryInternal::List& entries);
@@ -80,7 +81,7 @@ private:
KNSResource* resourceForEntry(const KNSCore::EntryInternal& entry);
void setFetching(bool f);
void markInvalid(const QString &message);
- ResultsStream* searchStream(const QString &searchText);
+ void searchStream(ResultsStream* stream, const QString &searchText);
bool m_onePage = false;
bool m_stopSearching = false;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic