Fix license headers: Quassel IRC Team -> Quassel Project, 2007 -> 2008
[quassel.git] / src / core / core.cpp
index b3abba6..7aae115 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-07 by the Quassel IRC Team                         *
+ *   Copyright (C) 2005-08 by the Quassel Project                          *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
@@ -21,8 +21,8 @@
 #include "core.h"
 #include "coresession.h"
 #include "coresettings.h"
+#include "signalproxy.h"
 #include "sqlitestorage.h"
-#include "util.h"
 
 #include <QMetaObject>
 #include <QMetaMethod>
@@ -42,10 +42,55 @@ void Core::destroy() {
 }
 
 Core::Core() {
-  storage = NULL;
+  storage = 0;
 }
 
 void Core::init() {
+
+  // TODO: Remove this again at some point
+  // Check if old core settings need to be migrated in order to make the switch to the
+  // new location less painful.
+  CoreSettings cs;
+  QVariant foo = cs.databaseSettings();
+  if(!foo.isValid()) {
+    // ok, no settings stored yet. check for old ones.
+    QSettings os("Quassel IRC Development Team", "Quassel IRC");
+    QVariant bar = os.value("Core/DatabaseSettings");
+    if(bar.isValid()) {
+      // old settings available -- migrate!
+      qWarning() << "\n\nOld settings detected. Will migrate core settings to the new location...\nNOTE: GUI style settings won't be migrated!\n";
+      QSettings ncs("Quassel Project", "Quassel Core");
+      ncs.setValue("Core/CoreState", os.value("Core/CoreState"));
+      ncs.setValue("Core/DatabaseSettings", os.value("Core/DatabaseSettings"));
+      os.beginGroup("SessionData");
+      foreach(QString group, os.childGroups()) {
+        ncs.setValue(QString("SessionData/%1/Identities").arg(group), os.value(QString("%1/Identities").arg(group)));
+        ncs.setValue(QString("SessionData/%1/Networks").arg(group), os.value(QString("%1/Networks").arg(group)));
+      }
+      os.endGroup();
+
+      QSettings ngs("Quassel Project", "Quassel Client");
+      os.beginGroup("Accounts");
+      foreach(QString key, os.childKeys()) {
+        ngs.setValue(QString("Accounts/%1").arg(key), os.value(key));
+      }
+      foreach(QString group, os.childGroups()) {
+        ngs.setValue(QString("Accounts/%1/AccountData").arg(group), os.value(QString("%1/AccountData").arg(group)));
+      }
+      os.endGroup();
+      os.beginGroup("Geometry");
+      foreach(QString key, os.childKeys()) {
+        ngs.setValue(QString("UI/%1").arg(key), os.value(key));
+      }
+      os.endGroup();
+
+      ncs.sync();
+      ngs.sync();
+      qWarning() << "Migration successfully finished. You may now delete $HOME/.config/Quassel IRC Development Team/ (on Linux).\n\n";
+    }
+  }
+  // END
+
   CoreSettings s;
   configured = false;
 
@@ -64,6 +109,7 @@ void Core::init() {
   connect(&server, SIGNAL(newConnection()), this, SLOT(incomingConnection()));
   startListening(s.port());
   guiUser = 0;
+
 }
 
 bool Core::initStorageSqlite(QVariantMap dbSettings, bool setup) {
@@ -92,6 +138,34 @@ Core::~Core() {
   }
 }
 
+void Core::restoreState() {
+  Q_ASSERT(!instance()->sessions.count());
+  CoreSettings s;
+  QList<QVariant> users = s.coreState().toList();
+  if(users.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"]);
+      }
+    }
+  }
+}
+
+void Core::saveState() {
+  CoreSettings s;
+  QList<QVariant> users;
+  foreach(CoreSession *sess, instance()->sessions.values()) {
+    QVariantMap m;
+    m["UserId"] = sess->userId();
+    m["State"] = sess->state();
+    users << m;
+  }
+  s.setCoreState(users);
+}
+
 CoreSession *Core::session(UserId uid) {
   Core *core = instance();
   if(core->sessions.contains(uid)) return core->sessions[uid];
@@ -147,7 +221,7 @@ void Core::clientHasData() {
   Q_ASSERT(socket && blockSizes.contains(socket));
   quint32 bsize = blockSizes.value(socket);
   QVariant item;
-  if(readDataFromDevice(socket, bsize, item)) {
+  if(SignalProxy::readDataFromDevice(socket, bsize, item)) {
     // we need to auth the client
     try {
       QVariantMap msg = item.toMap();
@@ -209,7 +283,7 @@ void Core::processClientInit(QTcpSocket *socket, const QVariantMap &msg) {
   disconnect(socket, 0, this, 0);
   sessions[uid]->addClient(socket);
   qDebug() << "Client initialized successfully.";
-  writeDataToDevice(socket, reply);
+  SignalProxy::writeDataToDevice(socket, reply);
 }
 
 void Core::processCoreSetup(QTcpSocket *socket, QVariantMap &msg) {
@@ -232,7 +306,7 @@ void Core::processCoreSetup(QTcpSocket *socket, QVariantMap &msg) {
       QVariantMap reply;
       reply["StartWizard"] = true;
       reply["StorageProviders"] = availableStorageProviders();
-      writeDataToDevice(socket, reply);
+      SignalProxy::writeDataToDevice(socket, reply);
     } else {
       // write coresettings
       CoreSettings s;
@@ -248,7 +322,7 @@ void Core::processCoreSetup(QTcpSocket *socket, QVariantMap &msg) {
     QVariantMap reply;
     reply["StartWizard"] = true;
     reply["StorageProviders"] = availableStorageProviders();
-    writeDataToDevice(socket, reply);
+    SignalProxy::writeDataToDevice(socket, reply);
   }
 }