From 7c8b3fc5e3a1e5bd42eca2a293a36ad09da73d45 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Tue, 1 May 2012 10:58:08 +0200 Subject: [PATCH] fixed #45: Terminate servatrice if critical error in e.g. listen() happens during initialization --- servatrice/src/main.cpp | 20 +++++++++++--------- servatrice/src/servatrice.cpp | 26 ++++++++++++++++---------- servatrice/src/servatrice.h | 1 + 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/servatrice/src/main.cpp b/servatrice/src/main.cpp index 6a54e129..8c969a67 100644 --- a/servatrice/src/main.cpp +++ b/servatrice/src/main.cpp @@ -165,15 +165,17 @@ int main(int argc, char *argv[]) Servatrice *server = new Servatrice(settings); QObject::connect(server, SIGNAL(logDebugMessage(QString, void *)), logger, SLOT(logMessage(QString, void *))); QObject::connect(server, SIGNAL(destroyed()), &app, SLOT(quit()), Qt::QueuedConnection); - - std::cerr << "-------------------------" << std::endl; - std::cerr << "Server initialized." << std::endl; - - qInstallMsgHandler(myMessageOutput); - int retval = app.exec(); - - std::cerr << "Server quit." << std::endl; - std::cerr << "-------------------------" << std::endl; + int retval = 0; + if (server->initServer()) { + std::cerr << "-------------------------" << std::endl; + std::cerr << "Server initialized." << std::endl; + + qInstallMsgHandler(myMessageOutput); + retval = app.exec(); + + std::cerr << "Server quit." << std::endl; + std::cerr << "-------------------------" << std::endl; + } delete rng; delete settings; diff --git a/servatrice/src/servatrice.cpp b/servatrice/src/servatrice.cpp index 0f724a29..368244b0 100644 --- a/servatrice/src/servatrice.cpp +++ b/servatrice/src/servatrice.cpp @@ -64,6 +64,16 @@ void Servatrice_IslServer::incomingConnection(int socketDescriptor) Servatrice::Servatrice(QSettings *_settings, QObject *parent) : Server(parent), dbMutex(QMutex::Recursive), settings(_settings), uptime(0), shutdownTimer(0) +{ +} + +Servatrice::~Servatrice() +{ + prepareDestroy(); + QSqlDatabase::database().close(); +} + +bool Servatrice::initServer() { serverName = settings->value("server/name").toString(); serverId = settings->value("server/id", 0).toInt(); @@ -192,10 +202,10 @@ Servatrice::Servatrice(QSettings *_settings, QObject *parent) if (islServer->listen(QHostAddress::Any, networkPort)) qDebug() << "ISL server listening."; else - throw QString("islServer->listen(): Error."); - + throw QString("islServer->listen()"); } } catch (QString error) { qDebug() << "ERROR --" << error; + return false; } pingClock = new QTimer(this); @@ -216,15 +226,11 @@ Servatrice::Servatrice(QSettings *_settings, QObject *parent) qDebug() << "Starting server on port" << gamePort; if (gameServer->listen(QHostAddress::Any, gamePort)) qDebug() << "Server listening."; - else + else { qDebug() << "gameServer->listen(): Error."; - -} - -Servatrice::~Servatrice() -{ - prepareDestroy(); - QSqlDatabase::database().close(); + return false; + } + return true; } bool Servatrice::openDatabase() diff --git a/servatrice/src/servatrice.h b/servatrice/src/servatrice.h index 5fbeefab..03ae2d71 100644 --- a/servatrice/src/servatrice.h +++ b/servatrice/src/servatrice.h @@ -88,6 +88,7 @@ public: mutable QMutex dbMutex; Servatrice(QSettings *_settings, QObject *parent = 0); ~Servatrice(); + bool initServer(); bool openDatabase(); bool checkSql(); bool execSqlQuery(QSqlQuery &query);