X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fclient%2Fclientbacklogmanager.cpp;h=b485726d6cf60054583094336c15a867043b0630;hb=6a590134d0ceca46e83a6b5b24e44550b68e9b4b;hp=86b1b1c17770931289a1d7339182b7cc5bc9bd87;hpb=8ec76e512d20ce5d1dc76de556bb98a06b75d695;p=quassel.git diff --git a/src/client/clientbacklogmanager.cpp b/src/client/clientbacklogmanager.cpp index 86b1b1c1..b485726d 100644 --- a/src/client/clientbacklogmanager.cpp +++ b/src/client/clientbacklogmanager.cpp @@ -19,17 +19,67 @@ ***************************************************************************/ #include "clientbacklogmanager.h" + +#include "abstractmessageprocessor.h" +#include "backlogrequester.h" #include "client.h" #include +#include ClientBacklogManager::ClientBacklogManager(QObject *parent) - : BacklogManager(parent) + : BacklogManager(parent), + _buffer(true) { } void ClientBacklogManager::receiveBacklog(BufferId bufferId, int lastMsgs, int offset, QVariantList msgs) { Q_UNUSED(lastMsgs) Q_UNUSED(offset) - emit backlog(bufferId, msgs); + + if(msgs.isEmpty()) + return; + + //QTime start = QTime::currentTime(); + QList msglist; + foreach(QVariant v, msgs) { + Message msg = v.value(); + msg.setFlags(msg.flags() | Message::Backlog); + msglist << msg; + } + + if(_buffer) { + _messageBuffer << msglist; + _buffersWaiting.remove(bufferId); + if(_buffersWaiting.isEmpty()) { + _buffer = false; + clock_t start_t = clock(); + qSort(_messageBuffer); + Client::messageProcessor()->process(_messageBuffer); + clock_t end_t = clock(); + qDebug() << "Processed" << _messageBuffer.count() << "Messages in" << (float)(end_t - start_t) / CLOCKS_PER_SEC << "seconds ==" << end_t - start_t << "clocks."; + _messageBuffer.clear(); + } + } else { + Client::messageProcessor()->process(msglist); + } + //qDebug() << "processed" << msgs.count() << "backlog lines in" << start.msecsTo(QTime::currentTime()); +} + +QVariantList ClientBacklogManager::requestBacklog(BufferId bufferId, int lastMsgs, int offset) { + if(_buffer) + _buffersWaiting << bufferId; + + return BacklogManager::requestBacklog(bufferId, lastMsgs, offset); +} + +void ClientBacklogManager::requestInitialBacklog() { + FixedBacklogRequester backlogRequester(this); + backlogRequester.requestBacklog(); +} + +void ClientBacklogManager::reset() { + _buffer = true; + _messageBuffer.clear(); + _buffersWaiting.clear(); }