Fix initial backlog for buffers with no new messages
[quassel.git] / src / core / corebacklogmanager.cpp
index c7bc8e7..9ef4b89 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-08 by the Quassel IRC Team                         *
+ *   Copyright (C) 2005-09 by the Quassel Project                          *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
 
 #include <QDebug>
 
+INIT_SYNCABLE_OBJECT(CoreBacklogManager)
 CoreBacklogManager::CoreBacklogManager(CoreSession *coreSession)
   : BacklogManager(coreSession),
     _coreSession(coreSession)
 {
 }
 
-QVariantList CoreBacklogManager::requestBacklog(BufferId bufferId, int limit, int offset) {
+QVariantList CoreBacklogManager::requestBacklog(BufferId bufferId, MsgId first, MsgId last, int limit, int additional) {
   QVariantList backlog;
   QList<Message> msgList;
-  msgList = Core::requestMsgs(coreSession()->user(), bufferId, limit, offset);
+  msgList = Core::requestMsgs(coreSession()->user(), bufferId, first, last, limit);
 
   QList<Message>::const_iterator msgIter = msgList.constBegin();
   QList<Message>::const_iterator msgListEnd = msgList.constEnd();
@@ -41,5 +42,70 @@ QVariantList CoreBacklogManager::requestBacklog(BufferId bufferId, int limit, in
     backlog << qVariantFromValue(*msgIter);
     msgIter++;
   }
+
+  if(additional && limit != 0) {
+    MsgId oldestMessage = first;
+    if(!msgList.isEmpty()) {
+      if(msgList.first().msgId() < msgList.last().msgId())
+        oldestMessage = msgList.first().msgId();
+      else
+        oldestMessage = msgList.last().msgId();
+    }
+
+    if(first != -1) {
+      last = first;
+    } else {
+      last = oldestMessage;
+    }
+
+    // only fetch additional messages if they continue seemlessly
+    // that is, if the list of messages is not truncated by the limit
+    if(last == oldestMessage) {
+      msgList = Core::requestMsgs(coreSession()->user(), bufferId, -1, last, additional);
+      msgIter = msgList.constBegin();
+      msgListEnd = msgList.constEnd();
+      while(msgIter != msgListEnd) {
+        backlog << qVariantFromValue(*msgIter);
+        msgIter++;
+      }
+    }
+  }
+
+  return backlog;
+}
+
+QVariantList CoreBacklogManager::requestBacklogAll(MsgId first, MsgId last, int limit, int additional) {
+  QVariantList backlog;
+  QList<Message> msgList;
+  msgList = Core::requestAllMsgs(coreSession()->user(), first, last, limit);
+
+  QList<Message>::const_iterator msgIter = msgList.constBegin();
+  QList<Message>::const_iterator msgListEnd = msgList.constEnd();
+  while(msgIter != msgListEnd) {
+    backlog << qVariantFromValue(*msgIter);
+    msgIter++;
+  }
+
+  if(additional) {
+    if(first != -1) {
+      last = first;
+    } else {
+      last = -1;
+      if(!msgList.isEmpty()) {
+       if(msgList.first().msgId() < msgList.last().msgId())
+         last = msgList.first().msgId();
+       else
+         last = msgList.last().msgId();
+      }
+    }
+    msgList = Core::requestAllMsgs(coreSession()->user(), -1, last, additional);
+    msgIter = msgList.constBegin();
+    msgListEnd = msgList.constEnd();
+    while(msgIter != msgListEnd) {
+      backlog << qVariantFromValue(*msgIter);
+      msgIter++;
+    }
+  }
+
   return backlog;
 }