- implemented on request a chat monitor: a simple buffer which shows
[quassel.git] / src / core / coresession.cpp
index 2d2c67e..eb6f3cc 100644 (file)
@@ -35,7 +35,7 @@
 
 #include <QtScript>
 
-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<QVariantMap> 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<QVariant> 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<NetworkId>(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<NetworkId>();
+    if(_networks.keys().contains(id)) connectToNetwork(id, v.toMap()["State"]);
   }
-  */
 }
 
 
@@ -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));
@@ -291,7 +307,7 @@ void CoreSession::recvMessageFromServer(Message::Type type, QString target, QStr
   }
   Message msg(buf, type, text, sender, flags);
   msg.setMsgId(Core::storeMessage(msg));
-  Q_ASSERT(msg.msgId());
+  Q_ASSERT(msg.msgId() != 0);
   emit displayMsg(msg);
 }
 
@@ -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;
@@ -324,10 +340,9 @@ QVariant CoreSession::sessionState() {
   }
   v["IrcUserCount"] = ircusercount;
   v["IrcChannelCount"] = ircchannelcount;
-  qDebug() << "nets:" << _networks.count() << " chans:" << ircchannelcount << " users:" << ircusercount;
 
   QList<QVariant> idlist;
-  foreach(Identity *i, _identities.values()) idlist << QVariant::fromValue<Identity>(*i);
+  foreach(Identity *i, _identities.values()) idlist << qVariantFromValue(*i);
   v["Identities"] = idlist;
 
   v["SessionData"] = sessionData;
@@ -348,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();