Aka: getting rid of "NetworkModel::setLastSeenMsgId(): buffer is unknown" messages.
Note: needs core upgrade
bufferSyncer()->requestMergeBuffersPermanently(bufferId1, bufferId2);
}
+void Client::purgeKnownBufferIds() {
+ if(!bufferSyncer())
+ return;
+ bufferSyncer()->requestPurgeBufferIds();
+}
+
void Client::bufferRemoved(BufferId bufferId) {
// select a sane buffer (status buffer)
/* we have to manually select a buffer because otherwise inconsitent changes
static void removeBuffer(BufferId id);
static void renameBuffer(BufferId bufferId, const QString &newName);
static void mergeBuffersPermanently(BufferId bufferId1, BufferId bufferId2);
+ static void purgeKnownBufferIds();
static void logMessage(QtMsgType type, const char *msg);
static inline const QString &debugLog() { return instance()->_debugLogBuffer; }
MsgId NetworkModel::lastSeenMsgId(const BufferId &bufferId) {
BufferItem *bufferItem = findBufferItem(bufferId);
if(!bufferItem) {
- qDebug() << "NetworkModel::lastSeenMsgId(): buffer is unknown:" << bufferId;
+ Client::purgeKnownBufferIds();
return MsgId();
}
return bufferItem->lastSeenMsgId();
void NetworkModel::setLastSeenMsgId(const BufferId &bufferId, const MsgId &msgId) {
BufferItem *bufferItem = findBufferItem(bufferId);
if(!bufferItem) {
- qDebug() << "NetworkModel::setLastSeenMsgId(): buffer is unknown:" << bufferId;
+ Client::purgeKnownBufferIds();
return;
}
bufferItem->setLastSeenMsgId(msgId);
virtual inline void requestMergeBuffersPermanently(BufferId buffer1, BufferId buffer2) { emit mergeBuffersPermanentlyRequested(buffer1, buffer2); }
virtual void mergeBuffersPermanently(BufferId buffer1, BufferId buffer2);
+ virtual inline void requestPurgeBufferIds() { emit purgeBufferIdsRequested(); }
+
signals:
void lastSeenMsgSet(BufferId buffer, const MsgId &msgId);
void setLastSeenMsgRequested(BufferId buffer, const MsgId &msgId);
void mergeBuffersPermanentlyRequested(BufferId buffer1, BufferId buffer2);
void buffersPermanentlyMerged(BufferId buffer1, BufferId buffer2);
+ void purgeBufferIdsRequested();
+
protected slots:
bool setLastSeenMsg(BufferId buffer, const MsgId &msgId);
+ QList<BufferId> bufferIds() const { return _lastSeenMsg.keys(); }
private:
QHash<BufferId, MsgId> _lastSeenMsg;
#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)
{
}
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);
+ }
+ }
+}
virtual inline void requestMergeBuffersPermanently(BufferId buffer1, BufferId buffer2) { mergeBuffersPermanently(buffer1, buffer2); }
virtual void mergeBuffersPermanently(BufferId buffer1, BufferId buffer2);
+ virtual void requestPurgeBufferIds();
+
void storeDirtyIds();
+protected:
+ virtual void customEvent(QEvent *event);
+
private:
CoreSession *_coreSession;
+ bool _purgeBuffers;
QSet<BufferId> dirtyBuffers;
+
+ void purgeBufferIds();
};
#endif //COREBUFFERSYNCER_H