Properly flushing buffers after all backlog was received.
authorMarcus Eggenberger <egs@quassel-irc.org>
Thu, 21 May 2009 15:59:37 +0000 (17:59 +0200)
committerMarcus Eggenberger <egs@quassel-irc.org>
Thu, 21 May 2009 20:01:12 +0000 (22:01 +0200)
This fixes a bug where it seems to be impossible to delete a buffer.

src/client/backlogrequester.cpp
src/client/backlogrequester.h
src/client/clientbacklogmanager.cpp
src/client/clientbacklogmanager.h

index b26fe17..4a6524c 100644 (file)
@@ -57,6 +57,16 @@ BufferIdList BacklogRequester::allBufferIds() const {
   return bufferIds.toList();
 }
 
   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
 // ========================================
 // ========================================
 //  FIXED BACKLOG REQUESTER
 // ========================================
index c7c3afe..e813c6c 100644 (file)
@@ -48,12 +48,14 @@ public:
 
   inline int buffersWaiting() const { return _buffersWaiting.count(); }
   inline int totalBuffers() const { return _totalBuffers; }
 
   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 requestBacklog(const BufferIdList &bufferIds) = 0;
   virtual inline void requestInitialBacklog() { requestBacklog(allBufferIds()); }
 
+  virtual void flushBuffer();
+
 protected:
   BufferIdList allBufferIds() const;
   inline void setWaitingBuffers(const QList<BufferId> &buffers) { setWaitingBuffers(buffers.toSet()); }
 protected:
   BufferIdList allBufferIds() const;
   inline void setWaitingBuffers(const QList<BufferId> &buffers) { setWaitingBuffers(buffers.toSet()); }
index 476fa10..0a02e4e 100644 (file)
@@ -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) {
     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);
     }
   } else {
     dispatchMessages(msglist);
@@ -132,11 +133,6 @@ void ClientBacklogManager::checkForBacklog(const QList<BufferId> &bufferIds) {
   };
 }
 
   };
 }
 
-void ClientBacklogManager::stopBuffering() {
-  Q_ASSERT(_requester);
-  dispatchMessages(_requester->bufferedMessages(), true);
-}
-
 bool ClientBacklogManager::isBuffering() {
   return _requester && _requester->isBuffering();
 }
 bool ClientBacklogManager::isBuffering() {
   return _requester && _requester->isBuffering();
 }
index 1c9f6dd..2aa399b 100644 (file)
@@ -56,7 +56,6 @@ signals:
 
 private:
   bool isBuffering();
 
 private:
   bool isBuffering();
-  void stopBuffering();
   BufferIdList filterNewBufferIds(const BufferIdList &bufferIds);
 
   void dispatchMessages(const MessageList &messages, bool sort = false);
   BufferIdList filterNewBufferIds(const BufferIdList &bufferIds);
 
   void dispatchMessages(const MessageList &messages, bool sort = false);