common: Don't use unsafe functions when handling POSIX signals
[quassel.git] / src / qtui / monoapplication.cpp
index 1a8822d..34890ed 100644 (file)
@@ -23,6 +23,7 @@
 #include "client.h"
 #include "core.h"
 #include "internalpeer.h"
+#include "logmessage.h"
 #include "qtui.h"
 
 class InternalPeer;
@@ -30,18 +31,13 @@ class InternalPeer;
 MonolithicApplication::MonolithicApplication(int &argc, char **argv)
     : QtUiApplication(argc, argv)
 {
-#if defined(HAVE_KDE4) || defined(Q_OS_MAC)
-    Quassel::disableCrashHandler();
-#endif /* HAVE_KDE4 || Q_OS_MAC */
-
     Quassel::setRunMode(Quassel::Monolithic);
 }
 
 
-bool MonolithicApplication::init()
+void MonolithicApplication::init()
 {
-    if (!QtUiApplication::init())
-        return false;
+    QtUiApplication::init();
 
     connect(Client::coreConnection(), SIGNAL(connectToInternalCore(QPointer<InternalPeer>)), this, SLOT(onConnectionRequest(QPointer<InternalPeer>)));
 
@@ -51,18 +47,41 @@ bool MonolithicApplication::init()
     if (Quassel::isOptionSet("port")) {
         startInternalCore();
     }
+}
 
-    return true;
+
+Quassel::QuitHandler MonolithicApplication::quitHandler()
+{
+    return [this]() {
+        quInfo() << "Client shutting down...";
+        connect(_client.get(), SIGNAL(destroyed()), this, SLOT(onClientDestroyed()));
+        _client.release()->deleteLater();
+    };
 }
 
 
-MonolithicApplication::~MonolithicApplication()
+void MonolithicApplication::onClientDestroyed()
 {
-    // Client needs to be destroyed first
-    Client::destroy();
-    _coreThread.quit();
-    _coreThread.wait();
-    Quassel::destroy();
+    if (_core) {
+        connect(_core, SIGNAL(shutdownComplete()), this, SLOT(onCoreShutdown()));
+        _core->shutdown();
+    }
+    else {
+        QCoreApplication::quit();
+    }
+}
+
+
+void MonolithicApplication::onCoreShutdown()
+{
+    if (_core) {
+        connect(_core, SIGNAL(destroyed()), QCoreApplication::instance(), SLOT(quit()));
+        _coreThread.quit();
+        _coreThread.wait();
+    }
+    else {
+        QCoreApplication::quit();
+    }
 }
 
 
@@ -76,12 +95,15 @@ void MonolithicApplication::startInternalCore()
     // Start internal core in a separate thread, so it doesn't block the UI
     _core = new Core{};
     _core->moveToThread(&_coreThread);
-    connect(&_coreThread, SIGNAL(started()), _core, SLOT(init()));
+    connect(&_coreThread, SIGNAL(started()), _core, SLOT(initAsync()));
     connect(&_coreThread, SIGNAL(finished()), _core, SLOT(deleteLater()));
 
     connect(this, SIGNAL(connectInternalPeer(QPointer<InternalPeer>)), _core, SLOT(connectInternalPeer(QPointer<InternalPeer>)));
     connect(_core, SIGNAL(sessionState(Protocol::SessionState)), Client::coreConnection(), SLOT(internalSessionStateReceived(Protocol::SessionState)));
 
+    connect(_core, SIGNAL(dbUpgradeInProgress(bool)), Client::instance(), SLOT(onDbUpgradeInProgress(bool)));
+    connect(_core, SIGNAL(exitRequested(int,QString)), Client::instance(), SLOT(onExitRequested(int,QString)));
+
     _coreThread.start();
 }