From e9845108739563c7cf40e88c26a051f1f8702cd1 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Thu, 21 May 2009 17:59:37 +0200 Subject: [PATCH] Properly flushing buffers after all backlog was received. This fixes a bug where it seems to be impossible to delete a buffer. --- src/client/backlogrequester.cpp | 10 ++++++++++ src/client/backlogrequester.h | 8 +++++--- src/client/clientbacklogmanager.cpp | 8 ++------ src/client/clientbacklogmanager.h | 1 - 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/client/backlogrequester.cpp b/src/client/backlogrequester.cpp index b26fe172..4a6524cc 100644 --- a/src/client/backlogrequester.cpp +++ b/src/client/backlogrequester.cpp @@ -57,6 +57,16 @@ BufferIdList BacklogRequester::allBufferIds() const { return bufferIds.toList(); } +void BacklogRequester::flushBuffer() { + if(!_buffersWaiting.isEmpty()) { + qWarning() << Q_FUNC_INFO << "was called before all backlog was received:" + << _buffersWaiting.count() << "buffers are waiting."; + } + _bufferedMessages.clear(); + _totalBuffers = 0; + _buffersWaiting.clear(); +} + // ======================================== // FIXED BACKLOG REQUESTER // ======================================== diff --git a/src/client/backlogrequester.h b/src/client/backlogrequester.h index c7c3afe9..e813c6c7 100644 --- a/src/client/backlogrequester.h +++ b/src/client/backlogrequester.h @@ -48,12 +48,14 @@ public: inline int buffersWaiting() const { return _buffersWaiting.count(); } inline int totalBuffers() const { return _totalBuffers; } - //! returns false if it was the last missing backlogpart - bool buffer(BufferId bufferId, const MessageList &messages); - + + bool buffer(BufferId bufferId, const MessageList &messages); //! returns false if it was the last missing backlogpart + virtual void requestBacklog(const BufferIdList &bufferIds) = 0; virtual inline void requestInitialBacklog() { requestBacklog(allBufferIds()); } + virtual void flushBuffer(); + protected: BufferIdList allBufferIds() const; inline void setWaitingBuffers(const QList &buffers) { setWaitingBuffers(buffers.toSet()); } diff --git a/src/client/clientbacklogmanager.cpp b/src/client/clientbacklogmanager.cpp index 476fa103..0a02e4ee 100644 --- a/src/client/clientbacklogmanager.cpp +++ b/src/client/clientbacklogmanager.cpp @@ -56,7 +56,8 @@ void ClientBacklogManager::receiveBacklog(BufferId bufferId, MsgId first, MsgId bool lastPart = !_requester->buffer(bufferId, msglist); updateProgress(_requester->totalBuffers() - _requester->buffersWaiting(), _requester->totalBuffers()); if(lastPart) { - stopBuffering(); + dispatchMessages(_requester->bufferedMessages(), true); + _requester->flushBuffer(); } } else { dispatchMessages(msglist); @@ -132,11 +133,6 @@ void ClientBacklogManager::checkForBacklog(const QList &bufferIds) { }; } -void ClientBacklogManager::stopBuffering() { - Q_ASSERT(_requester); - dispatchMessages(_requester->bufferedMessages(), true); -} - bool ClientBacklogManager::isBuffering() { return _requester && _requester->isBuffering(); } diff --git a/src/client/clientbacklogmanager.h b/src/client/clientbacklogmanager.h index 1c9f6dd9..2aa399b5 100644 --- a/src/client/clientbacklogmanager.h +++ b/src/client/clientbacklogmanager.h @@ -56,7 +56,6 @@ signals: private: bool isBuffering(); - void stopBuffering(); BufferIdList filterNewBufferIds(const BufferIdList &bufferIds); void dispatchMessages(const MessageList &messages, bool sort = false); -- 2.20.1