X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fcore%2Fcoresession.cpp;h=426bcdc70d301231752f165fdbd9816eb4d458ef;hb=788fd0058595c815dc42597e9956c02aea45261f;hp=602ce78ea08303a075b0245e150255cd2f0432bb;hpb=894d66d1d86ccebf9df99e03bc3c174959e7ce76;p=quassel.git diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index 602ce78e..426bcdc7 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -1,11 +1,11 @@ /*************************************************************************** - * Copyright (C) 2005-07 by The Quassel IRC Development Team * + * Copyright (C) 2005-07 by the Quassel IRC Team * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * + * (at your option) version 3. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * @@ -24,21 +24,22 @@ #include "signalproxy.h" #include "storage.h" -#include "synchronizer.h" #include "networkinfo.h" #include "ircuser.h" #include "ircchannel.h" #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; s.beginGroup(QString("SessionData/%1").arg(user)); mutex.lock(); @@ -52,7 +53,6 @@ CoreSession::CoreSession(UserId uid, Storage *_storage, QObject *parent) p->attachSlot(SIGNAL(requestNetworkStates()), this, SLOT(serverStateRequested())); p->attachSlot(SIGNAL(requestConnect(QString)), this, SLOT(connectToNetwork(QString))); p->attachSlot(SIGNAL(sendInput(BufferInfo, QString)), this, SLOT(msgFromGui(BufferInfo, QString))); - p->attachSlot(SIGNAL(importOldBacklog()), storage, SLOT(importOldBacklog())); p->attachSlot(SIGNAL(requestBacklog(BufferInfo, QVariant, QVariant)), this, SLOT(sendBacklog(BufferInfo, QVariant, QVariant))); p->attachSignal(this, SIGNAL(displayMsg(Message))); p->attachSignal(this, SIGNAL(displayStatusMsg(QString, QString))); @@ -62,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()) { @@ -71,6 +72,8 @@ CoreSession::CoreSession(UserId uid, Storage *_storage, QObject *parent) } qDebug() << list; if(list.count()) connectToIrc(list); */ + + initScriptEngine(); } CoreSession::~CoreSession() { @@ -80,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)); @@ -102,10 +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(); @@ -146,8 +181,9 @@ void CoreSession::serverConnected(uint networkid) { } void CoreSession::serverDisconnected(uint networkid) { - servers.remove(networkid); - delete servers[networkid]; + Q_ASSERT(servers.contains(networkid)); + servers.take(networkid)->deleteLater(); + Q_ASSERT(!servers.contains(networkid)); } void CoreSession::msgFromGui(BufferInfo bufid, QString msg) { @@ -228,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()); +} +