X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcoresession.cpp;h=4a798eae0b1c3aeb0c12f895940b304275e5bdde;hp=2677559f47fc742e3664875c0c17fe3b010bbcf0;hb=52a4b82e170fe88725de8381c842a5278c7d1e46;hpb=28e33cd3255a838a045303bed073f4f9c40a3af4 diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index 2677559f..4a798eae 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -18,11 +18,14 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ +#include + #include "core.h" #include "coresession.h" #include "networkconnection.h" #include "signalproxy.h" +#include "buffersyncer.h" #include "storage.h" #include "network.h" @@ -33,11 +36,10 @@ #include "util.h" #include "coreusersettings.h" -#include - CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) : QObject(parent), _user(uid), _signalProxy(new SignalProxy(SignalProxy::Server, 0, this)), + _bufferSyncer(new BufferSyncer(this)), scriptEngine(new QScriptEngine(this)) { @@ -67,6 +69,12 @@ CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) : QObje loadSettings(); initScriptEngine(); + // init BufferSyncer + QHash lastSeenHash = Core::bufferLastSeenDates(user()); + foreach(BufferId id, lastSeenHash.keys()) _bufferSyncer->requestSetLastSeen(id, lastSeenHash[id]); + connect(_bufferSyncer, SIGNAL(lastSeenSet(BufferId, const QDateTime &)), this, SLOT(storeBufferLastSeen(BufferId, const QDateTime &))); + p->synchronize(_bufferSyncer); + // Restore session state if(restoreState) restoreSessionState(); @@ -76,10 +84,10 @@ CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) : QObje CoreSession::~CoreSession() { saveSessionState(); foreach(NetworkConnection *conn, _connections.values()) { - conn->deleteLater(); + delete conn; } foreach(Network *net, _networks.values()) { - net->deleteLater(); + delete net; } } @@ -128,37 +136,32 @@ void CoreSession::loadSettings() { createIdentity(i); } - foreach(NetworkId id, s.networkIds()) { - NetworkInfo info = s.networkInfo(id); - createNetwork(info, true); - } - // FIXME Migrate old settings if available... - if(!_networks.count()) { - QVariantMap networks = s.sessionValue("Networks").toMap(); - if(networks.keys().count()) { - qWarning() << "Migrating your old network settings to the new format!"; - foreach(QString netname, networks.keys()) { - QVariantMap network = networks[netname].toMap(); - NetworkId netid = Core::networkId(user(), netname); - NetworkInfo info; - info.networkId = netid; - info.networkName = netname; - info.identity = 1; - info.codecForEncoding = "ISO-8859-15"; - info.codecForDecoding = "ISO-8859-15"; - QVariantList slist; - foreach(QVariant v, network["Servers"].toList()) { - QVariantMap server; - server["Host"] = v.toMap()["Address"]; - server["Port"] = v.toMap()["Port"]; - slist << server; - } - info.serverList = slist; - createNetwork(info, true); - } + // 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 { @@ -227,13 +230,14 @@ void CoreSession::connectToNetwork(NetworkId id, const QVariant &previousState) void CoreSession::attachNetworkConnection(NetworkConnection *conn) { connect(conn, SIGNAL(connected(NetworkId)), this, SLOT(networkConnected(NetworkId))); - connect(conn, SIGNAL(disconnected(NetworkId)), this, SLOT(networkDisconnected(NetworkId))); + connect(conn, SIGNAL(quitRequested(NetworkId)), this, SLOT(networkDisconnected(NetworkId))); // I guess we don't need these anymore, client-side can just connect the network's signals directly //signalProxy()->attachSignal(conn, SIGNAL(connected(NetworkId)), SIGNAL(networkConnected(NetworkId))); //signalProxy()->attachSignal(conn, SIGNAL(disconnected(NetworkId)), SIGNAL(networkDisconnected(NetworkId))); - connect(conn, SIGNAL(displayMsg(Message::Type, QString, QString, QString, quint8)), this, SLOT(recvMessageFromServer(Message::Type, QString, QString, QString, quint8))); + connect(conn, SIGNAL(displayMsg(Message::Type, BufferInfo::Type, QString, QString, QString, quint8)), + this, SLOT(recvMessageFromServer(Message::Type, BufferInfo::Type, QString, QString, QString, quint8))); connect(conn, SIGNAL(displayStatusMsg(QString)), this, SLOT(recvStatusMsgFromServer(QString))); } @@ -265,22 +269,19 @@ SignalProxy *CoreSession::signalProxy() const { // FIXME we need a sane way for creating buffers! void CoreSession::networkConnected(NetworkId networkid) { - Core::bufferInfo(user(), networkConnection(networkid)->networkName()); // create status buffer + Core::bufferInfo(user(), networkid, BufferInfo::StatusBuffer); // create status buffer } +// called now only on /quit and requested disconnects, not on normal disconnects! void CoreSession::networkDisconnected(NetworkId networkid) { - // FIXME - // connection should only go away on explicit /part, and handle reconnections etcpp internally otherwise - - Q_ASSERT(_connections.contains(networkid)); - _connections.take(networkid)->deleteLater(); + if(_connections.contains(networkid)) _connections.take(networkid)->deleteLater(); } // FIXME switch to BufferId void CoreSession::msgFromClient(BufferInfo bufinfo, QString msg) { NetworkConnection *conn = networkConnection(bufinfo.networkId()); if(conn) { - conn->userInput(bufinfo.buffer(), msg); + conn->userInput(bufinfo, msg); } else { qWarning() << "Trying to send to unconnected network!"; } @@ -288,16 +289,12 @@ void CoreSession::msgFromClient(BufferInfo bufinfo, QString msg) { // ALL messages coming pass through these functions before going to the GUI. // So this is the perfect place for storing the backlog and log stuff. -void CoreSession::recvMessageFromServer(Message::Type type, QString target, QString text, QString sender, quint8 flags) { - NetworkConnection *s = qobject_cast(this->sender()); - Q_ASSERT(s); - BufferInfo buf; - if((flags & Message::PrivMsg) && !(flags & Message::Self)) { - buf = Core::bufferInfo(user(), s->networkName(), nickFromMask(sender)); - } else { - buf = Core::bufferInfo(user(), s->networkName(), target); - } - Message msg(buf, type, text, sender, flags); +void CoreSession::recvMessageFromServer(Message::Type type, BufferInfo::Type bufferType, QString target, QString text, QString sender, quint8 flags) { + NetworkConnection *netCon = qobject_cast(this->sender()); + Q_ASSERT(netCon); + + BufferInfo bufferInfo = Core::bufferInfo(user(), netCon->networkId(), bufferType, target); + Message msg(bufferInfo, type, text, sender, flags); msg.setMsgId(Core::storeMessage(msg)); Q_ASSERT(msg.msgId() != 0); emit displayMsg(msg); @@ -341,6 +338,10 @@ QVariant CoreSession::sessionState() { return v; } +void CoreSession::storeBufferLastSeen(BufferId buffer, const QDateTime &lastSeen) { + Core::setBufferLastSeen(user(), buffer, lastSeen); +} + void CoreSession::sendBacklog(BufferInfo id, QVariant v1, QVariant v2) { QList log; QList msglist; @@ -417,17 +418,18 @@ void CoreSession::removeIdentity(IdentityId id) { /*** Network Handling ***/ -void CoreSession::createNetwork(const NetworkInfo &_info, bool useId) { - NetworkInfo info = _info; +void CoreSession::createNetwork(const NetworkInfo &info_) { + NetworkInfo info = info_; int id; - if(useId && info.networkId > 0) id = info.networkId.toInt(); - else { - for(id = 1; id <= _networks.count(); id++) { - if(!_networks.keys().contains(id)) break; - } - //qDebug() << "found free id" << i; - info.networkId = id; - } + + if(!info.networkId.isValid()) + Core::createNetwork(user(), info); + + Q_ASSERT(info.networkId.isValid()); + + id = info.networkId.toInt(); + Q_ASSERT(!_networks.contains(id)); + Network *net = new Network(id, this); connect(net, SIGNAL(connectRequested(NetworkId)), this, SLOT(connectToNetwork(NetworkId))); connect(net, SIGNAL(disconnectRequested(NetworkId)), this, SLOT(disconnectFromNetwork(NetworkId))); @@ -435,8 +437,6 @@ void CoreSession::createNetwork(const NetworkInfo &_info, bool useId) { net->setProxy(signalProxy()); _networks[id] = net; signalProxy()->synchronize(net); - CoreUserSettings s(user()); - s.storeNetworkInfo(info); emit networkCreated(id); } @@ -446,16 +446,30 @@ void CoreSession::updateNetwork(const NetworkInfo &info) { return; } _networks[info.networkId]->setNetworkInfo(info); - CoreUserSettings s(user()); - s.storeNetworkInfo(info); + Core::updateNetwork(user(), info); } void CoreSession::removeNetwork(NetworkId id) { + // Make sure the network is disconnected! + NetworkConnection *conn = _connections.value(id, 0); + if(conn) { + if(conn->connectionState() != Network::Disconnected) { + connect(conn, SIGNAL(disconnected(NetworkId)), this, SLOT(destroyNetwork(NetworkId))); + conn->disconnectFromIrc(); + } else { + _connections.take(id)->deleteLater(); // TODO make this saner + destroyNetwork(id); + } + } else { + destroyNetwork(id); + } +} + +void CoreSession::destroyNetwork(NetworkId id) { + Q_ASSERT(!_connections.contains(id)); Network *net = _networks.take(id); - if(net) { + if(net && Core::removeNetwork(user(), id)) { emit networkRemoved(id); - CoreUserSettings s(user()); - s.removeNetworkInfo(id); net->deleteLater(); } }