warnings--
[quassel.git] / src / core / corebuffersyncer.cpp
index 9549df7..55c28b2 100644 (file)
 #include "corenetwork.h"
 #include "ircchannel.h"
 
+class PurgeEvent : public QEvent {
+public:
+  PurgeEvent() : QEvent(QEvent::User) {}
+};
+
+INIT_SYNCABLE_OBJECT(CoreBufferSyncer)
 CoreBufferSyncer::CoreBufferSyncer(CoreSession *parent)
-  : BufferSyncer(Core::bufferLastSeenMsgIds(parent->user()), parent),
-    _coreSession(parent)
+  : BufferSyncer(Core::bufferLastSeenMsgIds(parent->user()), Core::bufferMarkerLineMsgIds(parent->user()), parent),
+    _coreSession(parent),
+    _purgeBuffers(false)
 {
 }
 
 void CoreBufferSyncer::requestSetLastSeenMsg(BufferId buffer, const MsgId &msgId) {
   if(setLastSeenMsg(buffer, msgId))
-    dirtyBuffers << buffer;
+    dirtyLastSeenBuffers << buffer;
+}
+
+void CoreBufferSyncer::requestSetMarkerLine(BufferId buffer, const MsgId &msgId) {
+  if(setMarkerLine(buffer, msgId))
+    dirtyMarkerLineBuffers << buffer;
 }
 
 void CoreBufferSyncer::storeDirtyIds() {
   UserId userId = _coreSession->user();
   MsgId msgId;
-  foreach(BufferId bufferId, dirtyBuffers) {
+  foreach(BufferId bufferId, dirtyLastSeenBuffers) {
     msgId = lastSeenMsg(bufferId);
     if(msgId.isValid())
       Core::setBufferLastSeenMsg(userId, bufferId, msgId);
   }
-  dirtyBuffers.clear();
+
+  foreach(BufferId bufferId, dirtyMarkerLineBuffers) {
+    msgId = markerLine(bufferId);
+    if(msgId.isValid())
+      Core::setBufferMarkerLineMsg(userId, bufferId, msgId);
+  }
+
+  dirtyLastSeenBuffers.clear();
+  dirtyMarkerLineBuffers.clear();
 }
 
 void CoreBufferSyncer::removeBuffer(BufferId bufferId) {
@@ -108,3 +128,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();
+  }
+
+  QSet<BufferId> storedIds = lastSeenBufferIds().toSet() + markerLineBufferIds().toSet();
+  foreach(BufferId bufferId, storedIds) {
+    if(!actualBuffers.contains(bufferId)) {
+      BufferSyncer::removeBuffer(bufferId);
+    }
+  }
+}