The BufferSyncer cache is now purged when an unknown bufferId is encountered.
authorMarcus Eggenberger <egs@quassel-irc.org>
Tue, 17 Feb 2009 16:32:55 +0000 (17:32 +0100)
committerMarcus Eggenberger <egs@quassel-irc.org>
Tue, 17 Feb 2009 16:34:02 +0000 (17:34 +0100)
Aka: getting rid of "NetworkModel::setLastSeenMsgId(): buffer is unknown" messages.
Note: needs core upgrade

src/client/client.cpp
src/client/client.h
src/client/networkmodel.cpp
src/common/buffersyncer.h
src/core/corebuffersyncer.cpp
src/core/corebuffersyncer.h

index bbca252..759afcf 100644 (file)
@@ -421,6 +421,12 @@ void Client::mergeBuffersPermanently(BufferId bufferId1, BufferId bufferId2) {
   bufferSyncer()->requestMergeBuffersPermanently(bufferId1, 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
 void Client::bufferRemoved(BufferId bufferId) {
   // select a sane buffer (status buffer)
   /* we have to manually select a buffer because otherwise inconsitent changes
index c0e07d8..2babb11 100644 (file)
@@ -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 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; }
 
   static void logMessage(QtMsgType type, const char *msg);
   static inline const QString &debugLog() { return instance()->_debugLogBuffer; }
index 8b087d5..cd5f46d 100644 (file)
@@ -970,7 +970,7 @@ MsgId NetworkModel::lastSeenMarkerMsgId(BufferId bufferId) const {
 MsgId NetworkModel::lastSeenMsgId(const BufferId &bufferId) {
   BufferItem *bufferItem = findBufferItem(bufferId);
   if(!bufferItem) {
 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();
     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) {
 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);
     return;
   }
   bufferItem->setLastSeenMsgId(msgId);
index f847093..0973828 100644 (file)
@@ -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 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);
 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 mergeBuffersPermanentlyRequested(BufferId buffer1, BufferId buffer2);
   void buffersPermanentlyMerged(BufferId buffer1, BufferId buffer2);
 
+  void purgeBufferIdsRequested();
+
 protected slots:
   bool setLastSeenMsg(BufferId buffer, const MsgId &msgId);
 protected slots:
   bool setLastSeenMsg(BufferId buffer, const MsgId &msgId);
+  QList<BufferId> bufferIds() const { return _lastSeenMsg.keys(); }
 
 private:
   QHash<BufferId, MsgId> _lastSeenMsg;
 
 private:
   QHash<BufferId, MsgId> _lastSeenMsg;
index 9549df7..d7a6ebc 100644 (file)
 #include "corenetwork.h"
 #include "ircchannel.h"
 
 #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),
 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);
   }
 }
     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<BufferInfo> bufferInfos = Core::requestBuffers(_coreSession->user());
+  QSet<BufferId> actualBuffers;
+  foreach(BufferInfo bufferInfo, bufferInfos) {
+    actualBuffers << bufferInfo.bufferId();
+  }
+
+  QList<BufferId> storedIds = bufferIds();
+  foreach(BufferId bufferId, storedIds) {
+    if(!actualBuffers.contains(bufferId)) {
+      removeBuffer(bufferId);
+    }
+  }
+}
index 6b85b12..1f4176c 100644 (file)
@@ -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 inline void requestMergeBuffersPermanently(BufferId buffer1, BufferId buffer2) { mergeBuffersPermanently(buffer1, buffer2); }
   virtual void mergeBuffersPermanently(BufferId buffer1, BufferId buffer2);
 
+  virtual void requestPurgeBufferIds();
+
   void storeDirtyIds();
 
   void storeDirtyIds();
 
+protected:
+  virtual void customEvent(QEvent *event);
+
 private:
   CoreSession *_coreSession;
 private:
   CoreSession *_coreSession;
+  bool _purgeBuffers;
 
   QSet<BufferId> dirtyBuffers;
 
   QSet<BufferId> dirtyBuffers;
+
+  void purgeBufferIds();
 };
 
 #endif //COREBUFFERSYNCER_H
 };
 
 #endif //COREBUFFERSYNCER_H