Made the client disconnection more verbose. And some minor fixes.
[quassel.git] / src / core / coresession.cpp
index c9891d2..4003783 100644 (file)
@@ -26,6 +26,8 @@
 
 #include "signalproxy.h"
 #include "buffersyncer.h"
+#include "corebacklogmanager.h"
+#include "corebufferviewmanager.h"
 #include "storage.h"
 
 #include "network.h"
 #include "util.h"
 #include "coreusersettings.h"
 
-CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) : QObject(parent),
+CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent)
+  : QObject(parent),
     _user(uid),
     _signalProxy(new SignalProxy(SignalProxy::Server, 0, this)),
     _bufferSyncer(new BufferSyncer(this)),
+    _backlogManager(new CoreBacklogManager(this)),
+    _bufferViewManager(new CoreBufferViewManager(_signalProxy, this)),
     scriptEngine(new QScriptEngine(this))
 {
 
   SignalProxy *p = signalProxy();
-
-  p->attachSlot(SIGNAL(requestConnect(QString)), this, SLOT(connectToNetwork(QString)));
-  p->attachSlot(SIGNAL(disconnectFromNetwork(NetworkId)), this, SLOT(disconnectFromNetwork(NetworkId))); // FIXME
+  connect(p, SIGNAL(peerRemoved(QIODevice *)), this, SLOT(removeClient(QIODevice *)));
+  
+  //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)));
   p->attachSignal(this, SIGNAL(displayStatusMsg(QString, QString)));
-  p->attachSignal(this, SIGNAL(backlogData(BufferInfo, QVariantList, bool)));
   p->attachSignal(this, SIGNAL(bufferInfoUpdated(BufferInfo)));
 
   p->attachSignal(this, SIGNAL(identityCreated(const Identity &)));
@@ -70,13 +73,20 @@ CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) : QObje
   initScriptEngine();
 
   // init BufferSyncer
-  QHash<BufferId, QDateTime> 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 &)));
+  QHash<BufferId, MsgId> lastSeenHash = Core::bufferLastSeenMsgIds(user());
+  foreach(BufferId id, lastSeenHash.keys())
+    _bufferSyncer->requestSetLastSeenMsg(id, lastSeenHash[id]);
+  
+  connect(_bufferSyncer, SIGNAL(lastSeenMsgSet(BufferId, MsgId)), this, SLOT(storeBufferLastSeenMsg(BufferId, MsgId)));
   connect(_bufferSyncer, SIGNAL(removeBufferRequested(BufferId)), this, SLOT(removeBufferRequested(BufferId)));
   connect(this, SIGNAL(bufferRemoved(BufferId)), _bufferSyncer, SLOT(removeBuffer(BufferId)));
+  connect(this, SIGNAL(bufferRenamed(BufferId, QString)), _bufferSyncer, SLOT(renameBuffer(BufferId, QString)));
   p->synchronize(_bufferSyncer);
 
+
+  // init BacklogManager;
+  p->synchronize(_backlogManager);
+    
   // Restore session state
   if(restoreState) restoreSessionState();
 
@@ -138,60 +148,19 @@ void CoreSession::loadSettings() {
     createIdentity(i);
   }
 
-
-  // migration to pure DB storage
-  QList<NetworkId> 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 {
-  QVariantMap res;
-  QVariantList conn;
-  foreach(NetworkConnection *net, _connections.values()) {
-    QVariantMap m;
-    m["NetworkId"] = QVariant::fromValue<NetworkId>(net->networkId());
-    m["State"] = net->state();
-    conn << m;
-  }
-  res["CoreBuild"] = Global::quasselBuild;
-  res["ConnectedNetworks"] = conn;
-  CoreUserSettings s(user());
-  s.setSessionState(res);
+
 }
 
 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"]);
+  QList<NetworkId> nets = Core::connectedNetworks(user());
+  foreach(NetworkId id, nets) {
+    connectToNetwork(id);
   }
 }
 
@@ -199,22 +168,7 @@ void CoreSession::updateBufferInfo(UserId uid, const BufferInfo &bufinfo) {
   if(uid == user()) emit bufferInfoUpdated(bufinfo);
 }
 
-// FIXME remove
-void CoreSession::connectToNetwork(QString netname, const QVariant &previousState) {
-  Network *net = 0;
-  foreach(Network *n, _networks.values()) {
-    if(n->networkName() == netname) {
-      net = n; break;
-    }
-  }
-  if(!net) {
-    qWarning() << "Connect to unknown network requested, ignoring!";
-    return;
-  }
-  connectToNetwork(net->networkId(), previousState);
-}
-
-void CoreSession::connectToNetwork(NetworkId id, const QVariant &previousState) {
+void CoreSession::connectToNetwork(NetworkId id) {
   Network *net = network(id);
   if(!net) {
     qWarning() << "Connect to unknown network requested! net:" << id << "user:" << user();
@@ -223,7 +177,7 @@ void CoreSession::connectToNetwork(NetworkId id, const QVariant &previousState)
 
   NetworkConnection *conn = networkConnection(id);
   if(!conn) {
-    conn = new NetworkConnection(net, this, previousState);
+    conn = new NetworkConnection(net, this);
     _connections[id] = conn;
     attachNetworkConnection(conn);
   }
@@ -242,6 +196,12 @@ void CoreSession::attachNetworkConnection(NetworkConnection *conn) {
          this, SLOT(recvMessageFromServer(Message::Type, BufferInfo::Type, QString, QString, QString, quint8)));
   connect(conn, SIGNAL(displayStatusMsg(QString)), this, SLOT(recvStatusMsgFromServer(QString)));
 
+  connect(conn, SIGNAL(nickChanged(const NetworkId &, const QString &, const QString &)),
+         this, SLOT(renameBuffer(const NetworkId &, const QString &, const QString &)));
+  connect(conn, SIGNAL(channelJoined(NetworkId, const QString &, const QString &)),
+          this, SLOT(channelJoined(NetworkId, const QString &, const QString &)));
+  connect(conn, SIGNAL(channelParted(NetworkId, const QString &)),
+          this, SLOT(channelParted(NetworkId, const QString &)));
 }
 
 void CoreSession::disconnectFromNetwork(NetworkId id) {
@@ -265,6 +225,17 @@ void CoreSession::addClient(QObject *dev) { // this is QObject* so we can use it
   }
 }
 
+void CoreSession::removeClient(QIODevice *iodev) {
+  // no checks for validity check - privateslot...
+  QTcpSocket *socket = qobject_cast<QTcpSocket *>(iodev);
+  if(socket)
+    qDebug() << qPrintable(tr("Client %1 disconnected (UserId: %2).").arg(socket->peerAddress().toString()).arg(user().toInt()));
+  else
+    qDebug() << "Local client disconnedted.";
+  disconnect(socket, 0, this, 0);
+  socket->deleteLater();
+}
+
 SignalProxy *CoreSession::signalProxy() const {
   return _signalProxy;
 }
@@ -272,13 +243,29 @@ SignalProxy *CoreSession::signalProxy() const {
 // FIXME we need a sane way for creating buffers!
 void CoreSession::networkConnected(NetworkId networkid) {
   Core::bufferInfo(user(), networkid, BufferInfo::StatusBuffer); // create status buffer
+  Core::setNetworkConnected(user(), networkid, true);
 }
 
 // called now only on /quit and requested disconnects, not on normal disconnects!
 void CoreSession::networkDisconnected(NetworkId networkid) {
+  Core::setNetworkConnected(user(), networkid, false);
   if(_connections.contains(networkid)) _connections.take(networkid)->deleteLater();
 }
 
+void CoreSession::channelJoined(NetworkId id, const QString &channel, const QString &key) {
+  Core::setChannelPersistent(user(), id, channel, true);
+  Core::setPersistentChannelKey(user(), id, channel, key);
+}
+
+void CoreSession::channelParted(NetworkId id, const QString &channel) {
+  Core::setChannelPersistent(user(), id, channel, false);
+}
+
+QHash<QString, QString> CoreSession::persistentChannels(NetworkId id) const {
+  return Core::persistentChannels(user(), id);
+  return QHash<QString, QString>();
+}
+
 // FIXME switch to BufferId
 void CoreSession::msgFromClient(BufferInfo bufinfo, QString msg) {
   NetworkConnection *conn = networkConnection(bufinfo.networkId());
@@ -340,32 +327,10 @@ QVariant CoreSession::sessionState() {
   return v;
 }
 
-void CoreSession::storeBufferLastSeen(BufferId buffer, const QDateTime &lastSeen) {
-  Core::setBufferLastSeen(user(), buffer, lastSeen);
+void CoreSession::storeBufferLastSeenMsg(BufferId buffer, const MsgId &msgId) {
+  Core::setBufferLastSeenMsg(user(), buffer, msgId);
 }
 
-void CoreSession::sendBacklog(BufferInfo id, QVariant v1, QVariant v2) {
-  QList<QVariant> log;
-  QList<Message> msglist;
-  if(v1.type() == QVariant::DateTime) {
-
-
-  } else {
-    msglist = Core::requestMsgs(id, v1.toInt(), v2.toInt());
-  }
-
-  // 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(qVariantFromValue(msglist[i]));
-    if(log.count() >= 5) {
-      emit backlogData(id, log, i >= msglist.count() - 1);
-      log.clear();
-    }
-  }
-  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)));
@@ -500,3 +465,10 @@ void CoreSession::removeBufferRequested(BufferId bufferId) {
   if(Core::removeBuffer(user(), bufferId))
     emit bufferRemoved(bufferId);
 }
+
+void CoreSession::renameBuffer(const NetworkId &networkId, const QString &newName, const QString &oldName) {
+  BufferId bufferId = Core::renameBuffer(user(), networkId, newName, oldName);
+  if(bufferId.isValid()) {
+    emit bufferRenamed(bufferId, newName);
+  }
+}