The BufferSyncer cache is now purged when an unknown bufferId is encountered.
[quassel.git] / src / core / corebuffersyncer.cpp
index 9549df7..d7a6ebc 100644 (file)
 #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<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);
+    }
+  }
+}