From 33546c6b7417bdfb125de9e50b45beb0330d66e6 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Thu, 6 Aug 2009 16:51:11 +0200 Subject: [PATCH] client and server related crash fixes --- cockatrice/src/client.cpp | 1 + cockatrice/src/client.h | 2 +- cockatrice/src/game.cpp | 6 +++--- servatrice/servatrice.pro | 2 +- servatrice/src/server.cpp | 8 ++++---- servatrice/src/server.h | 2 +- servatrice/src/servergame.cpp | 15 +++++++++------ servatrice/src/serversocket.cpp | 8 ++++++-- 8 files changed, 26 insertions(+), 18 deletions(-) diff --git a/cockatrice/src/client.cpp b/cockatrice/src/client.cpp index d5bb7e2d..e709c9a8 100644 --- a/cockatrice/src/client.cpp +++ b/cockatrice/src/client.cpp @@ -197,6 +197,7 @@ PendingCommand *Client::cmd(const QString &s) PendingCommands << pc; connect(this, SIGNAL(responseReceived(int, ServerResponse)), pc, SLOT(responseReceived(int, ServerResponse))); connect(pc, SIGNAL(finished(ServerResponse)), this, SLOT(removePendingCommand())); + connect(pc, SIGNAL(timeout()), this, SLOT(timeout())); connect(timer, SIGNAL(timeout()), pc, SLOT(checkTimeout())); return pc; } diff --git a/cockatrice/src/client.h b/cockatrice/src/client.h index f448fa17..657476ef 100644 --- a/cockatrice/src/client.h +++ b/cockatrice/src/client.h @@ -35,13 +35,13 @@ private: int time; signals: void finished(ServerResponse resp); + void timeout(); public slots: void responseReceived(int _msgid, ServerResponse _resp); void checkTimeout(); public: int getMsgId() const { return msgid; } QString getCmd() const { return cmd; } - bool timeout() { return ++time > 5; } PendingCommand(const QString &_cmd, int _msgid, QObject *parent = 0); }; diff --git a/cockatrice/src/game.cpp b/cockatrice/src/game.cpp index 3c35bfa9..4f095137 100644 --- a/cockatrice/src/game.cpp +++ b/cockatrice/src/game.cpp @@ -185,7 +185,7 @@ void Game::gameEvent(const ServerEventData &msg) localPlayer->gameEvent(msg); else { Player *p = players.findPlayer(msg.getPlayerId()); - if (!p) { + if ((!p) && (msg.getEventType() != eventJoin)) { // XXX } @@ -194,8 +194,8 @@ void Game::gameEvent(const ServerEventData &msg) emit logSay(p, msg.getEventData()[0]); break; case eventJoin: { - emit logJoin(p); - addPlayer(msg.getPlayerId(), msg.getPlayerName(), QPointF(0, 0), false); + Player *newPlayer = addPlayer(msg.getPlayerId(), msg.getPlayerName(), QPointF(0, 0), false); + emit logJoin(newPlayer); break; } case eventLeave: diff --git a/servatrice/servatrice.pro b/servatrice/servatrice.pro index 88808321..626dc610 100755 --- a/servatrice/servatrice.pro +++ b/servatrice/servatrice.pro @@ -9,7 +9,7 @@ INCLUDEPATH += . src MOC_DIR = build OBJECTS_DIR = build -CONFIG += qt thread +# CONFIG += qt debug QT += network sql QT -= gui diff --git a/servatrice/src/server.cpp b/servatrice/src/server.cpp index e9e9e5d5..b8aa8c9a 100644 --- a/servatrice/src/server.cpp +++ b/servatrice/src/server.cpp @@ -85,7 +85,6 @@ void Server::incomingConnection(int socketId) socket->setSocketDescriptor(socketId); connect(socket, SIGNAL(createGame(const QString, const QString, const int, ServerSocket *)), this, SLOT(addGame(const QString, const QString, const int, ServerSocket *))); connect(socket, SIGNAL(joinGame(int, ServerSocket *)), this, SLOT(addClientToGame(int, ServerSocket *))); - connect(socket, SIGNAL(destroyed(QObject *)), this, SLOT(socketDestroyed(QObject *))); socket->initConnection(); players << socket; } @@ -153,6 +152,7 @@ bool Server::checkGamePassword(int gameId, const QString &password) void Server::broadcastGameListUpdate(ServerGame *game) { + qDebug(QString("broadcastGameListUpdate() to %1 players").arg(players.size()).toLatin1()); QString line = game->getGameListLine(); for (int i = 0; i < players.size(); i++) if (players[i]->getAcceptsGameListChanges()) @@ -172,8 +172,8 @@ void Server::gameClosing() games.removeAt(games.indexOf(static_cast(sender()))); } -void Server::socketDestroyed(QObject *obj) +void Server::removePlayer(ServerSocket *player) { - players.removeAt(players.indexOf(static_cast(obj))); - qDebug(QString("Server::socketDestroyed: %1 players left").arg(players.size()).toLatin1()); + players.removeAt(players.indexOf(player)); + qDebug(QString("Server::removePlayer: %1 players left").arg(players.size()).toLatin1()); } diff --git a/servatrice/src/server.h b/servatrice/src/server.h index 7be2da29..467f62e9 100644 --- a/servatrice/src/server.h +++ b/servatrice/src/server.h @@ -37,7 +37,6 @@ private slots: void addGame(const QString description, const QString password, const int maxPlayers, ServerSocket *creator); void addClientToGame(int gameId, ServerSocket *client); void gameClosing(); - void socketDestroyed(QObject *obj); public: Server(QObject *parent = 0); ~Server(); @@ -49,6 +48,7 @@ public: ServerGame *getGame(int gameId); AbstractRNG *getRNG() const { return rng; } void broadcastGameListUpdate(ServerGame *game); + void removePlayer(ServerSocket *player); private: void incomingConnection(int SocketId); QList games; diff --git a/servatrice/src/servergame.cpp b/servatrice/src/servergame.cpp index 9534ed81..37c74d80 100644 --- a/servatrice/src/servergame.cpp +++ b/servatrice/src/servergame.cpp @@ -35,12 +35,15 @@ ServerGame::~ServerGame() QString ServerGame::getGameListLine() const { - return QString("list_games|%1|%2|%3|%4|%5|%6").arg(gameId) - .arg(description) - .arg(password.isEmpty() ? 0 : 1) - .arg(players.size()) - .arg(maxPlayers) - .arg(creator->getPlayerName()); + if (players.isEmpty()) + return QString("list_games|%1|||0|%2|").arg(gameId).arg(maxPlayers); + else + return QString("list_games|%1|%2|%3|%4|%5|%6").arg(gameId) + .arg(description) + .arg(password.isEmpty() ? 0 : 1) + .arg(players.size()) + .arg(maxPlayers) + .arg(creator->getPlayerName()); } QStringList ServerGame::getPlayerNames() const diff --git a/servatrice/src/serversocket.cpp b/servatrice/src/serversocket.cpp index a93cabb8..641e9dd3 100644 --- a/servatrice/src/serversocket.cpp +++ b/servatrice/src/serversocket.cpp @@ -42,6 +42,9 @@ ServerSocket::ServerSocket(Server *_server, QObject *parent) ServerSocket::~ServerSocket() { qDebug("ServerSocket destructor"); + // The socket has to be removed from the server's list before it is removed from the game's list + // so it will not receive the game update event. + server->removePlayer(this); if (game) game->removePlayer(this); } @@ -242,9 +245,9 @@ ReturnMessage::ReturnCode ServerSocket::cmdCreateGame(const QList &par QString description = params[0].toString(); QString password = params[1].toString(); int maxPlayers = params[2].toInt(); + acceptsGameListChanges = false; leaveGame(); emit createGame(description, password, maxPlayers, this); - acceptsGameListChanges = false; return ReturnMessage::ReturnOk; } @@ -254,9 +257,9 @@ ReturnMessage::ReturnCode ServerSocket::cmdJoinGame(const QList ¶m QString password = params[1].toString(); if (!server->checkGamePassword(gameId, password)) return ReturnMessage::ReturnPasswordWrong; + acceptsGameListChanges = false; leaveGame(); emit joinGame(gameId, this); - acceptsGameListChanges = false; return ReturnMessage::ReturnOk; } @@ -700,5 +703,6 @@ void ServerSocket::initConnection() void ServerSocket::catchSocketError(QAbstractSocket::SocketError socketError) { qDebug(QString("socket error: %1").arg(socketError).toLatin1()); + deleteLater(); }