qa: Replace deprecated qVariantFromValue() by QVariant::fromValue()
[quassel.git] / src / core / coreirclisthelper.cpp
index 5abb5aa..cadb5e3 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 "coreirclisthelper.h"
 
 #include "corenetwork.h"
-#include "userinputhandler.h"
-
-INIT_SYNCABLE_OBJECT(CoreIrcListHelper)
-QVariantList CoreIrcListHelper::requestChannelList(const NetworkId &netId, const QStringList &channelFilters) {
-  if(_finishedChannelLists.contains(netId))
-    return _finishedChannelLists.take(netId);
-     
-  if(_channelLists.contains(netId)) {
-    _queuedQuery[netId] = channelFilters.join(",");
-  } else {
-    dispatchQuery(netId, channelFilters.join(","));
-  }
-  return QVariantList();
-}
+#include "coreuserinputhandler.h"
+
+constexpr auto kTimeoutMs = 5000;
 
-bool CoreIrcListHelper::addChannel(const NetworkId &netId, const QString &channelName, quint32 userCount, const QString &topic) {
-  if(!_channelLists.contains(netId))
-    return false;
+QVariantList CoreIrcListHelper::requestChannelList(const NetworkId& netId, const QStringList& channelFilters)
+{
+    if (_finishedChannelLists.contains(netId))
+        return _finishedChannelLists.take(netId);
 
-  _channelLists[netId] << ChannelDescription(channelName, userCount, topic);
-  return true;
+    if (_channelLists.contains(netId)) {
+        _queuedQuery[netId] = channelFilters.join(",");
+    }
+    else {
+        dispatchQuery(netId, channelFilters.join(","));
+    }
+    return QVariantList();
 }
 
-bool CoreIrcListHelper::dispatchQuery(const NetworkId &netId, const QString &query) {
-  CoreNetwork *network = coreSession()->network(netId);
-  if(network) {
-    _channelLists[netId] = QList<ChannelDescription>();
-    network->userInputHandler()->handleList(BufferInfo(), query);
-    _queryTimeout[startTimer(10000)] = netId;
+bool CoreIrcListHelper::addChannel(const NetworkId& netId, const QString& channelName, quint32 userCount, const QString& topic)
+{
+    if (!_channelLists.contains(netId))
+        return false;
+
+    _channelLists[netId] << ChannelDescription(channelName, userCount, topic);
+    if (_queryTimeoutByNetId.contains(netId))
+        _queryTimeoutByNetId[netId]->start(kTimeoutMs, this);
+
     return true;
-  } else {
-    return false;
-  }
 }
 
-bool CoreIrcListHelper::endOfChannelList(const NetworkId &netId) {
-  if(_queuedQuery.contains(netId)) {
-    // we're no longer interessted in the current data. drop it and issue a new request.
-    return dispatchQuery(netId, _queuedQuery.take(netId));
-  } else if(_channelLists.contains(netId)) {
-    QVariantList channelList;
-    foreach(ChannelDescription channel, _channelLists[netId]) {
-      QVariantList channelVariant;
-      channelVariant << channel.channelName
-                    << channel.userCount
-                    << channel.topic;
-      channelList << qVariantFromValue<QVariant>(channelVariant);
+bool CoreIrcListHelper::dispatchQuery(const NetworkId& netId, const QString& query)
+{
+    CoreNetwork* network = coreSession()->network(netId);
+    if (network) {
+        _channelLists[netId] = QList<ChannelDescription>();
+        network->userInputHandler()->handleList(BufferInfo(), query);
+
+        auto timer = std::make_shared<QBasicTimer>();
+        timer->start(kTimeoutMs, this);
+        _queryTimeoutByNetId[netId] = timer;
+        _queryTimeoutByTimerId[timer->timerId()] = netId;
+
+        return true;
+    }
+    else {
+        return false;
     }
-    _finishedChannelLists[netId] = channelList;
-    _channelLists.remove(netId);
-    reportFinishedList(netId);
-    return true;
-  } else {
-    return false;
-  }
 }
 
-void CoreIrcListHelper::timerEvent(QTimerEvent *event) {
-  int timerId = event->timerId();
-  killTimer(timerId);
-  NetworkId netId = _queryTimeout.take(timerId);
-  endOfChannelList(netId);
+bool CoreIrcListHelper::endOfChannelList(const NetworkId& netId)
+{
+    if (_queryTimeoutByNetId.contains(netId)) {
+        // If we recieved an actual RPL_LISTEND, remove the timer
+        int timerId = _queryTimeoutByNetId.take(netId)->timerId();
+        _queryTimeoutByTimerId.remove(timerId);
+    }
+
+    if (_queuedQuery.contains(netId)) {
+        // we're no longer interessted in the current data. drop it and issue a new request.
+        return dispatchQuery(netId, _queuedQuery.take(netId));
+    }
+    else if (_channelLists.contains(netId)) {
+        QVariantList channelList;
+        foreach (ChannelDescription channel, _channelLists[netId]) {
+            QVariantList channelVariant;
+            channelVariant << channel.channelName << channel.userCount << channel.topic;
+            channelList << QVariant::fromValue<QVariant>(channelVariant);
+        }
+        _finishedChannelLists[netId] = channelList;
+        _channelLists.remove(netId);
+        reportFinishedList(netId);
+        return true;
+    }
+    else {
+        return false;
+    }
+}
+
+void CoreIrcListHelper::timerEvent(QTimerEvent* event)
+{
+    if (!_queryTimeoutByTimerId.contains(event->timerId())) {
+        IrcListHelper::timerEvent(event);
+        return;
+    }
+
+    NetworkId netId = _queryTimeoutByTimerId.take(event->timerId());
+    _queryTimeoutByNetId.remove(netId);
+
+    event->accept();
+    endOfChannelList(netId);
 }