Silence warning
[quassel.git] / src / client / clientbacklogmanager.cpp
index afd7e1f..f851b8c 100644 (file)
 
 #include <QDebug>
 
+INIT_SYNCABLE_OBJECT(ClientBacklogManager)
 ClientBacklogManager::ClientBacklogManager(QObject *parent)
   : BacklogManager(parent),
     _requester(0)
 {
 }
 
+QVariantList ClientBacklogManager::requestBacklog(BufferId bufferId, MsgId first, MsgId last, int limit, int additional) {
+  _buffersRequested << bufferId;
+  return BacklogManager::requestBacklog(bufferId, first, last, limit, additional);
+}
+
 void ClientBacklogManager::receiveBacklog(BufferId bufferId, MsgId first, MsgId last, int limit, int additional, QVariantList msgs) {
   Q_UNUSED(first) Q_UNUSED(last) Q_UNUSED(limit) Q_UNUSED(additional)
 
@@ -47,13 +53,12 @@ void ClientBacklogManager::receiveBacklog(BufferId bufferId, MsgId first, MsgId
     msglist << msg;
   }
 
-  _backlogReceived << bufferId;
-
   if(isBuffering()) {
     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);
@@ -74,8 +79,8 @@ void ClientBacklogManager::receiveBacklogAll(MsgId first, MsgId last, int limit,
 }
 
 void ClientBacklogManager::requestInitialBacklog() {
-  if(_requester) {
-    qWarning() << "ClientBacklogManager::requestInitialBacklog() called twice in the same session! (Backlog has already been requested)";
+  if(_requester && !_buffersRequested.isEmpty()) {
+    // qWarning() << "ClientBacklogManager::requestInitialBacklog() called twice in the same session! (Backlog has already been requested)";
     return;
   }
 
@@ -92,23 +97,29 @@ void ClientBacklogManager::requestInitialBacklog() {
     _requester = new FixedBacklogRequester(this);
   };
 
-  _requester->requestBacklog();
+  _requester->requestInitialBacklog();
   if(_requester->isBuffering()) {
     updateProgress(0, _requester->totalBuffers());
   }
 }
 
-void ClientBacklogManager::checkForBacklog(const BufferId bufferId) {
-  if(_backlogReceived.contains(bufferId))
-    return;
-
-  QList<BufferId> bufferIds;
-  bufferIds << bufferId;
-  checkForBacklog(bufferIds);
+BufferIdList ClientBacklogManager::filterNewBufferIds(const BufferIdList &bufferIds) {
+  BufferIdList newBuffers;
+  QSet<BufferId> availableBuffers = Client::networkModel()->allBufferIds().toSet();
+  foreach(BufferId bufferId, bufferIds) {
+    if(_buffersRequested.contains(bufferId) || !availableBuffers.contains(bufferId))
+      continue;
+    newBuffers << bufferId;
+  }
+  return newBuffers;
 }
 
 void ClientBacklogManager::checkForBacklog(const QList<BufferId> &bufferIds) {
-  Q_ASSERT(_requester);
+  if(!_requester) {
+    // during client start up this message is to be expected in some situations.
+    qDebug() << "ClientBacklogManager::checkForBacklog(): no active backlog requester (yet?).";
+    return;
+  }
   switch(_requester->type()) {
   case BacklogRequester::GlobalUnread:
     break;
@@ -116,20 +127,13 @@ void ClientBacklogManager::checkForBacklog(const QList<BufferId> &bufferIds) {
   case BacklogRequester::PerBufferFixed:
   default:
     {
-      QList<BufferId> buffers;
-      foreach(BufferId bufferId, bufferIds)
-        if(!_backlogReceived.contains(bufferId))
-          buffers << bufferId;
-      _requester->requestBacklog(buffers);
+      BufferIdList buffers = filterNewBufferIds(bufferIds);
+      if(!buffers.isEmpty())
+        _requester->requestBacklog(buffers);
     }
   };
 }
 
-void ClientBacklogManager::stopBuffering() {
-  Q_ASSERT(_requester);
-  dispatchMessages(_requester->bufferedMessages(), true);
-}
-
 bool ClientBacklogManager::isBuffering() {
   return _requester && _requester->isBuffering();
 }
@@ -152,5 +156,5 @@ void ClientBacklogManager::dispatchMessages(const MessageList &messages, bool so
 void ClientBacklogManager::reset() {
   delete _requester;
   _requester = 0;
-  _backlogReceived.clear();
+  _buffersRequested.clear();
 }