X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcoreirclisthelper.cpp;h=9ff68fae8dc8e7663b86690c97afeb8808947b56;hp=aefcec9ddf3ddf2a3eb775a2034cebf18772055d;hb=3e63cb8a6e83765069a45101b86ae9e21dcc57ad;hpb=e50ae7a06fc4e5d3a911c361d30953410deab609 diff --git a/src/core/coreirclisthelper.cpp b/src/core/coreirclisthelper.cpp index aefcec9d..9ff68fae 100644 --- a/src/core/coreirclisthelper.cpp +++ b/src/core/coreirclisthelper.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2015 by the Quassel Project * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -23,7 +23,8 @@ #include "corenetwork.h" #include "coreuserinputhandler.h" -INIT_SYNCABLE_OBJECT(CoreIrcListHelper) +constexpr auto kTimeoutMs = 5000; + QVariantList CoreIrcListHelper::requestChannelList(const NetworkId &netId, const QStringList &channelFilters) { if (_finishedChannelLists.contains(netId)) @@ -45,6 +46,9 @@ bool CoreIrcListHelper::addChannel(const NetworkId &netId, const QString &channe return false; _channelLists[netId] << ChannelDescription(channelName, userCount, topic); + if (_queryTimeoutByNetId.contains(netId)) + _queryTimeoutByNetId[netId]->start(kTimeoutMs, this); + return true; } @@ -55,7 +59,12 @@ bool CoreIrcListHelper::dispatchQuery(const NetworkId &netId, const QString &que if (network) { _channelLists[netId] = QList(); network->userInputHandler()->handleList(BufferInfo(), query); - _queryTimeout[startTimer(10000)] = netId; + + auto timer = std::make_shared(); + timer->start(kTimeoutMs, this); + _queryTimeoutByNetId[netId] = timer; + _queryTimeoutByTimerId[timer->timerId()] = netId; + return true; } else { @@ -66,6 +75,12 @@ bool CoreIrcListHelper::dispatchQuery(const NetworkId &netId, const QString &que 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)); @@ -92,8 +107,14 @@ bool CoreIrcListHelper::endOfChannelList(const NetworkId &netId) void CoreIrcListHelper::timerEvent(QTimerEvent *event) { - int timerId = event->timerId(); - killTimer(timerId); - NetworkId netId = _queryTimeout.take(timerId); + if (!_queryTimeoutByTimerId.contains(event->timerId())) { + IrcListHelper::timerEvent(event); + return; + } + + NetworkId netId = _queryTimeoutByTimerId.take(event->timerId()); + _queryTimeoutByNetId.remove(netId); + + event->accept(); endOfChannelList(netId); }