From d6e19c715ec6deea07165ea2669dfb2fa7a7745e Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Tue, 11 Jul 2023 05:58:55 +0300 Subject: [PATCH] plasma: run the get() job of dict data engine asynchronously same result however no extra QEventLoop, the only overhead is from the property that has to be set for each source (converting QString to QVariant and then back to QString) Signed-off-by: Ivailo Monev --- plasma/dataengines/dict/dictengine.cpp | 23 +++++++++++++++-------- plasma/dataengines/dict/dictengine.h | 4 ++++ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/plasma/dataengines/dict/dictengine.cpp b/plasma/dataengines/dict/dictengine.cpp index 0a27f19f..977093fe 100644 --- a/plasma/dataengines/dict/dictengine.cpp +++ b/plasma/dataengines/dict/dictengine.cpp @@ -58,12 +58,20 @@ bool DictEngine::sourceRequestEvent(const QString &query) const KUrl queryurl = QString::fromLatin1("https://api.dictionaryapi.dev/api/v2/entries/en/") + queryword; KIO::StoredTransferJob *kiojob = KIO::storedGet(queryurl, KIO::Reload, KIO::HideProgressInfo); kiojob->setAutoDelete(false); - const bool kioresult = KIO::NetAccess::synchronousRun(kiojob, nullptr); - if (!kioresult) { + kiojob->setProperty("dictquery", query); + connect(kiojob, SIGNAL(finished(KJob*)), this, SLOT(slotFinished(KJob*))); + return true; +} + +void DictEngine::slotFinished(KJob *kjob) +{ + KIO::StoredTransferJob *kiojob = qobject_cast(kjob); + const QString query = kiojob->property("dictquery").toString(); + if (kiojob->error() != KJob::NoError) { kWarning() << "KIO job failed"; setError(query, QLatin1String("Cannot get meaning")); kiojob->deleteLater(); - return true; + return; } const QJsonDocument jsondocument = QJsonDocument::fromJson(kiojob->data()); @@ -71,24 +79,24 @@ bool DictEngine::sourceRequestEvent(const QString &query) if (jsondocument.isNull()) { kWarning() << jsondocument.errorString(); setError(query, QLatin1String("Cannot parse JSON")); - return true; + return; } const QVariantList rootlist = jsondocument.toVariant().toList(); if (rootlist.isEmpty()) { setError(query, QLatin1String("Unexpected JSON data")); - return true; + return; } const QVariantList meaningslist = rootlist.first().toMap().value("meanings").toList(); if (meaningslist.isEmpty()) { setError(query, QLatin1String("Unexpected meanings data")); - return true; + return; } // qDebug() << Q_FUNC_INFO << "meanings" << meaningslist; const QVariantList definitionslist = meaningslist.first().toMap().value("definitions").toList(); if (definitionslist.isEmpty()) { setError(query, QLatin1String("Unexpected definitions data")); - return true; + return; } // qDebug() << Q_FUNC_INFO << "definitions" << definitionslist; const QString definition = definitionslist.first().toMap().value("definition").toString(); @@ -105,7 +113,6 @@ bool DictEngine::sourceRequestEvent(const QString &query) setData(query, QString("definition"), definition); setData(query, QString("example"), example); setData(QString("list-dictionaries"), QString("dictionaries"), QString("en")); - return true; } void DictEngine::setError(const QString &query, const QString &message) diff --git a/plasma/dataengines/dict/dictengine.h b/plasma/dataengines/dict/dictengine.h index f2f87b16..7032e1dc 100644 --- a/plasma/dataengines/dict/dictengine.h +++ b/plasma/dataengines/dict/dictengine.h @@ -20,6 +20,7 @@ #define DICTENGINE_H #include +#include #include /** @@ -40,6 +41,9 @@ class DictEngine: public Plasma::DataEngine private: void setError(const QString &query, const QString &message); + + private Q_SLOTS: + void slotFinished(KJob *kjob); }; K_EXPORT_PLASMA_DATAENGINE(dict, DictEngine) -- 2.11.0