Separate cache functionality into own class.
This commit is contained in:
		
							parent
							
								
									803d7bc1a7
								
							
						
					
					
						commit
						34e0e709a3
					
				
					 6 changed files with 137 additions and 56 deletions
				
			
		|  | @ -327,7 +327,8 @@ HEADERS +=  src/core/feeddownloader.h \ | ||||||
|             src/services/standard/feedparser.h \ |             src/services/standard/feedparser.h \ | ||||||
|             src/services/standard/rdfparser.h \ |             src/services/standard/rdfparser.h \ | ||||||
|             src/services/standard/rssparser.h \ |             src/services/standard/rssparser.h \ | ||||||
|             src/miscellaneous/serviceoperator.h |             src/miscellaneous/serviceoperator.h \ | ||||||
|  |             src/services/abstract/cacheforserviceroot.h | ||||||
| 
 | 
 | ||||||
| SOURCES +=  src/core/feeddownloader.cpp \ | SOURCES +=  src/core/feeddownloader.cpp \ | ||||||
|             src/core/feedsmodel.cpp \ |             src/core/feedsmodel.cpp \ | ||||||
|  | @ -446,7 +447,8 @@ SOURCES +=  src/core/feeddownloader.cpp \ | ||||||
|             src/services/standard/feedparser.cpp \ |             src/services/standard/feedparser.cpp \ | ||||||
|             src/services/standard/rdfparser.cpp \ |             src/services/standard/rdfparser.cpp \ | ||||||
|             src/services/standard/rssparser.cpp \ |             src/services/standard/rssparser.cpp \ | ||||||
|             src/miscellaneous/serviceoperator.cpp |             src/miscellaneous/serviceoperator.cpp \ | ||||||
|  |             src/services/abstract/cacheforserviceroot.cpp | ||||||
| 
 | 
 | ||||||
| FORMS +=    src/gui/toolbareditor.ui \ | FORMS +=    src/gui/toolbareditor.ui \ | ||||||
|             src/network-web/downloaditem.ui \ |             src/network-web/downloaditem.ui \ | ||||||
|  |  | ||||||
							
								
								
									
										77
									
								
								src/services/abstract/cacheforserviceroot.cpp
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										77
									
								
								src/services/abstract/cacheforserviceroot.cpp
									
										
									
									
									
										Executable 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); | ||||||
|  | } | ||||||
							
								
								
									
										45
									
								
								src/services/abstract/cacheforserviceroot.h
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										45
									
								
								src/services/abstract/cacheforserviceroot.h
									
										
									
									
									
										Executable 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
 | ||||||
|  | @ -18,6 +18,7 @@ | ||||||
| #include "services/owncloud/owncloudrecyclebin.h" | #include "services/owncloud/owncloudrecyclebin.h" | ||||||
| 
 | 
 | ||||||
| #include "services/owncloud/owncloudserviceroot.h" | #include "services/owncloud/owncloudserviceroot.h" | ||||||
|  | #include "services/abstract/cacheforserviceroot.h" | ||||||
| #include "services/owncloud/network/owncloudnetworkfactory.h" | #include "services/owncloud/network/owncloudnetworkfactory.h" | ||||||
| 
 | 
 | ||||||
| #include <QNetworkReply> | #include <QNetworkReply> | ||||||
|  |  | ||||||
|  | @ -33,8 +33,7 @@ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| OwnCloudServiceRoot::OwnCloudServiceRoot(RootItem *parent) | OwnCloudServiceRoot::OwnCloudServiceRoot(RootItem *parent) | ||||||
|   : ServiceRoot(parent), m_cacheSaveMutex(new Mutex(QMutex::NonRecursive, this)), m_cachedStatesRead(QMap<RootItem::ReadStatus, QStringList>()), |   : ServiceRoot(parent), CacheForServiceRoot(), m_recycleBin(new OwnCloudRecycleBin(this)), | ||||||
|     m_cachedStatesImportant(QMap<RootItem::Importance, QStringList>()), m_recycleBin(new OwnCloudRecycleBin(this)), |  | ||||||
|     m_actionSyncIn(nullptr), m_serviceMenu(QList<QAction*>()), m_network(new OwnCloudNetworkFactory()) { |     m_actionSyncIn(nullptr), m_serviceMenu(QList<QAction*>()), m_network(new OwnCloudNetworkFactory()) { | ||||||
|   setIcon(OwnCloudServiceEntryPoint().icon()); |   setIcon(OwnCloudServiceEntryPoint().icon()); | ||||||
| } | } | ||||||
|  | @ -113,51 +112,11 @@ OwnCloudNetworkFactory *OwnCloudServiceRoot::network() const { | ||||||
|   return m_network; |   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() { | 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()) { |   // Save the actual data read/unread.
 | ||||||
|     // 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.
 |  | ||||||
|   while (i.hasNext()) { |   while (i.hasNext()) { | ||||||
|     i.next(); |     i.next(); | ||||||
|     auto key = i.key(); |     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) { |                                                   RootItem::ReadStatus read) { | ||||||
|   Q_UNUSED(selected_item) |   Q_UNUSED(selected_item) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -19,6 +19,7 @@ | ||||||
| #define OWNCLOUDSERVICEROOT_H | #define OWNCLOUDSERVICEROOT_H | ||||||
| 
 | 
 | ||||||
| #include "services/abstract/serviceroot.h" | #include "services/abstract/serviceroot.h" | ||||||
|  | #include "services/abstract/cacheforserviceroot.h" | ||||||
| 
 | 
 | ||||||
| #include <QMap> | #include <QMap> | ||||||
| 
 | 
 | ||||||
|  | @ -27,11 +28,11 @@ class OwnCloudNetworkFactory; | ||||||
| class OwnCloudRecycleBin; | class OwnCloudRecycleBin; | ||||||
| class Mutex; | class Mutex; | ||||||
| 
 | 
 | ||||||
| class OwnCloudServiceRoot : public ServiceRoot { | class OwnCloudServiceRoot : public ServiceRoot, public CacheForServiceRoot { | ||||||
|     Q_OBJECT |     Q_OBJECT | ||||||
| 
 | 
 | ||||||
|   public: |   public: | ||||||
|     explicit OwnCloudServiceRoot(RootItem *parent = NULL); |     explicit OwnCloudServiceRoot(RootItem *parent = nullptr); | ||||||
|     virtual ~OwnCloudServiceRoot(); |     virtual ~OwnCloudServiceRoot(); | ||||||
| 
 | 
 | ||||||
|     bool canBeEdited() const; |     bool canBeEdited() const; | ||||||
|  | @ -48,14 +49,13 @@ class OwnCloudServiceRoot : public ServiceRoot { | ||||||
| 
 | 
 | ||||||
|     OwnCloudNetworkFactory *network() const; |     OwnCloudNetworkFactory *network() const; | ||||||
| 
 | 
 | ||||||
|     void addMessageStatesToCache(const QStringList &ids_of_messages, ReadStatus read); |  | ||||||
| 
 |  | ||||||
|     bool onBeforeSetMessagesRead(RootItem *selected_item, const QList<Message> &messages, ReadStatus read); |     bool onBeforeSetMessagesRead(RootItem *selected_item, const QList<Message> &messages, ReadStatus read); | ||||||
|     bool onBeforeSwitchMessageImportance(RootItem *selected_item, const QList<ImportanceChange> &changes); |     bool onBeforeSwitchMessageImportance(RootItem *selected_item, const QList<ImportanceChange> &changes); | ||||||
| 
 | 
 | ||||||
|     void updateTitle(); |     void updateTitle(); | ||||||
|     void saveAccountDataToDatabase(); |     void saveAccountDataToDatabase(); | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|     void saveAllCachedData(); |     void saveAllCachedData(); | ||||||
| 
 | 
 | ||||||
|   public slots: |   public slots: | ||||||
|  | @ -63,10 +63,6 @@ class OwnCloudServiceRoot : public ServiceRoot { | ||||||
|     void addNewCategory(); |     void addNewCategory(); | ||||||
| 
 | 
 | ||||||
|   private: |   private: | ||||||
|     Mutex *m_cacheSaveMutex; |  | ||||||
|     QMap<RootItem::ReadStatus, QStringList> m_cachedStatesRead; |  | ||||||
|     QMap<RootItem::Importance, QStringList> m_cachedStatesImportant; |  | ||||||
| 
 |  | ||||||
|     QMap<int,QVariant> storeCustomFeedsData(); |     QMap<int,QVariant> storeCustomFeedsData(); | ||||||
|     void restoreCustomFeedsData(const QMap<int,QVariant> &data, const QHash<int,Feed*> &feeds); |     void restoreCustomFeedsData(const QMap<int,QVariant> &data, const QHash<int,Feed*> &feeds); | ||||||
|     RootItem *obtainNewTreeForSyncIn() const; |     RootItem *obtainNewTreeForSyncIn() const; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue