X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fnetworkinfo.cpp;h=74cb8b9a0abcea0cada826d557a201fcc35c098b;hp=114287aca32240b5228582f19ed1f37fd2d305a9;hb=836534302ea576791dc5cc01918dd4c5abd61878;hpb=902c95728306e5ba115de84800fc8d5d239c9d62 diff --git a/src/common/networkinfo.cpp b/src/common/networkinfo.cpp index 114287ac..74cb8b9a 100644 --- a/src/common/networkinfo.cpp +++ b/src/common/networkinfo.cpp @@ -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 { @@ -162,7 +166,14 @@ IrcUser *NetworkInfo::newIrcUser(const QString &hostmask) { QString nick(nickFromMask(hostmask)); 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())); @@ -172,6 +183,22 @@ IrcUser *NetworkInfo::newIrcUser(const QString &hostmask) { 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); +} + +void NetworkInfo::removeIrcUser(QString nick) { + IrcUser *ircuser; + if((ircuser = ircUser(nick)) != 0) + removeIrcUser(ircuser); +} + IrcUser *NetworkInfo::ircUser(const QString &nickname) const { if(_ircUsers.contains(nickname)) return _ircUsers[nickname]; @@ -186,7 +213,15 @@ QList NetworkInfo::ircUsers() const { IrcChannel *NetworkInfo::newIrcChannel(const QString &channelname) { if(!_ircChannels.contains(channelname)) { 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; @@ -299,6 +334,7 @@ IrcUser *NetworkInfo::updateNickFromMask(const QString &mask) { void NetworkInfo::ircUserNickChanged(QString newnick) { QString oldnick = _ircUsers.key(qobject_cast(sender())); + if(oldnick.isNull()) return; @@ -309,27 +345,15 @@ void NetworkInfo::ircUserNickChanged(QString newnick) { } void NetworkInfo::ircUserDestroyed() { - IrcUser *ircuser = qobject_cast(sender()); - QHash::iterator i = _ircUsers.begin(); - while(i != _ircUsers.end()) { - if(i.value() == ircuser) { - i = _ircUsers.erase(i); - } else { - i++; - } - } + IrcUser *ircuser = static_cast(sender()); + Q_ASSERT(ircuser); + removeIrcUser(ircuser); } void NetworkInfo::channelDestroyed() { - IrcChannel *channel = qobject_cast(sender()); - QHash::iterator i = _ircChannels.begin(); - while(i != _ircChannels.end()) { - if(i.value() == channel) { - i = _ircChannels.erase(i); - } else { - i++; - } - } + IrcChannel *channel = static_cast(sender()); + Q_ASSERT(channel); + _ircChannels.remove(_ircChannels.key(channel)); } void NetworkInfo::setInitialized() { @@ -348,8 +372,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++) {