diff --git a/src/services/owncloud/owncloudserviceroot.cpp b/src/services/owncloud/owncloudserviceroot.cpp index c1671b092..fdedbd621 100755 --- a/src/services/owncloud/owncloudserviceroot.cpp +++ b/src/services/owncloud/owncloudserviceroot.cpp @@ -108,6 +108,11 @@ QString OwnCloudServiceRoot::code() const { return OwnCloudServiceEntryPoint().code(); } +bool OwnCloudServiceRoot::markAsReadUnread(RootItem::ReadStatus status) { + addMessageStatesToCache(customIDSOfMessagesForItem(this), status); + return ServiceRoot::markAsReadUnread(status); +} + OwnCloudNetworkFactory *OwnCloudServiceRoot::network() const { return m_network; } diff --git a/src/services/owncloud/owncloudserviceroot.h b/src/services/owncloud/owncloudserviceroot.h index c3609b4e2..aed6846e5 100755 --- a/src/services/owncloud/owncloudserviceroot.h +++ b/src/services/owncloud/owncloudserviceroot.h @@ -46,6 +46,7 @@ class OwnCloudServiceRoot : public ServiceRoot, public CacheForServiceRoot { void start(bool freshly_activated); void stop(); QString code() const; + bool markAsReadUnread(ReadStatus status); OwnCloudNetworkFactory *network() const; diff --git a/src/services/tt-rss/ttrssfeed.cpp b/src/services/tt-rss/ttrssfeed.cpp index 91e38c8f8..acc7da34c 100755 --- a/src/services/tt-rss/ttrssfeed.cpp +++ b/src/services/tt-rss/ttrssfeed.cpp @@ -124,18 +124,8 @@ bool TtRssFeed::deleteViaGui() { } bool TtRssFeed::markAsReadUnread(RootItem::ReadStatus status) { - QStringList ids = getParentServiceRoot()->customIDSOfMessagesForItem(this); - TtRssUpdateArticleResponse response = serviceRoot()->network()->updateArticles(ids, UpdateArticle::Unread, - status == RootItem::Unread ? - UpdateArticle::SetToTrue : - UpdateArticle::SetToFalse); - - if (serviceRoot()->network()->lastError() != QNetworkReply::NoError || response.updateStatus() != STATUS_OK) { - return false; - } - else { - return getParentServiceRoot()->markFeedsReadUnread(QList() << this, status); - } + serviceRoot()->addMessageStatesToCache(getParentServiceRoot()->customIDSOfMessagesForItem(this), status); + return getParentServiceRoot()->markFeedsReadUnread(QList() << this, status); } bool TtRssFeed::cleanMessages(bool clear_only_read) { diff --git a/src/services/tt-rss/ttrssrecyclebin.cpp b/src/services/tt-rss/ttrssrecyclebin.cpp index 41047ec7f..39b8e7923 100755 --- a/src/services/tt-rss/ttrssrecyclebin.cpp +++ b/src/services/tt-rss/ttrssrecyclebin.cpp @@ -33,16 +33,6 @@ TtRssServiceRoot *TtRssRecycleBin::serviceRoot() { } bool TtRssRecycleBin::markAsReadUnread(RootItem::ReadStatus status) { - QStringList ids = serviceRoot()->customIDSOfMessagesForItem(this); - TtRssUpdateArticleResponse response = serviceRoot()->network()->updateArticles(ids, UpdateArticle::Unread, - status == RootItem::Unread ? - UpdateArticle::SetToTrue : - UpdateArticle::SetToFalse); - - if (serviceRoot()->network()->lastError() != QNetworkReply::NoError || response.updateStatus() != STATUS_OK) { - return false; - } - else { - return RecycleBin::markAsReadUnread(status); - } + serviceRoot()->addMessageStatesToCache(getParentServiceRoot()->customIDSOfMessagesForItem(this), status); + return RecycleBin::markAsReadUnread(status); } diff --git a/src/services/tt-rss/ttrssserviceroot.cpp b/src/services/tt-rss/ttrssserviceroot.cpp index 1c909c460..800417e79 100755 --- a/src/services/tt-rss/ttrssserviceroot.cpp +++ b/src/services/tt-rss/ttrssserviceroot.cpp @@ -39,7 +39,7 @@ TtRssServiceRoot::TtRssServiceRoot(RootItem *parent) - : ServiceRoot(parent), m_recycleBin(new TtRssRecycleBin(this)), + : ServiceRoot(parent), CacheForServiceRoot(), m_recycleBin(new TtRssRecycleBin(this)), m_actionSyncIn(nullptr), m_serviceMenu(QList()), m_network(new TtRssNetworkFactory()) { setIcon(TtRssServiceEntryPoint().icon()); } @@ -88,18 +88,8 @@ bool TtRssServiceRoot::deleteViaGui() { } bool TtRssServiceRoot::markAsReadUnread(RootItem::ReadStatus status) { - QStringList ids = customIDSOfMessagesForItem(this); - TtRssUpdateArticleResponse response = m_network->updateArticles(ids, UpdateArticle::Unread, - status == RootItem::Unread ? - UpdateArticle::SetToTrue : - UpdateArticle::SetToFalse); - - if (m_network->lastError() != QNetworkReply::NoError || response.updateStatus() != STATUS_OK) { - return false; - } - else { - return ServiceRoot::markAsReadUnread(status); - } + addMessageStatesToCache(customIDSOfMessagesForItem(this), status); + return ServiceRoot::markAsReadUnread(status); } bool TtRssServiceRoot::supportsFeedAdding() const { @@ -166,6 +156,37 @@ RecycleBin *TtRssServiceRoot::recycleBin() const { return m_recycleBin; } +void TtRssServiceRoot::saveAllCachedData() { + /*TtRssUpdateArticleResponse response = m_network->updateArticles(customIDsOfMessages(messages), + UpdateArticle::Unread, + read == RootItem::Unread ? + UpdateArticle::SetToTrue : + UpdateArticle::SetToFalse); + + if (m_network->lastError() == QNetworkReply::NoError && response.updateStatus() == STATUS_OK) { + return true; + } + else { + return false; + }*/ + + QPair, QMap> msgCache = takeMessageCache(); + QMapIterator i(msgCache.first); + + // Save the actual data read/unread. + while (i.hasNext()) { + i.next(); + auto key = i.key(); + QStringList ids = i.value(); + + if (!ids.isEmpty()) { + network()->updateArticles(ids, + UpdateArticle::Unread, + key == RootItem::Unread ? UpdateArticle::SetToTrue : UpdateArticle::SetToFalse); + } + } +} + QList TtRssServiceRoot::serviceMenu() { if (m_serviceMenu.isEmpty()) { m_actionSyncIn = new QAction(qApp->icons()->fromTheme(QSL("view-refresh")), tr("Sync in"), this); @@ -180,18 +201,8 @@ QList TtRssServiceRoot::serviceMenu() { bool TtRssServiceRoot::onBeforeSetMessagesRead(RootItem *selected_item, const QList &messages, RootItem::ReadStatus read) { Q_UNUSED(selected_item) - TtRssUpdateArticleResponse response = m_network->updateArticles(customIDsOfMessages(messages), - UpdateArticle::Unread, - read == RootItem::Unread ? - UpdateArticle::SetToTrue : - UpdateArticle::SetToFalse); - - if (m_network->lastError() == QNetworkReply::NoError && response.updateStatus() == STATUS_OK) { - return true; - } - else { - return false; - } + addMessageStatesToCache(customIDsOfMessages(messages), read); + return true; } bool TtRssServiceRoot::onBeforeSwitchMessageImportance(RootItem *selected_item, const QList &changes) { diff --git a/src/services/tt-rss/ttrssserviceroot.h b/src/services/tt-rss/ttrssserviceroot.h index 6b7f8fd34..273d3f2ac 100755 --- a/src/services/tt-rss/ttrssserviceroot.h +++ b/src/services/tt-rss/ttrssserviceroot.h @@ -19,6 +19,7 @@ #define TTRSSSERVICEROOT_H #include "services/abstract/serviceroot.h" +#include "services/abstract/cacheforserviceroot.h" #include @@ -28,7 +29,7 @@ class TtRssFeed; class TtRssNetworkFactory; class TtRssRecycleBin; -class TtRssServiceRoot : public ServiceRoot { +class TtRssServiceRoot : public ServiceRoot, public CacheForServiceRoot { Q_OBJECT public: @@ -48,6 +49,7 @@ class TtRssServiceRoot : public ServiceRoot { QVariant data(int column, int role) const; QList serviceMenu(); RecycleBin *recycleBin() const; + void saveAllCachedData(); bool onBeforeSetMessagesRead(RootItem *selected_item, const QList &messages, ReadStatus read); bool onBeforeSwitchMessageImportance(RootItem *selected_item, const QList &changes);