X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fnetwork.cpp;h=c7343ca31735a5528dddf9cc5dbc847e9da567ff;hp=c62d44638f237d9f2be806e15109aef4754852bb;hb=1ed8c48b0e7d309e1a92c905a19fcb7128b73d3d;hpb=8f237cecca9a6353bc4d150b4b55719a6bf37476 diff --git a/src/common/network.cpp b/src/common/network.cpp index c62d4463..c7343ca3 100644 --- a/src/common/network.cpp +++ b/src/common/network.cpp @@ -28,6 +28,7 @@ #include "util.h" +QTextCodec *Network::_defaultCodecForServer = 0; QTextCodec *Network::_defaultCodecForEncoding = 0; QTextCodec *Network::_defaultCodecForDecoding = 0; @@ -35,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()), @@ -44,7 +46,13 @@ Network::Network(const NetworkId &networkid, QObject *parent) : SyncableObject(p _connectionState(Disconnected), _prefixes(QString()), _prefixModes(QString()), - _proxy(0), + _useRandomServer(false), + _useAutoIdentify(false), + _useAutoReconnect(false), + _autoReconnectInterval(60), + _autoReconnectRetries(10), + _unlimitedReconnectRetries(false), + _codecForServer(0), _codecForEncoding(0), _codecForDecoding(0) { @@ -109,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(); @@ -120,6 +129,7 @@ NetworkInfo Network::networkInfo() const { info.useAutoReconnect = useAutoReconnect(); info.autoReconnectInterval = autoReconnectInterval(); info.autoReconnectRetries = autoReconnectRetries(); + info.unlimitedReconnectRetries = unlimitedReconnectRetries(); info.rejoinChannels = rejoinChannels(); return info; } @@ -128,6 +138,7 @@ void Network::setNetworkInfo(const NetworkInfo &info) { // we don't set our ID! if(!info.networkName.isEmpty() && info.networkName != networkName()) setNetworkName(info.networkName); if(info.identity > 0 && info.identity != identity()) setIdentity(info.identity); + if(info.codecForServer != codecForServer()) setCodecForServer(QTextCodec::codecForName(info.codecForServer)); if(info.codecForEncoding != codecForEncoding()) setCodecForEncoding(QTextCodec::codecForName(info.codecForEncoding)); if(info.codecForDecoding != codecForDecoding()) setCodecForDecoding(QTextCodec::codecForName(info.codecForDecoding)); if(info.serverList.count()) setServerList(info.serverList); // FIXME compare components @@ -139,6 +150,7 @@ void Network::setNetworkInfo(const NetworkInfo &info) { if(info.useAutoReconnect != useAutoReconnect()) setUseAutoReconnect(info.useAutoReconnect); if(info.autoReconnectInterval != autoReconnectInterval()) setAutoReconnectInterval(info.autoReconnectInterval); if(info.autoReconnectRetries != autoReconnectRetries()) setAutoReconnectRetries(info.autoReconnectRetries); + if(info.unlimitedReconnectRetries != unlimitedReconnectRetries()) setUnlimitedReconnectRetries(info.unlimitedReconnectRetries); if(info.rejoinChannels != rejoinChannels()) setRejoinChannels(info.rejoinChannels); } @@ -226,10 +238,14 @@ quint32 Network::autoReconnectInterval() const { return _autoReconnectInterval; } -qint16 Network::autoReconnectRetries() const { +quint16 Network::autoReconnectRetries() const { return _autoReconnectRetries; } +bool Network::unlimitedReconnectRetries() const { + return _unlimitedReconnectRetries; +} + bool Network::rejoinChannels() const { return _rejoinChannels; } @@ -282,7 +298,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) { @@ -297,6 +328,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) { @@ -308,12 +345,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)) @@ -323,7 +354,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 { @@ -356,7 +387,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 { @@ -368,7 +399,7 @@ IrcChannel *Network::ircChannel(QString channelname) const { } IrcChannel *Network::ircChannel(const QByteArray &channelname) const { - return ircChannel(decodeString(channelname)); + return ircChannel(decodeServerString(channelname)); } @@ -380,6 +411,15 @@ quint32 Network::ircChannelCount() const { return _ircChannels.count(); } +QByteArray Network::defaultCodecForServer() { + if(_defaultCodecForServer) return _defaultCodecForServer->name(); + return QByteArray(); +} + +void Network::setDefaultCodecForServer(const QByteArray &name) { + _defaultCodecForServer = QTextCodec::codecForName(name); +} + QByteArray Network::defaultCodecForEncoding() { if(_defaultCodecForEncoding) return _defaultCodecForEncoding->name(); return QByteArray(); @@ -398,6 +438,20 @@ void Network::setDefaultCodecForDecoding(const QByteArray &name) { _defaultCodecForDecoding = QTextCodec::codecForName(name); } +QByteArray Network::codecForServer() const { + if(_codecForServer) return _codecForServer->name(); + return QByteArray(); +} + +void Network::setCodecForServer(const QByteArray &name) { + setCodecForServer(QTextCodec::codecForName(name)); +} + +void Network::setCodecForServer(QTextCodec *codec) { + _codecForServer = codec; + emit codecForServerSet(codecForServer()); +} + QByteArray Network::codecForEncoding() const { if(_codecForEncoding) return _codecForEncoding->name(); return QByteArray(); @@ -426,12 +480,13 @@ void Network::setCodecForDecoding(QTextCodec *codec) { emit codecForDecodingSet(codecForDecoding()); } +// FIXME use server encoding if appropriate QString Network::decodeString(const QByteArray &text) const { if(_codecForDecoding) return ::decodeString(text, _codecForDecoding); 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); } @@ -441,6 +496,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: // ==================== @@ -456,8 +526,10 @@ void Network::setCurrentServer(const QString ¤tServer) { void Network::setConnected(bool connected) { _connected = connected; - if(!connected) + if(!connected) { removeChansAndUsers(); + setCurrentServer(QString()); + } emit connectedSet(connected); } @@ -519,11 +591,16 @@ void Network::setAutoReconnectInterval(quint32 interval) { emit autoReconnectIntervalSet(interval); } -void Network::setAutoReconnectRetries(qint16 retries) { +void Network::setAutoReconnectRetries(quint16 retries) { _autoReconnectRetries = retries; emit autoReconnectRetriesSet(retries); } +void Network::setUnlimitedReconnectRetries(bool unlimited) { + _unlimitedReconnectRetries = unlimited; + emit unlimitedReconnectRetriesSet(unlimited); +} + void Network::setRejoinChannels(bool rejoin) { _rejoinChannels = rejoin; emit rejoinChannelsSet(rejoin); @@ -589,7 +666,11 @@ void Network::initSetIrcUsers(const QStringList &hostmasks) { } } -void Network::initSetChannels(const QStringList &channels) { +void Network::initSetIrcChannels(const QStringList &channels) { + // FIXME This does not work correctly, "received data for unknown User" triggers + // So we disable this for now + return; + if(!_ircChannels.empty()) return; foreach(QString channel, channels) @@ -663,7 +744,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 :) @@ -731,6 +812,7 @@ bool NetworkInfo::operator==(const NetworkInfo &other) const { if(networkId != other.networkId) return false; if(networkName != other.networkName) return false; if(identity != other.identity) return false; + if(codecForServer != other.codecForServer) return false; if(codecForEncoding != other.codecForEncoding) return false; if(codecForDecoding != other.codecForDecoding) return false; if(serverList != other.serverList) return false; @@ -742,6 +824,7 @@ bool NetworkInfo::operator==(const NetworkInfo &other) const { if(useAutoReconnect != other.useAutoReconnect) return false; if(autoReconnectInterval != other.autoReconnectInterval) return false; if(autoReconnectRetries != other.autoReconnectRetries) return false; + if(unlimitedReconnectRetries != other.unlimitedReconnectRetries) return false; if(rejoinChannels != other.rejoinChannels) return false; return true; } @@ -755,6 +838,7 @@ QDataStream &operator<<(QDataStream &out, const NetworkInfo &info) { i["NetworkId"] = QVariant::fromValue(info.networkId); i["NetworkName"] = info.networkName; i["Identity"] = QVariant::fromValue(info.identity); + i["CodecForServer"] = info.codecForServer; i["CodecForEncoding"] = info.codecForEncoding; i["CodecForDecoding"] = info.codecForDecoding; i["ServerList"] = info.serverList; @@ -766,6 +850,7 @@ QDataStream &operator<<(QDataStream &out, const NetworkInfo &info) { i["UseAutoReconnect"] = info.useAutoReconnect; i["AutoReconnectInterval"] = info.autoReconnectInterval; i["AutoReconnectRetries"] = info.autoReconnectRetries; + i["UnlimitedReconnectRetries"] = info.unlimitedReconnectRetries; i["RejoinChannels"] = info.rejoinChannels; out << i; return out; @@ -777,6 +862,7 @@ QDataStream &operator>>(QDataStream &in, NetworkInfo &info) { info.networkId = i["NetworkId"].value(); info.networkName = i["NetworkName"].toString(); info.identity = i["Identity"].value(); + info.codecForServer = i["CodecForServer"].toByteArray(); info.codecForEncoding = i["CodecForEncoding"].toByteArray(); info.codecForDecoding = i["CodecForDecoding"].toByteArray(); info.serverList = i["ServerList"].toList(); @@ -788,15 +874,21 @@ QDataStream &operator>>(QDataStream &in, NetworkInfo &info) { info.useAutoReconnect = i["UseAutoReconnect"].toBool(); info.autoReconnectInterval = i["AutoReconnectInterval"].toUInt(); info.autoReconnectRetries = i["AutoReconnectRetries"].toInt(); + info.unlimitedReconnectRetries = i["UnlimitedReconnectRetries"].toBool(); info.rejoinChannels = i["RejoinChannels"].toBool(); 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(); +}