diff --git a/resources/text/CHANGELOG b/resources/text/CHANGELOG index 314908986..25af0168e 100755 --- a/resources/text/CHANGELOG +++ b/resources/text/CHANGELOG @@ -10,6 +10,9 @@ Changed: ▪ Folder which holds SQL scripts got renamed to "sql". ▪ Tweaked some conditions for determining newly "updated" messages in ATOM format. (issue #103) +Fixed: +▪ Crash in TT-RSS plugin on application exit, when TT-RSS user needed to be logged out. + 3.4.0 ————— diff --git a/src/core/feedsmodel.cpp b/src/core/feedsmodel.cpp index 949c4397c..2b408c96d 100755 --- a/src/core/feedsmodel.cpp +++ b/src/core/feedsmodel.cpp @@ -61,10 +61,6 @@ FeedsModel::FeedsModel(QObject *parent) : QAbstractItemModel(parent) { FeedsModel::~FeedsModel() { qDebug("Destroying FeedsModel instance."); - foreach (ServiceRoot *account, serviceRoots()) { - account->stop(); - } - // Delete all model items. delete m_rootItem; } @@ -539,6 +535,12 @@ void FeedsModel::loadActivatedServiceAccounts() { } } +void FeedsModel::stopServiceAccounts() { + foreach (ServiceRoot *account, serviceRoots()) { + account->stop(); + } +} + QList FeedsModel::feedsForIndex(const QModelIndex &index) const { return itemForIndex(index)->getSubTreeFeeds(); } diff --git a/src/core/feedsmodel.h b/src/core/feedsmodel.h index b43c3ff55..505b15b7a 100755 --- a/src/core/feedsmodel.h +++ b/src/core/feedsmodel.h @@ -109,6 +109,8 @@ class FeedsModel : public QAbstractItemModel { // Loads feed/categories from the database. void loadActivatedServiceAccounts(); + void stopServiceAccounts(); + // Reloads counts of all feeds/categories/whatever in the model. void reloadCountsOfWholeModel(); diff --git a/src/miscellaneous/feedreader.cpp b/src/miscellaneous/feedreader.cpp index 9dca3071b..c085ba0f3 100755 --- a/src/miscellaneous/feedreader.cpp +++ b/src/miscellaneous/feedreader.cpp @@ -311,6 +311,8 @@ void FeedReader::quit() { if (qApp->settings()->value(GROUP(Messages), SETTING(Messages::ClearReadOnExit)).toBool()) { m_feedsModel->markItemCleared(m_feedsModel->rootItem(), true); } + + m_feedsModel->stopServiceAccounts(); } MessagesProxyModel *FeedReader::messagesProxyModel() const { diff --git a/src/services/tt-rss/ttrssserviceroot.cpp b/src/services/tt-rss/ttrssserviceroot.cpp index c8ca6c662..c1b90cb6d 100755 --- a/src/services/tt-rss/ttrssserviceroot.cpp +++ b/src/services/tt-rss/ttrssserviceroot.cpp @@ -157,19 +157,6 @@ RecycleBin *TtRssServiceRoot::recycleBin() const { } 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); @@ -185,6 +172,22 @@ void TtRssServiceRoot::saveAllCachedData() { key == RootItem::Unread ? UpdateArticle::SetToTrue : UpdateArticle::SetToFalse); } } + + QMapIterator> j(msgCache.second); + + // Save the actual data important/not important. + while (j.hasNext()) { + j.next(); + auto key = j.key(); + QList messages = j.value(); + + if (!messages.isEmpty()) { + QStringList ids = customIDsOfMessages(messages); + network()->updateArticles(ids, + UpdateArticle::Starred, + key == RootItem::Important ? UpdateArticle::SetToTrue : UpdateArticle::SetToFalse); + } + } } QList TtRssServiceRoot::serviceMenu() { @@ -208,19 +211,28 @@ bool TtRssServiceRoot::onBeforeSetMessagesRead(RootItem *selected_item, const QL bool TtRssServiceRoot::onBeforeSwitchMessageImportance(RootItem *selected_item, const QList &changes) { Q_UNUSED(selected_item) - // NOTE: We just toggle it here, because we know, that there is only - // toggling of starred status supported by RSS Guard right now and - // Tiny Tiny RSS API allows it, which is great. - TtRssUpdateArticleResponse response = m_network->updateArticles(customIDsOfMessages(changes), - UpdateArticle::Starred, - UpdateArticle::Togggle); + // Now, we need to separate the changes because of ownCloud API limitations. + QList mark_starred_msgs; + QList mark_unstarred_msgs; - if (m_network->lastError() == QNetworkReply::NoError && response.updateStatus() == STATUS_OK) { - return true; + foreach (const ImportanceChange &pair, changes) { + if (pair.second == RootItem::Important) { + mark_starred_msgs.append(pair.first); + } + else { + mark_unstarred_msgs.append(pair.first); + } } - else { - return false; + + if (!mark_starred_msgs.isEmpty()) { + addMessageStatesToCache(mark_starred_msgs, RootItem::Important); } + + if (!mark_unstarred_msgs.isEmpty()) { + addMessageStatesToCache(mark_unstarred_msgs, RootItem::NotImportant); + } + + return true; } TtRssNetworkFactory *TtRssServiceRoot::network() const {