Stop core from crashing when exiting while clients are still connected.
[quassel.git] / src / core / core.cpp
index 32b34f5..c0b9a50 100644 (file)
@@ -64,14 +64,12 @@ void Core::init() {
 
   CoreSettings cs;
 
-  // TODO migrate old db settings
-
   if(!(configured = initStorage(cs.storageSettings().toMap()))) {
     qWarning("Core is currently not configured!");
 
     // try to migrate old settings
     QVariantMap old = cs.oldDbSettings().toMap();
-    if(old.count() && old["Type"].toString() == "SQlite") {
+    if(old.count() && old["Type"].toString().toUpper() == "SQLITE") {
       QVariantMap newSettings;
       newSettings["Backend"] = "SQLite";
       if((configured = initStorage(newSettings))) {
@@ -86,7 +84,7 @@ void Core::init() {
 }
 
 Core::~Core() {
-  foreach(QTcpSocket *socket, blocksizes.keys()) {
+  foreach(QTcpSocket *socket, blocksizes.keys()) { qDebug() << "disconnecting" << socket << blocksizes.keys();
     socket->disconnectFromHost();  // disconnect local (i.e. non-authed) clients
   }
   qDeleteAll(sessions);
@@ -106,6 +104,10 @@ void Core::saveState() {
 }
 
 void Core::restoreState() {
+  if(!instance()->configured) {
+    qWarning() << qPrintable(tr("Cannot restore a state for an unconfigured core!"));
+    return;
+  }
   if(instance()->sessions.count()) {
     qWarning() << qPrintable(tr("Calling restoreState() even though active sessions exist!"));
     return;
@@ -203,9 +205,9 @@ void Core::syncStorage() {
 }
 
 /*** Storage Access ***/
-bool Core::createNetworkId(UserId user, NetworkInfo &info) {
+bool Core::createNetwork(UserId user, NetworkInfo &info) {
   QMutexLocker locker(&mutex);
-  NetworkId networkId = instance()->storage->createNetworkId(user, info);
+  NetworkId networkId = instance()->storage->createNetwork(user, info);
   if(!networkId.isValid())
     return false;
 
@@ -213,14 +215,29 @@ bool Core::createNetworkId(UserId user, NetworkInfo &info) {
   return true;
 }
 
+bool Core::updateNetwork(UserId user, const NetworkInfo &info) {
+  QMutexLocker locker(&mutex);
+  return instance()->storage->updateNetwork(user, info);
+}
+
+bool Core::removeNetwork(UserId user, const NetworkId &networkId) {
+  QMutexLocker locker(&mutex);
+  return instance()->storage->removeNetwork(user, networkId);
+}
+
+QList<NetworkInfo> Core::networks(UserId user) {
+  QMutexLocker locker(&mutex);
+  return instance()->storage->networks(user);
+}
+
 NetworkId Core::networkId(UserId user, const QString &network) {
   QMutexLocker locker(&mutex);
   return instance()->storage->getNetworkId(user, network);
 }
 
-BufferInfo Core::bufferInfo(UserId user, const NetworkId &networkId, const QString &buffer) {
+BufferInfo Core::bufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer) {
   QMutexLocker locker(&mutex);
-  return instance()->storage->getBufferInfo(user, networkId, buffer);
+  return instance()->storage->getBufferInfo(user, networkId, type, buffer);
 }
 
 MsgId Core::storeMessage(const Message &message) {
@@ -248,6 +265,16 @@ QList<BufferInfo> Core::requestBuffers(UserId user, QDateTime since) {
   return instance()->storage->requestBuffers(user, since);
 }
 
+void Core::setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate) {
+  QMutexLocker locker(&mutex);
+  return instance()->storage->setBufferLastSeen(user, bufferId, seenDate);
+}
+
+QHash<BufferId, QDateTime> Core::bufferLastSeenDates(UserId user) {
+  QMutexLocker locker(&mutex);
+  return instance()->storage->bufferLastSeenDates(user);
+}
+
 /*** Network Management ***/
 
 bool Core::startListening(uint port) {
@@ -288,6 +315,7 @@ void Core::clientHasData() {
   while(SignalProxy::readDataFromDevice(socket, blocksizes[socket], item)) {
     QVariantMap msg = item.toMap();
     processClientMessage(socket, msg);
+    if(!blocksizes.contains(socket)) break;  // this socket is no longer ours to handle!
   }
 }
 
@@ -402,43 +430,6 @@ void Core::clientDisconnected() {
   // Suggestion: kill sessions if they are not connected to any network and client.
 }
 
-/*
-void Core::processCoreSetup(QTcpSocket *socket, QVariantMap &msg) {
-  if(msg["HasSettings"].toBool()) {
-    QVariantMap auth;
-    auth["User"] = msg["User"];
-    auth["Password"] = msg["Password"];
-    msg.remove("User");
-    msg.remove("Password");
-    qDebug() << "Initializing storage provider" << msg["Type"].toString();
-
-    if(!initStorage(msg, true)) {
-      // notify client to start wizard again
-      qWarning("Core is currently not configured!");
-      QVariantMap reply;
-      reply["StartWizard"] = true;
-      reply["StorageProviders"] = availableStorageProviders();
-      SignalProxy::writeDataToDevice(socket, reply);
-    } else {
-      // write coresettings
-      CoreSettings s;
-      s.setDatabaseSettings(msg);
-      // write admin user to database & make the core listen again to connections
-      storage->addUser(auth["User"].toString(), auth["Password"].toString());
-      startListening();
-      // continue the normal procedure
-      //processClientInit(socket, auth);
-    }
-  } else {
-    // notify client to start wizard
-    QVariantMap reply;
-    reply["StartWizard"] = true;
-    reply["StorageProviders"] = availableStorageProviders();
-    SignalProxy::writeDataToDevice(socket, reply);
-  }
-}
-*/
-
 void Core::setupClientSession(QTcpSocket *socket, UserId uid) {
   // Find or create session for validated user
   SessionThread *sess;