X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcorebacklogmanager.cpp;h=d72aa71931fb61e6fade4213049c2e73f9ab0f7d;hp=bb1d93f5b84c97fe3a7e0a1613d1c8e3722491ff;hb=f91f3faa1432894e6d6ecaaf0a1f60a483dd0129;hpb=921e54680da16fcf2adb7a90506875aceb6633a4 diff --git a/src/core/corebacklogmanager.cpp b/src/core/corebacklogmanager.cpp index bb1d93f5..d72aa719 100644 --- a/src/core/corebacklogmanager.cpp +++ b/src/core/corebacklogmanager.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2015 by the Quassel Project * + * Copyright (C) 2005-2019 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -19,18 +19,16 @@ ***************************************************************************/ #include "corebacklogmanager.h" -#include "core.h" -#include "coresession.h" #include -INIT_SYNCABLE_OBJECT(CoreBacklogManager) -CoreBacklogManager::CoreBacklogManager(CoreSession *coreSession) - : BacklogManager(coreSession), - _coreSession(coreSession) -{ -} +#include "core.h" +#include "coresession.h" +CoreBacklogManager::CoreBacklogManager(CoreSession* coreSession) + : BacklogManager(coreSession) + , _coreSession(coreSession) +{} QVariantList CoreBacklogManager::requestBacklog(BufferId bufferId, MsgId first, MsgId last, int limit, int additional) { @@ -42,7 +40,7 @@ QVariantList CoreBacklogManager::requestBacklog(BufferId bufferId, MsgId first, QList::const_iterator msgListEnd = msgList.constEnd(); while (msgIter != msgListEnd) { backlog << qVariantFromValue(*msgIter); - msgIter++; + ++msgIter; } if (additional && limit != 0) { @@ -69,7 +67,7 @@ QVariantList CoreBacklogManager::requestBacklog(BufferId bufferId, MsgId first, msgListEnd = msgList.constEnd(); while (msgIter != msgListEnd) { backlog << qVariantFromValue(*msgIter); - msgIter++; + ++msgIter; } } } @@ -77,6 +75,50 @@ QVariantList CoreBacklogManager::requestBacklog(BufferId bufferId, MsgId first, return backlog; } +QVariantList CoreBacklogManager::requestBacklogFiltered(BufferId bufferId, MsgId first, MsgId last, int limit, int additional, int type, int flags) +{ + QVariantList backlog; + QList msgList; + msgList = Core::requestMsgsFiltered(coreSession()->user(), bufferId, first, last, limit, Message::Types{type}, Message::Flags{flags}); + + QList::const_iterator msgIter = msgList.constBegin(); + QList::const_iterator msgListEnd = msgList.constEnd(); + while (msgIter != msgListEnd) { + 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::requestMsgsFiltered(coreSession()->user(), bufferId, -1, last, additional, Message::Types{type}, Message::Flags{flags}); + 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) { @@ -88,7 +130,7 @@ QVariantList CoreBacklogManager::requestBacklogAll(MsgId first, MsgId last, int QList::const_iterator msgListEnd = msgList.constEnd(); while (msgIter != msgListEnd) { backlog << qVariantFromValue(*msgIter); - msgIter++; + ++msgIter; } if (additional) { @@ -109,7 +151,45 @@ QVariantList CoreBacklogManager::requestBacklogAll(MsgId first, MsgId last, int msgListEnd = msgList.constEnd(); while (msgIter != msgListEnd) { backlog << qVariantFromValue(*msgIter); - msgIter++; + ++msgIter; + } + } + + return backlog; +} + +QVariantList CoreBacklogManager::requestBacklogAllFiltered(MsgId first, MsgId last, int limit, int additional, int type, int flags) +{ + QVariantList backlog; + QList msgList; + msgList = Core::requestAllMsgsFiltered(coreSession()->user(), first, last, limit, Message::Types{type}, Message::Flags{flags}); + + 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::requestAllMsgsFiltered(coreSession()->user(), -1, last, additional, Message::Types{type}, Message::Flags{flags}); + msgIter = msgList.constBegin(); + msgListEnd = msgList.constEnd(); + while (msgIter != msgListEnd) { + backlog << qVariantFromValue(*msgIter); + ++msgIter; } }