From 3ed7d3bb6e9123ff0aa77023b264a39d1f63bd90 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Thu, 21 Feb 2008 16:54:28 +0000 Subject: [PATCH] Preparing for the core session state being stored in the database. NOTE: Session restore is NOT working in this revision! --- src/common/network.cpp | 30 ------ src/common/network.h | 13 --- src/core/coresession.cpp | 101 +++++------------- src/core/coresession.h | 8 +- src/core/ircserverhandler.cpp | 8 +- src/core/networkconnection.cpp | 39 +++++-- src/core/networkconnection.h | 12 ++- src/qtui/settingspages/generalsettingspage.ui | 4 +- .../settingspages/networkssettingspage.ui | 3 + 9 files changed, 77 insertions(+), 141 deletions(-) diff --git a/src/common/network.cpp b/src/common/network.cpp index b1a17a66..c0de22e7 100644 --- a/src/common/network.cpp +++ b/src/common/network.cpp @@ -631,14 +631,6 @@ QStringList Network::initIrcChannels() const { return _ircChannels.keys(); } -QStringList Network::initPersistentChannels() const { - QStringList list; - foreach(QString chan, _persistentChannels.keys()) { - list << QString("%1/%2").arg(chan).arg(_persistentChannels.value(chan)); - } - return list; -} - void Network::initSetSupports(const QVariantMap &supports) { QMapIterator iter(supports); while(iter.hasNext()) { @@ -670,28 +662,6 @@ void Network::initSetIrcChannels(const QStringList &channels) { newIrcChannel(channel); } -void Network::initSetPersistentChannels(const QStringList &channels) { - foreach(QString chan, channels) { - QStringList l = chan.split("/"); - _persistentChannels[l[0]] = l[1]; - } -} - -void Network::addPersistentChannel(const QString &channel, const QString &key) { - _persistentChannels[channel.toLower()] = key; - emit persistentChannelAdded(channel, key); -} - -void Network::removePersistentChannel(const QString &channel) { - _persistentChannels.remove(channel.toLower()); - emit persistentChannelRemoved(channel); -} - -void Network::setPersistentChannelKey(const QString &channel, const QString &key) { - _persistentChannels[channel.toLower()] = key; - emit persistentChannelKeySet(channel, key); -} - IrcUser *Network::updateNickFromMask(const QString &mask) { QString nick(nickFromMask(mask).toLower()); IrcUser *ircuser; diff --git a/src/common/network.h b/src/common/network.h index c67fea89..29d57492 100644 --- a/src/common/network.h +++ b/src/common/network.h @@ -133,8 +133,6 @@ public: QList ircChannels() const; quint32 ircChannelCount() const; - inline QHash persistentChannels() const { return _persistentChannels; } - QByteArray codecForServer() const; QByteArray codecForEncoding() const; QByteArray codecForDecoding() const; @@ -186,23 +184,17 @@ public slots: void removeIrcUser(const QString &nick); void removeIrcChannel(const QString &channel); - void addPersistentChannel(const QString &channel, const QString &key = QString()); - void removePersistentChannel(const QString &channel); - void setPersistentChannelKey(const QString &channel, const QString &key); - //init geters QVariantMap initSupports() const; QVariantList initServerList() const; QStringList initIrcUsers() const; QStringList initIrcChannels() const; - QStringList initPersistentChannels() const; //init seters void initSetSupports(const QVariantMap &supports); void initSetServerList(const QVariantList &serverList); void initSetIrcUsers(const QStringList &hostmasks); void initSetIrcChannels(const QStringList &channels); - void initSetPersistentChannels(const QStringList &channels); IrcUser *updateNickFromMask(const QString &mask); @@ -261,10 +253,6 @@ signals: void ircUserRemoved(const QString &nick); void ircChannelRemoved(const QString &channel); - void persistentChannelAdded(const QString &channel, const QString &key); - void persistentChannelRemoved(const QString &channel); - void persistentChannelKeySet(const QString &channel, const QString &key); - // needed for client sync progress void ircUserRemoved(QObject *); void ircChannelRemoved(QObject *); @@ -293,7 +281,6 @@ private: QHash _ircUsers; // stores all known nicks for the server QHash _ircChannels; // stores all known channels QHash _supports; // stores results from RPL_ISUPPORT - QHash _persistentChannels; // stores persistent channels and their passwords, if any QVariantList _serverList; bool _useRandomServer; diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index 165753a7..8d63ec8c 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -138,74 +138,20 @@ void CoreSession::loadSettings() { createIdentity(i); } - - // migration to pure DB storage - QList netIds = s.networkIds(); - if(!netIds.isEmpty()) { - qDebug() << "Migrating Networksettings to DB Storage for User:" << user(); - foreach(NetworkId id, netIds) { - NetworkInfo info = s.networkInfo(id); - - // default new options - info.useRandomServer = false; - info.useAutoReconnect = true; - info.autoReconnectInterval = 60; - info.autoReconnectRetries = 20; - info.unlimitedReconnectRetries = false; - info.useAutoIdentify = false; - info.autoIdentifyService = "NickServ"; - info.rejoinChannels = true; - - Core::updateNetwork(user(), info); - s.removeNetworkInfo(id); - } - } - foreach(NetworkInfo info, Core::networks(user())) { createNetwork(info); } } void CoreSession::saveSessionState() const { - QVariantMap res; - QVariantList conn; - foreach(NetworkConnection *nc, _connections.values()) { - QHash persistentChans = nc->network()->persistentChannels(); - QStringList list; - foreach(QString chan, persistentChans.keys()) list << QString("%1/%2").arg(chan).arg(persistentChans.value(chan)); - QVariantMap m; - m["NetworkId"] = QVariant::fromValue(nc->networkId()); - m["PersistentChannels"] = list; - conn << m; - } - res["CoreBuild"] = Global::quasselBuild; - res["ConnectedNetworks"] = conn; - CoreUserSettings s(user()); - s.setSessionState(res); + } void CoreSession::restoreSessionState() { - CoreUserSettings s(user()); - uint build = s.sessionState().toMap()["CoreBuild"].toUInt(); - if(build < 362) { - qWarning() << qPrintable(tr("Session state does not exist or is too old!")); - return; - } - QVariantList conn = s.sessionState().toMap()["ConnectedNetworks"].toList(); - foreach(QVariant v, conn) { - NetworkId id = v.toMap()["NetworkId"].value(); - // TODO remove migration code some time - QStringList list = v.toMap()["PersistentChannels"].toStringList(); - if(!list.count()) { - // migrate older state - QStringList old = v.toMap()["State"].toStringList(); - foreach(QString chan, old) list << QString("%1/").arg(chan); - } - foreach(QString chan, list) { - QStringList l = chan.split("/"); - network(id)->addPersistentChannel(l[0], l[1]); - } - //qDebug() << "User" << user() << "connecting to" << network(id)->networkName(); + // FIXME db support + //QList nets = Core::connectedNetworks(user()); + QList nets; + foreach(NetworkId id, nets) { connectToNetwork(id); } } @@ -214,23 +160,6 @@ void CoreSession::updateBufferInfo(UserId uid, const BufferInfo &bufinfo) { if(uid == user()) emit bufferInfoUpdated(bufinfo); } -// FIXME remove -/* -void CoreSession::connectToNetwork(QString netname, const QVariant &previousState) { - Network *net = 0; - foreach(Network *n, _networks.values()) { - if(n->networkName() == netname) { - net = n; break; - } - } - if(!net) { - qWarning() << "Connect to unknown network requested, ignoring!"; - return; - } - connectToNetwork(net->networkId(), previousState); -} -*/ - void CoreSession::connectToNetwork(NetworkId id) { Network *net = network(id); if(!net) { @@ -261,6 +190,10 @@ void CoreSession::attachNetworkConnection(NetworkConnection *conn) { connect(conn, SIGNAL(nickChanged(const NetworkId &, const QString &, const QString &)), this, SLOT(renameBuffer(const NetworkId &, const QString &, const QString &))); + connect(conn, SIGNAL(channelJoined(NetworkId, const QString &, const QString &)), + this, SLOT(channelJoined(NetworkId, const QString &, const QString &))); + connect(conn, SIGNAL(channelParted(NetworkId, const QString &)), + this, SLOT(channelParted(NetworkId, const QString &))); } void CoreSession::disconnectFromNetwork(NetworkId id) { @@ -291,13 +224,29 @@ SignalProxy *CoreSession::signalProxy() const { // FIXME we need a sane way for creating buffers! void CoreSession::networkConnected(NetworkId networkid) { Core::bufferInfo(user(), networkid, BufferInfo::StatusBuffer); // create status buffer + //Core::setNetworkConnected(user(), networkid, true); } // called now only on /quit and requested disconnects, not on normal disconnects! void CoreSession::networkDisconnected(NetworkId networkid) { + //Core::setNetworkConnected(user(), networkid, false); if(_connections.contains(networkid)) _connections.take(networkid)->deleteLater(); } +void CoreSession::channelJoined(NetworkId id, const QString &channel, const QString &key) { + //Core::setChannelPersistent(user(), id, channel, true); + //Core::setPersistentChannelKey(user(), id, channel, key); +} + +void CoreSession::channelParted(NetworkId id, const QString &channel) { + //Core::setChannelPersistent(user(), id, channel, false); +} + +QHash CoreSession::persistentChannels(NetworkId id) const { + //return Core::persistentChannels(user(), id); + return QHash(); +} + // FIXME switch to BufferId void CoreSession::msgFromClient(BufferInfo bufinfo, QString msg) { NetworkConnection *conn = networkConnection(bufinfo.networkId()); diff --git a/src/core/coresession.h b/src/core/coresession.h index f8134ccf..7dd0a53a 100644 --- a/src/core/coresession.h +++ b/src/core/coresession.h @@ -63,11 +63,9 @@ public slots: void addClient(QObject *socket); -// void connectToNetwork(QString, const QVariant &previousState = QVariant()); void connectToNetwork(NetworkId); void disconnectFromNetwork(NetworkId id); - //void processSignal(ClientSignal, QVariant, QVariant, QVariant); void sendBacklog(BufferInfo, QVariant, QVariant); void msgFromClient(BufferInfo, QString message); @@ -114,7 +112,11 @@ public slots: * emits bufferRenamed(bufferId, newName) on success. */ void renameBuffer(const NetworkId &networkId, const QString &newName, const QString &oldName); - + + void channelJoined(NetworkId id, const QString &channel, const QString &key = QString()); + void channelParted(NetworkId, const QString &channel); + QHash persistentChannels(NetworkId) const; + signals: void initialized(); diff --git a/src/core/ircserverhandler.cpp b/src/core/ircserverhandler.cpp index 0499c859..e46bb737 100644 --- a/src/core/ircserverhandler.cpp +++ b/src/core/ircserverhandler.cpp @@ -162,20 +162,20 @@ void IrcServerHandler::defaultHandler(QString cmd, const QString &prefix, const // IRC SERVER HANDLER //******************************/ void IrcServerHandler::handleJoin(const QString &prefix, const QList ¶ms) { - Q_ASSERT(params.count() == 1); + if(params.count() < 1) return; QString channel = serverDecode(params[0]); IrcUser *ircuser = network()->updateNickFromMask(prefix); emit displayMsg(Message::Join, BufferInfo::ChannelBuffer, channel, channel, prefix); //qDebug() << "IrcServerHandler::handleJoin()" << prefix << params; ircuser->joinChannel(channel); - if(network()->isMe(ircuser)) network()->addPersistentChannel(channel, networkConnection()->channelKey(channel)); + if(network()->isMe(ircuser)) networkConnection()->setChannelJoined(channel); } void IrcServerHandler::handleKick(const QString &prefix, const QList ¶ms) { network()->updateNickFromMask(prefix); IrcUser *victim = network()->ircUser(params[1]); + if(!victim) return; QString channel = serverDecode(params[0]); - Q_ASSERT(victim); victim->partChannel(channel); @@ -278,7 +278,7 @@ void IrcServerHandler::handlePart(const QString &prefix, const QList msg = userDecode(ircuser->nick(), params[1]); emit displayMsg(Message::Part, BufferInfo::ChannelBuffer, channel, msg, prefix); - if(network()->isMe(ircuser)) network()->removePersistentChannel(channel); + if(network()->isMe(ircuser)) networkConnection()->setChannelParted(channel); } void IrcServerHandler::handlePing(const QString &prefix, const QList ¶ms) { diff --git a/src/core/networkconnection.cpp b/src/core/networkconnection.cpp index 0a2604c0..84eabeec 100644 --- a/src/core/networkconnection.cpp +++ b/src/core/networkconnection.cpp @@ -51,6 +51,11 @@ NetworkConnection::NetworkConnection(Network *network, CoreSession *session) : Q _whoTimer.setInterval(60 * 1000); _whoTimer.setSingleShot(false); + QHash channels = coreSession()->persistentChannels(networkId()); + foreach(QString chan, channels.keys()) { + _channelKeys[chan.toLower()] = channels[chan]; + } + connect(&_autoReconnectTimer, SIGNAL(timeout()), this, SLOT(doAutoReconnect())); connect(&_whoTimer, SIGNAL(timeout()), this, SLOT(sendWho())); @@ -71,7 +76,7 @@ NetworkConnection::NetworkConnection(Network *network, CoreSession *session) : Q NetworkConnection::~NetworkConnection() { if(connectionState() != Network::Disconnected && connectionState() != Network::Reconnecting) - disconnectFromIrc(); + disconnectFromIrc(false); // clean up, but this does not count as requested disconnect! delete _ircServerHandler; delete _userInputHandler; delete _ctcpHandler; @@ -227,8 +232,8 @@ void NetworkConnection::sendPerform() { // rejoin channels we've been in QStringList channels, keys; - foreach(QString chan, network()->persistentChannels().keys()) { - QString key = network()->persistentChannels()[chan]; + foreach(QString chan, persistentChannels()) { + QString key = channelKey(chan); if(!key.isEmpty()) { channels.prepend(chan); keys.prepend(key); } else { @@ -239,9 +244,11 @@ void NetworkConnection::sendPerform() { if(!joinString.isEmpty()) userInputHandler()->handleJoin(statusBuf, joinString); } -void NetworkConnection::disconnectFromIrc() { - _autoReconnectTimer.stop(); - _autoReconnectCount = 0; +void NetworkConnection::disconnectFromIrc(bool requested) { + if(requested) { + _autoReconnectTimer.stop(); + _autoReconnectCount = 0; + } displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Disconnecting.")); if(socket.state() < QAbstractSocket::ConnectedState) { setConnectionState(Network::Disconnected); @@ -355,17 +362,29 @@ void NetworkConnection::sendWho() { } } +void NetworkConnection::setChannelJoined(const QString &channel) { + emit channelJoined(networkId(), channel, _channelKeys[channel.toLower()]); +} + +void NetworkConnection::setChannelParted(const QString &channel) { + removeChannelKey(channel); + emit channelParted(networkId(), channel); +} + void NetworkConnection::addChannelKey(const QString &channel, const QString &key) { - if(key.isEmpty()) removeChannelKey(channel); - else _channelKeys[channel] = key; + if(key.isEmpty()) { + removeChannelKey(channel); + } else { + _channelKeys[channel.toLower()] = key; + } } void NetworkConnection::removeChannelKey(const QString &channel) { - _channelKeys.remove(channel); + _channelKeys.remove(channel.toLower()); } void NetworkConnection::nickChanged(const QString &newNick, const QString &oldNick) { - emit nickChanged(_network->networkId(), newNick, oldNick); + emit nickChanged(networkId(), newNick, oldNick); } /* Exception classes for message handling */ diff --git a/src/core/networkconnection.h b/src/core/networkconnection.h index 57fd9d25..d6d18306 100644 --- a/src/core/networkconnection.h +++ b/src/core/networkconnection.h @@ -77,17 +77,20 @@ public: //! Encode a string using the user-specific encoding, if set, and use the standard encoding else. QByteArray userEncode(const QString &userNick, const QString &string) const; - inline QString channelKey(const QString &channel) const { return _channelKeys.value(channel, QString()); } + inline QString channelKey(const QString &channel) const { return _channelKeys.value(channel.toLower(), QString()); } + inline QStringList persistentChannels() const { return _channelKeys.keys(); } public slots: // void setServerOptions(); void connectToIrc(bool reconnecting = false); - void disconnectFromIrc(); + void disconnectFromIrc(bool requested = true); void userInput(BufferInfo bufferInfo, QString msg); void putRawLine(QByteArray input); void putCmd(const QString &cmd, const QVariantList ¶ms, const QByteArray &prefix = QByteArray()); + void setChannelJoined(const QString &channel); + void setChannelParted(const QString &channel); void addChannelKey(const QString &channel, const QString &key); void removeChannelKey(const QString &channel); @@ -114,6 +117,8 @@ signals: //void queryRequested(QString network, QString nick); void nickChanged(const NetworkId &networkId, const QString &newNick, const QString &oldNick); // this signal is inteded to rename query buffers in the storage backend + void channelJoined(NetworkId, const QString &channel, const QString &key = QString()); + void channelParted(NetworkId, const QString &channel); private slots: void socketHasData(); @@ -136,7 +141,8 @@ private: UserInputHandler *_userInputHandler; CtcpHandler *_ctcpHandler; - QHash _channelKeys; + QHash _channelKeys; // stores persistent channels and their passwords, if any + QTimer _autoReconnectTimer; int _autoReconnectCount; diff --git a/src/qtui/settingspages/generalsettingspage.ui b/src/qtui/settingspages/generalsettingspage.ui index 359401c5..51cece6c 100644 --- a/src/qtui/settingspages/generalsettingspage.ui +++ b/src/qtui/settingspages/generalsettingspage.ui @@ -83,7 +83,7 @@ false - in query buffer (if exists) + in query buffer (if exists) @@ -105,7 +105,7 @@ Qt::Vertical - + 457 51 diff --git a/src/qtui/settingspages/networkssettingspage.ui b/src/qtui/settingspages/networkssettingspage.ui index f1260c71..75a1fa1f 100644 --- a/src/qtui/settingspages/networkssettingspage.ui +++ b/src/qtui/settingspages/networkssettingspage.ui @@ -632,6 +632,9 @@ + + false + Rejoin all channels on reconnect -- 2.20.1