fixed #45: Terminate servatrice if critical error in e.g. listen() happens during initialization

This commit is contained in:
Max-Wilhelm Bruker 2012-05-01 10:58:08 +02:00
parent 875610e1b3
commit 7c8b3fc5e3
3 changed files with 28 additions and 19 deletions

View file

@ -165,15 +165,17 @@ int main(int argc, char *argv[])
Servatrice *server = new Servatrice(settings); Servatrice *server = new Servatrice(settings);
QObject::connect(server, SIGNAL(logDebugMessage(QString, void *)), logger, SLOT(logMessage(QString, void *))); QObject::connect(server, SIGNAL(logDebugMessage(QString, void *)), logger, SLOT(logMessage(QString, void *)));
QObject::connect(server, SIGNAL(destroyed()), &app, SLOT(quit()), Qt::QueuedConnection); QObject::connect(server, SIGNAL(destroyed()), &app, SLOT(quit()), Qt::QueuedConnection);
int retval = 0;
std::cerr << "-------------------------" << std::endl; if (server->initServer()) {
std::cerr << "Server initialized." << std::endl; std::cerr << "-------------------------" << std::endl;
std::cerr << "Server initialized." << std::endl;
qInstallMsgHandler(myMessageOutput);
int retval = app.exec(); qInstallMsgHandler(myMessageOutput);
retval = app.exec();
std::cerr << "Server quit." << std::endl;
std::cerr << "-------------------------" << std::endl; std::cerr << "Server quit." << std::endl;
std::cerr << "-------------------------" << std::endl;
}
delete rng; delete rng;
delete settings; delete settings;

View file

@ -64,6 +64,16 @@ void Servatrice_IslServer::incomingConnection(int socketDescriptor)
Servatrice::Servatrice(QSettings *_settings, QObject *parent) Servatrice::Servatrice(QSettings *_settings, QObject *parent)
: Server(parent), dbMutex(QMutex::Recursive), settings(_settings), uptime(0), shutdownTimer(0) : 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(); serverName = settings->value("server/name").toString();
serverId = settings->value("server/id", 0).toInt(); serverId = settings->value("server/id", 0).toInt();
@ -192,10 +202,10 @@ Servatrice::Servatrice(QSettings *_settings, QObject *parent)
if (islServer->listen(QHostAddress::Any, networkPort)) if (islServer->listen(QHostAddress::Any, networkPort))
qDebug() << "ISL server listening."; qDebug() << "ISL server listening.";
else else
throw QString("islServer->listen(): Error."); throw QString("islServer->listen()");
} } catch (QString error) { } } catch (QString error) {
qDebug() << "ERROR --" << error; qDebug() << "ERROR --" << error;
return false;
} }
pingClock = new QTimer(this); pingClock = new QTimer(this);
@ -216,15 +226,11 @@ Servatrice::Servatrice(QSettings *_settings, QObject *parent)
qDebug() << "Starting server on port" << gamePort; qDebug() << "Starting server on port" << gamePort;
if (gameServer->listen(QHostAddress::Any, gamePort)) if (gameServer->listen(QHostAddress::Any, gamePort))
qDebug() << "Server listening."; qDebug() << "Server listening.";
else else {
qDebug() << "gameServer->listen(): Error."; qDebug() << "gameServer->listen(): Error.";
return false;
} }
return true;
Servatrice::~Servatrice()
{
prepareDestroy();
QSqlDatabase::database().close();
} }
bool Servatrice::openDatabase() bool Servatrice::openDatabase()

View file

@ -88,6 +88,7 @@ public:
mutable QMutex dbMutex; mutable QMutex dbMutex;
Servatrice(QSettings *_settings, QObject *parent = 0); Servatrice(QSettings *_settings, QObject *parent = 0);
~Servatrice(); ~Servatrice();
bool initServer();
bool openDatabase(); bool openDatabase();
bool checkSql(); bool checkSql();
bool execSqlQuery(QSqlQuery &query); bool execSqlQuery(QSqlQuery &query);