fixing a bug where no backlog is requested after an aborted connect
[quassel.git] / src / client / clientbacklogmanager.cpp
index ce22e33..518ac24 100644 (file)
 #include "clientbacklogmanager.h"
 
 #include "abstractmessageprocessor.h"
+#include "backlogsettings.h"
 #include "backlogrequester.h"
 #include "client.h"
 
+#include <ctime>
+
 #include <QDebug>
 
 ClientBacklogManager::ClientBacklogManager(QObject *parent)
-  : BacklogManager(parent)
+  : BacklogManager(parent),
+    _requester(0)
 {
 }
 
 void ClientBacklogManager::receiveBacklog(BufferId bufferId, int lastMsgs, int offset, QVariantList msgs) {
-  Q_UNUSED(bufferId)
   Q_UNUSED(lastMsgs)
   Q_UNUSED(offset)
 
   if(msgs.isEmpty())
     return;
 
-  //QTime start = QTime::currentTime();
-  QList<Message> msglist;
+  emit messagesReceived(bufferId, msgs.count());
+
+  MessageList msglist;
   foreach(QVariant v, msgs) {
     Message msg = v.value<Message>();
     msg.setFlags(msg.flags() | Message::Backlog);
     msglist << msg;
   }
-  Client::messageProcessor()->process(msglist);
-  //qDebug() << "processed" << msgs.count() << "backlog lines in" << start.msecsTo(QTime::currentTime());
+
+  if(isBuffering()) {
+    if(!_requester->buffer(bufferId, msglist)) {
+      // this was the last part to buffer
+      stopBuffering();
+    }
+  } else {
+    dispatchMessages(msglist);
+  }
 }
 
 void ClientBacklogManager::requestInitialBacklog() {
-  FixedBacklogRequester backlogRequester(this);
-  backlogRequester.requestBacklog();
+  if(_requester) {
+    qWarning() << "ClientBacklogManager::requestInitialBacklog() called twice in the same session! (Backlog has already been requested)";
+    return;
+  }
+
+  BacklogSettings settings;
+  switch(settings.requesterType()) {
+  case BacklogRequester::GlobalUnread:
+  case BacklogRequester::PerBufferUnread:
+  case BacklogRequester::PerBufferFixed:
+  default:
+    _requester = new FixedBacklogRequester(this);
+  };
+
+  _requester->requestBacklog();
+}
+
+void ClientBacklogManager::stopBuffering() {
+  Q_ASSERT(_requester);
+
+  dispatchMessages(_requester->bufferedMessages(), true);
+  reset();
+}
+
+bool ClientBacklogManager::isBuffering() {
+  return _requester && _requester->isBuffering();
+}
+
+void ClientBacklogManager::dispatchMessages(const MessageList &messages, bool sort) {
+  MessageList msgs = messages;
+
+  clock_t start_t = clock();
+  if(sort)
+    qSort(msgs);
+  Client::messageProcessor()->process(msgs);
+  clock_t end_t = clock();
+
+  emit messagesProcessed(tr("Processed %1 messages in %2 seconds.").arg(msgs.count()).arg((float)(end_t - start_t) / CLOCKS_PER_SEC));
+}
+
+void ClientBacklogManager::reset() {
+  delete _requester;
+  _requester = 0;
 }