diff --git a/resources/desktop/com.github.rssguard.appdata.xml b/resources/desktop/com.github.rssguard.appdata.xml
index 3de105cef..f0e281060 100644
--- a/resources/desktop/com.github.rssguard.appdata.xml
+++ b/resources/desktop/com.github.rssguard.appdata.xml
@@ -26,7 +26,7 @@
https://github.com/sponsors/martinrotter
-
+
none
diff --git a/src/librssguard/gui/dialogs/formupdate.cpp b/src/librssguard/gui/dialogs/formupdate.cpp
index e8a4ea214..b9ac6ad79 100644
--- a/src/librssguard/gui/dialogs/formupdate.cpp
+++ b/src/librssguard/gui/dialogs/formupdate.cpp
@@ -170,8 +170,12 @@ void FormUpdate::loadAvailableFiles() {
m_ui.m_tabInfo->setCurrentIndex(1);
}
-void FormUpdate::updateCompleted(const QUrl& url, QNetworkReply::NetworkError status, const QByteArray& contents) {
+void FormUpdate::updateCompleted(const QUrl& url,
+ QNetworkReply::NetworkError status,
+ int http_code,
+ const QByteArray& contents) {
Q_UNUSED(url)
+ Q_UNUSED(http_code)
qDebugNN << LOGSEC_GUI << "Download of application update file was completed with code" << QUOTE_W_SPACE_DOT(status);
diff --git a/src/librssguard/gui/dialogs/formupdate.h b/src/librssguard/gui/dialogs/formupdate.h
index 8c64311a1..aacf6511f 100644
--- a/src/librssguard/gui/dialogs/formupdate.h
+++ b/src/librssguard/gui/dialogs/formupdate.h
@@ -14,10 +14,9 @@
#include
class RSSGUARD_DLLSPEC FormUpdate : public QDialog {
- Q_OBJECT
+ Q_OBJECT
public:
-
// Constructors and destructors.
explicit FormUpdate(QWidget* parent);
@@ -32,7 +31,10 @@ class RSSGUARD_DLLSPEC FormUpdate : public QDialog {
void startUpdate();
void updateProgress(qint64 bytes_received, qint64 bytes_total);
- void updateCompleted(const QUrl &url, QNetworkReply::NetworkError status, const QByteArray& contents);
+ void updateCompleted(const QUrl& url,
+ QNetworkReply::NetworkError status,
+ int http_code,
+ const QByteArray& contents);
void saveUpdateFile(const QByteArray& file_contents);
private:
diff --git a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp
index 030d08e11..3a82ecd30 100644
--- a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp
+++ b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp
@@ -548,7 +548,12 @@ void TextBrowserViewer::downloadNextNeededResource() {
}
}
-void TextBrowserViewer::resourceDownloaded(const QUrl& url, QNetworkReply::NetworkError status, QByteArray contents) {
+void TextBrowserViewer::resourceDownloaded(const QUrl& url,
+ QNetworkReply::NetworkError status,
+ int http_code,
+ QByteArray contents) {
+ Q_UNUSED(http_code)
+
if (status == QNetworkReply::NetworkError::NoError) {
m_loadedResources.insert(url, contents);
}
diff --git a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.h b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.h
index 84a62b7b7..5e7f9cdd2 100644
--- a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.h
+++ b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.h
@@ -86,7 +86,10 @@ class TextBrowserViewer : public QTextBrowser, public WebViewer {
private slots:
void reloadHtmlDelayed();
void downloadNextNeededResource();
- void resourceDownloaded(const QUrl& url, QNetworkReply::NetworkError status, QByteArray contents = QByteArray());
+ void resourceDownloaded(const QUrl& url,
+ QNetworkReply::NetworkError status,
+ int http_code,
+ QByteArray contents = QByteArray());
private:
bool m_resourcesEnabled;
diff --git a/src/librssguard/network-web/downloader.cpp b/src/librssguard/network-web/downloader.cpp
index b64924efd..0aa5a310d 100644
--- a/src/librssguard/network-web/downloader.cpp
+++ b/src/librssguard/network-web/downloader.cpp
@@ -17,8 +17,8 @@
Downloader::Downloader(QObject* parent)
: QObject(parent), m_activeReply(nullptr), m_downloadManager(new SilentNetworkAccessManager(this)),
m_timer(new QTimer(this)), m_inputData(QByteArray()), m_inputMultipartData(nullptr), m_targetProtected(false),
- m_targetUsername(QString()), m_targetPassword(QString()), m_lastOutputData(QByteArray()),
- m_lastOutputError(QNetworkReply::NoError) {
+ m_targetUsername(QString()), m_targetPassword(QString()), m_lastOutputData({}),
+ m_lastOutputError(QNetworkReply::NetworkError::NoError), m_lastHttpStatusCode(0) {
m_timer->setInterval(DOWNLOAD_TIMEOUT);
m_timer->setSingleShot(true);
@@ -212,8 +212,9 @@ void Downloader::finished() {
m_lastCookies = {};
}
- m_lastContentType = reply->header(QNetworkRequest::ContentTypeHeader);
+ m_lastContentType = reply->header(QNetworkRequest::KnownHeaders::ContentTypeHeader);
m_lastOutputError = reply->error();
+ m_lastHttpStatusCode = reply->attribute(QNetworkRequest::Attribute::HttpStatusCodeAttribute).toInt();
// original_url = m_activeReply->property("original_url").toUrl();
@@ -224,7 +225,7 @@ void Downloader::finished() {
m_inputMultipartData->deleteLater();
}
- emit completed(original_url, m_lastOutputError, m_lastOutputData);
+ emit completed(original_url, m_lastOutputError, m_lastHttpStatusCode, m_lastOutputData);
}
}
@@ -335,6 +336,10 @@ void Downloader::runGetRequest(const QNetworkRequest& request) {
connect(m_activeReply, &QNetworkReply::finished, this, &Downloader::finished);
}
+int Downloader::lastHttpStatusCode() const {
+ return m_lastHttpStatusCode;
+}
+
QList Downloader::lastCookies() const {
return m_lastCookies;
}
diff --git a/src/librssguard/network-web/downloader.h b/src/librssguard/network-web/downloader.h
index 05890c14e..b48a60315 100644
--- a/src/librssguard/network-web/downloader.h
+++ b/src/librssguard/network-web/downloader.h
@@ -29,6 +29,7 @@ class Downloader : public QObject {
QList lastOutputMultipartData() const;
QVariant lastContentType() const;
QList lastCookies() const;
+ int lastHttpStatusCode() const;
void setProxy(const QNetworkProxy& proxy);
@@ -68,9 +69,8 @@ class Downloader : public QObject {
const QString& password = QString());
signals:
- // Emitted when new progress is known.
void progress(qint64 bytes_received, qint64 bytes_total);
- void completed(const QUrl& url, QNetworkReply::NetworkError status, QByteArray contents = QByteArray());
+ void completed(const QUrl& url, QNetworkReply::NetworkError status, int http_code, QByteArray contents = {});
private slots:
@@ -111,8 +111,8 @@ class Downloader : public QObject {
// Response data.
QByteArray m_lastOutputData;
QList m_lastOutputMultipartData;
-
QNetworkReply::NetworkError m_lastOutputError;
+ int m_lastHttpStatusCode;
QVariant m_lastContentType;
QList m_lastCookies;
};
diff --git a/src/librssguard/network-web/googlesuggest.cpp b/src/librssguard/network-web/googlesuggest.cpp
index a8f1c9196..2e9e5ada3 100644
--- a/src/librssguard/network-web/googlesuggest.cpp
+++ b/src/librssguard/network-web/googlesuggest.cpp
@@ -156,8 +156,12 @@ void GoogleSuggest::autoSuggest() {
m_downloader->downloadFile(url);
}
-void GoogleSuggest::handleNetworkData(const QUrl& url, QNetworkReply::NetworkError status, const QByteArray& contents) {
+void GoogleSuggest::handleNetworkData(const QUrl& url,
+ QNetworkReply::NetworkError status,
+ int http_code,
+ const QByteArray& contents) {
Q_UNUSED(url)
+ Q_UNUSED(http_code)
if (status == QNetworkReply::NetworkError::NoError) {
QStringList choices;
diff --git a/src/librssguard/network-web/googlesuggest.h b/src/librssguard/network-web/googlesuggest.h
index 24b6fef6c..59717e3cb 100644
--- a/src/librssguard/network-web/googlesuggest.h
+++ b/src/librssguard/network-web/googlesuggest.h
@@ -54,7 +54,10 @@ class GoogleSuggest : public QObject {
void doneCompletion();
void preventSuggest();
void autoSuggest();
- void handleNetworkData(const QUrl& url, QNetworkReply::NetworkError status, const QByteArray& contents);
+ void handleNetworkData(const QUrl& url,
+ QNetworkReply::NetworkError status,
+ int http_code,
+ const QByteArray& contents);
private:
LocationLineEdit* editor;
diff --git a/src/librssguard/network-web/networkfactory.cpp b/src/librssguard/network-web/networkfactory.cpp
index 36297631a..445584b17 100644
--- a/src/librssguard/network-web/networkfactory.cpp
+++ b/src/librssguard/network-web/networkfactory.cpp
@@ -270,6 +270,7 @@ NetworkResult NetworkFactory::performNetworkOperation(const QString& url,
result.m_networkError = downloader.lastOutputError();
result.m_contentType = downloader.lastContentType().toString();
result.m_cookies = downloader.lastCookies();
+ result.m_httpCode = downloader.lastHttpStatusCode();
return result;
}
@@ -309,12 +310,16 @@ NetworkResult NetworkFactory::performNetworkOperation(const QString& url,
result.m_networkError = downloader.lastOutputError();
result.m_contentType = downloader.lastContentType().toString();
result.m_cookies = downloader.lastCookies();
+ result.m_httpCode = downloader.lastHttpStatusCode();
return result;
}
NetworkResult::NetworkResult()
- : m_networkError(QNetworkReply::NetworkError::NoError), m_contentType(QString()), m_cookies({}) {}
+ : m_networkError(QNetworkReply::NetworkError::NoError), m_httpCode(0), m_contentType(QString()), m_cookies({}) {}
-NetworkResult::NetworkResult(QNetworkReply::NetworkError err, const QString& ct, const QList& cook)
- : m_networkError(err), m_contentType(ct), m_cookies(cook) {}
+NetworkResult::NetworkResult(QNetworkReply::NetworkError err,
+ int http_code,
+ const QString& ct,
+ const QList& cook)
+ : m_networkError(err), m_httpCode(http_code), m_contentType(ct), m_cookies(cook) {}
diff --git a/src/librssguard/network-web/networkfactory.h b/src/librssguard/network-web/networkfactory.h
index 458e3277e..0723669e9 100644
--- a/src/librssguard/network-web/networkfactory.h
+++ b/src/librssguard/network-web/networkfactory.h
@@ -14,18 +14,22 @@
#include
struct NetworkResult {
- QNetworkReply::NetworkError m_networkError;
- QString m_contentType;
- QList m_cookies;
+ QNetworkReply::NetworkError m_networkError;
+ int m_httpCode;
+ QString m_contentType;
+ QList m_cookies;
- explicit NetworkResult();
- explicit NetworkResult(QNetworkReply::NetworkError err, const QString& ct, const QList& cook);
+ explicit NetworkResult();
+ explicit NetworkResult(QNetworkReply::NetworkError err,
+ int http_code,
+ const QString& ct,
+ const QList& cook);
};
class Downloader;
class NetworkFactory {
- Q_DECLARE_TR_FUNCTIONS(NetworkFactory)
+ Q_DECLARE_TR_FUNCTIONS(NetworkFactory)
private:
explicit NetworkFactory() = default;
@@ -44,25 +48,32 @@ class NetworkFactory {
int timeout,
QIcon& output,
const QList>& additional_headers,
- const QNetworkProxy& custom_proxy = QNetworkProxy::ProxyType::DefaultProxy);
- static NetworkResult performNetworkOperation(const QString& url, int timeout,
+ const QNetworkProxy& custom_proxy =
+ QNetworkProxy::ProxyType::DefaultProxy);
+ static NetworkResult performNetworkOperation(const QString& url,
+ int timeout,
const QByteArray& input_data,
QByteArray& output,
QNetworkAccessManager::Operation operation,
- const QList>& additional_headers = QList>(),
+ const QList>& additional_headers =
+ QList>(),
bool protected_contents = false,
const QString& username = QString(),
const QString& password = QString(),
- const QNetworkProxy& custom_proxy = QNetworkProxy::ProxyType::DefaultProxy);
- static NetworkResult performNetworkOperation(const QString& url, int timeout,
+ const QNetworkProxy& custom_proxy =
+ QNetworkProxy::ProxyType::DefaultProxy);
+ static NetworkResult performNetworkOperation(const QString& url,
+ int timeout,
QHttpMultiPart* input_data,
QList& output,
QNetworkAccessManager::Operation operation,
- const QList>& additional_headers = QList>(),
+ const QList>& additional_headers =
+ QList>(),
bool protected_contents = false,
const QString& username = QString(),
const QString& password = QString(),
- const QNetworkProxy& custom_proxy = QNetworkProxy::ProxyType::DefaultProxy);
+ const QNetworkProxy& custom_proxy =
+ QNetworkProxy::ProxyType::DefaultProxy);
};
#endif // NETWORKFACTORY_H
diff --git a/src/librssguard/services/abstract/serviceroot.cpp b/src/librssguard/services/abstract/serviceroot.cpp
index 9f5946cee..9be752c5b 100644
--- a/src/librssguard/services/abstract/serviceroot.cpp
+++ b/src/librssguard/services/abstract/serviceroot.cpp
@@ -442,11 +442,11 @@ void ServiceRoot::syncIn() {
setIcon(qApp->icons()->fromTheme(QSL("view-refresh")));
itemChanged({this});
- qDebugNN << LOGSEC_CORE << "Starting sync-in process.";
+ try {
+ qDebugNN << LOGSEC_CORE << "Starting sync-in process.";
- RootItem* new_tree = obtainNewTreeForSyncIn();
+ RootItem* new_tree = obtainNewTreeForSyncIn();
- if (new_tree != nullptr) {
qDebugNN << LOGSEC_CORE << "New feed tree for sync-in obtained.";
auto feed_custom_data = storeCustomFeedsData();
@@ -498,8 +498,15 @@ void ServiceRoot::syncIn() {
updateCounts(true);
requestReloadMessageList(true);
}
- else {
- qCriticalNN << LOGSEC_CORE << "New feed tree for sync-in NOT obtained.";
+ catch (const ApplicationException& ex) {
+ qCriticalNN << LOGSEC_CORE << "New feed tree for sync-in NOT obtained:" << QUOTE_W_SPACE_DOT(ex.message());
+
+ qApp->showGuiMessage(Notification::Event::GeneralEvent,
+ GuiMessage(tr("Error when fetching list of feeds"),
+ tr("Feeds & categories for account '%1' were not fetched, error: %2")
+ .arg(title(), ex.message()),
+ QSystemTrayIcon::MessageIcon::Critical),
+ GuiMessageDestination(true, true));
}
setIcon(original_icon);
diff --git a/src/librssguard/services/feedly/feedlynetwork.cpp b/src/librssguard/services/feedly/feedlynetwork.cpp
index b4fd78d6f..e04549c99 100644
--- a/src/librssguard/services/feedly/feedlynetwork.cpp
+++ b/src/librssguard/services/feedly/feedlynetwork.cpp
@@ -2,7 +2,6 @@
#include "services/feedly/feedlynetwork.h"
-#include "3rd-party/boolinq/boolinq.h"
#include "3rd-party/boolinq/boolinq.h"
#include "database/databasequeries.h"
#include "exceptions/networkexception.h"
@@ -26,19 +25,18 @@
FeedlyNetwork::FeedlyNetwork(QObject* parent)
: QObject(parent), m_service(nullptr),
#if defined(FEEDLY_OFFICIAL_SUPPORT)
- m_oauth(new OAuth2Service(QSL(FEEDLY_API_URL_BASE) + QSL(FEEDLY_API_URL_AUTH),
- QSL(FEEDLY_API_URL_BASE) + QSL(FEEDLY_API_URL_TOKEN),
- TextFactory::decrypt(QSL(FEEDLY_CLIENT_ID), OAUTH_DECRYPTION_KEY),
- TextFactory::decrypt(QSL(FEEDLY_CLIENT_SECRET), OAUTH_DECRYPTION_KEY),
- QSL(FEEDLY_API_SCOPE), this)),
+ m_oauth(new OAuth2Service(QSL(FEEDLY_API_URL_BASE) + QSL(FEEDLY_API_URL_AUTH),
+ QSL(FEEDLY_API_URL_BASE) + QSL(FEEDLY_API_URL_TOKEN),
+ TextFactory::decrypt(QSL(FEEDLY_CLIENT_ID), OAUTH_DECRYPTION_KEY),
+ TextFactory::decrypt(QSL(FEEDLY_CLIENT_SECRET), OAUTH_DECRYPTION_KEY),
+ QSL(FEEDLY_API_SCOPE),
+ this)),
#endif
- m_username(QString()),
- m_developerAccessToken(QString()), m_batchSize(FEEDLY_DEFAULT_BATCH_SIZE), m_downloadOnlyUnreadMessages(false),
- m_intelligentSynchronization(true) {
+ m_username(QString()), m_developerAccessToken(QString()), m_batchSize(FEEDLY_DEFAULT_BATCH_SIZE),
+ m_downloadOnlyUnreadMessages(false), m_intelligentSynchronization(true) {
#if defined(FEEDLY_OFFICIAL_SUPPORT)
- m_oauth->setRedirectUrl(QSL(OAUTH_REDIRECT_URI) + QL1C(':') + QString::number(FEEDLY_API_REDIRECT_URI_PORT),
- true);
+ m_oauth->setRedirectUrl(QSL(OAUTH_REDIRECT_URI) + QL1C(':') + QString::number(FEEDLY_API_REDIRECT_URI_PORT), true);
connect(m_oauth, &OAuth2Service::tokensRetrieveError, this, &FeedlyNetwork::onTokensError);
connect(m_oauth, &OAuth2Service::authFailed, this, &FeedlyNetwork::onAuthFailed);
@@ -118,8 +116,7 @@ void FeedlyNetwork::untagEntries(const QString& tag_id, const QStringList& msg_c
throw NetworkException(QNetworkReply::NetworkError::AuthenticationRequiredError);
}
- QString target_url = fullUrl(Service::TagEntries) +
- QSL("/%1/").arg(QString(QUrl::toPercentEncoding(tag_id)));
+ QString target_url = fullUrl(Service::TagEntries) + QSL("/%1/").arg(QString(QUrl::toPercentEncoding(tag_id)));
int timeout = qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt();
QByteArray output;
int i = 0;
@@ -129,16 +126,18 @@ void FeedlyNetwork::untagEntries(const QString& tag_id, const QStringList& msg_c
i += FEEDLY_UNTAG_BATCH_SIZE;
- auto ids = boolinq::from(msg_batch).select([](const QString& msg_id) {
- return QString(QUrl::toPercentEncoding(msg_id));
- }).toStdList();
+ auto ids = boolinq::from(msg_batch)
+ .select([](const QString& msg_id) {
+ return QString(QUrl::toPercentEncoding(msg_id));
+ })
+ .toStdList();
QString final_url = target_url + FROM_STD_LIST(QStringList, ids).join(',');
auto result = NetworkFactory::performNetworkOperation(final_url,
timeout,
{},
output,
QNetworkAccessManager::Operation::DeleteOperation,
- { bearerHeader(bear) },
+ {bearerHeader(bear)},
false,
{},
{},
@@ -172,17 +171,17 @@ void FeedlyNetwork::tagEntries(const QString& tag_id, const QStringList& msg_cus
input[QSL("entryIds")] = QJsonArray::fromStringList(msg_custom_ids);
input_data = QJsonDocument(input).toJson(QJsonDocument::JsonFormat::Compact);
- auto result = NetworkFactory::performNetworkOperation(target_url,
- timeout,
- input_data,
- output,
- QNetworkAccessManager::Operation::PutOperation,
- { bearerHeader(bear),
- { HTTP_HEADERS_CONTENT_TYPE, "application/json" } },
- false,
- {},
- {},
- m_service->networkProxy());
+ auto result =
+ NetworkFactory::performNetworkOperation(target_url,
+ timeout,
+ input_data,
+ output,
+ QNetworkAccessManager::Operation::PutOperation,
+ {bearerHeader(bear), {HTTP_HEADERS_CONTENT_TYPE, "application/json"}},
+ false,
+ {},
+ {},
+ m_service->networkProxy());
if (result.m_networkError != QNetworkReply::NetworkError::NoError) {
throw NetworkException(result.m_networkError, output);
@@ -211,17 +210,17 @@ void FeedlyNetwork::markers(const QString& action, const QStringList& msg_custom
input[QSL("entryIds")] = QJsonArray::fromStringList(msg_custom_ids);
QByteArray input_data = QJsonDocument(input).toJson(QJsonDocument::JsonFormat::Compact);
- auto result = NetworkFactory::performNetworkOperation(target_url,
- timeout,
- input_data,
- output,
- QNetworkAccessManager::Operation::PostOperation,
- { bearerHeader(bear),
- { HTTP_HEADERS_CONTENT_TYPE, "application/json" } },
- false,
- {},
- {},
- m_service->networkProxy());
+ auto result =
+ NetworkFactory::performNetworkOperation(target_url,
+ timeout,
+ input_data,
+ output,
+ QNetworkAccessManager::Operation::PostOperation,
+ {bearerHeader(bear), {HTTP_HEADERS_CONTENT_TYPE, "application/json"}},
+ false,
+ {},
+ {},
+ m_service->networkProxy());
if (result.m_networkError != QNetworkReply::NetworkError::NoError) {
throw NetworkException(result.m_networkError, output);
@@ -245,21 +244,22 @@ QList FeedlyNetwork::entries(const QStringList& ids) {
do {
QJsonArray json;
- for (int window = next_message + 1000; next_message < window && next_message < ids.size(); next_message++ ) {
+ for (int window = next_message + 1000; next_message < window && next_message < ids.size(); next_message++) {
json.append(QJsonValue(ids.at(next_message)));
}
QByteArray output;
- auto result = NetworkFactory::performNetworkOperation(target_url,
- timeout,
- QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact),
- output,
- QNetworkAccessManager::Operation::PostOperation,
- { bearerHeader(bear) },
- false,
- {},
- {},
- m_service->networkProxy());
+ auto result =
+ NetworkFactory::performNetworkOperation(target_url,
+ timeout,
+ QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact),
+ output,
+ QNetworkAccessManager::Operation::PostOperation,
+ {bearerHeader(bear)},
+ false,
+ {},
+ {},
+ m_service->networkProxy());
if (result.m_networkError != QNetworkReply::NetworkError::NoError) {
throw NetworkException(result.m_networkError, output);
@@ -311,7 +311,7 @@ QList FeedlyNetwork::streamContents(const QString& stream_id) {
{},
output,
QNetworkAccessManager::Operation::GetOperation,
- { bearerHeader(bear) },
+ {bearerHeader(bear)},
false,
{},
{},
@@ -323,8 +323,7 @@ QList FeedlyNetwork::streamContents(const QString& stream_id) {
messages += decodeStreamContents(output, true, continuation);
}
- while (!continuation.isEmpty() &&
- (m_batchSize <= 0 || messages.size() < m_batchSize) &&
+ while (!continuation.isEmpty() && (m_batchSize <= 0 || messages.size() < m_batchSize) &&
messages.size() <= FEEDLY_MAX_TOTAL_SIZE);
return messages;
@@ -369,7 +368,7 @@ QStringList FeedlyNetwork::streamIds(const QString& stream_id, bool unread_only,
{},
output,
QNetworkAccessManager::Operation::GetOperation,
- { bearerHeader(bear) },
+ {bearerHeader(bear)},
false,
{},
{},
@@ -399,7 +398,9 @@ QStringList FeedlyNetwork::decodeStreamIds(const QByteArray& stream_ids, QString
return messages;
}
-QList FeedlyNetwork::decodeStreamContents(const QByteArray& stream_contents, bool nested_items, QString& continuation) const {
+QList FeedlyNetwork::decodeStreamContents(const QByteArray& stream_contents,
+ bool nested_items,
+ QString& continuation) const {
QList messages;
QJsonDocument json = QJsonDocument::fromJson(stream_contents);
auto active_labels = m_service->labelsNode() != nullptr ? m_service->labelsNode()->labels() : QList