X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fnetworkinfo.cpp;h=8836a702a0e8b60b280ddb1c0a8f863988311fee;hp=f79ef5c5993d829b6ee5d05caf533d30a7fbcd5e;hb=45d9ea6ed5d64eec3ca351fdcf7610c7cff3529d;hpb=976a2fe94b138b84832388f1ac9067beea565407 diff --git a/src/common/networkinfo.cpp b/src/common/networkinfo.cpp index f79ef5c5..8836a702 100644 --- a/src/common/networkinfo.cpp +++ b/src/common/networkinfo.cpp @@ -1,11 +1,11 @@ /*************************************************************************** - * Copyright (C) 2005-07 by The Quassel Team * + * Copyright (C) 2005-07 by the Quassel IRC Team * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * + * (at your option) version 3. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * @@ -20,7 +20,6 @@ #include "networkinfo.h" #include "signalproxy.h" -#include "synchronizer.h" #include "ircuser.h" #include "ircchannel.h" @@ -31,7 +30,7 @@ // ==================== // Public: // ==================== -NetworkInfo::NetworkInfo(const uint &networkid, SignalProxy *proxy, QObject *parent) +NetworkInfo::NetworkInfo(const uint &networkid, QObject *parent) : QObject(parent), _networkId(networkid), _initialized(false), @@ -39,20 +38,20 @@ NetworkInfo::NetworkInfo(const uint &networkid, SignalProxy *proxy, QObject *par _networkName(QString()), _currentServer(QString()), _prefixes(QString()), - _prefixModes(QString()) + _prefixModes(QString()), + _proxy(NULL) { setObjectName(QString::number(networkid)); - _synchronizer = new Synchronizer(this, proxy); } // I think this is unnecessary since IrcUsers have us as their daddy :) -// NetworkInfo::~NetworkInfo() { +//NetworkInfo::~NetworkInfo() { // QHashIterator ircuser(_ircUsers); // while (ircuser.hasNext()) { // ircuser.next(); // delete ircuser.value(); // } -// } +//} uint NetworkInfo::networkId() const { return _networkId; @@ -62,8 +61,13 @@ bool NetworkInfo::initialized() const { return _initialized; } -Synchronizer *NetworkInfo::synchronizer() { - return _synchronizer; +SignalProxy *NetworkInfo::proxy() const { + return _proxy; +} + +void NetworkInfo::setProxy(SignalProxy *proxy) { + _proxy = proxy; + proxy->synchronize(this); } bool NetworkInfo::isMyNick(const QString &nick) const { @@ -159,20 +163,44 @@ QString NetworkInfo::support(const QString ¶m) const { } IrcUser *NetworkInfo::newIrcUser(const QString &hostmask) { - QString nick(nickFromMask(hostmask)); + QString nick(nickFromMask(hostmask).toLower()); if(!_ircUsers.contains(nick)) { IrcUser *ircuser = new IrcUser(hostmask, this); - new Synchronizer(ircuser, synchronizer()->proxy()); + // mark IrcUser as already initialized to keep the SignalProxy from requesting initData + if(initialized()) + ircuser->setInitialized(); + if(proxy()) + proxy()->synchronize(ircuser); + else + qWarning() << "unable to synchronize new IrcUser" << hostmask << "forgot to call NetworkInfo::setProxy(SignalProxy *)?"; + connect(ircuser, SIGNAL(nickSet(QString)), this, SLOT(ircUserNickChanged(QString))); connect(ircuser, SIGNAL(initDone()), this, SIGNAL(ircUserInitDone())); connect(ircuser, SIGNAL(destroyed()), this, SLOT(ircUserDestroyed())); _ircUsers[nick] = ircuser; emit ircUserAdded(hostmask); } - return _ircUsers[nick]; + return _ircUsers[nick]; +} + +void NetworkInfo::removeIrcUser(IrcUser *ircuser) { + QString nick = _ircUsers.key(ircuser); + if(nick.isNull()) + return; + + _ircUsers.remove(nick); + ircuser->deleteLater(); + emit ircUserRemoved(nick); } -IrcUser *NetworkInfo::ircUser(const QString &nickname) const { +void NetworkInfo::removeIrcUser(QString nick) { + IrcUser *ircuser; + if((ircuser = ircUser(nick)) != 0) + removeIrcUser(ircuser); +} + +IrcUser *NetworkInfo::ircUser(QString nickname) const { + nickname = nickname.toLower(); if(_ircUsers.contains(nickname)) return _ircUsers[nickname]; else @@ -184,19 +212,28 @@ QList NetworkInfo::ircUsers() const { } IrcChannel *NetworkInfo::newIrcChannel(const QString &channelname) { - if(!_ircChannels.contains(channelname)) { + if(!_ircChannels.contains(channelname.toLower())) { IrcChannel *channel = new IrcChannel(channelname, this); - new Synchronizer(channel, synchronizer()->proxy()); + // mark IrcUser as already initialized to keep the SignalProxy from requesting initData + if(initialized()) + channel->setInitialized(); + + if(proxy()) + proxy()->synchronize(channel); + else + qWarning() << "unable to synchronize new IrcChannel" << channelname << "forgot to call NetworkInfo::setProxy(SignalProxy *)?"; + connect(channel, SIGNAL(initDone()), this, SIGNAL(ircChannelInitDone())); connect(channel, SIGNAL(destroyed()), this, SLOT(channelDestroyed())); - _ircChannels[channelname] = channel; + _ircChannels[channelname.toLower()] = channel; emit ircChannelAdded(channelname); } - return _ircChannels[channelname]; + return _ircChannels[channelname.toLower()]; } -IrcChannel *NetworkInfo::ircChannel(const QString &channelname) { +IrcChannel *NetworkInfo::ircChannel(QString channelname) { + channelname = channelname.toLower(); if(_ircChannels.contains(channelname)) return _ircChannels[channelname]; else @@ -285,7 +322,7 @@ void NetworkInfo::initSetChannels(const QStringList &channels) { } IrcUser *NetworkInfo::updateNickFromMask(const QString &mask) { - QString nick(nickFromMask(mask)); + QString nick(nickFromMask(mask).toLower()); IrcUser *ircuser; if(_ircUsers.contains(nick)) { @@ -302,25 +339,21 @@ void NetworkInfo::ircUserNickChanged(QString newnick) { if(oldnick.isNull()) return; + + if(newnick.toLower() != oldnick) _ircUsers[newnick.toLower()] = _ircUsers.take(oldnick); - _ircUsers[newnick] = _ircUsers.take(oldnick); - - if(myNick() == oldnick) + if(myNick().toLower() == oldnick) setMyNick(newnick); } void NetworkInfo::ircUserDestroyed() { - IrcUser *ircuser = qobject_cast(sender()); - // in case this assert triggers we probably need a static_cast - // dynamic_casts seem to screw things up when using the destroyed signal + IrcUser *ircuser = static_cast(sender()); Q_ASSERT(ircuser); - _ircUsers.remove(_ircUsers.key(ircuser)); + removeIrcUser(ircuser); } void NetworkInfo::channelDestroyed() { - IrcChannel *channel = qobject_cast(sender()); - // in case this assert triggers we probably need a static_cast - // dynamic_casts seem to screw things up when using the destroyed signal + IrcChannel *channel = static_cast(sender()); Q_ASSERT(channel); _ircChannels.remove(_ircChannels.key(channel)); } @@ -341,8 +374,8 @@ void NetworkInfo::determinePrefixes() { _prefixes = PREFIX.section(")", 1); _prefixModes = PREFIX.mid(1).section(")", 0, 0); } else { - QString defaultPrefixes("@%+"); - QString defaultPrefixModes("ohv"); + QString defaultPrefixes("~&@%+"); + QString defaultPrefixModes("qaohv"); // we just assume that in PREFIX are only prefix chars stored for(int i = 0; i < defaultPrefixes.size(); i++) {