The BufferSyncer cache is now purged when an unknown bufferId is encountered.
[quassel.git] / src / core / corebuffersyncer.cpp
index f218508..d7a6ebc 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
 /***************************************************************************
- *   Copyright (C) 2005-08 by the Quassel Project                          *
+ *   Copyright (C) 2005-09 by the Quassel Project                          *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
 #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)
 CoreBufferSyncer::CoreBufferSyncer(CoreSession *parent)
-  : BufferSyncer(parent),
-    _coreSession(parent)
+  : BufferSyncer(Core::bufferLastSeenMsgIds(parent->user()), parent),
+    _coreSession(parent),
+    _purgeBuffers(false)
 {
 }
 
 {
 }
 
@@ -94,7 +100,6 @@ void CoreBufferSyncer::renameBuffer(BufferId bufferId, QString newName) {
 void CoreBufferSyncer::mergeBuffersPermanently(BufferId bufferId1, BufferId bufferId2) {
   BufferInfo bufferInfo1 = Core::getBufferInfo(_coreSession->user(), bufferId1);
   BufferInfo bufferInfo2 = Core::getBufferInfo(_coreSession->user(), bufferId2);
 void CoreBufferSyncer::mergeBuffersPermanently(BufferId bufferId1, BufferId bufferId2) {
   BufferInfo bufferInfo1 = Core::getBufferInfo(_coreSession->user(), bufferId1);
   BufferInfo bufferInfo2 = Core::getBufferInfo(_coreSession->user(), bufferId2);
-  qDebug() << Q_FUNC_INFO << bufferInfo1 << bufferInfo2;
   if(!bufferInfo1.isValid() || !bufferInfo2.isValid()) {
     qWarning() << "CoreBufferSyncer::mergeBufferPermanently(): invalid BufferIds:" << bufferId1 << bufferId2 << "for User:" << _coreSession->user();
     return;
   if(!bufferInfo1.isValid() || !bufferInfo2.isValid()) {
     qWarning() << "CoreBufferSyncer::mergeBufferPermanently(): invalid BufferIds:" << bufferId1 << bufferId2 << "for User:" << _coreSession->user();
     return;
@@ -106,7 +111,38 @@ void CoreBufferSyncer::mergeBuffersPermanently(BufferId bufferId1, BufferId buff
   }
 
   if(Core::mergeBuffersPermanently(_coreSession->user(), bufferId1, bufferId2)) {
   }
 
   if(Core::mergeBuffersPermanently(_coreSession->user(), bufferId1, bufferId2)) {
-    qDebug () << "HUUUUP";
     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);
+    }
+  }
+}