X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcorebacklogmanager.cpp;h=9ef4b8990e2279fbe46b8c29c38e7e62dda710ef;hp=c7bc8e72cfd45d479bdfcb0b00c1144a82ee0ca8;hb=3474e986630907fa2a3f4143012ac2a42796609e;hpb=26b9300ccab24e526a9f43bef95a2a70f59161df diff --git a/src/core/corebacklogmanager.cpp b/src/core/corebacklogmanager.cpp index c7bc8e72..9ef4b899 100644 --- a/src/core/corebacklogmanager.cpp +++ b/src/core/corebacklogmanager.cpp @@ -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 * @@ -24,16 +24,17 @@ #include +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 msgList; - msgList = Core::requestMsgs(coreSession()->user(), bufferId, limit, offset); + msgList = Core::requestMsgs(coreSession()->user(), bufferId, first, last, limit); QList::const_iterator msgIter = msgList.constBegin(); QList::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 msgList; + msgList = Core::requestAllMsgs(coreSession()->user(), first, last, limit); + + QList::const_iterator msgIter = msgList.constBegin(); + QList::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; }