/***************************************************************************
- * 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 *
#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) {
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(Core::mergeBuffersPermanently(_coreSession->user(), bufferId1, bufferId2)) {
- qDebug () << "HUUUUP";
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);
+ }
+ }
+}