X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcorebuffersyncer.cpp;h=55c28b266a42125dac766fc5b50686eda710faca;hp=5f035a914933913be1bccaeda58a890606c9c900;hb=86bd6b1ffb870e65af6d830a2ea16471c348ed5a;hpb=f0ac185f1fc99f64b49928c2886933ec927f265a diff --git a/src/core/corebuffersyncer.cpp b/src/core/corebuffersyncer.cpp index 5f035a91..55c28b26 100644 --- a/src/core/corebuffersyncer.cpp +++ b/src/core/corebuffersyncer.cpp @@ -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 * @@ -25,26 +25,46 @@ #include "corenetwork.h" #include "ircchannel.h" +class PurgeEvent : public QEvent { +public: + PurgeEvent() : QEvent(QEvent::User) {} +}; + +INIT_SYNCABLE_OBJECT(CoreBufferSyncer) CoreBufferSyncer::CoreBufferSyncer(CoreSession *parent) - : BufferSyncer(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 bufferInfos = Core::requestBuffers(_coreSession->user()); + QSet actualBuffers; + foreach(BufferInfo bufferInfo, bufferInfos) { + actualBuffers << bufferInfo.bufferId(); + } + + QSet storedIds = lastSeenBufferIds().toSet() + markerLineBufferIds().toSet(); + foreach(BufferId bufferId, storedIds) { + if(!actualBuffers.contains(bufferId)) { + BufferSyncer::removeBuffer(bufferId); + } + } +}