diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index e79bf259..b3396309 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -308,6 +308,35 @@ ResponseCode Server_ProtocolHandler::cmdLogin(Command_Login *cmd, CommandContain _ignoreList.append(new ServerInfo_User(ignoreIterator.next().value())); } + server->serverMutex.lock(); + + QList gameList; + QMapIterator roomIterator(server->getRooms()); + QMutexLocker gameListLocker(&gameListMutex); + while (roomIterator.hasNext()) { + Server_Room *room = roomIterator.next().value(); + room->roomMutex.lock(); + QMapIterator gameIterator(room->getGames()); + while (gameIterator.hasNext()) { + Server_Game *game = gameIterator.next().value(); + QMutexLocker gameLocker(&game->gameMutex); + const QList &gamePlayers = game->getPlayers().values(); + for (int j = 0; j < gamePlayers.size(); ++j) + if (gamePlayers[j]->getUserInfo()->getName() == userInfo->getName()) { + gamePlayers[j]->setProtocolHandler(this); + game->postConnectionStatusUpdate(gamePlayers[j], true); + games.insert(game->getGameId(), QPair(game, gamePlayers[j])); + + enqueueProtocolItem(new Event_GameJoined(game->getGameId(), game->getDescription(), gamePlayers[j]->getPlayerId(), gamePlayers[j]->getSpectator(), game->getSpectatorsCanTalk(), game->getSpectatorsSeeEverything(), true)); + enqueueProtocolItem(GameEventContainer::makeNew(new Event_GameStateChanged(game->getGameStarted(), game->getActivePlayer(), game->getActivePhase(), game->getGameState(gamePlayers[j])), game->getGameId())); + + break; + } + } + room->roomMutex.unlock(); + } + server->serverMutex.unlock(); + ProtocolResponse *resp = new Response_Login(cont->getCmdId(), RespOk, new ServerInfo_User(userInfo, true), _buddyList, _ignoreList); if (getCompressionSupport()) resp->setCompressed(true); @@ -414,26 +443,6 @@ ResponseCode Server_ProtocolHandler::cmdJoinRoom(Command_JoinRoom *cmd, CommandC enqueueProtocolItem(new Event_RoomSay(r->getId(), QString(), r->getJoinMessage())); - // This might not scale very well. Use an extra QMap if it becomes a problem. - QMutexLocker gameListLocker(&gameListMutex); - QMapIterator gameIterator(r->getGames()); - while (gameIterator.hasNext()) { - Server_Game *game = gameIterator.next().value(); - QMutexLocker gameLocker(&game->gameMutex); - const QList &gamePlayers = game->getPlayers().values(); - for (int j = 0; j < gamePlayers.size(); ++j) - if (gamePlayers[j]->getUserInfo()->getName() == userInfo->getName()) { - gamePlayers[j]->setProtocolHandler(this); - game->postConnectionStatusUpdate(gamePlayers[j], true); - games.insert(game->getGameId(), QPair(game, gamePlayers[j])); - - enqueueProtocolItem(new Event_GameJoined(game->getGameId(), game->getDescription(), gamePlayers[j]->getPlayerId(), gamePlayers[j]->getSpectator(), game->getSpectatorsCanTalk(), game->getSpectatorsSeeEverything(), true)); - enqueueProtocolItem(GameEventContainer::makeNew(new Event_GameStateChanged(game->getGameStarted(), game->getActivePlayer(), game->getActivePhase(), game->getGameState(gamePlayers[j])), game->getGameId())); - - break; - } - } - ServerInfo_Room *info = r->getInfo(true); if (getCompressionSupport()) info->setCompressed(true);