qa: Avoid deprecation warnings for QList/QSet conversions
[quassel.git] / src / client / clientbacklogmanager.cpp
index afd7e1f..35403c0 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-09 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  *
  *   You should have received a copy of the GNU General Public License     *
  *   along with this program; if not, write to the                         *
  *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
  ***************************************************************************/
 
 #include "clientbacklogmanager.h"
 
+#include <algorithm>
+#include <ctime>
+
+#include <QDebug>
+
 #include "abstractmessageprocessor.h"
-#include "backlogsettings.h"
 #include "backlogrequester.h"
+#include "backlogsettings.h"
 #include "client.h"
+#include "util.h"
 
-#include <ctime>
-
-#include <QDebug>
+ClientBacklogManager::ClientBacklogManager(QObject* parent)
+    : BacklogManager(parent)
+{}
 
-ClientBacklogManager::ClientBacklogManager(QObject *parent)
-  : BacklogManager(parent),
-    _requester(0)
+QVariantList ClientBacklogManager::requestBacklog(BufferId bufferId, MsgId first, MsgId last, int limit, int additional)
 {
+    _buffersRequested << bufferId;
+    return BacklogManager::requestBacklog(bufferId, first, last, limit, additional);
 }
 
-void ClientBacklogManager::receiveBacklog(BufferId bufferId, MsgId first, MsgId last, int limit, int additional, QVariantList msgs) {
-  Q_UNUSED(first) Q_UNUSED(last) Q_UNUSED(limit) Q_UNUSED(additional)
-
-  emit messagesReceived(bufferId, msgs.count());
-
-  MessageList msglist;
-  foreach(QVariant v, msgs) {
-    Message msg = v.value<Message>();
-    msg.setFlags(msg.flags() | Message::Backlog);
-    msglist << msg;
-  }
-
-  _backlogReceived << bufferId;
+void ClientBacklogManager::receiveBacklog(BufferId bufferId, MsgId first, MsgId last, int limit, int additional, QVariantList msgs)
+{
+    Q_UNUSED(first)
+    Q_UNUSED(last)
+    Q_UNUSED(limit)
+    Q_UNUSED(additional)
+
+    emit messagesReceived(bufferId, msgs.count());
+
+    MessageList msglist;
+    foreach (QVariant v, msgs) {
+        Message msg = v.value<Message>();
+        msg.setFlags(msg.flags() | Message::Backlog);
+        msglist << msg;
+    }
 
-  if(isBuffering()) {
-    bool lastPart = !_requester->buffer(bufferId, msglist);
-    updateProgress(_requester->totalBuffers() - _requester->buffersWaiting(), _requester->totalBuffers());
-    if(lastPart) {
-      stopBuffering();
+    if (isBuffering()) {
+        bool lastPart = !_requester->buffer(bufferId, msglist);
+        updateProgress(_requester->totalBuffers() - _requester->buffersWaiting(), _requester->totalBuffers());
+        if (lastPart) {
+            dispatchMessages(_requester->bufferedMessages(), true);
+            _requester->flushBuffer();
+        }
+    }
+    else {
+        dispatchMessages(msglist);
     }
-  } else {
-    dispatchMessages(msglist);
-  }
 }
 
-void ClientBacklogManager::receiveBacklogAll(MsgId first, MsgId last, int limit, int additional, QVariantList msgs) {
-  Q_UNUSED(first) Q_UNUSED(last) Q_UNUSED(limit) Q_UNUSED(additional)
-
-  MessageList msglist;
-  foreach(QVariant v, msgs) {
-    Message msg = v.value<Message>();
-    msg.setFlags(msg.flags() | Message::Backlog);
-    msglist << msg;
-  }
-
-  dispatchMessages(msglist);
-}
+void ClientBacklogManager::receiveBacklogAll(MsgId first, MsgId last, int limit, int additional, QVariantList msgs)
+{
+    Q_UNUSED(first)
+    Q_UNUSED(last)
+    Q_UNUSED(limit)
+    Q_UNUSED(additional)
+
+    MessageList msglist;
+    foreach (QVariant v, msgs) {
+        Message msg = v.value<Message>();
+        msg.setFlags(msg.flags() | Message::Backlog);
+        msglist << msg;
+    }
 
-void ClientBacklogManager::requestInitialBacklog() {
-  if(_requester) {
-    qWarning() << "ClientBacklogManager::requestInitialBacklog() called twice in the same session! (Backlog has already been requested)";
-    return;
-  }
-
-  BacklogSettings settings;
-  switch(settings.requesterType()) {
-  case BacklogRequester::GlobalUnread:
-    _requester = new GlobalUnreadBacklogRequester(this);
-    break;
-  case BacklogRequester::PerBufferUnread:
-    _requester = new PerBufferUnreadBacklogRequester(this);
-    break;
-  case BacklogRequester::PerBufferFixed:
-  default:
-    _requester = new FixedBacklogRequester(this);
-  };
-
-  _requester->requestBacklog();
-  if(_requester->isBuffering()) {
-    updateProgress(0, _requester->totalBuffers());
-  }
+    dispatchMessages(msglist);
 }
 
-void ClientBacklogManager::checkForBacklog(const BufferId bufferId) {
-  if(_backlogReceived.contains(bufferId))
-    return;
+void ClientBacklogManager::requestInitialBacklog()
+{
+    if (_initBacklogRequested) {
+        Q_ASSERT(_requester);
+        qWarning() << "ClientBacklogManager::requestInitialBacklog() called twice in the same session! (Backlog has already been requested)";
+        return;
+    }
 
-  QList<BufferId> bufferIds;
-  bufferIds << bufferId;
-  checkForBacklog(bufferIds);
+    BacklogSettings settings;
+    switch (settings.requesterType()) {
+    case BacklogRequester::GlobalUnread:
+        _requester = new GlobalUnreadBacklogRequester(this);
+        break;
+    case BacklogRequester::PerBufferUnread:
+        _requester = new PerBufferUnreadBacklogRequester(this);
+        break;
+    case BacklogRequester::PerBufferFixed:
+    default:
+        _requester = new FixedBacklogRequester(this);
+    };
+
+    _requester->requestInitialBacklog();
+    _initBacklogRequested = true;
+    if (_requester->isBuffering()) {
+        updateProgress(0, _requester->totalBuffers());
+    }
 }
 
-void ClientBacklogManager::checkForBacklog(const QList<BufferId> &bufferIds) {
-  Q_ASSERT(_requester);
-  switch(_requester->type()) {
-  case BacklogRequester::GlobalUnread:
-    break;
-  case BacklogRequester::PerBufferUnread:
-  case BacklogRequester::PerBufferFixed:
-  default:
-    {
-      QList<BufferId> buffers;
-      foreach(BufferId bufferId, bufferIds)
-        if(!_backlogReceived.contains(bufferId))
-          buffers << bufferId;
-      _requester->requestBacklog(buffers);
+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::stopBuffering() {
-  Q_ASSERT(_requester);
-  dispatchMessages(_requester->bufferedMessages(), true);
+void ClientBacklogManager::checkForBacklog(const QList<BufferId>& bufferIds)
+{
+    // we ingore 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:
+    default: {
+        BufferIdList buffers = filterNewBufferIds(bufferIds);
+        if (!buffers.isEmpty())
+            _requester->requestBacklog(buffers);
+    }
+    };
 }
 
-bool ClientBacklogManager::isBuffering() {
-  return _requester && _requester->isBuffering();
+bool ClientBacklogManager::isBuffering()
+{
+    return _requester && _requester->isBuffering();
 }
 
-void ClientBacklogManager::dispatchMessages(const MessageList &messages, bool sort) {
-  if(messages.isEmpty())
-    return;
+void ClientBacklogManager::dispatchMessages(const MessageList& messages, bool sort)
+{
+    if (messages.isEmpty())
+        return;
 
-  MessageList msgs = messages;
+    MessageList msgs = messages;
 
-  clock_t start_t = clock();
-  if(sort)
-    qSort(msgs);
-  Client::messageProcessor()->process(msgs);
-  clock_t end_t = clock();
+    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));
+    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 = 0;
-  _backlogReceived.clear();
+void ClientBacklogManager::reset()
+{
+    delete _requester;
+    _requester = nullptr;
+    _initBacklogRequested = false;
+    _buffersRequested.clear();
 }