+BufferIdList ClientBacklogManager::filterNewBufferIds(const BufferIdList& bufferIds)
+{
+ BufferIdList newBuffers;
+ QSet<BufferId> availableBuffers = toQSet(Client::networkModel()->allBufferIds());
+ foreach (BufferId bufferId, bufferIds) {
+ if (_buffersRequested.contains(bufferId) || !availableBuffers.contains(bufferId))
+ continue;
+ newBuffers << bufferId;
+ }
+ return newBuffers;
+}
+
+void ClientBacklogManager::checkForBacklog(const QList<BufferId>& bufferIds)
+{
+ // we ignore all backlogrequests until we had our initial request
+ if (!_initBacklogRequested) {
+ return;
+ }
+
+ if (!_requester) {
+ // during client start up this message is to be expected in some situations.
+ qDebug() << "ClientBacklogManager::checkForBacklog(): no active backlog requester.";
+ return;
+ }
+ switch (_requester->type()) {
+ case BacklogRequester::GlobalUnread:
+ break;
+ case BacklogRequester::PerBufferUnread:
+ case BacklogRequester::PerBufferFixed:
+ case BacklogRequester::AsNeeded:
+ default: {
+ BufferIdList buffers = filterNewBufferIds(bufferIds);
+ if (!buffers.isEmpty())
+ _requester->requestBacklog(buffers);
+ }
+ };
+}
+
+bool ClientBacklogManager::isBuffering()
+{
+ return _requester && _requester->isBuffering();
+}
+
+void ClientBacklogManager::dispatchMessages(const MessageList& messages, bool sort)
+{
+ if (messages.isEmpty())
+ return;
+
+ MessageList msgs = messages;
+
+ clock_t start_t = clock();
+ if (sort)
+ std::sort(msgs.begin(), msgs.end());
+ Client::messageProcessor()->process(msgs);
+ clock_t end_t = clock();
+
+ emit messagesProcessed(tr("Processed %1 messages in %2 seconds.").arg(messages.count()).arg((float)(end_t - start_t) / CLOCKS_PER_SEC));
+}
+
+void ClientBacklogManager::reset()
+{
+ delete _requester;
+ _requester = nullptr;
+ _initBacklogRequested = false;
+ _buffersRequested.clear();