X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fcore%2Fcoresession.cpp;h=426bcdc70d301231752f165fdbd9816eb4d458ef;hb=2517c75cb456db066aec68f99eed6e42d12a827d;hp=dcc5641f1d60e373e6b2c65f42e67a14e74baaa3;hpb=e3198912416b2e4ed3708d66953fd6f4928a2382;p=quassel.git diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index dcc5641f..426bcdc7 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -30,12 +30,14 @@ #include "util.h" +#include CoreSession::CoreSession(UserId uid, Storage *_storage, QObject *parent) : QObject(parent), user(uid), _signalProxy(new SignalProxy(SignalProxy::Server, 0, this)), - storage(_storage) + storage(_storage), + scriptEngine(new QScriptEngine(this)) { QSettings s; @@ -60,6 +62,7 @@ CoreSession::CoreSession(UserId uid, Storage *_storage, QObject *parent) p->attachSignal(this, SIGNAL(sessionDataChanged(const QString &, const QVariant &)), SIGNAL(coreSessionDataChanged(const QString &, const QVariant &))); p->attachSlot(SIGNAL(clientSessionDataChanged(const QString &, const QVariant &)), this, SLOT(storeSessionData(const QString &, const QVariant &))); /* Autoconnect. (When) do we actually do this? + --> session restore should be enough! QStringList list; QVariantMap networks = retrieveSessionData("Networks").toMap(); foreach(QString net, networks.keys()) { @@ -69,6 +72,8 @@ CoreSession::CoreSession(UserId uid, Storage *_storage, QObject *parent) } qDebug() << list; if(list.count()) connectToIrc(list); */ + + initScriptEngine(); } CoreSession::~CoreSession() { @@ -78,6 +83,34 @@ UserId CoreSession::userId() const { return user; } +QVariant CoreSession::state() const { + QVariantMap res; + QList conn; + foreach(Server *server, servers.values()) { + if(server->isConnected()) { + QVariantMap m; + m["Network"] = server->networkName(); + m["State"] = server->state(); + conn << m; + } + } + res["ConnectedServers"] = conn; + return res; +} + +void CoreSession::restoreState(const QVariant &previousState) { + // 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::storeSessionData(const QString &key, const QVariant &data) { QSettings s; s.beginGroup(QString("SessionData/%1").arg(user)); @@ -100,14 +133,14 @@ QVariant CoreSession::retrieveSessionData(const QString &key, const QVariant &de } // FIXME switch to NetworkIDs -void CoreSession::connectToNetwork(QString network) { +void CoreSession::connectToNetwork(QString network, const QVariant &previousState) { uint networkid = getNetworkId(network); if(networkid == 0) { qWarning() << "unable to connect to Network" << network << "(User:" << userId() << "): unable to determine NetworkId"; return; } if(!servers.contains(networkid)) { - Server *server = new Server(userId(), networkid, network); + Server *server = new Server(userId(), networkid, network, previousState); servers[networkid] = server; attachServer(server); server->start(); @@ -231,3 +264,17 @@ void CoreSession::sendBacklog(BufferInfo id, QVariant v1, QVariant v2) { } if(log.count() > 0) emit backlogData(id, log, true); } + + +void CoreSession::initScriptEngine() { + signalProxy()->attachSlot(SIGNAL(scriptRequest(QString)), this, SLOT(scriptRequest(QString))); + signalProxy()->attachSignal(this, SIGNAL(scriptResult(QString))); + + QScriptValue storage_ = scriptEngine->newQObject(storage); + scriptEngine->globalObject().setProperty("storage", storage_); +} + +void CoreSession::scriptRequest(QString script) { + emit scriptResult(scriptEngine->evaluate(script).toString()); +} +