[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