client and server related crash fixes
This commit is contained in:
parent
a2b30dc86f
commit
33546c6b74
8 changed files with 26 additions and 18 deletions
|
@ -197,6 +197,7 @@ PendingCommand *Client::cmd(const QString &s)
|
||||||
PendingCommands << pc;
|
PendingCommands << pc;
|
||||||
connect(this, SIGNAL(responseReceived(int, ServerResponse)), pc, SLOT(responseReceived(int, ServerResponse)));
|
connect(this, SIGNAL(responseReceived(int, ServerResponse)), pc, SLOT(responseReceived(int, ServerResponse)));
|
||||||
connect(pc, SIGNAL(finished(ServerResponse)), this, SLOT(removePendingCommand()));
|
connect(pc, SIGNAL(finished(ServerResponse)), this, SLOT(removePendingCommand()));
|
||||||
|
connect(pc, SIGNAL(timeout()), this, SLOT(timeout()));
|
||||||
connect(timer, SIGNAL(timeout()), pc, SLOT(checkTimeout()));
|
connect(timer, SIGNAL(timeout()), pc, SLOT(checkTimeout()));
|
||||||
return pc;
|
return pc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,13 +35,13 @@ private:
|
||||||
int time;
|
int time;
|
||||||
signals:
|
signals:
|
||||||
void finished(ServerResponse resp);
|
void finished(ServerResponse resp);
|
||||||
|
void timeout();
|
||||||
public slots:
|
public slots:
|
||||||
void responseReceived(int _msgid, ServerResponse _resp);
|
void responseReceived(int _msgid, ServerResponse _resp);
|
||||||
void checkTimeout();
|
void checkTimeout();
|
||||||
public:
|
public:
|
||||||
int getMsgId() const { return msgid; }
|
int getMsgId() const { return msgid; }
|
||||||
QString getCmd() const { return cmd; }
|
QString getCmd() const { return cmd; }
|
||||||
bool timeout() { return ++time > 5; }
|
|
||||||
PendingCommand(const QString &_cmd, int _msgid, QObject *parent = 0);
|
PendingCommand(const QString &_cmd, int _msgid, QObject *parent = 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -185,7 +185,7 @@ void Game::gameEvent(const ServerEventData &msg)
|
||||||
localPlayer->gameEvent(msg);
|
localPlayer->gameEvent(msg);
|
||||||
else {
|
else {
|
||||||
Player *p = players.findPlayer(msg.getPlayerId());
|
Player *p = players.findPlayer(msg.getPlayerId());
|
||||||
if (!p) {
|
if ((!p) && (msg.getEventType() != eventJoin)) {
|
||||||
// XXX
|
// XXX
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,8 +194,8 @@ void Game::gameEvent(const ServerEventData &msg)
|
||||||
emit logSay(p, msg.getEventData()[0]);
|
emit logSay(p, msg.getEventData()[0]);
|
||||||
break;
|
break;
|
||||||
case eventJoin: {
|
case eventJoin: {
|
||||||
emit logJoin(p);
|
Player *newPlayer = addPlayer(msg.getPlayerId(), msg.getPlayerName(), QPointF(0, 0), false);
|
||||||
addPlayer(msg.getPlayerId(), msg.getPlayerName(), QPointF(0, 0), false);
|
emit logJoin(newPlayer);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case eventLeave:
|
case eventLeave:
|
||||||
|
|
|
@ -9,7 +9,7 @@ INCLUDEPATH += . src
|
||||||
MOC_DIR = build
|
MOC_DIR = build
|
||||||
OBJECTS_DIR = build
|
OBJECTS_DIR = build
|
||||||
|
|
||||||
CONFIG += qt thread
|
# CONFIG += qt debug
|
||||||
QT += network sql
|
QT += network sql
|
||||||
QT -= gui
|
QT -= gui
|
||||||
|
|
||||||
|
|
|
@ -85,7 +85,6 @@ void Server::incomingConnection(int socketId)
|
||||||
socket->setSocketDescriptor(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(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(joinGame(int, ServerSocket *)), this, SLOT(addClientToGame(int, ServerSocket *)));
|
||||||
connect(socket, SIGNAL(destroyed(QObject *)), this, SLOT(socketDestroyed(QObject *)));
|
|
||||||
socket->initConnection();
|
socket->initConnection();
|
||||||
players << socket;
|
players << socket;
|
||||||
}
|
}
|
||||||
|
@ -153,6 +152,7 @@ bool Server::checkGamePassword(int gameId, const QString &password)
|
||||||
|
|
||||||
void Server::broadcastGameListUpdate(ServerGame *game)
|
void Server::broadcastGameListUpdate(ServerGame *game)
|
||||||
{
|
{
|
||||||
|
qDebug(QString("broadcastGameListUpdate() to %1 players").arg(players.size()).toLatin1());
|
||||||
QString line = game->getGameListLine();
|
QString line = game->getGameListLine();
|
||||||
for (int i = 0; i < players.size(); i++)
|
for (int i = 0; i < players.size(); i++)
|
||||||
if (players[i]->getAcceptsGameListChanges())
|
if (players[i]->getAcceptsGameListChanges())
|
||||||
|
@ -172,8 +172,8 @@ void Server::gameClosing()
|
||||||
games.removeAt(games.indexOf(static_cast<ServerGame *>(sender())));
|
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)));
|
players.removeAt(players.indexOf(player));
|
||||||
qDebug(QString("Server::socketDestroyed: %1 players left").arg(players.size()).toLatin1());
|
qDebug(QString("Server::removePlayer: %1 players left").arg(players.size()).toLatin1());
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,6 @@ private slots:
|
||||||
void addGame(const QString description, const QString password, const int maxPlayers, ServerSocket *creator);
|
void addGame(const QString description, const QString password, const int maxPlayers, ServerSocket *creator);
|
||||||
void addClientToGame(int gameId, ServerSocket *client);
|
void addClientToGame(int gameId, ServerSocket *client);
|
||||||
void gameClosing();
|
void gameClosing();
|
||||||
void socketDestroyed(QObject *obj);
|
|
||||||
public:
|
public:
|
||||||
Server(QObject *parent = 0);
|
Server(QObject *parent = 0);
|
||||||
~Server();
|
~Server();
|
||||||
|
@ -49,6 +48,7 @@ public:
|
||||||
ServerGame *getGame(int gameId);
|
ServerGame *getGame(int gameId);
|
||||||
AbstractRNG *getRNG() const { return rng; }
|
AbstractRNG *getRNG() const { return rng; }
|
||||||
void broadcastGameListUpdate(ServerGame *game);
|
void broadcastGameListUpdate(ServerGame *game);
|
||||||
|
void removePlayer(ServerSocket *player);
|
||||||
private:
|
private:
|
||||||
void incomingConnection(int SocketId);
|
void incomingConnection(int SocketId);
|
||||||
QList<ServerGame *> games;
|
QList<ServerGame *> games;
|
||||||
|
|
|
@ -35,12 +35,15 @@ ServerGame::~ServerGame()
|
||||||
|
|
||||||
QString ServerGame::getGameListLine() const
|
QString ServerGame::getGameListLine() const
|
||||||
{
|
{
|
||||||
return QString("list_games|%1|%2|%3|%4|%5|%6").arg(gameId)
|
if (players.isEmpty())
|
||||||
.arg(description)
|
return QString("list_games|%1|||0|%2|").arg(gameId).arg(maxPlayers);
|
||||||
.arg(password.isEmpty() ? 0 : 1)
|
else
|
||||||
.arg(players.size())
|
return QString("list_games|%1|%2|%3|%4|%5|%6").arg(gameId)
|
||||||
.arg(maxPlayers)
|
.arg(description)
|
||||||
.arg(creator->getPlayerName());
|
.arg(password.isEmpty() ? 0 : 1)
|
||||||
|
.arg(players.size())
|
||||||
|
.arg(maxPlayers)
|
||||||
|
.arg(creator->getPlayerName());
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList ServerGame::getPlayerNames() const
|
QStringList ServerGame::getPlayerNames() const
|
||||||
|
|
|
@ -42,6 +42,9 @@ ServerSocket::ServerSocket(Server *_server, QObject *parent)
|
||||||
ServerSocket::~ServerSocket()
|
ServerSocket::~ServerSocket()
|
||||||
{
|
{
|
||||||
qDebug("ServerSocket destructor");
|
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)
|
if (game)
|
||||||
game->removePlayer(this);
|
game->removePlayer(this);
|
||||||
}
|
}
|
||||||
|
@ -242,9 +245,9 @@ ReturnMessage::ReturnCode ServerSocket::cmdCreateGame(const QList<QVariant> &par
|
||||||
QString description = params[0].toString();
|
QString description = params[0].toString();
|
||||||
QString password = params[1].toString();
|
QString password = params[1].toString();
|
||||||
int maxPlayers = params[2].toInt();
|
int maxPlayers = params[2].toInt();
|
||||||
|
acceptsGameListChanges = false;
|
||||||
leaveGame();
|
leaveGame();
|
||||||
emit createGame(description, password, maxPlayers, this);
|
emit createGame(description, password, maxPlayers, this);
|
||||||
acceptsGameListChanges = false;
|
|
||||||
return ReturnMessage::ReturnOk;
|
return ReturnMessage::ReturnOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,9 +257,9 @@ ReturnMessage::ReturnCode ServerSocket::cmdJoinGame(const QList<QVariant> ¶m
|
||||||
QString password = params[1].toString();
|
QString password = params[1].toString();
|
||||||
if (!server->checkGamePassword(gameId, password))
|
if (!server->checkGamePassword(gameId, password))
|
||||||
return ReturnMessage::ReturnPasswordWrong;
|
return ReturnMessage::ReturnPasswordWrong;
|
||||||
|
acceptsGameListChanges = false;
|
||||||
leaveGame();
|
leaveGame();
|
||||||
emit joinGame(gameId, this);
|
emit joinGame(gameId, this);
|
||||||
acceptsGameListChanges = false;
|
|
||||||
return ReturnMessage::ReturnOk;
|
return ReturnMessage::ReturnOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -700,5 +703,6 @@ void ServerSocket::initConnection()
|
||||||
void ServerSocket::catchSocketError(QAbstractSocket::SocketError socketError)
|
void ServerSocket::catchSocketError(QAbstractSocket::SocketError socketError)
|
||||||
{
|
{
|
||||||
qDebug(QString("socket error: %1").arg(socketError).toLatin1());
|
qDebug(QString("socket error: %1").arg(socketError).toLatin1());
|
||||||
|
|
||||||
deleteLater();
|
deleteLater();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue