From: Marcus Eggenberger Date: Tue, 17 Feb 2009 16:32:55 +0000 (+0100) Subject: The BufferSyncer cache is now purged when an unknown bufferId is encountered. X-Git-Tag: 0.4.0~11 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=aadd816dbcae859ce9ac5b44d609bd3094b3d6fc;hp=5df0040d620491dc32987492361003cb97f81c2b The BufferSyncer cache is now purged when an unknown bufferId is encountered. Aka: getting rid of "NetworkModel::setLastSeenMsgId(): buffer is unknown" messages. Note: needs core upgrade --- diff --git a/src/client/client.cpp b/src/client/client.cpp index bbca2525..759afcf9 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -421,6 +421,12 @@ void Client::mergeBuffersPermanently(BufferId bufferId1, BufferId bufferId2) { bufferSyncer()->requestMergeBuffersPermanently(bufferId1, bufferId2); } +void Client::purgeKnownBufferIds() { + if(!bufferSyncer()) + return; + bufferSyncer()->requestPurgeBufferIds(); +} + void Client::bufferRemoved(BufferId bufferId) { // select a sane buffer (status buffer) /* we have to manually select a buffer because otherwise inconsitent changes diff --git a/src/client/client.h b/src/client/client.h index c0e07d88..2babb111 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -116,6 +116,7 @@ public: static void removeBuffer(BufferId id); static void renameBuffer(BufferId bufferId, const QString &newName); static void mergeBuffersPermanently(BufferId bufferId1, BufferId bufferId2); + static void purgeKnownBufferIds(); static void logMessage(QtMsgType type, const char *msg); static inline const QString &debugLog() { return instance()->_debugLogBuffer; } diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index 8b087d58..cd5f46d9 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -970,7 +970,7 @@ MsgId NetworkModel::lastSeenMarkerMsgId(BufferId bufferId) const { MsgId NetworkModel::lastSeenMsgId(const BufferId &bufferId) { BufferItem *bufferItem = findBufferItem(bufferId); if(!bufferItem) { - qDebug() << "NetworkModel::lastSeenMsgId(): buffer is unknown:" << bufferId; + Client::purgeKnownBufferIds(); return MsgId(); } return bufferItem->lastSeenMsgId(); @@ -979,7 +979,7 @@ MsgId NetworkModel::lastSeenMsgId(const BufferId &bufferId) { void NetworkModel::setLastSeenMsgId(const BufferId &bufferId, const MsgId &msgId) { BufferItem *bufferItem = findBufferItem(bufferId); if(!bufferItem) { - qDebug() << "NetworkModel::setLastSeenMsgId(): buffer is unknown:" << bufferId; + Client::purgeKnownBufferIds(); return; } bufferItem->setLastSeenMsgId(msgId); diff --git a/src/common/buffersyncer.h b/src/common/buffersyncer.h index f847093d..0973828f 100644 --- a/src/common/buffersyncer.h +++ b/src/common/buffersyncer.h @@ -50,6 +50,8 @@ public slots: virtual inline void requestMergeBuffersPermanently(BufferId buffer1, BufferId buffer2) { emit mergeBuffersPermanentlyRequested(buffer1, buffer2); } virtual void mergeBuffersPermanently(BufferId buffer1, BufferId buffer2); + virtual inline void requestPurgeBufferIds() { emit purgeBufferIdsRequested(); } + signals: void lastSeenMsgSet(BufferId buffer, const MsgId &msgId); void setLastSeenMsgRequested(BufferId buffer, const MsgId &msgId); @@ -63,8 +65,11 @@ signals: void mergeBuffersPermanentlyRequested(BufferId buffer1, BufferId buffer2); void buffersPermanentlyMerged(BufferId buffer1, BufferId buffer2); + void purgeBufferIdsRequested(); + protected slots: bool setLastSeenMsg(BufferId buffer, const MsgId &msgId); + QList bufferIds() const { return _lastSeenMsg.keys(); } private: QHash _lastSeenMsg; diff --git a/src/core/corebuffersyncer.cpp b/src/core/corebuffersyncer.cpp index 9549df7a..d7a6ebcb 100644 --- a/src/core/corebuffersyncer.cpp +++ b/src/core/corebuffersyncer.cpp @@ -25,9 +25,15 @@ #include "corenetwork.h" #include "ircchannel.h" +class PurgeEvent : public QEvent { +public: + PurgeEvent() : QEvent(QEvent::User) {} +}; + CoreBufferSyncer::CoreBufferSyncer(CoreSession *parent) : BufferSyncer(Core::bufferLastSeenMsgIds(parent->user()), parent), - _coreSession(parent) + _coreSession(parent), + _purgeBuffers(false) { } @@ -108,3 +114,35 @@ void CoreBufferSyncer::mergeBuffersPermanently(BufferId bufferId1, BufferId buff BufferSyncer::mergeBuffersPermanently(bufferId1, bufferId2); } } + +void CoreBufferSyncer::customEvent(QEvent *event) { + if(event->type() != QEvent::User) + return; + + purgeBufferIds(); + event->accept(); +} + +void CoreBufferSyncer::requestPurgeBufferIds() { + if(_purgeBuffers) + return; + + _purgeBuffers = true; + QCoreApplication::postEvent(this, new PurgeEvent()); +} + +void CoreBufferSyncer::purgeBufferIds() { + _purgeBuffers = false; + QList bufferInfos = Core::requestBuffers(_coreSession->user()); + QSet actualBuffers; + foreach(BufferInfo bufferInfo, bufferInfos) { + actualBuffers << bufferInfo.bufferId(); + } + + QList storedIds = bufferIds(); + foreach(BufferId bufferId, storedIds) { + if(!actualBuffers.contains(bufferId)) { + removeBuffer(bufferId); + } + } +} diff --git a/src/core/corebuffersyncer.h b/src/core/corebuffersyncer.h index 6b85b12b..1f4176cd 100644 --- a/src/core/corebuffersyncer.h +++ b/src/core/corebuffersyncer.h @@ -43,12 +43,20 @@ public slots: virtual inline void requestMergeBuffersPermanently(BufferId buffer1, BufferId buffer2) { mergeBuffersPermanently(buffer1, buffer2); } virtual void mergeBuffersPermanently(BufferId buffer1, BufferId buffer2); + virtual void requestPurgeBufferIds(); + void storeDirtyIds(); +protected: + virtual void customEvent(QEvent *event); + private: CoreSession *_coreSession; + bool _purgeBuffers; QSet dirtyBuffers; + + void purgeBufferIds(); }; #endif //COREBUFFERSYNCER_H