client and server related crash fixes

This commit is contained in:
Max-Wilhelm Bruker 2009-08-06 16:51:11 +02:00
parent a2b30dc86f
commit 33546c6b74
8 changed files with 26 additions and 18 deletions

View file

@ -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<ServerGame *>(sender())));
}
void Server::socketDestroyed(QObject *obj)
void Server::removePlayer(ServerSocket *player)
{
players.removeAt(players.indexOf(static_cast<ServerSocket *>(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());
}

View file

@ -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<ServerGame *> games;

View file

@ -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

View file

@ -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<QVariant> &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<QVariant> &param
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();
}