Backlogdata is now made persistent every 10 minutes.
[quassel.git] / src / core / core.cpp
index 3233798..4826c3e 100644 (file)
@@ -28,6 +28,7 @@
 #include "coresettings.h"
 #include "signalproxy.h"
 #include "sqlitestorage.h"
+#include "network.h"
 
 Core *Core::instanceptr = 0;
 QMutex Core::mutex;
@@ -48,6 +49,10 @@ Core::Core()
   : storage(0)
 {
   startTime = QDateTime::currentDateTime();  // for uptime :)
+
+  connect(&_storageSyncTimer, SIGNAL(timeout()),
+         this, SLOT(syncStorage()));
+  _storageSyncTimer.start(10 * 60 * 1000); // in msecs
 }
 
 void Core::init() {
@@ -94,50 +99,62 @@ Core::~Core() {
   qDeleteAll(sessions);
 }
 
+void Core::syncStorage() {
+  QMutexLocker locker(&mutex);
+  return instance()->storage->sync();
+}
+
 void Core::restoreState() {
-  return;
-  /*
-  Q_ASSERT(!instance()->sessions.count());
+  if(instance()->sessions.count()) {
+    qWarning() << qPrintable(tr("Calling restoreState() even though active sessions exist!"));
+    return;
+  }
   CoreSettings s;
-  QList<QVariant> users = s.coreState().toList();
-  if(users.count() > 0) {
+  uint build = s.coreState().toMap()["CoreBuild"].toUInt();
+  if(build < 362) {
+    qWarning() << qPrintable(tr("Core state too old, ignoring..."));
+    return;
+  }
+  QVariantList activeSessions = s.coreState().toMap()["ActiveSessions"].toList();
+  if(activeSessions.count() > 0) {
     qDebug() << "Restoring previous core state...";
-    foreach(QVariant v, users) {
-      QVariantMap m = v.toMap();
-      if(m.contains("UserId")) {
-        CoreSession *sess = createSession(m["UserId"].toUInt());
-        sess->restoreState(m["State"]);  // FIXME multithreading
-      }
+    foreach(QVariant v, activeSessions) {
+      UserId user = v.value<UserId>();
+      instance()->createSession(user, true);
     }
     qDebug() << "...done.";
   }
-  */
 }
 
 void Core::saveState() {
-  /*
   CoreSettings s;
-  QList<QVariant> users;
-  foreach(CoreSession *sess, instance()->sessions.values()) {
-    QVariantMap m;
-    m["UserId"] = sess->user();  // FIXME multithreading
-    m["State"] = sess->state();
-    users << m;
-  }
-  s.setCoreState(users);
-  */
+  QVariantMap state;
+  QVariantList activeSessions;
+  foreach(UserId user, instance()->sessions.keys()) activeSessions << QVariant::fromValue<UserId>(user);
+  state["CoreBuild"] = Global::quasselBuild;
+  state["ActiveSessions"] = activeSessions;
+  s.setCoreState(state);
 }
 
 /*** Storage Access ***/
+bool Core::createNetworkId(UserId user, NetworkInfo &info) {
+  QMutexLocker locker(&mutex);
+  NetworkId networkId = instance()->storage->createNetworkId(user, info);
+  if(!networkId.isValid())
+    return false;
+  
+  info.networkId = networkId;
+  return true;
+}
 
 NetworkId Core::networkId(UserId user, const QString &network) {
   QMutexLocker locker(&mutex);
   return instance()->storage->getNetworkId(user, network);
 }
 
-BufferInfo Core::bufferInfo(UserId user, const QString &network, const QString &buffer) {
+BufferInfo Core::bufferInfo(UserId user, const NetworkId &networkId, const QString &buffer) {
   //QMutexLocker locker(&mutex);
-  return instance()->storage->getBufferInfo(user, network, buffer);
+  return instance()->storage->getBufferInfo(user, networkId, buffer);
 }
 
 MsgId Core::storeMessage(const Message &message) {
@@ -254,7 +271,7 @@ void Core::clientHasData() {
       mutex.lock();
       UserId uid = storage->validateUser(msg["User"].toString(), msg["Password"].toString());
       mutex.unlock();
-      if(!uid) {
+      if(uid == 0) {
         reply["MsgType"] = "ClientLoginReject";
         reply["Error"] = tr("<b>Invalid username or password!</b><br>The username/password combination you supplied could not be found in the database.");
         SignalProxy::writeDataToDevice(socket, reply);
@@ -308,15 +325,6 @@ void Core::clientDisconnected() {
   // Suggestion: kill sessions if they are not connected to any network and client.
 }
 
-  
-  //disconnect(socket, 0, this, 0);
-  /*
-  sessions[uid]->addClient(socket);  // FIXME multithreading
-  qDebug() << "Client initialized successfully.";
-  SignalProxy::writeDataToDevice(socket, reply);
-  */
-
-
 void Core::processCoreSetup(QTcpSocket *socket, QVariantMap &msg) {
   if(msg["HasSettings"].toBool()) {
     QVariantMap auth;
@@ -366,12 +374,12 @@ void Core::setupClientSession(QTcpSocket *socket, UserId uid) {
   sess->addClient(socket);
 }
 
-SessionThread *Core::createSession(UserId uid) {
+SessionThread *Core::createSession(UserId uid, bool restore) {
   if(sessions.contains(uid)) {
     qWarning() << "Calling createSession() when a session for the user already exists!";
     return 0;
   }
-  SessionThread *sess = new SessionThread(uid, this);
+  SessionThread *sess = new SessionThread(uid, restore, this);
   sessions[uid] = sess;
   sess->start();
   return sess;