X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcoresession.cpp;h=eb6f3ccb7f0cba74695049dcc2384c51d25713e0;hp=6b28d71e942ae2397912ab0be6ca50e435a59644;hb=e7696b65e76e50137b8bab0ec3e43ce66a94f190;hpb=e733408e4759473bf38831f498f48a0f2f5e6dc7 diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index 6b28d71e..eb6f3ccb 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -35,7 +35,7 @@ #include -CoreSession::CoreSession(UserId uid, QObject *parent) : QObject(parent), +CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) : QObject(parent), _user(uid), _signalProxy(new SignalProxy(SignalProxy::Server, 0, this)), scriptEngine(new QScriptEngine(this)) @@ -70,6 +70,7 @@ CoreSession::CoreSession(UserId uid, QObject *parent) : QObject(parent), //p->attachSlot(SIGNAL(requestNetworkStates()), this, SLOT(networkStateRequested())); p->attachSlot(SIGNAL(requestConnect(QString)), this, SLOT(connectToNetwork(QString))); + p->attachSlot(SIGNAL(disconnectFromNetwork(NetworkId)), this, SLOT(disconnectFromNetwork(NetworkId))); // FIXME p->attachSlot(SIGNAL(sendInput(BufferInfo, QString)), this, SLOT(msgFromClient(BufferInfo, QString))); p->attachSlot(SIGNAL(requestBacklog(BufferInfo, QVariant, QVariant)), this, SLOT(sendBacklog(BufferInfo, QVariant, QVariant))); p->attachSignal(this, SIGNAL(displayMsg(Message))); @@ -106,17 +107,27 @@ CoreSession::CoreSession(UserId uid, QObject *parent) : QObject(parent), net->setCodecForEncoding("ISO-8859-15"); // FIXME net->setCodecForDecoding("ISO-8859-15"); // FIXME QList slist; - foreach(QVariant v, network["Servers"].toList()) slist << v.toMap(); + foreach(QVariant v, network["Servers"].toList()) { + QVariantMap server; + server["Host"] = v.toMap()["Address"]; + server["Address"] = v.toMap()["Address"]; + server["Port"] = v.toMap()["Port"]; + slist << server; + } net->setServerList(slist); net->setProxy(p); _networks[netid] = net; p->synchronize(net); } + // Restore session state + if(restoreState) restoreSessionState(); + emit initialized(); } CoreSession::~CoreSession() { + saveSessionState(); } UserId CoreSession::user() const { @@ -138,35 +149,33 @@ Identity *CoreSession::identity(IdentityId id) const { return 0; } -QVariant CoreSession::state() const { // FIXME +void CoreSession::saveSessionState() const { QVariantMap res; - /* - QList conn; - foreach(NetworkConnection *net, connections.values()) { - if(net->isConnected()) { - QVariantMap m; - m["Network"] = net->networkName(); - m["State"] = net->state(); - conn << m; - } + QVariantList conn; + foreach(NetworkConnection *net, _connections.values()) { + QVariantMap m; + m["NetworkId"] = QVariant::fromValue(net->networkId()); + m["State"] = net->state(); + conn << m; } - res["ConnectedServers"] = conn; - */ - return res; + res["CoreBuild"] = Global::quasselBuild; + res["ConnectedNetworks"] = conn; + CoreUserSettings s(user()); + s.setSessionState(res); } -void CoreSession::restoreState(const QVariant &previousState) { // FIXME - // Session restore - /* - QVariantMap state = previousState.toMap(); - if(state.contains("ConnectedServers")) { - foreach(QVariant v, state["ConnectedServers"].toList()) { - QVariantMap m = v.toMap(); - QString net = m["Network"].toString(); - if(!net.isEmpty()) connectToNetwork(net, m["State"]); - } +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(); + if(_networks.keys().contains(id)) connectToNetwork(id, v.toMap()["State"]); } - */ } @@ -225,8 +234,8 @@ void CoreSession::attachNetworkConnection(NetworkConnection *conn) { //connect(this, SIGNAL(disconnectFromIrc(QString)), network, SLOT(disconnectFromIrc(QString))); //connect(this, SIGNAL(msgFromGui(uint, QString, QString)), network, SLOT(userInput(uint, QString, QString))); - //connect(conn, SIGNAL(connected(NetworkId)), this, SLOT(networkConnected(NetworkId))); - //connect(conn, SIGNAL(disconnected(NetworkId)), this, SLOT(networkDisconnected(NetworkId))); + connect(conn, SIGNAL(connected(NetworkId)), this, SLOT(networkConnected(NetworkId))); + connect(conn, SIGNAL(disconnected(NetworkId)), this, SLOT(networkDisconnected(NetworkId))); signalProxy()->attachSignal(conn, SIGNAL(connected(NetworkId)), SIGNAL(networkConnected(NetworkId))); signalProxy()->attachSignal(conn, SIGNAL(disconnected(NetworkId)), SIGNAL(networkDisconnected(NetworkId))); @@ -236,6 +245,10 @@ void CoreSession::attachNetworkConnection(NetworkConnection *conn) { // TODO add error handling } +void CoreSession::disconnectFromNetwork(NetworkId id) { + _connections[id]->disconnectFromIrc(); +} + void CoreSession::networkStateRequested() { } @@ -256,13 +269,16 @@ SignalProxy *CoreSession::signalProxy() const { return _signalProxy; } -void CoreSession::networkConnected(uint networkid) { +void CoreSession::networkConnected(NetworkId networkid) { + network(networkid)->setConnected(true); Core::bufferInfo(user(), networkConnection(networkid)->networkName()); // create status buffer } -void CoreSession::networkDisconnected(uint networkid) { +void CoreSession::networkDisconnected(NetworkId networkid) { // FIXME // connection should only go away on explicit /part, and handle reconnections etcpp internally otherwise + network(networkid)->setConnected(false); + Q_ASSERT(_connections.contains(networkid)); _connections.take(networkid)->deleteLater(); Q_ASSERT(!_connections.contains(networkid)); @@ -310,10 +326,10 @@ QVariant CoreSession::sessionState() { QVariantMap v; QVariantList bufs; - foreach(BufferInfo id, buffers()) bufs << QVariant::fromValue(id); + foreach(BufferInfo id, buffers()) bufs << qVariantFromValue(id); v["BufferInfos"] = bufs; QVariantList networkids; - foreach(NetworkId id, _networks.keys()) networkids << QVariant::fromValue(id); + foreach(NetworkId id, _networks.keys()) networkids << qVariantFromValue(id); v["NetworkIds"] = networkids; quint32 ircusercount = 0; @@ -326,7 +342,7 @@ QVariant CoreSession::sessionState() { v["IrcChannelCount"] = ircchannelcount; QList idlist; - foreach(Identity *i, _identities.values()) idlist << QVariant::fromValue(*i); + foreach(Identity *i, _identities.values()) idlist << qVariantFromValue(*i); v["Identities"] = idlist; v["SessionData"] = sessionData; @@ -347,7 +363,7 @@ void CoreSession::sendBacklog(BufferInfo id, QVariant v1, QVariant v2) { // Send messages out in smaller packages - we don't want to make the signal data too large! for(int i = 0; i < msglist.count(); i++) { - log.append(QVariant::fromValue(msglist[i])); + log.append(qVariantFromValue(msglist[i])); if(log.count() >= 5) { emit backlogData(id, log, i >= msglist.count() - 1); log.clear();