Separate cache functionality into own class.

This commit is contained in:
martinrotter 2017-04-27 07:41:27 +02:00
parent 803d7bc1a7
commit 34e0e709a3
6 changed files with 137 additions and 56 deletions

View file

@ -327,7 +327,8 @@ HEADERS += src/core/feeddownloader.h \
src/services/standard/feedparser.h \
src/services/standard/rdfparser.h \
src/services/standard/rssparser.h \
src/miscellaneous/serviceoperator.h
src/miscellaneous/serviceoperator.h \
src/services/abstract/cacheforserviceroot.h
SOURCES += src/core/feeddownloader.cpp \
src/core/feedsmodel.cpp \
@ -446,7 +447,8 @@ SOURCES += src/core/feeddownloader.cpp \
src/services/standard/feedparser.cpp \
src/services/standard/rdfparser.cpp \
src/services/standard/rssparser.cpp \
src/miscellaneous/serviceoperator.cpp
src/miscellaneous/serviceoperator.cpp \
src/services/abstract/cacheforserviceroot.cpp
FORMS += src/gui/toolbareditor.ui \
src/network-web/downloaditem.ui \

View file

@ -0,0 +1,77 @@
// This file is part of RSS Guard.
//
// Copyright (C) 2011-2017 by Martin Rotter <rotter.martinos@gmail.com>
//
// RSS Guard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// RSS Guard is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
#include "services/abstract/cacheforserviceroot.h"
#include "miscellaneous/mutex.h"
#include <QSet>
CacheForServiceRoot::CacheForServiceRoot() : m_cacheSaveMutex(new Mutex(QMutex::NonRecursive, nullptr)),
m_cachedStatesRead(QMap<RootItem::ReadStatus, QStringList>()),
m_cachedStatesImportant(QMap<RootItem::Importance, QStringList>()) {
}
CacheForServiceRoot::~CacheForServiceRoot() {
m_cacheSaveMutex->deleteLater();
}
void CacheForServiceRoot::addMessageStatesToCache(const QStringList &ids_of_messages, RootItem::ReadStatus read) {
m_cacheSaveMutex->lock();
QStringList &list_act = m_cachedStatesRead[read];
QStringList &list_other = m_cachedStatesRead[read == RootItem::Read ? RootItem::Unread : RootItem::Read];
// Store changes, they will be sent to server later.
list_act.append(ids_of_messages);
QSet<QString> set_act = list_act.toSet();
QSet<QString> set_other = list_other.toSet();
// Now, we want to remove all IDS from list_other, which are contained in list.
set_other -= set_act;
list_act.clear(); list_act.append(set_act.toList());
list_other.clear(); list_other.append(set_other.toList());
m_cacheSaveMutex->unlock();
}
QPair<QMap<RootItem::ReadStatus, QStringList>, QMap<RootItem::Importance, QStringList> > CacheForServiceRoot::takeMessageCache() {
m_cacheSaveMutex->lock();
if (m_cachedStatesRead.isEmpty() && m_cachedStatesImportant.isEmpty()) {
// No cached changes.
m_cacheSaveMutex->unlock();
return QPair<QMap<RootItem::ReadStatus, QStringList>, QMap<RootItem::Importance, QStringList> >();
}
// Make copy of changes.
QMap<RootItem::ReadStatus, QStringList> cached_data_read = m_cachedStatesRead;
cached_data_read.detach();
QMap<RootItem::Importance, QStringList> cached_data_imp = m_cachedStatesImportant;
cached_data_imp.detach();
m_cachedStatesRead.clear();
m_cachedStatesImportant.clear();
m_cacheSaveMutex->unlock();
return QPair<QMap<RootItem::ReadStatus, QStringList>, QMap<RootItem::Importance, QStringList> >(cached_data_read, cached_data_imp);
}

View file

@ -0,0 +1,45 @@
// This file is part of RSS Guard.
//
// Copyright (C) 2011-2017 by Martin Rotter <rotter.martinos@gmail.com>
//
// RSS Guard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// RSS Guard is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
#ifndef CACHEFORSERVICEROOT_H
#define CACHEFORSERVICEROOT_H
#include "services/abstract/serviceroot.h"
#include <QStringList>
#include <QPair>
#include <QMap>
class Mutex;
class CacheForServiceRoot {
public:
explicit CacheForServiceRoot();
virtual ~CacheForServiceRoot();
void addMessageStatesToCache(const QStringList &ids_of_messages, RootItem::ReadStatus read);
protected:
QPair<QMap<RootItem::ReadStatus, QStringList>, QMap<RootItem::Importance, QStringList>> takeMessageCache();
Mutex *m_cacheSaveMutex;
QMap<RootItem::ReadStatus, QStringList> m_cachedStatesRead;
QMap<RootItem::Importance, QStringList> m_cachedStatesImportant;
};
#endif // CACHEFORSERVICEROOT_H

View file

@ -18,6 +18,7 @@
#include "services/owncloud/owncloudrecyclebin.h"
#include "services/owncloud/owncloudserviceroot.h"
#include "services/abstract/cacheforserviceroot.h"
#include "services/owncloud/network/owncloudnetworkfactory.h"
#include <QNetworkReply>

View file

@ -33,8 +33,7 @@
OwnCloudServiceRoot::OwnCloudServiceRoot(RootItem *parent)
: ServiceRoot(parent), m_cacheSaveMutex(new Mutex(QMutex::NonRecursive, this)), m_cachedStatesRead(QMap<RootItem::ReadStatus, QStringList>()),
m_cachedStatesImportant(QMap<RootItem::Importance, QStringList>()), m_recycleBin(new OwnCloudRecycleBin(this)),
: ServiceRoot(parent), CacheForServiceRoot(), m_recycleBin(new OwnCloudRecycleBin(this)),
m_actionSyncIn(nullptr), m_serviceMenu(QList<QAction*>()), m_network(new OwnCloudNetworkFactory()) {
setIcon(OwnCloudServiceEntryPoint().icon());
}
@ -113,51 +112,11 @@ OwnCloudNetworkFactory *OwnCloudServiceRoot::network() const {
return m_network;
}
void OwnCloudServiceRoot::addMessageStatesToCache(const QStringList &ids_of_messages, RootItem::ReadStatus read) {
m_cacheSaveMutex->lock();
QStringList &list_act = m_cachedStatesRead[read];
QStringList &list_other = m_cachedStatesRead[read == RootItem::Read ? RootItem::Unread : RootItem::Read];
// Store changes, they will be sent to server later.
list_act.append(ids_of_messages);
QSet<QString> set_act = list_act.toSet();
QSet<QString> set_other = list_other.toSet();
// Now, we want to remove all IDS from list_other, which are contained in list.
set_other -= set_act;
list_act.clear(); list_act.append(set_act.toList());
list_other.clear(); list_other.append(set_other.toList());
m_cacheSaveMutex->unlock();
}
void OwnCloudServiceRoot::saveAllCachedData() {
m_cacheSaveMutex->lock();
QPair<QMap<RootItem::ReadStatus, QStringList>, QMap<RootItem::Importance, QStringList>> msgCache = takeMessageCache();
QMapIterator<RootItem::ReadStatus, QStringList> i(msgCache.first);
if (m_cachedStatesRead.isEmpty() && m_cachedStatesImportant.isEmpty()) {
// No cached changes.
m_cacheSaveMutex->unlock();
return;
}
// Make copy of changes.
QMap<RootItem::ReadStatus, QStringList> cached_data_read = m_cachedStatesRead;
cached_data_read.detach();
QMap<RootItem::Importance, QStringList> cached_data_imp = m_cachedStatesImportant;
cached_data_imp.detach();
m_cachedStatesRead.clear();
m_cachedStatesImportant.clear();
m_cacheSaveMutex->unlock();
QMapIterator<RootItem::ReadStatus, QStringList> i(cached_data_read);
// Save the actual data.
// Save the actual data read/unread.
while (i.hasNext()) {
i.next();
auto key = i.key();
@ -169,7 +128,8 @@ void OwnCloudServiceRoot::saveAllCachedData() {
}
}
bool OwnCloudServiceRoot::onBeforeSetMessagesRead(RootItem *selected_item, const QList<Message> &messages,
bool OwnCloudServiceRoot::onBeforeSetMessagesRead(RootItem *selected_item,
const QList<Message> &messages,
RootItem::ReadStatus read) {
Q_UNUSED(selected_item)

View file

@ -19,6 +19,7 @@
#define OWNCLOUDSERVICEROOT_H
#include "services/abstract/serviceroot.h"
#include "services/abstract/cacheforserviceroot.h"
#include <QMap>
@ -27,11 +28,11 @@ class OwnCloudNetworkFactory;
class OwnCloudRecycleBin;
class Mutex;
class OwnCloudServiceRoot : public ServiceRoot {
class OwnCloudServiceRoot : public ServiceRoot, public CacheForServiceRoot {
Q_OBJECT
public:
explicit OwnCloudServiceRoot(RootItem *parent = NULL);
explicit OwnCloudServiceRoot(RootItem *parent = nullptr);
virtual ~OwnCloudServiceRoot();
bool canBeEdited() const;
@ -48,14 +49,13 @@ class OwnCloudServiceRoot : public ServiceRoot {
OwnCloudNetworkFactory *network() const;
void addMessageStatesToCache(const QStringList &ids_of_messages, ReadStatus read);
bool onBeforeSetMessagesRead(RootItem *selected_item, const QList<Message> &messages, ReadStatus read);
bool onBeforeSwitchMessageImportance(RootItem *selected_item, const QList<ImportanceChange> &changes);
void updateTitle();
void saveAccountDataToDatabase();
void saveAllCachedData();
public slots:
@ -63,10 +63,6 @@ class OwnCloudServiceRoot : public ServiceRoot {
void addNewCategory();
private:
Mutex *m_cacheSaveMutex;
QMap<RootItem::ReadStatus, QStringList> m_cachedStatesRead;
QMap<RootItem::Importance, QStringList> m_cachedStatesImportant;
QMap<int,QVariant> storeCustomFeedsData();
void restoreCustomFeedsData(const QMap<int,QVariant> &data, const QHash<int,Feed*> &feeds);
RootItem *obtainNewTreeForSyncIn() const;