X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fnetwork.cpp;h=db15d2538deec2915738a6074a35a653bf6bc3cd;hp=99b647a22602d6687685b8c43a972907dce0f341;hb=f66bc9ecb5ebde376da256035db425d7dc0c74d0;hpb=dd2b40bf10da0309a72a9b2e8f49af752646fd92 diff --git a/src/common/network.cpp b/src/common/network.cpp index 99b647a2..db15d253 100644 --- a/src/common/network.cpp +++ b/src/common/network.cpp @@ -36,6 +36,7 @@ QTextCodec *Network::_defaultCodecForDecoding = 0; // Public: // ==================== Network::Network(const NetworkId &networkid, QObject *parent) : SyncableObject(parent), + _proxy(0), _networkId(networkid), _identity(0), _myNick(QString()), @@ -45,7 +46,6 @@ Network::Network(const NetworkId &networkid, QObject *parent) : SyncableObject(p _connectionState(Disconnected), _prefixes(QString()), _prefixModes(QString()), - _proxy(0), _useRandomServer(false), _useAutoIdentify(false), _useAutoReconnect(false), @@ -117,6 +117,7 @@ NetworkInfo Network::networkInfo() const { info.networkName = networkName(); info.networkId = networkId(); info.identity = identity(); + info.codecForServer = codecForServer(); info.codecForEncoding = codecForEncoding(); info.codecForDecoding = codecForDecoding(); info.serverList = serverList(); @@ -128,6 +129,7 @@ NetworkInfo Network::networkInfo() const { info.useAutoReconnect = useAutoReconnect(); info.autoReconnectInterval = autoReconnectInterval(); info.autoReconnectRetries = autoReconnectRetries(); + info.unlimitedReconnectRetries = unlimitedReconnectRetries(); info.rejoinChannels = rejoinChannels(); return info; } @@ -278,9 +280,7 @@ IrcUser *Network::newIrcUser(const QString &hostmask) { QString nick(nickFromMask(hostmask).toLower()); if(!_ircUsers.contains(nick)) { IrcUser *ircuser = new IrcUser(hostmask, this); - // mark IrcUser as already initialized to keep the SignalProxy from requesting initData - //if(isInitialized()) - // ircuser->setInitialized(); + if(proxy()) proxy()->synchronize(ircuser); else @@ -288,6 +288,7 @@ IrcUser *Network::newIrcUser(const QString &hostmask) { connect(ircuser, SIGNAL(nickSet(QString)), this, SLOT(ircUserNickChanged(QString))); connect(ircuser, SIGNAL(initDone()), this, SLOT(ircUserInitDone())); + connect(ircuser, SIGNAL(destroyed()), this, SLOT(ircUserDestroyed())); _ircUsers[nick] = ircuser; emit ircUserAdded(hostmask); emit ircUserAdded(ircuser); @@ -296,7 +297,22 @@ IrcUser *Network::newIrcUser(const QString &hostmask) { } IrcUser *Network::newIrcUser(const QByteArray &hostmask) { - return newIrcUser(decodeString(hostmask)); + return newIrcUser(decodeServerString(hostmask)); +} + +void Network::ircUserDestroyed() { + IrcUser *ircUser = static_cast(sender()); + if(!ircUser) + return; + + QHash::iterator ircUserIter = _ircUsers.begin(); + while(ircUserIter != _ircUsers.end()) { + if(ircUser == *ircUserIter) { + ircUserIter = _ircUsers.erase(ircUserIter); + break; + } + ircUserIter++; + } } void Network::removeIrcUser(IrcUser *ircuser) { @@ -311,6 +327,12 @@ void Network::removeIrcUser(IrcUser *ircuser) { ircuser->deleteLater(); } +void Network::removeIrcUser(const QString &nick) { + IrcUser *ircuser; + if((ircuser = ircUser(nick)) != 0) + removeIrcUser(ircuser); +} + void Network::removeChansAndUsers() { QList users = ircUsers(); foreach(IrcUser *user, users) { @@ -322,12 +344,6 @@ void Network::removeChansAndUsers() { } } -void Network::removeIrcUser(const QString &nick) { - IrcUser *ircuser; - if((ircuser = ircUser(nick)) != 0) - removeIrcUser(ircuser); -} - IrcUser *Network::ircUser(QString nickname) const { nickname = nickname.toLower(); if(_ircUsers.contains(nickname)) @@ -337,7 +353,7 @@ IrcUser *Network::ircUser(QString nickname) const { } IrcUser *Network::ircUser(const QByteArray &nickname) const { - return ircUser(decodeString(nickname)); + return ircUser(decodeServerString(nickname)); } QList Network::ircUsers() const { @@ -351,9 +367,6 @@ quint32 Network::ircUserCount() const { IrcChannel *Network::newIrcChannel(const QString &channelname) { if(!_ircChannels.contains(channelname.toLower())) { IrcChannel *channel = new IrcChannel(channelname, this); - // mark IrcUser as already initialized to keep the SignalProxy from requesting initData - //if(isInitialized()) - // channel->setInitialized(); if(proxy()) proxy()->synchronize(channel); @@ -370,7 +383,7 @@ IrcChannel *Network::newIrcChannel(const QString &channelname) { } IrcChannel *Network::newIrcChannel(const QByteArray &channelname) { - return newIrcChannel(decodeString(channelname)); + return newIrcChannel(decodeServerString(channelname)); } IrcChannel *Network::ircChannel(QString channelname) const { @@ -382,7 +395,7 @@ IrcChannel *Network::ircChannel(QString channelname) const { } IrcChannel *Network::ircChannel(const QByteArray &channelname) const { - return ircChannel(decodeString(channelname)); + return ircChannel(decodeServerString(channelname)); } @@ -469,7 +482,7 @@ QString Network::decodeString(const QByteArray &text) const { else return ::decodeString(text, _defaultCodecForDecoding); } -QByteArray Network::encodeString(const QString string) const { +QByteArray Network::encodeString(const QString &string) const { if(_codecForEncoding) { return _codecForEncoding->fromUnicode(string); } @@ -479,6 +492,21 @@ QByteArray Network::encodeString(const QString string) const { return string.toAscii(); } +QString Network::decodeServerString(const QByteArray &text) const { + if(_codecForServer) return ::decodeString(text, _codecForServer); + else return ::decodeString(text, _defaultCodecForServer); +} + +QByteArray Network::encodeServerString(const QString &string) const { + if(_codecForServer) { + return _codecForServer->fromUnicode(string); + } + if(_defaultCodecForServer) { + return _defaultCodecForServer->fromUnicode(string); + } + return string.toAscii(); +} + // ==================== // Public Slots: // ==================== @@ -611,7 +639,13 @@ QStringList Network::initIrcUsers() const { } QStringList Network::initIrcChannels() const { - return _ircChannels.keys(); + QStringList channels; + QHash::const_iterator iter = _ircChannels.constBegin(); + while(iter != _ircChannels.constEnd()) { + channels << iter.value()->name(); + iter++; + } + return channels; } void Network::initSetSupports(const QVariantMap &supports) { @@ -634,7 +668,7 @@ void Network::initSetIrcUsers(const QStringList &hostmasks) { } } -void Network::initSetChannels(const QStringList &channels) { +void Network::initSetIrcChannels(const QStringList &channels) { if(!_ircChannels.empty()) return; foreach(QString channel, channels) @@ -708,7 +742,7 @@ void Network::requestConnect() const { if(proxy()->proxyMode() == SignalProxy::Client) emit connectRequested(); // on the client this triggers calling this slot on the core else { if(connectionState() != Disconnected) { - qWarning() << "Requesting connect while not being disconnected!"; + qWarning() << "Requesting connect while already being connected!"; return; } emit connectRequested(networkId()); // and this is for CoreSession :) @@ -843,11 +877,16 @@ QDataStream &operator>>(QDataStream &in, NetworkInfo &info) { return in; } - - - - - +QDebug operator<<(QDebug dbg, const NetworkInfo &i) { + dbg.nospace() << "(id = " << i.networkId << " name = " << i.networkName << " identity = " << i.identity + << " codecForServer = " << i.codecForServer << " codecForEncoding = " << i.codecForEncoding << " codecForDecoding = " << i.codecForDecoding + << " serverList = " << i.serverList << " useRandomServer = " << i.useRandomServer << " perform = " << i.perform + << " useAutoIdentify = " << i.useAutoIdentify << " autoIdentifyService = " << i.autoIdentifyService << " autoIdentifyPassword = " << i.autoIdentifyPassword + << " useAutoReconnect = " << i.useAutoReconnect << " autoReconnectInterval = " << i.autoReconnectInterval + << " autoReconnectRetries = " << i.autoReconnectRetries << " unlimitedReconnectRetries = " << i.unlimitedReconnectRetries + << " rejoinChannels = " << i.rejoinChannels << ")"; + return dbg.space(); +}