X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcoreirclisthelper.cpp;h=cadb5e3c34bd29c8774cdfea81778c75290d9e6c;hp=5abb5aad46bff90f8b7a5d74f94fc92c3cacdc29;hb=1f21c1f9613031ae263eeed0c4883bfcd5488343;hpb=f6b9eeda207d42c99fc3e9085631722cf2ec83dc diff --git a/src/core/coreirclisthelper.cpp b/src/core/coreirclisthelper.cpp index 5abb5aad..cadb5e3c 100644 --- a/src/core/coreirclisthelper.cpp +++ b/src/core/coreirclisthelper.cpp @@ -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 * @@ -15,72 +15,100 @@ * 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(); - 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(channelVariant); +bool CoreIrcListHelper::dispatchQuery(const NetworkId& netId, const QString& query) +{ + CoreNetwork* network = coreSession()->network(netId); + if (network) { + _channelLists[netId] = QList(); + network->userInputHandler()->handleList(BufferInfo(), query); + + auto timer = std::make_shared(); + 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(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); }