QTfrontend/net/tcpBase.cpp
changeset 10307 e13d3147f15b
parent 10248 7b9b44a051f8
child 10310 22f541fbde32
--- a/QTfrontend/net/tcpBase.cpp	Sun Jun 15 00:02:25 2014 +0200
+++ b/QTfrontend/net/tcpBase.cpp	Sun Jun 15 04:33:54 2014 +0200
@@ -172,7 +172,10 @@
     thread->start();
 #else
     process = new QProcess(this);
-    connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(StartProcessError(QProcess::ProcessError)));
+    connect(process, SIGNAL(error(QProcess::ProcessError)),
+        this, SLOT(StartProcessError(QProcess::ProcessError)));
+    connect(process, SIGNAL(finished(int, QProcess::ExitStatus)),
+        this, SLOT(onEngineDeath(int, QProcess::ExitStatus)));
     QStringList arguments = getArguments();
 
 #ifdef QT_DEBUG
@@ -198,7 +201,9 @@
 #endif
         emit isReadyNow();
     }
+
     IPCSocket->deleteLater();
+    IPCSocket = NULL;
 
     deleteLater();
 }
@@ -217,6 +222,37 @@
     ClientDisconnect();
 }
 
+void TCPBase::onEngineDeath(int exitCode, QProcess::ExitStatus exitStatus)
+{
+    Q_UNUSED(exitStatus);
+
+    ClientDisconnect();
+
+    // show error message if there was an error that was not an engine's
+    // fatal error - because that one already sent a info via IPC
+    if ((exitCode != 0) && (exitCode != 2))
+    {
+        // inform user that something bad happened
+        MessageDialog::ShowFatalMessage(
+            tr("The game engine died unexpectedly!")
+            + QString("\n(exit code %1)").arg(exitCode)
+            + "\n\n " + tr("We are very sorry for the inconvenience :(") + "\n\n" +
+            tr("If this keeps happening, please click the '%1' button in the main menu!")
+            .arg("Feedback"));
+
+    }
+
+    // cleanup up
+    if (IPCSocket)
+    {
+        IPCSocket->close();
+        IPCSocket->deleteLater();
+    }
+
+    // plot suicide
+    deleteLater();
+}
+
 void TCPBase::tcpServerReady()
 {
     disconnect(srvsList.first(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady()));