From: Marcus Eggenberger Date: Thu, 21 May 2009 15:59:37 +0000 (+0200) Subject: Properly flushing buffers after all backlog was received. X-Git-Tag: 0.5-rc1~185 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=e9845108739563c7cf40e88c26a051f1f8702cd1;ds=sidebyside Properly flushing buffers after all backlog was received. This fixes a bug where it seems to be impossible to delete a buffer. --- 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);