From 9b9a92186712c9b1d4ee5a36415bbc33941564a1 Mon Sep 17 00:00:00 2001 From: lotodore Date: Thu, 10 Mar 2011 20:55:46 +0000 Subject: [PATCH] Removing SessionWrapper to prepare rejoin. This also improves dispatching network packets. --- src/net/common/clientthread.cpp | 2 +- src/net/common/servergame.cpp | 65 ++-- src/net/common/servergamestate.cpp | 114 ++++--- src/net/common/serverlobbythread.cpp | 426 ++++++++++++++------------- src/net/common/sessiondata.cpp | 15 + src/net/common/sessionmanager.cpp | 82 +++--- src/net/servergame.h | 20 +- src/net/servergamestate.h | 32 +- src/net/serverlobbythread.h | 64 ++-- src/net/sessiondata.h | 5 + src/net/sessionmanager.h | 21 +- 11 files changed, 425 insertions(+), 421 deletions(-) diff --git a/src/net/common/clientthread.cpp b/src/net/common/clientthread.cpp index 0e70000b..08e1ba44 100644 --- a/src/net/common/clientthread.cpp +++ b/src/net/common/clientthread.cpp @@ -366,7 +366,7 @@ ClientThread::StartAsyncRead() } void -ClientThread::CloseSession(boost::shared_ptr session) +ClientThread::CloseSession(boost::shared_ptr /*session*/) { throw NetException(__FILE__, __LINE__, ERR_SOCK_CONN_RESET, 0); } diff --git a/src/net/common/servergame.cpp b/src/net/common/servergame.cpp index c9880684..1870537f 100644 --- a/src/net/common/servergame.cpp +++ b/src/net/common/servergame.cpp @@ -102,25 +102,25 @@ ServerGame::SetDBId(DB_id newId) } void -ServerGame::AddSession(SessionWrapper session) +ServerGame::AddSession(boost::shared_ptr session) { - if (session.sessionData) + if (session) GetState().HandleNewSession(shared_from_this(), session); } void ServerGame::RemovePlayer(unsigned playerId, unsigned errorCode) { - SessionWrapper tmpSession = GetSessionManager().GetSessionByUniquePlayerId(playerId); + boost::shared_ptr tmpSession = GetSessionManager().GetSessionByUniquePlayerId(playerId); // Only kick if the player was found. - if (tmpSession.sessionData.get()) + if (tmpSession) SessionError(tmpSession, errorCode); } void -ServerGame::HandlePacket(SessionWrapper session, boost::shared_ptr packet) +ServerGame::HandlePacket(boost::shared_ptr session, boost::shared_ptr packet) { - if (session.sessionData && packet) + if (session && packet) GetState().ProcessPacket(shared_from_this(), session, packet); } @@ -372,9 +372,9 @@ ServerGame::RemoveAutoLeavePlayers() PlayerIdList::const_iterator i = m_autoLeavePlayerList.begin(); PlayerIdList::const_iterator end = m_autoLeavePlayerList.end(); while (i != end) { - SessionWrapper tmpSession = GetSessionManager().GetSessionByUniquePlayerId(*i); + boost::shared_ptr tmpSession = GetSessionManager().GetSessionByUniquePlayerId(*i); // Only remove if the player was found. - if (tmpSession.sessionData.get()) + if (tmpSession) MoveSessionToLobby(tmpSession, NTF_NET_REMOVED_ON_REQUEST); ++i; } @@ -391,9 +391,9 @@ ServerGame::InternalEndGame() void ServerGame::InternalKickPlayer(unsigned playerId) { - SessionWrapper tmpSession = GetSessionManager().GetSessionByUniquePlayerId(playerId); + boost::shared_ptr tmpSession = GetSessionManager().GetSessionByUniquePlayerId(playerId); // Only kick if the player was found. - if (tmpSession.sessionData.get()) + if (tmpSession) MoveSessionToLobby(tmpSession, NTF_NET_REMOVED_KICKED); // KICKING COMPUTER PLAYERS IS BUGGY AND OCCASIONALLY CAUSES A CRASH // Disabled for now. @@ -406,9 +406,9 @@ ServerGame::InternalKickPlayer(unsigned playerId) } void -ServerGame::InternalAskVoteKick(SessionWrapper byWhom, unsigned playerIdWho, unsigned timeoutSec) +ServerGame::InternalAskVoteKick(boost::shared_ptr byWhom, unsigned playerIdWho, unsigned timeoutSec) { - if (IsRunning() && byWhom.playerData) { + if (IsRunning() && byWhom->GetPlayerData()) { // Retrieve only the number of human players. size_t numPlayers = GetSessionManager().GetPlayerIdList(SessionData::Game).size(); if (numPlayers > 2) { @@ -417,7 +417,7 @@ ServerGame::InternalAskVoteKick(SessionWrapper byWhom, unsigned playerIdWho, uns // Lock the vote kick data. if (!m_voteKickData) { // Initiate a vote kick. - unsigned playerIdByWhom = byWhom.playerData->GetUniqueId(); + unsigned playerIdByWhom = byWhom->GetPlayerData()->GetUniqueId(); m_voteKickData.reset(new VoteKickData); m_voteKickData->petitionId = m_curPetitionId++; m_voteKickData->kickPlayerId = playerIdWho; @@ -455,7 +455,7 @@ ServerGame::InternalAskVoteKick(SessionWrapper byWhom, unsigned playerIdWho, uns } void -ServerGame::InternalDenyAskVoteKick(SessionWrapper byWhom, unsigned playerIdWho, DenyKickPlayerReason reason) +ServerGame::InternalDenyAskVoteKick(boost::shared_ptr byWhom, unsigned playerIdWho, DenyKickPlayerReason reason) { boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); packet->GetMsg()->present = PokerTHMessage_PR_askKickDeniedMessage; @@ -463,17 +463,17 @@ ServerGame::InternalDenyAskVoteKick(SessionWrapper byWhom, unsigned playerIdWho, netKickDenied->gameId = GetId(); netKickDenied->playerId = playerIdWho; netKickDenied->kickDeniedReason = reason; - GetLobbyThread().GetSender().Send(byWhom.sessionData, packet); + GetLobbyThread().GetSender().Send(byWhom, packet); } void -ServerGame::InternalVoteKick(SessionWrapper byWhom, unsigned petitionId, KickVote vote) +ServerGame::InternalVoteKick(boost::shared_ptr byWhom, unsigned petitionId, KickVote vote) { - if (IsRunning() && byWhom.playerData) { + if (IsRunning() && byWhom->GetPlayerData()) { // Check whether this is the valid petition id. if (m_voteKickData && m_voteKickData->petitionId == petitionId) { // Check whether the player already voted. - unsigned playerId = byWhom.playerData->GetUniqueId(); + unsigned playerId = byWhom->GetPlayerData()->GetUniqueId(); if (find(m_voteKickData->votedPlayerIds.begin(), m_voteKickData->votedPlayerIds.end(), playerId) == m_voteKickData->votedPlayerIds.end()) { m_voteKickData->votedPlayerIds.push_back(playerId); if (vote == KICK_VOTE_IN_FAVOUR) @@ -499,7 +499,7 @@ ServerGame::InternalVoteKick(SessionWrapper byWhom, unsigned petitionId, KickVot } void -ServerGame::InternalDenyVoteKick(SessionWrapper byWhom, unsigned petitionId, DenyVoteReason reason) +ServerGame::InternalDenyVoteKick(boost::shared_ptr byWhom, unsigned petitionId, DenyVoteReason reason) { boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); packet->GetMsg()->present = PokerTHMessage_PR_voteKickReplyMessage; @@ -510,7 +510,7 @@ ServerGame::InternalDenyVoteKick(SessionWrapper byWhom, unsigned petitionId, Den VoteKickDenied_t *kickDenied = &netVoteReply->voteKickReplyType.choice.voteKickDenied; kickDenied->voteKickDeniedReason = reason; - GetLobbyThread().GetSender().Send(byWhom.sessionData, packet); + GetLobbyThread().GetSender().Send(byWhom, packet); } PlayerDataList @@ -527,10 +527,9 @@ boost::shared_ptr ServerGame::GetPlayerDataByUniqueId(unsigned playerId) const { boost::shared_ptr tmpPlayer; - SessionWrapper session = GetSessionManager().GetSessionByUniquePlayerId(playerId); - if (session.playerData.get()) { - tmpPlayer = session.playerData; - } else { + boost::shared_ptr session = GetSessionManager().GetSessionByUniquePlayerId(playerId); + tmpPlayer = session->GetPlayerData(); + if (!tmpPlayer) { boost::mutex::scoped_lock lock(m_computerPlayerListMutex); PlayerDataList::const_iterator i = m_computerPlayerList.begin(); PlayerDataList::const_iterator end = m_computerPlayerList.end(); @@ -694,13 +693,13 @@ ServerGame::ResetComputerPlayerList() } void -ServerGame::GracefulRemoveSession(SessionWrapper session, int reason) +ServerGame::GracefulRemoveSession(boost::shared_ptr session, int reason) { - if (!session.sessionData) + if (!session) throw ServerException(__FILE__, __LINE__, ERR_NET_INVALID_SESSION, 0); - if (GetSessionManager().RemoveSession(session.sessionData->GetId())) { - boost::shared_ptr tmpPlayerData = session.playerData; + if (GetSessionManager().RemoveSession(session->GetId())) { + boost::shared_ptr tmpPlayerData = session->GetPlayerData(); if (tmpPlayerData && !tmpPlayerData->GetName().empty()) { RemovePlayerData(tmpPlayerData, reason); } @@ -763,27 +762,27 @@ ServerGame::RemovePlayerData(boost::shared_ptr player, int reason) } void -ServerGame::ErrorRemoveSession(SessionWrapper session) +ServerGame::ErrorRemoveSession(boost::shared_ptr session) { GetLobbyThread().RemoveSessionFromGame(session); GracefulRemoveSession(session, NTF_NET_INTERNAL); } void -ServerGame::SessionError(SessionWrapper session, int errorCode) +ServerGame::SessionError(boost::shared_ptr session, int errorCode) { - if (!session.sessionData.get()) + if (!session) throw ServerException(__FILE__, __LINE__, ERR_NET_INVALID_SESSION, 0); ErrorRemoveSession(session); GetLobbyThread().SessionError(session, errorCode); } void -ServerGame::MoveSessionToLobby(SessionWrapper session, int reason) +ServerGame::MoveSessionToLobby(boost::shared_ptr session, int reason) { GracefulRemoveSession(session, reason); // Reset ready flag - just in case it is set, player may leave at any time. - session.sessionData->ResetReadyFlag(); + session->ResetReadyFlag(); GetLobbyThread().ReAddSession(session, reason); } diff --git a/src/net/common/servergamestate.cpp b/src/net/common/servergamestate.cpp index 0b2aafb8..e6825f0d 100644 --- a/src/net/common/servergamestate.cpp +++ b/src/net/common/servergamestate.cpp @@ -221,10 +221,10 @@ AbstractServerGameStateReceiving::~AbstractServerGameStateReceiving() } void -AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet) +AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr server, boost::shared_ptr session, boost::shared_ptr packet) { if (packet->IsClientActivity()) - session.sessionData->ResetActivityTimer(); + session->ResetActivityTimer(); if (packet->GetMsg()->present == PokerTHMessage_PR_playerInfoRequestMessage) { // Delegate to Lobby. server->GetLobbyThread().HandleGameRetrievePlayerInfo(session, packet->GetMsg()->choice.playerInfoRequestMessage); @@ -237,27 +237,25 @@ AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr se // Only admins are allowed to kick, and only in the lobby. // After leaving the lobby, a vote needs to be initiated to kick. KickPlayerRequestMessage_t *netKickRequest = &packet->GetMsg()->choice.kickPlayerRequestMessage; - if (session.playerData->IsGameAdmin() && !server->IsRunning() + if (session->GetPlayerData()->IsGameAdmin() && !server->IsRunning() && netKickRequest->gameId == server->GetId() && server->GetGameData().gameType != GAME_TYPE_RANKING) { server->InternalKickPlayer(netKickRequest->playerId); } } else if (packet->GetMsg()->present == PokerTHMessage_PR_askKickPlayerMessage) { - if (session.playerData && server->GetGameData().gameType != GAME_TYPE_RANKING) { + if (server->GetGameData().gameType != GAME_TYPE_RANKING) { AskKickPlayerMessage_t *netAskKick = &packet->GetMsg()->choice.askKickPlayerMessage; server->InternalAskVoteKick(session, netAskKick->playerId, SERVER_VOTE_KICK_TIMEOUT_SEC); } } else if (packet->GetMsg()->present == PokerTHMessage_PR_voteKickRequestMessage) { - if (session.playerData) { - VoteKickRequestMessage_t *netVoteKick = &packet->GetMsg()->choice.voteKickRequestMessage; - server->InternalVoteKick(session, netVoteKick->petitionId, netVoteKick->voteKick ? KICK_VOTE_IN_FAVOUR : KICK_VOTE_AGAINST); - } + VoteKickRequestMessage_t *netVoteKick = &packet->GetMsg()->choice.voteKickRequestMessage; + server->InternalVoteKick(session, netVoteKick->petitionId, netVoteKick->voteKick ? KICK_VOTE_IN_FAVOUR : KICK_VOTE_AGAINST); } // Chat text is always allowed. else if (packet->GetMsg()->present == PokerTHMessage_PR_chatRequestMessage) { bool chatSent = false; ChatRequestMessage_t *netChatRequest = &packet->GetMsg()->choice.chatRequestMessage; // Only forward if this player is known and not a guest. - if (session.playerData && session.playerData->GetRights() != PLAYER_RIGHTS_GUEST) { + if (session->GetPlayerData()->GetRights() != PLAYER_RIGHTS_GUEST) { // Forward chat text to all players. // TODO: Some limitation needed. if (netChatRequest->chatRequestType.present == chatRequestType_PR_chatRequestTypeLobby @@ -273,7 +271,7 @@ AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr se netChat->chatType.present = chatType_PR_chatTypeGame; ChatTypeGame_t *netGameChat = &netChat->chatType.choice.chatTypeGame; netGameChat->gameId = server->GetId(); - netGameChat->playerId = session.playerData->GetUniqueId(); + netGameChat->playerId = session->GetPlayerData()->GetUniqueId(); OCTET_STRING_fromBuf( &netChat->chatText, (char *)netChatRequest->chatText.buf, @@ -286,8 +284,8 @@ AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr se //{ server->GetLobbyThread().GetChatCleaner().HandleGameChatText( server->GetId(), - session.playerData->GetUniqueId(), - session.playerData->GetName(), + session->GetPlayerData()->GetUniqueId(), + session->GetPlayerData()->GetName(), string((char *)netChatRequest->chatText.buf, netChatRequest->chatText.size)); //} } @@ -301,15 +299,15 @@ AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr se &netReject->chatText, (char *)netChatRequest->chatText.buf, netChatRequest->chatText.size); - server->GetLobbyThread().GetSender().Send(session.sessionData, packet); + server->GetLobbyThread().GetSender().Send(session, packet); } } else if (packet->GetMsg()->present == PokerTHMessage_PR_subscriptionRequestMessage) { SubscriptionRequestMessage_t *netSubscription = &packet->GetMsg()->choice.subscriptionRequestMessage; if (netSubscription->subscriptionAction == subscriptionAction_resubscribeGameList) { - if (!session.sessionData->WantsLobbyMsg()) + if (!session->WantsLobbyMsg()) server->GetLobbyThread().ResubscribeLobbyMsg(session); } else - session.sessionData->ResetWantsLobbyMsg(); + session->ResetWantsLobbyMsg(); } else if (packet->GetMsg()->present == PokerTHMessage_PR_reportAvatarMessage) { ReportAvatarMessage_t *netReport = &packet->GetMsg()->choice.reportAvatarMessage; boost::shared_ptr tmpPlayer = server->GetPlayerDataByUniqueId(netReport->reportedPlayerId); @@ -320,7 +318,7 @@ AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr se // Temporarily note that this avatar was reported. // This prevents spamming of the avatar report. server->AddReportedAvatar(tmpPlayer->GetUniqueId()); - DB_id myDBid = session.playerData->GetDBId(); + DB_id myDBid = session->GetPlayerData()->GetDBId(); // Do not use the "game" database object, but the global one. // The entry should be created even if we are not running a // ranking game. @@ -331,7 +329,7 @@ AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr se tmpAvatarType.erase(0, 1); // Only store extension without the "." server->GetLobbyThread().GetDatabase()->AsyncReportAvatar( - session.playerData->GetUniqueId(), + session->GetPlayerData()->GetUniqueId(), tmpPlayer->GetUniqueId(), tmpPlayer->GetDBId(), tmpPlayer->GetAvatarMD5().ToString(), @@ -344,7 +342,7 @@ AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr se ReportAvatarAckMessage_t *netReportAck = &packet->GetMsg()->choice.reportAvatarAckMessage; netReportAck->reportedPlayerId = netReport->reportedPlayerId; netReportAck->reportResult = reportResult_avatarReportDuplicate; - server->GetLobbyThread().GetSender().Send(session.sessionData, packet); + server->GetLobbyThread().GetSender().Send(session, packet); } } else { boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); @@ -352,7 +350,7 @@ AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr se ReportAvatarAckMessage_t *netReportAck = &packet->GetMsg()->choice.reportAvatarAckMessage; netReportAck->reportedPlayerId = netReport->reportedPlayerId; netReportAck->reportResult = reportResult_avatarReportInvalid; - server->GetLobbyThread().GetSender().Send(session.sessionData, packet); + server->GetLobbyThread().GetSender().Send(session, packet); } } else { // Packet processing in subclass. @@ -405,15 +403,15 @@ ServerGameStateInit::NotifySessionRemoved(boost::shared_ptr server) } void -ServerGameStateInit::HandleNewSession(boost::shared_ptr server, SessionWrapper session) +ServerGameStateInit::HandleNewSession(boost::shared_ptr server, boost::shared_ptr session) { - if (session.sessionData && session.playerData) { + if (session && session->GetPlayerData()) { const GameData &tmpGameData = server->GetGameData(); // Check the number of players. if (server->GetCurNumberOfPlayers() >= (size_t)tmpGameData.maxNumberOfPlayers) { server->MoveSessionToLobby(session, NTF_NET_REMOVED_GAME_FULL); } else { - session.playerData->SetGameAdmin(session.playerData->GetUniqueId() == server->GetAdminPlayerId()); + session->GetPlayerData()->SetGameAdmin(session->GetPlayerData()->GetUniqueId() == server->GetAdminPlayerId()); // Send ack to client. boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); @@ -422,32 +420,32 @@ ServerGameStateInit::HandleNewSession(boost::shared_ptr server, Sess netJoinReply->gameId = server->GetId(); netJoinReply->joinGameResult.present = joinGameResult_PR_joinGameAck; JoinGameAck_t *joinAck = &netJoinReply->joinGameResult.choice.joinGameAck; - joinAck->areYouGameAdmin = static_cast(session.playerData->IsGameAdmin()); + joinAck->areYouGameAdmin = static_cast(session->GetPlayerData()->IsGameAdmin()); NetPacket::SetGameData(server->GetGameData(), &joinAck->gameInfo); OCTET_STRING_fromBuf( &joinAck->gameInfo.gameName, server->GetName().c_str(), server->GetName().length()); - server->GetLobbyThread().GetSender().Send(session.sessionData, packet); + server->GetLobbyThread().GetSender().Send(session, packet); // Send notifications for connected players to client. PlayerDataList tmpPlayerList = server->GetFullPlayerDataList(); PlayerDataList::iterator player_i = tmpPlayerList.begin(); PlayerDataList::iterator player_end = tmpPlayerList.end(); while (player_i != player_end) { - server->GetLobbyThread().GetSender().Send(session.sessionData, CreateNetPacketPlayerJoined(server->GetId(), *(*player_i))); + server->GetLobbyThread().GetSender().Send(session, CreateNetPacketPlayerJoined(server->GetId(), *(*player_i))); ++player_i; } // Send "Player Joined" to other fully connected clients. - server->SendToAllPlayers(CreateNetPacketPlayerJoined(server->GetId(), *session.playerData), SessionData::Game); + server->SendToAllPlayers(CreateNetPacketPlayerJoined(server->GetId(), *session->GetPlayerData()), SessionData::Game); // Accept session. server->GetSessionManager().AddSession(session); // Notify lobby. - server->GetLobbyThread().NotifyPlayerJoinedGame(server->GetId(), session.playerData->GetUniqueId()); + server->GetLobbyThread().NotifyPlayerJoinedGame(server->GetId(), session->GetPlayerData()->GetUniqueId()); if (server->GetCurNumberOfPlayers() == (size_t)tmpGameData.maxNumberOfPlayers) { // Automatically start the game if it is full. @@ -508,15 +506,15 @@ ServerGameStateInit::TimerAdminWarning(const boost::system::error_code &ec, boos { if (!ec && &server->GetState() == this) { // Find game admin. - SessionWrapper session = server->GetSessionManager().GetSessionByUniquePlayerId(server->GetAdminPlayerId()); - if (session.sessionData.get()) { + boost::shared_ptr session = server->GetSessionManager().GetSessionByUniquePlayerId(server->GetAdminPlayerId()); + if (session) { // Send him a warning. boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); packet->GetMsg()->present = PokerTHMessage_PR_timeoutWarningMessage; TimeoutWarningMessage_t *netWarning = &packet->GetMsg()->choice.timeoutWarningMessage; netWarning->timeoutReason = NETWORK_TIMEOUT_GAME_ADMIN_IDLE; netWarning->remainingSeconds = SERVER_GAME_ADMIN_WARNING_REMAINING_SEC; - server->GetLobbyThread().GetSender().Send(session.sessionData, packet); + server->GetLobbyThread().GetSender().Send(session, packet); } // Start timeout timer. server->GetStateTimer1().expires_from_now( @@ -532,8 +530,8 @@ ServerGameStateInit::TimerAdminTimeout(const boost::system::error_code &ec, boos { if (!ec && &server->GetState() == this) { // Find game admin. - SessionWrapper session = server->GetSessionManager().GetSessionByUniquePlayerId(server->GetAdminPlayerId()); - if (session.sessionData.get()) { + boost::shared_ptr session = server->GetSessionManager().GetSessionByUniquePlayerId(server->GetAdminPlayerId()); + if (session) { // Remove him from the game. server->MoveSessionToLobby(session, NTF_NET_REMOVED_TIMEOUT); } @@ -576,12 +574,12 @@ ServerGameStateInit::SendStartEvent(ServerGame &server, bool fillWithComputerPla } void -ServerGameStateInit::InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet) +ServerGameStateInit::InternalProcessPacket(boost::shared_ptr server, boost::shared_ptr session, boost::shared_ptr packet) { if (packet->GetMsg()->present == PokerTHMessage_PR_startEventMessage) { StartEventMessage_t *netStartEvent = &packet->GetMsg()->choice.startEventMessage; // Only admins are allowed to start the game. - if (session.playerData->IsGameAdmin() + if (session->GetPlayerData()->IsGameAdmin() && netStartEvent->gameId == server->GetId() && (server->GetGameData().gameType != GAME_TYPE_RANKING // ranking games need to be full || server->GetGameData().maxNumberOfPlayers == (int)server->GetCurNumberOfPlayers())) { @@ -598,7 +596,7 @@ ServerGameStateInit::InternalProcessPacket(boost::shared_ptr server, packet->GetMsg()->present = PokerTHMessage_PR_inviteNotifyMessage; InviteNotifyMessage_t *netInvNotif = &packet->GetMsg()->choice.inviteNotifyMessage; netInvNotif->gameId = netInvite->gameId; - netInvNotif->playerIdByWhom = session.playerData->GetUniqueId(); + netInvNotif->playerIdByWhom = session->GetPlayerData()->GetUniqueId(); netInvNotif->playerIdWho = netInvite->playerId; bool requestSent = server->GetLobbyThread().SendToLobbyPlayer(netInvite->playerId, packet); @@ -619,7 +617,7 @@ ServerGameStateInit::InternalProcessPacket(boost::shared_ptr server, } } } else if (packet->GetMsg()->present == PokerTHMessage_PR_resetTimeoutMessage) { - if (session.playerData->IsGameAdmin()) { + if (session->GetPlayerData()->IsGameAdmin()) { RegisterAdminTimer(server); } } else { @@ -676,17 +674,17 @@ ServerGameStateStartGame::Exit(boost::shared_ptr server) } void -ServerGameStateStartGame::HandleNewSession(boost::shared_ptr server, SessionWrapper session) +ServerGameStateStartGame::HandleNewSession(boost::shared_ptr server, boost::shared_ptr session) { // Do not accept new sessions in this state. server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING); } void -ServerGameStateStartGame::InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet) +ServerGameStateStartGame::InternalProcessPacket(boost::shared_ptr server, boost::shared_ptr session, boost::shared_ptr packet) { if (packet->GetMsg()->present == PokerTHMessage_PR_startEventAckMessage) { - session.sessionData->SetReadyFlag(); + session->SetReadyFlag(); if (server->GetSessionManager().CountReadySessions() == server->GetSessionManager().GetRawSessionCount()) { // Everyone is ready. server->GetSessionManager().ResetAllReadyFlags(); @@ -714,8 +712,8 @@ ServerGameStateStartGame::DoStart(boost::shared_ptr server) if (tmpPlayerList.size() <= 1) { if (!tmpPlayerList.empty()) { boost::shared_ptr tmpPlayer(tmpPlayerList.front()); - SessionWrapper tmpSession = server->GetSessionManager().GetSessionByUniquePlayerId(tmpPlayer->GetUniqueId()); - if (tmpSession.sessionData) + boost::shared_ptr tmpSession = server->GetSessionManager().GetSessionByUniquePlayerId(tmpPlayer->GetUniqueId()); + if (tmpSession) server->MoveSessionToLobby(tmpSession, NTF_NET_REMOVED_START_FAILED); } } else { @@ -780,14 +778,14 @@ ServerGameStateHand::Exit(boost::shared_ptr server) } void -ServerGameStateHand::HandleNewSession(boost::shared_ptr server, SessionWrapper session) +ServerGameStateHand::HandleNewSession(boost::shared_ptr server, boost::shared_ptr session) { // Do not accept new sessions in this state. server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING); } void -ServerGameStateHand::InternalProcessPacket(boost::shared_ptr /*server*/, SessionWrapper /*session*/, boost::shared_ptr /*packet*/) +ServerGameStateHand::InternalProcessPacket(boost::shared_ptr /*server*/, boost::shared_ptr /*session*/, boost::shared_ptr /*packet*/) { // TODO: maybe reject packet. } @@ -1088,8 +1086,8 @@ ServerGameStateHand::StartNewHand(boost::shared_ptr server) while (i != end) { // also send to inactive players, but not to disconnected players. boost::shared_ptr tmpPlayer = *i; - SessionWrapper tmpSession = server->GetSessionManager().GetSessionByUniquePlayerId(tmpPlayer->getMyUniqueID()); - if (tmpPlayer->isConnected() && tmpSession.sessionData) { + boost::shared_ptr tmpSession = server->GetSessionManager().GetSessionByUniquePlayerId(tmpPlayer->getMyUniqueID()); + if (tmpPlayer->isConnected() && tmpSession) { int cards[2]; bool errorFlag = false; tmpPlayer->getMyCards(cards); @@ -1098,7 +1096,7 @@ ServerGameStateHand::StartNewHand(boost::shared_ptr server) notifyCards->GetMsg()->present = PokerTHMessage_PR_handStartMessage; HandStartMessage_t *netHandStart = ¬ifyCards->GetMsg()->choice.handStartMessage; netHandStart->gameId = server->GetId(); - string tmpPassword(tmpSession.sessionData->AuthGetPassword()); + string tmpPassword(tmpSession->AuthGetPassword()); if (tmpPassword.empty()) { // encrypt only if password is present netHandStart->yourCards.present = yourCards_PR_plainCards; PlainCards_t *plainCards = &netHandStart->yourCards.choice.plainCards; @@ -1131,7 +1129,7 @@ ServerGameStateHand::StartNewHand(boost::shared_ptr server) } if (!errorFlag) { netHandStart->smallBlind = curGame.getCurrentHand()->getSmallBlind(); - server->GetLobbyThread().GetSender().Send(tmpSession.sessionData, notifyCards); + server->GetLobbyThread().GetSender().Send(tmpSession, notifyCards); } } ++i; @@ -1230,22 +1228,22 @@ ServerGameStateWaitPlayerAction::Exit(boost::shared_ptr server) } void -ServerGameStateWaitPlayerAction::HandleNewSession(boost::shared_ptr server, SessionWrapper session) +ServerGameStateWaitPlayerAction::HandleNewSession(boost::shared_ptr server, boost::shared_ptr session) { // Do not accept new sessions in this state. server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING); } void -ServerGameStateWaitPlayerAction::InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet) +ServerGameStateWaitPlayerAction::InternalProcessPacket(boost::shared_ptr server, boost::shared_ptr session, boost::shared_ptr packet) { if (packet->GetMsg()->present == PokerTHMessage_PR_myActionRequestMessage) { MyActionRequestMessage_t *netMyAction = &packet->GetMsg()->choice.myActionRequestMessage; // TODO consider game id. Game &curGame = server->GetGame(); - boost::shared_ptr tmpPlayer = curGame.getPlayerByUniqueId(session.playerData->GetUniqueId()); - if (!tmpPlayer.get()) + boost::shared_ptr tmpPlayer = curGame.getPlayerByUniqueId(session->GetPlayerData()->GetUniqueId()); + if (!tmpPlayer) throw ServerException(__FILE__, __LINE__, ERR_NET_UNKNOWN_PLAYER_ID, 0); // Check whether this is the correct round. @@ -1294,7 +1292,7 @@ ServerGameStateWaitPlayerAction::InternalProcessPacket(boost::shared_ptryourAction = netMyAction->myAction; netActionRejected->yourRelativeBet = netMyAction->myRelativeBet; netActionRejected->rejectionReason = code; - server->GetLobbyThread().GetSender().Send(session.sessionData, reject); + server->GetLobbyThread().GetSender().Send(session, reject); } } } @@ -1309,8 +1307,8 @@ ServerGameStateWaitPlayerAction::TimerTimeout(const boost::system::error_code &e boost::shared_ptr curPlayer = curGame.getCurrentPlayer(); if (!curPlayer) throw ServerException(__FILE__, __LINE__, ERR_NET_NO_CURRENT_PLAYER, 0); - SessionWrapper tmpSession = server->GetSessionManager().GetSessionByUniquePlayerId(curPlayer->getMyUniqueID()); - if (!tmpSession.sessionData) + boost::shared_ptr tmpSession = server->GetSessionManager().GetSessionByUniquePlayerId(curPlayer->getMyUniqueID()); + if (!tmpSession) throw ServerException(__FILE__, __LINE__, ERR_NET_NO_CURRENT_PLAYER, 0); // Player did not act fast enough. Act for him. @@ -1328,7 +1326,7 @@ ServerGameStateWaitPlayerAction::TimerTimeout(const boost::system::error_code &e warning->GetMsg()->present = PokerTHMessage_PR_afkWarningMessage; AfkWarningMessage_t *netWarning = &warning->GetMsg()->choice.afkWarningMessage; netWarning->remainingTimeouts = SERVER_KICK_ACTION_TIMEOUT_REMAINING; - server->GetLobbyThread().GetSender().Send(tmpSession.sessionData, warning); + server->GetLobbyThread().GetSender().Send(tmpSession, warning); } else if (curPlayer->getActionTimeoutCounter() > SERVER_WARNING_ACTION_TIMEOUT_THRESHOLD + SERVER_KICK_ACTION_TIMEOUT_REMAINING) { server->InternalKickPlayer(curPlayer->getMyUniqueID()); } @@ -1384,14 +1382,14 @@ ServerGameStateWaitNextHand::Exit(boost::shared_ptr server) } void -ServerGameStateWaitNextHand::HandleNewSession(boost::shared_ptr server, SessionWrapper session) +ServerGameStateWaitNextHand::HandleNewSession(boost::shared_ptr server, boost::shared_ptr session) { // Do not accept new sessions in this state. server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING); } void -ServerGameStateWaitNextHand::InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet) +ServerGameStateWaitNextHand::InternalProcessPacket(boost::shared_ptr server, boost::shared_ptr session, boost::shared_ptr packet) { if (packet->GetMsg()->present == PokerTHMessage_PR_showMyCardsRequestMessage) { Game &curGame = server->GetGame(); @@ -1399,7 +1397,7 @@ ServerGameStateWaitNextHand::InternalProcessPacket(boost::shared_ptr show->GetMsg()->present = PokerTHMessage_PR_afterHandShowCardsMessage; AfterHandShowCardsMessage_t *netShowCards = &show->GetMsg()->choice.afterHandShowCardsMessage; - boost::shared_ptr tmpPlayer(curGame.getPlayerByUniqueId(session.playerData->GetUniqueId())); + boost::shared_ptr tmpPlayer(curGame.getPlayerByUniqueId(session->GetPlayerData()->GetUniqueId())); if (tmpPlayer) { SetPlayerResult(netShowCards->playerResult, tmpPlayer); server->SendToAllPlayers(show, SessionData::Game); diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index ff9d6062..55bdeff7 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -285,23 +285,23 @@ ServerLobbyThread::AddConnection(boost::shared_ptr sock) if (!hasClientIp) { // We do not accept sessions if we cannot // retrieve the client address. - SessionError(SessionWrapper(sessionData, boost::shared_ptr()), ERR_NET_INVALID_SESSION); + SessionError(sessionData, ERR_NET_INVALID_SESSION); } } else { // Server is full. // Gracefully close this session. - SessionError(SessionWrapper(sessionData, boost::shared_ptr()), ERR_NET_SERVER_FULL); + SessionError(sessionData, ERR_NET_SERVER_FULL); } } void -ServerLobbyThread::ReAddSession(SessionWrapper session, int reason) +ServerLobbyThread::ReAddSession(boost::shared_ptr session, int reason) { - if (session.sessionData.get() && session.playerData.get()) { + if (session && session->GetPlayerData()) { boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); packet->GetMsg()->present = PokerTHMessage_PR_gamePlayerMessage; GamePlayerMessage_t *netPlayerMsg = &packet->GetMsg()->choice.gamePlayerMessage; - netPlayerMsg->gameId = session.sessionData->GetGameId(); + netPlayerMsg->gameId = session->GetGameId(); netPlayerMsg->gamePlayerNotification.present = gamePlayerNotification_PR_removedFromGame; RemovedFromGame_t *removed = &netPlayerMsg->gamePlayerNotification.choice.removedFromGame; @@ -325,32 +325,32 @@ ServerLobbyThread::ReAddSession(SessionWrapper session, int reason) removed->removedFromGameReason = removedFromGameReason_removedOnRequest; break; } - GetSender().Send(session.sessionData, packet); + GetSender().Send(session, packet); HandleReAddedSession(session); } } void -ServerLobbyThread::MoveSessionToGame(ServerGame &game, SessionWrapper session, bool autoLeave) +ServerLobbyThread::MoveSessionToGame(ServerGame &game, boost::shared_ptr session, bool autoLeave) { // Remove session from the lobby. - m_sessionManager.RemoveSession(session.sessionData->GetId()); + m_sessionManager.RemoveSession(session->GetId()); // Session is now in game state. - session.sessionData->SetState(SessionData::Game); + session->SetState(SessionData::Game); // Store it in the list of game sessions. m_gameSessionManager.AddSession(session); // Set the game id of the session. - session.sessionData->SetGameId(game.GetId()); + session->SetGameId(game.GetId()); // Add session to the game. game.AddSession(session); // Optionally enable auto leave after game finish. if (autoLeave) - game.SetPlayerAutoLeaveOnFinish(session.playerData->GetUniqueId()); + game.SetPlayerAutoLeaveOnFinish(session->GetPlayerData()->GetUniqueId()); } void -ServerLobbyThread::RemoveSessionFromGame(SessionWrapper session) +ServerLobbyThread::RemoveSessionFromGame(boost::shared_ptr session) { // Just remove the session. Only for fatal errors. CloseSession(session); @@ -359,11 +359,11 @@ ServerLobbyThread::RemoveSessionFromGame(SessionWrapper session) void ServerLobbyThread::CloseSession(SessionId sessionId) { - SessionWrapper session = m_sessionManager.GetSessionById(sessionId); - if (!session.sessionData) + boost::shared_ptr session = m_sessionManager.GetSessionById(sessionId); + if (!session) session = m_gameSessionManager.GetSessionById(sessionId); - if (session.sessionData) { - GameMap::iterator pos = m_gameMap.find(session.sessionData->GetGameId()); + if (session) { + GameMap::iterator pos = m_gameMap.find(session->GetGameId()); if (pos != m_gameMap.end()) { pos->second->ErrorRemoveSession(session); } else { @@ -373,25 +373,25 @@ ServerLobbyThread::CloseSession(SessionId sessionId) } void -ServerLobbyThread::CloseSession(SessionWrapper session) +ServerLobbyThread::CloseSession(boost::shared_ptr session) { - if (session.sessionData && session.sessionData->GetState() != SessionData::Closed) { // Make this call reentrant. - LOG_VERBOSE("Closing session #" << session.sessionData->GetId() << "."); - session.sessionData->SetState(SessionData::Closed); + if (session && session->GetState() != SessionData::Closed) { // Make this call reentrant. + LOG_VERBOSE("Closing session #" << session->GetId() << "."); + session->SetState(SessionData::Closed); - m_sessionManager.RemoveSession(session.sessionData->GetId()); - m_gameSessionManager.RemoveSession(session.sessionData->GetId()); + m_sessionManager.RemoveSession(session->GetId()); + m_gameSessionManager.RemoveSession(session->GetId()); - if (session.playerData) - NotifyPlayerLeftLobby(session.playerData->GetUniqueId()); + if (session->GetPlayerData()) + NotifyPlayerLeftLobby(session->GetPlayerData()->GetUniqueId()); // Update stats (if needed). UpdateStatisticsNumberOfPlayers(); - session.sessionData->SetGameId(0); + session->SetGameId(0); } } void -ServerLobbyThread::ResubscribeLobbyMsg(SessionWrapper session) +ServerLobbyThread::ResubscribeLobbyMsg(boost::shared_ptr session) { InternalResubscribeMsg(session); } @@ -480,21 +480,21 @@ ServerLobbyThread::NotifyReopeningGame(unsigned gameId) } void -ServerLobbyThread::HandleGameRetrievePlayerInfo(SessionWrapper session, const PlayerInfoRequestMessage_t &playerInfoRequest) +ServerLobbyThread::HandleGameRetrievePlayerInfo(boost::shared_ptr session, const PlayerInfoRequestMessage_t &playerInfoRequest) { // Someone within a game requested player info. HandleNetPacketRetrievePlayerInfo(session, playerInfoRequest); } void -ServerLobbyThread::HandleGameRetrieveAvatar(SessionWrapper session, const AvatarRequestMessage_t &retrieveAvatar) +ServerLobbyThread::HandleGameRetrieveAvatar(boost::shared_ptr session, const AvatarRequestMessage_t &retrieveAvatar) { // Someone within a game requested an avatar. HandleNetPacketRetrieveAvatar(session, retrieveAvatar); } void -ServerLobbyThread::HandleChatRequest(SessionWrapper session, const ChatRequestMessage_t &chatRequest) +ServerLobbyThread::HandleChatRequest(boost::shared_ptr session, const ChatRequestMessage_t &chatRequest) { // Someone within a game sent a lobby message. HandleNetPacketChatRequest(session, chatRequest); @@ -504,12 +504,12 @@ bool ServerLobbyThread::KickPlayerByName(const std::string &playerName) { bool retVal = false; - SessionWrapper session = m_sessionManager.GetSessionByPlayerName(playerName); - if (!session.sessionData.get()) + boost::shared_ptr session = m_sessionManager.GetSessionByPlayerName(playerName); + if (!session) session = m_gameSessionManager.GetSessionByPlayerName(playerName); - if (session.sessionData.get() && session.playerData.get()) { - RemovePlayer(session.playerData->GetUniqueId(), ERR_NET_PLAYER_KICKED); + if (session && session->GetPlayerData()) { + RemovePlayer(session->GetPlayerData()->GetUniqueId(), ERR_NET_PLAYER_KICKED); retVal = true; } @@ -520,12 +520,12 @@ string ServerLobbyThread::GetPlayerIPAddress(const std::string &playerName) const { string ipAddress; - SessionWrapper session = m_sessionManager.GetSessionByPlayerName(playerName); - if (!session.sessionData) + boost::shared_ptr session = m_sessionManager.GetSessionByPlayerName(playerName); + if (!session) session = m_gameSessionManager.GetSessionByPlayerName(playerName); - if (session.sessionData && session.playerData) - ipAddress = session.sessionData->GetClientAddr(); + if (session) + ipAddress = session->GetClientAddr(); return ipAddress; } @@ -534,12 +534,12 @@ std::string ServerLobbyThread::GetPlayerNameFromId(unsigned playerId) const { string name; - SessionWrapper session = m_sessionManager.GetSessionByUniquePlayerId(playerId); - if (!session.sessionData) + boost::shared_ptr session = m_sessionManager.GetSessionByUniquePlayerId(playerId); + if (!session) session = m_gameSessionManager.GetSessionByUniquePlayerId(playerId); - if (session.sessionData && session.playerData) - name = session.playerData->GetName(); + if (session && session->GetPlayerData()) + name = session->GetPlayerData()->GetName(); return name; } @@ -645,9 +645,9 @@ bool ServerLobbyThread::SendToLobbyPlayer(unsigned playerId, boost::shared_ptr packet) { bool retVal = false; - SessionWrapper tmpSession = m_sessionManager.GetSessionByUniquePlayerId(playerId); - if (tmpSession.sessionData) { - GetSender().Send(tmpSession.sessionData, packet); + boost::shared_ptr tmpSession = m_sessionManager.GetSessionByUniquePlayerId(playerId); + if (tmpSession) { + GetSender().Send(tmpSession, packet); retVal = true; } return retVal; @@ -853,15 +853,11 @@ ServerLobbyThread::InitChatCleaner() } void -ServerLobbyThread::DispatchPacket(boost::shared_ptr s, boost::shared_ptr packet) +ServerLobbyThread::DispatchPacket(boost::shared_ptr session, boost::shared_ptr packet) { - // Find the session. - SessionWrapper session = m_sessionManager.GetSessionById(s->GetId()); - if (!session.sessionData) - session = m_gameSessionManager.GetSessionById(s->GetId()); - if (session.sessionData) { + if (session) { // Retrieve current game, if applicable. - boost::shared_ptr game = InternalGetGameFromId(session.sessionData->GetGameId()); + boost::shared_ptr game = InternalGetGameFromId(session->GetGameId()); if (game) { // We need to catch game-specific exceptions, so that they do not affect the server. try { @@ -876,13 +872,13 @@ ServerLobbyThread::DispatchPacket(boost::shared_ptr s, boost::share } void -ServerLobbyThread::HandlePacket(SessionWrapper session, boost::shared_ptr packet) +ServerLobbyThread::HandlePacket(boost::shared_ptr session, boost::shared_ptr packet) { - if (session.sessionData && packet) { + if (session && packet) { if (packet->IsClientActivity()) - session.sessionData->ResetActivityTimer(); + session->ResetActivityTimer(); - if (session.sessionData->GetState() == SessionData::Init) { + if (session->GetState() == SessionData::Init) { if (packet->GetMsg()->present == PokerTHMessage_PR_initMessage) HandleNetPacketInit(session, packet->GetMsg()->choice.initMessage); else if (packet->GetMsg()->present == PokerTHMessage_PR_authMessage) { @@ -901,7 +897,7 @@ ServerLobbyThread::HandlePacket(SessionWrapper session, boost::shared_ptrGetState() == SessionData::ReceivingAvatar) { + } else if (session->GetState() == SessionData::ReceivingAvatar) { if (packet->GetMsg()->present == PokerTHMessage_PR_avatarReplyMessage) { AvatarReplyMessage_t *avatarReply = &packet->GetMsg()->choice.avatarReplyMessage; if (avatarReply->avatarResult.present == avatarResult_PR_avatarData) @@ -924,7 +920,7 @@ ServerLobbyThread::HandlePacket(SessionWrapper session, boost::shared_ptrsubscriptionAction == subscriptionAction_resubscribeGameList) InternalResubscribeMsg(session); else - session.sessionData->ResetWantsLobbyMsg(); + session->ResetWantsLobbyMsg(); } else if (packet->GetMsg()->present == PokerTHMessage_PR_joinGameRequestMessage) { JoinGameRequestMessage_t *joinRequest = &packet->GetMsg()->choice.joinGameRequestMessage; string password; @@ -945,9 +941,9 @@ ServerLobbyThread::HandlePacket(SessionWrapper session, boost::shared_ptr session, const InitMessage_t &initMessage) { - LOG_VERBOSE("Received init for session #" << session.sessionData->GetId() << "."); + LOG_VERBOSE("Received init for session #" << session->GetId() << "."); // Before any other processing, perform some denial of service and // brute force attack prevention by checking whether the user recently sent an @@ -956,10 +952,10 @@ ServerLobbyThread::HandleNetPacketInit(SessionWrapper session, const InitMessage bool recentlySentInit = false; { boost::mutex::scoped_lock lock(m_timerClientAddressMapMutex); - if (m_timerClientAddressMap.find(session.sessionData->GetClientAddr()) != m_timerClientAddressMap.end()) + if (m_timerClientAddressMap.find(session->GetClientAddr()) != m_timerClientAddressMap.end()) recentlySentInit = true; else - m_timerClientAddressMap[session.sessionData->GetClientAddr()] = boost::timers::portable::microsec_timer(); + m_timerClientAddressMap[session->GetClientAddr()] = boost::timers::portable::microsec_timer(); } if (recentlySentInit) { SessionError(session, ERR_NET_INIT_BLOCKED); @@ -969,7 +965,7 @@ ServerLobbyThread::HandleNetPacketInit(SessionWrapper session, const InitMessage // Check the protocol version. if (initMessage.requestedVersion.major != NET_VERSION_MAJOR - || session.playerData) { // Has this session already sent an init? + || session->GetPlayerData()) { // Has this session already sent an init? SessionError(session, ERR_NET_VERSION_NOT_SUPPORTED); return; } @@ -1001,9 +997,9 @@ ServerLobbyThread::HandleNetPacketInit(SessionWrapper session, const InitMessage string inAuthData((const char *)authLogin->clientUserData.buf, authLogin->clientUserData.size); if (authLogin->avatar) memcpy(avatarMD5.GetData(), authLogin->avatar->buf, MD5_DATA_SIZE); - session.sessionData->CreateServerAuthSession(m_authContext); - if (session.sessionData->AuthStep(1, inAuthData)) - playerName = session.sessionData->AuthGetUser(); + session->CreateServerAuthSession(m_authContext); + if (session->AuthStep(1, inAuthData)) + playerName = session->AuthGetUser(); } #else else if (initMessage.login.present == login_PR_unauthenticatedLogin) { @@ -1042,7 +1038,7 @@ ServerLobbyThread::HandleNetPacketInit(SessionWrapper session, const InitMessage return; } // Check whether the peer IP address is banned. - if (GetBanManager().IsIPAddressBanned(session.sessionData->GetClientAddr())) { + if (GetBanManager().IsIPAddressBanned(session->GetClientAddr())) { SessionError(session, ERR_NET_PLAYER_BANNED); return; } @@ -1054,8 +1050,8 @@ ServerLobbyThread::HandleNetPacketInit(SessionWrapper session, const InitMessage tmpPlayerData->SetAvatarMD5(avatarMD5); // Set player data for session. - m_sessionManager.SetSessionPlayerData(session.sessionData->GetId(), tmpPlayerData); - session.playerData = tmpPlayerData; + m_sessionManager.SetSessionPlayerData(session->GetId(), tmpPlayerData); + session->SetPlayerData(tmpPlayerData); if (noAuth) InitAfterLogin(session); @@ -1064,12 +1060,12 @@ ServerLobbyThread::HandleNetPacketInit(SessionWrapper session, const InitMessage } void -ServerLobbyThread::HandleNetPacketAuthClientResponse(SessionWrapper session, const AuthClientResponse_t &clientResponse) +ServerLobbyThread::HandleNetPacketAuthClientResponse(boost::shared_ptr session, const AuthClientResponse_t &clientResponse) { - if (session.sessionData && session.playerData && session.sessionData->AuthGetCurStepNum() == 1) { + if (session && session->GetPlayerData() && session->AuthGetCurStepNum() == 1) { string authData = STL_STRING_FROM_OCTET_STRING(clientResponse.clientResponse); - if (session.sessionData->AuthStep(2, authData)) { - string outVerification(session.sessionData->AuthGetNextOutMsg()); + if (session->AuthStep(2, authData)) { + string outVerification(session->AuthGetNextOutMsg()); boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); packet->GetMsg()->present = PokerTHMessage_PR_authMessage; @@ -1080,7 +1076,7 @@ ServerLobbyThread::HandleNetPacketAuthClientResponse(SessionWrapper session, con &verification->serverVerification, (char *)outVerification.c_str(), outVerification.size()); - GetSender().Send(session.sessionData, packet); + GetSender().Send(session, packet); // The last message is only for server verification. // We are done now, the user has logged in. CheckAvatarBlacklist(session); @@ -1090,9 +1086,9 @@ ServerLobbyThread::HandleNetPacketAuthClientResponse(SessionWrapper session, con } void -ServerLobbyThread::HandleNetPacketAvatarHeader(SessionWrapper session, unsigned /*requestId*/, const AvatarHeader_t &avatarHeader) +ServerLobbyThread::HandleNetPacketAvatarHeader(boost::shared_ptr session, unsigned /*requestId*/, const AvatarHeader_t &avatarHeader) { - if (session.playerData) { + if (session->GetPlayerData()) { if (avatarHeader.avatarSize >= MIN_AVATAR_FILE_SIZE && avatarHeader.avatarSize <= MAX_AVATAR_FILE_SIZE) { boost::shared_ptr tmpAvatarFile(new AvatarFile); tmpAvatarFile->fileData.reserve(avatarHeader.avatarSize); @@ -1100,32 +1096,32 @@ ServerLobbyThread::HandleNetPacketAvatarHeader(SessionWrapper session, unsigned tmpAvatarFile->reportedSize = avatarHeader.avatarSize; // Ignore request id for now. - session.playerData->SetNetAvatarFile(tmpAvatarFile); + session->GetPlayerData()->SetNetAvatarFile(tmpAvatarFile); // Session is now receiving an avatar. - session.sessionData->SetState(SessionData::ReceivingAvatar); + session->SetState(SessionData::ReceivingAvatar); } else SessionError(session, ERR_NET_AVATAR_TOO_LARGE); } } void -ServerLobbyThread::HandleNetPacketUnknownAvatar(SessionWrapper session, unsigned /*requestId*/, const UnknownAvatar_t &/*unknownAvatar*/) +ServerLobbyThread::HandleNetPacketUnknownAvatar(boost::shared_ptr session, unsigned /*requestId*/, const UnknownAvatar_t &/*unknownAvatar*/) { - if (session.playerData.get()) { + if (session->GetPlayerData()) { // Free memory (just in case). - session.playerData->SetNetAvatarFile(boost::shared_ptr()); - session.playerData->SetAvatarMD5(MD5Buf()); + session->GetPlayerData()->SetNetAvatarFile(boost::shared_ptr()); + session->GetPlayerData()->SetAvatarMD5(MD5Buf()); // Start session. EstablishSession(session); } } void -ServerLobbyThread::HandleNetPacketAvatarFile(SessionWrapper session, unsigned /*requestId*/, const AvatarData_t &avatarData) +ServerLobbyThread::HandleNetPacketAvatarFile(boost::shared_ptr session, unsigned /*requestId*/, const AvatarData_t &avatarData) { - if (session.playerData.get()) { - boost::shared_ptr tmpAvatar = session.playerData->GetNetAvatarFile(); + if (session->GetPlayerData()) { + boost::shared_ptr tmpAvatar = session->GetPlayerData()->GetNetAvatarFile(); if (tmpAvatar.get() && tmpAvatar->fileData.size() + avatarData.avatarBlock.size <= tmpAvatar->reportedSize) { std::copy(&avatarData.avatarBlock.buf[0], &avatarData.avatarBlock.buf[avatarData.avatarBlock.size], back_inserter(tmpAvatar->fileData)); } @@ -1133,28 +1129,28 @@ ServerLobbyThread::HandleNetPacketAvatarFile(SessionWrapper session, unsigned /* } void -ServerLobbyThread::HandleNetPacketAvatarEnd(SessionWrapper session, unsigned /*requestId*/, const AvatarEnd_t &/*avatarEnd*/) +ServerLobbyThread::HandleNetPacketAvatarEnd(boost::shared_ptr session, unsigned /*requestId*/, const AvatarEnd_t &/*avatarEnd*/) { - if (session.playerData.get()) { - boost::shared_ptr tmpAvatar = session.playerData->GetNetAvatarFile(); - MD5Buf avatarMD5 = session.playerData->GetAvatarMD5(); + if (session->GetPlayerData()) { + boost::shared_ptr tmpAvatar = session->GetPlayerData()->GetNetAvatarFile(); + MD5Buf avatarMD5 = session->GetPlayerData()->GetAvatarMD5(); if (!avatarMD5.IsZero() && tmpAvatar.get()) { unsigned avatarSize = (unsigned)tmpAvatar->fileData.size(); if (avatarSize == tmpAvatar->reportedSize) { if (!GetAvatarManager().StoreAvatarInCache(avatarMD5, tmpAvatar->fileType, &tmpAvatar->fileData[0], avatarSize, true)) { - session.playerData->SetAvatarMD5(MD5Buf()); + session->GetPlayerData()->SetAvatarMD5(MD5Buf()); LOG_ERROR("Failed to store avatar in cache directory."); } // Free memory. - session.playerData->SetNetAvatarFile(boost::shared_ptr()); + session->GetPlayerData()->SetNetAvatarFile(boost::shared_ptr()); // Set avatar file name. string avatarFileName; if (GetAvatarManager().GetAvatarFileName(avatarMD5, avatarFileName)) - session.playerData->SetAvatarFile(avatarFileName); + session->GetPlayerData()->SetAvatarFile(avatarFileName); // Init finished - start session. EstablishSession(session); - LOG_MSG("Client \"" << session.sessionData->GetClientAddr() << "\" uploaded avatar \"" + LOG_MSG("Client \"" << session->GetClientAddr() << "\" uploaded avatar \"" << boost::filesystem::path(avatarFileName).file_string() << "\"."); } else SessionError(session, ERR_NET_WRONG_AVATAR_SIZE); @@ -1163,12 +1159,18 @@ ServerLobbyThread::HandleNetPacketAvatarEnd(SessionWrapper session, unsigned /*r } void -ServerLobbyThread::HandleNetPacketRetrievePlayerInfo(SessionWrapper session, const PlayerInfoRequestMessage_t &playerInfoRequest) +ServerLobbyThread::HandleNetPacketRetrievePlayerInfo(boost::shared_ptr session, const PlayerInfoRequestMessage_t &playerInfoRequest) { // Find player in lobby or in a game. - boost::shared_ptr tmpPlayer = m_sessionManager.GetSessionByUniquePlayerId(playerInfoRequest.playerId).playerData; - if (!tmpPlayer) - tmpPlayer = m_gameSessionManager.GetSessionByUniquePlayerId(playerInfoRequest.playerId).playerData; + boost::shared_ptr tmpSession = m_sessionManager.GetSessionByUniquePlayerId(playerInfoRequest.playerId); + if (!tmpSession) { + tmpSession = m_gameSessionManager.GetSessionByUniquePlayerId(playerInfoRequest.playerId); + } + boost::shared_ptr tmpPlayer; + if (tmpSession) { + tmpPlayer = tmpSession->GetPlayerData(); + } + if (!tmpPlayer) { boost::mutex::scoped_lock lock(m_computerPlayersMutex); PlayerDataMap::const_iterator pos = m_computerPlayers.find(playerInfoRequest.playerId); @@ -1210,11 +1212,11 @@ ServerLobbyThread::HandleNetPacketRetrievePlayerInfo(SessionWrapper session, con // Unknown player id - notify client. netPlayerInfoReply->playerInfoResult.present = playerInfoResult_PR_unknownPlayerInfo; } - GetSender().Send(session.sessionData, packet); + GetSender().Send(session, packet); } void -ServerLobbyThread::HandleNetPacketRetrieveAvatar(SessionWrapper session, const AvatarRequestMessage_t &retrieveAvatar) +ServerLobbyThread::HandleNetPacketRetrieveAvatar(boost::shared_ptr session, const AvatarRequestMessage_t &retrieveAvatar) { bool avatarFound = false; @@ -1225,7 +1227,7 @@ ServerLobbyThread::HandleNetPacketRetrieveAvatar(SessionWrapper session, const A NetPacketList tmpPackets; if (GetAvatarManager().AvatarFileToNetPackets(tmpFile, retrieveAvatar.requestId, tmpPackets) == 0) { avatarFound = true; - GetSender().Send(session.sessionData, tmpPackets); + GetSender().Send(session, tmpPackets); } else LOG_ERROR("Failed to read avatar file for network transmission."); } @@ -1238,14 +1240,14 @@ ServerLobbyThread::HandleNetPacketRetrieveAvatar(SessionWrapper session, const A netAvatarReply->requestId = retrieveAvatar.requestId; netAvatarReply->avatarResult.present = avatarResult_PR_unknownAvatar; - GetSender().Send(session.sessionData, unknownAvatar); + GetSender().Send(session, unknownAvatar); } } void -ServerLobbyThread::HandleNetPacketCreateGame(SessionWrapper session, const std::string &password, bool autoLeave, const JoinNewGame_t &newGame) +ServerLobbyThread::HandleNetPacketCreateGame(boost::shared_ptr session, const std::string &password, bool autoLeave, const JoinNewGame_t &newGame) { - LOG_VERBOSE("Creating new game, initiated by session #" << session.sessionData->GetId() << "."); + LOG_VERBOSE("Creating new game, initiated by session #" << session->GetId() << "."); // Create a new game. GameData tmpData; @@ -1254,14 +1256,14 @@ ServerLobbyThread::HandleNetPacketCreateGame(SessionWrapper session, const std:: unsigned gameId = GetNextGameId(); if (IsGameNameInUse(gameName)) { - SendJoinGameFailed(session.sessionData, gameId, NTF_NET_JOIN_GAME_NAME_IN_USE); + SendJoinGameFailed(session, gameId, NTF_NET_JOIN_GAME_NAME_IN_USE); } else if (GetBanManager().IsBadGameName(gameName)) { - SendJoinGameFailed(session.sessionData, gameId, NTF_NET_JOIN_GAME_BAD_NAME); - } else if (session.playerData->GetRights() == PLAYER_RIGHTS_GUEST + SendJoinGameFailed(session, gameId, NTF_NET_JOIN_GAME_BAD_NAME); + } else if (session->GetPlayerData()->GetRights() == PLAYER_RIGHTS_GUEST && tmpData.gameType != GAME_TYPE_NORMAL) { - SendJoinGameFailed(session.sessionData, gameId, NTF_NET_JOIN_GUEST_FORBIDDEN); + SendJoinGameFailed(session, gameId, NTF_NET_JOIN_GUEST_FORBIDDEN); } else if (!ServerGame::CheckSettings(tmpData, password, GetServerMode())) { - SendJoinGameFailed(session.sessionData, gameId, NTF_NET_JOIN_INVALID_SETTINGS); + SendJoinGameFailed(session, gameId, NTF_NET_JOIN_INVALID_SETTINGS); } else { boost::shared_ptr game( new ServerGame( @@ -1270,7 +1272,7 @@ ServerLobbyThread::HandleNetPacketCreateGame(SessionWrapper session, const std:: gameName, password, tmpData, - session.playerData->GetUniqueId(), + session->GetPlayerData()->GetUniqueId(), GetGui(), m_serverConfig, *m_serverLog)); @@ -1284,7 +1286,7 @@ ServerLobbyThread::HandleNetPacketCreateGame(SessionWrapper session, const std:: } void -ServerLobbyThread::HandleNetPacketJoinGame(SessionWrapper session, const std::string &password, bool autoLeave, const JoinExistingGame_t &joinGame) +ServerLobbyThread::HandleNetPacketJoinGame(boost::shared_ptr session, const std::string &password, bool autoLeave, const JoinExistingGame_t &joinGame) { // Join an existing game. GameMap::iterator pos = m_gameMap.find(joinGame.gameId); @@ -1292,41 +1294,41 @@ ServerLobbyThread::HandleNetPacketJoinGame(SessionWrapper session, const std::st if (pos != m_gameMap.end()) { ServerGame &game = *pos->second; const GameData &tmpData = game.GetGameData(); - if (session.playerData->GetRights() == PLAYER_RIGHTS_GUEST + if (session->GetPlayerData()->GetRights() == PLAYER_RIGHTS_GUEST && tmpData.gameType != GAME_TYPE_NORMAL) { - SendJoinGameFailed(session.sessionData, joinGame.gameId, NTF_NET_JOIN_GUEST_FORBIDDEN); + SendJoinGameFailed(session, joinGame.gameId, NTF_NET_JOIN_GUEST_FORBIDDEN); } else if (tmpData.gameType == GAME_TYPE_INVITE_ONLY - && !game.IsPlayerInvited(session.playerData->GetUniqueId())) { - SendJoinGameFailed(session.sessionData, joinGame.gameId, NTF_NET_JOIN_NOT_INVITED); + && !game.IsPlayerInvited(session->GetPlayerData()->GetUniqueId())) { + SendJoinGameFailed(session, joinGame.gameId, NTF_NET_JOIN_NOT_INVITED); } else if (!game.CheckPassword(password)) { - SendJoinGameFailed(session.sessionData, joinGame.gameId, NTF_NET_JOIN_INVALID_PASSWORD); + SendJoinGameFailed(session, joinGame.gameId, NTF_NET_JOIN_INVALID_PASSWORD); } else if (tmpData.gameType == GAME_TYPE_RANKING - && session.sessionData->GetClientAddr() != SERVER_ADDRESS_LOCALHOST_STR - && session.sessionData->GetClientAddr() != SERVER_ADDRESS_LOCALHOST_STR_V4V6 - && session.sessionData->GetClientAddr() != SERVER_ADDRESS_LOCALHOST_STR_V4 - && game.IsClientAddressConnected(session.sessionData->GetClientAddr())) { - SendJoinGameFailed(session.sessionData, joinGame.gameId, NTF_NET_JOIN_IP_BLOCKED); + && session->GetClientAddr() != SERVER_ADDRESS_LOCALHOST_STR + && session->GetClientAddr() != SERVER_ADDRESS_LOCALHOST_STR_V4V6 + && session->GetClientAddr() != SERVER_ADDRESS_LOCALHOST_STR_V4 + && game.IsClientAddressConnected(session->GetClientAddr())) { + SendJoinGameFailed(session, joinGame.gameId, NTF_NET_JOIN_IP_BLOCKED); } else { MoveSessionToGame(game, session, autoLeave); } } else { - SendJoinGameFailed(session.sessionData, joinGame.gameId, NTF_NET_JOIN_GAME_INVALID); + SendJoinGameFailed(session, joinGame.gameId, NTF_NET_JOIN_GAME_INVALID); } } void -ServerLobbyThread::HandleNetPacketChatRequest(SessionWrapper session, const ChatRequestMessage_t &chatRequest) +ServerLobbyThread::HandleNetPacketChatRequest(boost::shared_ptr session, const ChatRequestMessage_t &chatRequest) { bool chatSent = false; // Guests are not allowed to chat. - if (session.playerData && session.playerData->GetRights() != PLAYER_RIGHTS_GUEST) { + if (session->GetPlayerData() && session->GetPlayerData()->GetRights() != PLAYER_RIGHTS_GUEST) { if (chatRequest.chatRequestType.present == chatRequestType_PR_chatRequestTypeLobby) { boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); packet->GetMsg()->present = PokerTHMessage_PR_chatMessage; ChatMessage_t *netChat = &packet->GetMsg()->choice.chatMessage; netChat->chatType.present = chatType_PR_chatTypeLobby; ChatTypeLobby_t *netLobbyChat = &netChat->chatType.choice.chatTypeLobby; - netLobbyChat->playerId = session.playerData->GetUniqueId(); + netLobbyChat->playerId = session->GetPlayerData()->GetUniqueId(); OCTET_STRING_fromBuf( &netChat->chatText, (char *)chatRequest.chatText.buf, @@ -1338,24 +1340,24 @@ ServerLobbyThread::HandleNetPacketChatRequest(SessionWrapper session, const Chat string chatMsg = STL_STRING_FROM_OCTET_STRING(chatRequest.chatText); // Send the message to the chat cleaner bot. m_chatCleanerManager->HandleLobbyChatText( - session.playerData->GetUniqueId(), - session.playerData->GetName(), + session->GetPlayerData()->GetUniqueId(), + session->GetPlayerData()->GetName(), chatMsg); // Send the message to the irc bot. GetIrcBotCallback().SignalLobbyMessage( - session.playerData->GetUniqueId(), - session.playerData->GetName(), + session->GetPlayerData()->GetUniqueId(), + session->GetPlayerData()->GetName(), chatMsg); chatSent = true; } else if (chatRequest.chatRequestType.present == chatRequestType_PR_chatRequestTypePrivate) { const ChatRequestTypePrivate_t *netPrivateChat = &chatRequest.chatRequestType.choice.chatRequestTypePrivate; - SessionWrapper targetSession = m_sessionManager.GetSessionByUniquePlayerId(netPrivateChat->targetPlayerId); - if (!targetSession.sessionData) + boost::shared_ptr targetSession = m_sessionManager.GetSessionByUniquePlayerId(netPrivateChat->targetPlayerId); + if (!targetSession) targetSession = m_gameSessionManager.GetSessionByUniquePlayerId(netPrivateChat->targetPlayerId); - if (targetSession.sessionData && targetSession.playerData) { + if (targetSession && targetSession->GetPlayerData()) { // Only allow private messages to players which are not in running games. - unsigned gameId = targetSession.sessionData->GetGameId(); + unsigned gameId = targetSession->GetGameId(); GameMap::const_iterator pos = m_gameMap.find(gameId); if (pos == m_gameMap.end() || !pos->second->IsRunning()) { boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); @@ -1363,12 +1365,12 @@ ServerLobbyThread::HandleNetPacketChatRequest(SessionWrapper session, const Chat ChatMessage_t *netChat = &packet->GetMsg()->choice.chatMessage; netChat->chatType.present = chatType_PR_chatTypePrivate; ChatTypePrivate_t *netPrivateChat = &netChat->chatType.choice.chatTypePrivate; - netPrivateChat->playerId = session.playerData->GetUniqueId(); + netPrivateChat->playerId = session->GetPlayerData()->GetUniqueId(); OCTET_STRING_fromBuf( &netChat->chatText, (char *)chatRequest.chatText.buf, chatRequest.chatText.size); - GetSender().Send(targetSession.sessionData, packet); + GetSender().Send(targetSession, packet); chatSent = true; } } @@ -1383,18 +1385,18 @@ ServerLobbyThread::HandleNetPacketChatRequest(SessionWrapper session, const Chat &netReject->chatText, (char *)chatRequest.chatText.buf, chatRequest.chatText.size); - GetSender().Send(session.sessionData, packet); + GetSender().Send(session, packet); } } void -ServerLobbyThread::HandleNetPacketRejectGameInvitation(SessionWrapper session, const RejectGameInvitationMessage_t &reject) +ServerLobbyThread::HandleNetPacketRejectGameInvitation(boost::shared_ptr session, const RejectGameInvitationMessage_t &reject) { GameMap::iterator pos = m_gameMap.find(reject.gameId); - if (pos != m_gameMap.end() && session.playerData) { + if (pos != m_gameMap.end() && session->GetPlayerData()) { ServerGame &game = *pos->second; - unsigned tmpPlayerId = session.playerData->GetUniqueId(); + unsigned tmpPlayerId = session->GetPlayerData()->GetUniqueId(); if (game.IsPlayerInvited(tmpPlayerId)) { // If he rejects, he is no longer invited. game.RemovePlayerInvitation(tmpPlayerId); @@ -1412,11 +1414,11 @@ ServerLobbyThread::HandleNetPacketRejectGameInvitation(SessionWrapper session, c } void -ServerLobbyThread::AuthChallenge(SessionWrapper session, const string &secret) +ServerLobbyThread::AuthChallenge(boost::shared_ptr session, const string &secret) { - if (session.sessionData && session.playerData && session.sessionData->AuthGetCurStepNum() == 1) { - session.sessionData->AuthSetPassword(secret); // For this auth session. - string outChallenge(session.sessionData->AuthGetNextOutMsg()); + if (session && session->GetPlayerData() && session->AuthGetCurStepNum() == 1) { + session->AuthSetPassword(secret); // For this auth session. + string outChallenge(session->AuthGetNextOutMsg()); boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); packet->GetMsg()->present = PokerTHMessage_PR_authMessage; @@ -1427,17 +1429,17 @@ ServerLobbyThread::AuthChallenge(SessionWrapper session, const string &secret) &challenge->serverChallenge, (char *)outChallenge.c_str(), outChallenge.size()); - GetSender().Send(session.sessionData, packet); + GetSender().Send(session, packet); } } void -ServerLobbyThread::CheckAvatarBlacklist(SessionWrapper session) +ServerLobbyThread::CheckAvatarBlacklist(boost::shared_ptr session) { - if (session.sessionData && session.playerData) { - const MD5Buf &avatarMD5 = session.playerData->GetAvatarMD5(); + if (session && session->GetPlayerData()) { + const MD5Buf &avatarMD5 = session->GetPlayerData()->GetAvatarMD5(); if (!avatarMD5.IsZero()) - m_database->AsyncCheckAvatarBlacklist(session.playerData->GetUniqueId(), avatarMD5.ToString()); + m_database->AsyncCheckAvatarBlacklist(session->GetPlayerData()->GetUniqueId(), avatarMD5.ToString()); else InitAfterLogin(session); } @@ -1446,9 +1448,9 @@ ServerLobbyThread::CheckAvatarBlacklist(SessionWrapper session) void ServerLobbyThread::AvatarBlacklisted(unsigned playerId) { - SessionWrapper tmpSession = m_sessionManager.GetSessionByUniquePlayerId(playerId, true); - if (tmpSession.sessionData && tmpSession.playerData) { - tmpSession.playerData->SetAvatarMD5(MD5Buf()); // Reset avatar if blacklisted. + boost::shared_ptr tmpSession = m_sessionManager.GetSessionByUniquePlayerId(playerId, true); + if (tmpSession && tmpSession->GetPlayerData()) { + tmpSession->GetPlayerData()->SetAvatarMD5(MD5Buf()); // Reset avatar if blacklisted. InitAfterLogin(tmpSession); } } @@ -1456,43 +1458,43 @@ ServerLobbyThread::AvatarBlacklisted(unsigned playerId) void ServerLobbyThread::AvatarOK(unsigned playerId) { - SessionWrapper tmpSession = m_sessionManager.GetSessionByUniquePlayerId(playerId, true); + boost::shared_ptr tmpSession = m_sessionManager.GetSessionByUniquePlayerId(playerId, true); InitAfterLogin(tmpSession); } void -ServerLobbyThread::InitAfterLogin(SessionWrapper session) +ServerLobbyThread::InitAfterLogin(boost::shared_ptr session) { - if (session.sessionData && session.playerData) { - const MD5Buf &avatarMD5 = session.playerData->GetAvatarMD5(); + if (session && session->GetPlayerData()) { + const MD5Buf &avatarMD5 = session->GetPlayerData()->GetAvatarMD5(); string avatarFileName; if (!avatarMD5.IsZero() && !GetAvatarManager().GetAvatarFileName(avatarMD5, avatarFileName)) { RequestPlayerAvatar(session); } else { if (!avatarFileName.empty()) - session.playerData->SetAvatarFile(avatarFileName); + session->GetPlayerData()->SetAvatarFile(avatarFileName); EstablishSession(session); } } } void -ServerLobbyThread::EstablishSession(SessionWrapper session) +ServerLobbyThread::EstablishSession(boost::shared_ptr session) { - if (!session.playerData) + if (!session->GetPlayerData()) throw ServerException(__FILE__, __LINE__, ERR_NET_INVALID_SESSION, 0); // Run postlogin for DB string tmpAvatarHash; string tmpAvatarType; - if (!session.playerData->GetAvatarMD5().IsZero()) { - tmpAvatarHash = session.playerData->GetAvatarMD5().ToString(); - tmpAvatarType = AvatarManager::GetAvatarFileExtension(AvatarManager::GetAvatarFileType(session.playerData->GetAvatarFile())); + if (!session->GetPlayerData()->GetAvatarMD5().IsZero()) { + tmpAvatarHash = session->GetPlayerData()->GetAvatarMD5().ToString(); + tmpAvatarType = AvatarManager::GetAvatarFileExtension(AvatarManager::GetAvatarFileType(session->GetPlayerData()->GetAvatarFile())); if (!tmpAvatarType.empty()) tmpAvatarType.erase(0, 1); // Only store extension without the "." } - m_database->PlayerPostLogin(session.playerData->GetDBId(), tmpAvatarHash, tmpAvatarType); + m_database->PlayerPostLogin(session->GetPlayerData()->GetDBId(), tmpAvatarHash, tmpAvatarType); // Send ACK to client. boost::shared_ptr ack(new NetPacket(NetPacket::Alloc)); @@ -1503,16 +1505,16 @@ ServerLobbyThread::EstablishSession(SessionWrapper session) &netInitAck->yourSessionId, (char *)&sessionId, boost::uuids::uuid::static_size()); - netInitAck->yourPlayerId = session.playerData->GetUniqueId(); - GetSender().Send(session.sessionData, ack); + netInitAck->yourPlayerId = session->GetPlayerData()->GetUniqueId(); + GetSender().Send(session, ack); // Send the connected players list to the client. - SendPlayerList(session.sessionData); + SendPlayerList(session); // Send the game list to the client. - SendGameList(session.sessionData); + SendGameList(session); // Session is now established. - session.sessionData->SetState(SessionData::Established); + session->SetState(SessionData::Established); { boost::mutex::scoped_lock lock(m_statMutex); @@ -1520,26 +1522,26 @@ ServerLobbyThread::EstablishSession(SessionWrapper session) m_statDataChanged = true; } // Notify all players. - NotifyPlayerJoinedLobby(session.playerData->GetUniqueId()); + NotifyPlayerJoinedLobby(session->GetPlayerData()->GetUniqueId()); UpdateStatisticsNumberOfPlayers(); } void -ServerLobbyThread::AuthenticatePlayer(SessionWrapper session) +ServerLobbyThread::AuthenticatePlayer(boost::shared_ptr session) { - if(session.playerData) { - m_database->AsyncPlayerLogin(session.playerData->GetUniqueId(), session.playerData->GetName()); + if(session->GetPlayerData()) { + m_database->AsyncPlayerLogin(session->GetPlayerData()->GetUniqueId(), session->GetPlayerData()->GetName()); } } void ServerLobbyThread::UserValid(unsigned playerId, const DBPlayerData &dbPlayerData) { - SessionWrapper tmpSession = m_sessionManager.GetSessionByUniquePlayerId(playerId, true); - if (tmpSession.sessionData && tmpSession.playerData) { - tmpSession.playerData->SetDBId(dbPlayerData.id); - tmpSession.playerData->SetCountry(dbPlayerData.country); + boost::shared_ptr tmpSession = m_sessionManager.GetSessionByUniquePlayerId(playerId, true); + if (tmpSession && tmpSession->GetPlayerData()) { + tmpSession->GetPlayerData()->SetDBId(dbPlayerData.id); + tmpSession->GetPlayerData()->SetCountry(dbPlayerData.country); this->AuthChallenge(tmpSession, dbPlayerData.secret); } } @@ -1553,16 +1555,16 @@ ServerLobbyThread::UserInvalid(unsigned playerId) void ServerLobbyThread::SendReportAvatarResult(unsigned byPlayerId, unsigned reportedPlayerId, bool success) { - SessionWrapper session = m_sessionManager.GetSessionByUniquePlayerId(byPlayerId); - if (!session.sessionData) + boost::shared_ptr session = m_sessionManager.GetSessionByUniquePlayerId(byPlayerId); + if (!session) session = m_gameSessionManager.GetSessionByUniquePlayerId(byPlayerId); - if (session.sessionData) { + if (session) { boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); packet->GetMsg()->present = PokerTHMessage_PR_reportAvatarAckMessage; ReportAvatarAckMessage_t *netReportAck = &packet->GetMsg()->choice.reportAvatarAckMessage; netReportAck->reportedPlayerId = reportedPlayerId; netReportAck->reportResult = success ? reportResult_avatarReportAccepted : reportResult_avatarReportInvalid; - GetSender().Send(session.sessionData, packet); + GetSender().Send(session, packet); } } @@ -1573,20 +1575,20 @@ ServerLobbyThread::UserBlocked(unsigned playerId) } void -ServerLobbyThread::RequestPlayerAvatar(SessionWrapper session) +ServerLobbyThread::RequestPlayerAvatar(boost::shared_ptr session) { - if (!session.playerData) + if (!session->GetPlayerData()) throw ServerException(__FILE__, __LINE__, ERR_NET_INVALID_SESSION, 0); // Ask the client to send its avatar. boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); packet->GetMsg()->present = PokerTHMessage_PR_avatarRequestMessage; AvatarRequestMessage_t *netAvatarRequest = &packet->GetMsg()->choice.avatarRequestMessage; - netAvatarRequest->requestId = session.playerData->GetUniqueId(); + netAvatarRequest->requestId = session->GetPlayerData()->GetUniqueId(); OCTET_STRING_fromBuf( &netAvatarRequest->avatar, - (char *)session.playerData->GetAvatarMD5().GetData(), + (char *)session->GetPlayerData()->GetAvatarMD5().GetData(), MD5_DATA_SIZE); - GetSender().Send(session.sessionData, packet); + GetSender().Send(session, packet); } void @@ -1772,8 +1774,8 @@ ServerLobbyThread::InternalRemoveGame(boost::shared_ptr game) void ServerLobbyThread::InternalRemovePlayer(unsigned playerId, unsigned errorCode) { - SessionWrapper session = m_sessionManager.GetSessionByUniquePlayerId(playerId, true); - if (session.sessionData.get()) + boost::shared_ptr session = m_sessionManager.GetSessionByUniquePlayerId(playerId, true); + if (session) SessionError(session, errorCode); else { // Scan games for the player. @@ -1792,12 +1794,12 @@ ServerLobbyThread::InternalRemovePlayer(unsigned playerId, unsigned errorCode) } void -ServerLobbyThread::InternalResubscribeMsg(SessionWrapper session) +ServerLobbyThread::InternalResubscribeMsg(boost::shared_ptr session) { - if (!session.sessionData->WantsLobbyMsg()) { - session.sessionData->SetWantsLobbyMsg(); - SendPlayerList(session.sessionData); - SendGameList(session.sessionData); + if (!session->WantsLobbyMsg()) { + session->SetWantsLobbyMsg(); + SendPlayerList(session); + SendGameList(session); // Send new statistics information. /* boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); packet->GetMsg()->present = PokerTHMessage_PR_statisticsMessage; @@ -1808,20 +1810,20 @@ ServerLobbyThread::InternalResubscribeMsg(SessionWrapper session) data->statisticsValue = m_sessionManager.GetRawSessionCount() + m_gameSessionManager.GetRawSessionCount(); ASN_SEQUENCE_ADD(&netStatistics->statisticsData.list, data); - GetSender().Send(session.sessionData, packet);*/ + GetSender().Send(session, packet);*/ } } void -ServerLobbyThread::HandleReAddedSession(SessionWrapper session) +ServerLobbyThread::HandleReAddedSession(boost::shared_ptr session) { // Remove session from game session list. - m_gameSessionManager.RemoveSession(session.sessionData->GetId()); + m_gameSessionManager.RemoveSession(session->GetId()); if (m_sessionManager.GetRawSessionCount() <= SERVER_MAX_NUM_LOBBY_SESSIONS) { // Set state (back) to established. - session.sessionData->SetState(SessionData::Established); - session.sessionData->SetGameId(0); + session->SetState(SessionData::Established); + session->SetGameId(0); // Add session to lobby list. m_sessionManager.AddSession(session); } else { @@ -1831,44 +1833,44 @@ ServerLobbyThread::HandleReAddedSession(SessionWrapper session) } void -ServerLobbyThread::InternalCheckSessionTimeouts(SessionWrapper session) +ServerLobbyThread::InternalCheckSessionTimeouts(boost::shared_ptr session) { bool closeSession = false; - if (session.sessionData.get()) { - if (session.sessionData->GetState() == SessionData::Init && session.sessionData->GetAutoDisconnectTimerElapsedSec() >= SERVER_INIT_SESSION_TIMEOUT_SEC) { - LOG_VERBOSE("Session init timeout, removing session #" << session.sessionData->GetId() << "."); + if (session) { + if (session->GetState() == SessionData::Init && session->GetAutoDisconnectTimerElapsedSec() >= SERVER_INIT_SESSION_TIMEOUT_SEC) { + LOG_VERBOSE("Session init timeout, removing session #" << session->GetId() << "."); closeSession = true; - } else if (session.sessionData->GetActivityTimerElapsedSec() >= SERVER_SESSION_ACTIVITY_TIMEOUT_SEC - SERVER_TIMEOUT_WARNING_REMAINING_SEC - && !session.sessionData->HasActivityNoticeBeenSent()) { - session.sessionData->MarkActivityNotice(); + } else if (session->GetActivityTimerElapsedSec() >= SERVER_SESSION_ACTIVITY_TIMEOUT_SEC - SERVER_TIMEOUT_WARNING_REMAINING_SEC + && !session->HasActivityNoticeBeenSent()) { + session->MarkActivityNotice(); boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); packet->GetMsg()->present = PokerTHMessage_PR_timeoutWarningMessage; TimeoutWarningMessage_t *netWarning = &packet->GetMsg()->choice.timeoutWarningMessage; netWarning->timeoutReason = timeoutReason_timeoutNoDataReceived; netWarning->remainingSeconds = SERVER_TIMEOUT_WARNING_REMAINING_SEC; - GetSender().Send(session.sessionData, packet); - } else if (session.sessionData->GetActivityTimerElapsedSec() >= SERVER_SESSION_ACTIVITY_TIMEOUT_SEC) { - LOG_VERBOSE("Activity timeout, removing session #" << session.sessionData->GetId() << "."); + GetSender().Send(session, packet); + } else if (session->GetActivityTimerElapsedSec() >= SERVER_SESSION_ACTIVITY_TIMEOUT_SEC) { + LOG_VERBOSE("Activity timeout, removing session #" << session->GetId() << "."); closeSession = true; - } else if (session.sessionData->GetAutoDisconnectTimerElapsedSec() >= SERVER_SESSION_FORCED_TIMEOUT_SEC) { - LOG_VERBOSE("Auto disconnect timeout, removing session #" << session.sessionData->GetId() << "."); + } else if (session->GetAutoDisconnectTimerElapsedSec() >= SERVER_SESSION_FORCED_TIMEOUT_SEC) { + LOG_VERBOSE("Auto disconnect timeout, removing session #" << session->GetId() << "."); closeSession = true; } } if (closeSession) { - if (session.playerData.get()) - RemovePlayer(session.playerData->GetUniqueId(), ERR_NET_SESSION_TIMED_OUT); + if (session->GetPlayerData()) + RemovePlayer(session->GetPlayerData()->GetUniqueId(), ERR_NET_SESSION_TIMED_OUT); else - m_sessionManager.RemoveSession(session.sessionData->GetId()); + m_sessionManager.RemoveSession(session->GetId()); } } void -ServerLobbyThread::SessionError(SessionWrapper session, int errorCode) +ServerLobbyThread::SessionError(boost::shared_ptr session, int errorCode) { - if (session.sessionData) { - SendError(session.sessionData, errorCode); + if (session) { + SendError(session, errorCode); CloseSession(session); } } diff --git a/src/net/common/sessiondata.cpp b/src/net/common/sessiondata.cpp index feaeabd2..f9bd1dd7 100644 --- a/src/net/common/sessiondata.cpp +++ b/src/net/common/sessiondata.cpp @@ -271,3 +271,18 @@ SessionData::GetAutoDisconnectTimerElapsedSec() const boost::mutex::scoped_lock lock(m_dataMutex); return m_autoDisconnectTimer.elapsed().total_seconds(); } + +void +SessionData::SetPlayerData(boost::shared_ptr player) +{ + boost::mutex::scoped_lock lock(m_dataMutex); + m_playerData = player; +} + +boost::shared_ptr +SessionData::GetPlayerData() +{ + boost::mutex::scoped_lock lock(m_dataMutex); + return m_playerData; +} + diff --git a/src/net/common/sessionmanager.cpp b/src/net/common/sessionmanager.cpp index e9894f6c..f43b13d9 100644 --- a/src/net/common/sessionmanager.cpp +++ b/src/net/common/sessionmanager.cpp @@ -42,24 +42,18 @@ SessionManager::HasSessions() const } void -SessionManager::AddSession(boost::shared_ptr sessionData) -{ - AddSession(SessionWrapper(sessionData, boost::shared_ptr())); -} - -void -SessionManager::AddSession(SessionWrapper session) +SessionManager::AddSession(boost::shared_ptr session) { boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex); - SessionMap::iterator pos = m_sessionMap.lower_bound(session.sessionData->GetId()); + SessionMap::iterator pos = m_sessionMap.lower_bound(session->GetId()); // If pos points to a pair whose key is equivalent to the socket, this handle // already exists within the list. - if (pos != m_sessionMap.end() && session.sessionData->GetId() == pos->first) { + if (pos != m_sessionMap.end() && session->GetId() == pos->first) { throw ServerException(__FILE__, __LINE__, ERR_SOCK_CONN_EXISTS, 0); } - m_sessionMap.insert(pos, SessionMap::value_type(session.sessionData->GetId(), session)); + m_sessionMap.insert(pos, SessionMap::value_type(session->GetId(), session)); } void @@ -69,7 +63,7 @@ SessionManager::SetSessionPlayerData(SessionId session, boost::shared_ptrsecond.playerData = playerData; + pos->second->SetPlayerData(playerData); } bool @@ -79,10 +73,10 @@ SessionManager::RemoveSession(SessionId session) return m_sessionMap.erase(session) == 1; } -SessionWrapper +boost::shared_ptr SessionManager::GetSessionById(SessionId id) const { - SessionWrapper tmpSession; + boost::shared_ptr tmpSession; boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex); SessionMap::const_iterator pos = m_sessionMap.find(id); if (pos != m_sessionMap.end()) @@ -90,10 +84,10 @@ SessionManager::GetSessionById(SessionId id) const return tmpSession; } -SessionWrapper +boost::shared_ptr SessionManager::GetSessionByPlayerName(const string &playerName) const { - SessionWrapper tmpSession; + boost::shared_ptr tmpSession; boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex); SessionMap::const_iterator session_i = m_sessionMap.begin(); @@ -101,9 +95,9 @@ SessionManager::GetSessionByPlayerName(const string &playerName) const while (session_i != session_end) { // Check all players which are fully connected. - if (session_i->second.sessionData->GetState() != SessionData::Init) { - boost::shared_ptr tmpPlayer(session_i->second.playerData); - if (!tmpPlayer.get()) + if (session_i->second->GetState() != SessionData::Init) { + boost::shared_ptr tmpPlayer(session_i->second->GetPlayerData()); + if (!tmpPlayer) throw ServerException(__FILE__, __LINE__, ERR_NET_INVALID_SESSION, 0); if (tmpPlayer->GetName() == playerName) { tmpSession = session_i->second; @@ -116,10 +110,10 @@ SessionManager::GetSessionByPlayerName(const string &playerName) const return tmpSession; } -SessionWrapper +boost::shared_ptr SessionManager::GetSessionByUniquePlayerId(unsigned uniqueId, bool initSessions) const { - SessionWrapper tmpSession; + boost::shared_ptr tmpSession; boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex); SessionMap::const_iterator session_i = m_sessionMap.begin(); @@ -127,8 +121,8 @@ SessionManager::GetSessionByUniquePlayerId(unsigned uniqueId, bool initSessions) while (session_i != session_end) { // Check all players which are fully connected. - if (initSessions || session_i->second.sessionData->GetState() != SessionData::Init) { - boost::shared_ptr tmpPlayer(session_i->second.playerData); + if (initSessions || session_i->second->GetState() != SessionData::Init) { + boost::shared_ptr tmpPlayer(session_i->second->GetPlayerData()); if (tmpPlayer && tmpPlayer->GetUniqueId() == uniqueId) { tmpSession = session_i->second; break; @@ -151,8 +145,8 @@ SessionManager::GetPlayerDataList() const while (session_i != session_end) { // Get all players in the game. - if (session_i->second.sessionData->GetState() == SessionData::Game) { - boost::shared_ptr tmpPlayer(session_i->second.playerData); + if (session_i->second->GetState() == SessionData::Game) { + boost::shared_ptr tmpPlayer(session_i->second->GetPlayerData()); if (!tmpPlayer.get() || tmpPlayer->GetName().empty()) throw ServerException(__FILE__, __LINE__, ERR_NET_INVALID_SESSION, 0); playerList.push_back(tmpPlayer); @@ -173,8 +167,8 @@ SessionManager::GetPlayerIdList(SessionData::State state) const while (session_i != session_end) { // Get all players in the game. - if (session_i->second.sessionData->GetState() == state) { - playerList.push_back(session_i->second.playerData->GetUniqueId()); + if (session_i->second->GetState() == state) { + playerList.push_back(session_i->second->GetPlayerData()->GetUniqueId()); } ++session_i; } @@ -186,9 +180,9 @@ SessionManager::IsPlayerConnected(const string &playerName) const { bool retVal = false; - SessionWrapper tmpSession = GetSessionByPlayerName(playerName); + boost::shared_ptr tmpSession = GetSessionByPlayerName(playerName); - if (tmpSession.sessionData && tmpSession.playerData) + if (tmpSession && tmpSession->GetPlayerData()) retVal = true; return retVal; @@ -199,9 +193,9 @@ SessionManager::IsPlayerConnected(unsigned uniqueId) const { bool retVal = false; - SessionWrapper tmpSession = GetSessionByUniquePlayerId(uniqueId); + boost::shared_ptr tmpSession = GetSessionByUniquePlayerId(uniqueId); - if (tmpSession.sessionData && tmpSession.playerData) + if (tmpSession && tmpSession->GetPlayerData()) retVal = true; return retVal; @@ -217,7 +211,7 @@ SessionManager::IsClientAddressConnected(const std::string &clientAddress) const SessionMap::const_iterator end = m_sessionMap.end(); while (i != end) { - if ((*i).second.sessionData->GetClientAddr() == clientAddress) { + if ((*i).second->GetClientAddr() == clientAddress) { retVal = true; break; } @@ -227,7 +221,7 @@ SessionManager::IsClientAddressConnected(const std::string &clientAddress) const } void -SessionManager::ForEach(boost::function func) +SessionManager::ForEach(boost::function)> func) { boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex); @@ -252,7 +246,7 @@ SessionManager::CountReadySessions() const SessionMap::const_iterator end = m_sessionMap.end(); while (i != end) { - if ((*i).second.sessionData->IsReady()) + if ((*i).second->IsReady()) ++counter; ++i; } @@ -268,7 +262,7 @@ SessionManager::ResetAllReadyFlags() SessionMap::iterator end = m_sessionMap.end(); while (i != end) { - (*i).second.sessionData->ResetReadyFlag(); + (*i).second->ResetReadyFlag(); ++i; } } @@ -282,7 +276,7 @@ SessionManager::Clear() boost::system::error_code ec; while (i != end) { - i->second.sessionData->GetAsioSocket()->close(ec); + i->second->GetAsioSocket()->close(ec); ++i; } m_sessionMap.clear(); @@ -305,7 +299,7 @@ SessionManager::GetEstablishedSessionCount() SessionMap::const_iterator end = m_sessionMap.end(); while (i != end) { - if ((*i).second.sessionData->GetState() >= SessionData::Established) + if ((*i).second->GetState() >= SessionData::Established) ++counter; ++i; } @@ -321,12 +315,12 @@ SessionManager::SendToAllSessions(SenderHelper &sender, boost::shared_ptrsecond.sessionData.get()) + if (!i->second.get()) throw ServerException(__FILE__, __LINE__, ERR_NET_INVALID_SESSION, 0); // Send each client (with a certain state) a copy of the packet. - if (i->second.sessionData->GetState() == state) - sender.Send(i->second.sessionData, packet); + if (i->second->GetState() == state) + sender.Send(i->second, packet); ++i; } } @@ -340,12 +334,12 @@ SessionManager::SendLobbyMsgToAllSessions(SenderHelper &sender, boost::shared_pt SessionMap::iterator end = m_sessionMap.end(); while (i != end) { - if (!i->second.sessionData.get()) + if (!i->second.get()) throw ServerException(__FILE__, __LINE__, ERR_NET_INVALID_SESSION, 0); // Send each client (with a certain state) a copy of the packet. - if (i->second.sessionData->GetState() == state && i->second.sessionData->WantsLobbyMsg()) - sender.Send(i->second.sessionData, packet); + if (i->second->GetState() == state && i->second->WantsLobbyMsg()) + sender.Send(i->second, packet); ++i; } } @@ -360,9 +354,9 @@ SessionManager::SendToAllButOneSessions(SenderHelper &sender, boost::shared_ptr< while (i != end) { // Send each fully connected client but one a copy of the packet. - if (i->second.sessionData->GetState() == state) + if (i->second->GetState() == state) if (i->first != except) - sender.Send(i->second.sessionData, packet); + sender.Send(i->second, packet); ++i; } } diff --git a/src/net/servergame.h b/src/net/servergame.h index c7e4a55b..92c14c65 100644 --- a/src/net/servergame.h +++ b/src/net/servergame.h @@ -55,10 +55,10 @@ public: DB_id GetDBId() const; void SetDBId(DB_id newId); - void AddSession(SessionWrapper session); + void AddSession(boost::shared_ptr session); void RemovePlayer(unsigned playerId, unsigned errorCode); - void HandlePacket(SessionWrapper session, boost::shared_ptr packet); + void HandlePacket(boost::shared_ptr session, boost::shared_ptr packet); ServerCallback &GetCallback(); GameState GetCurRound() const; @@ -117,10 +117,10 @@ protected: void InternalEndGame(); void InternalKickPlayer(unsigned playerId); - void InternalAskVoteKick(SessionWrapper byWhom, unsigned playerIdWho, unsigned timeoutSec); - void InternalDenyAskVoteKick(SessionWrapper byWhom, unsigned playerIdWho, DenyKickPlayerReason reason); - void InternalVoteKick(SessionWrapper byWhom, unsigned petitionId, KickVote vote); - void InternalDenyVoteKick(SessionWrapper byWhom, unsigned petitionId, DenyVoteReason reason); + void InternalAskVoteKick(boost::shared_ptr byWhom, unsigned playerIdWho, unsigned timeoutSec); + void InternalDenyAskVoteKick(boost::shared_ptr byWhom, unsigned playerIdWho, DenyKickPlayerReason reason); + void InternalVoteKick(boost::shared_ptr byWhom, unsigned petitionId, KickVote vote); + void InternalDenyVoteKick(boost::shared_ptr byWhom, unsigned petitionId, DenyVoteReason reason); PlayerDataList GetFullPlayerDataList() const; @@ -129,11 +129,11 @@ protected: bool IsComputerPlayerActive(unsigned playerId) const; void ResetComputerPlayerList(); - void GracefulRemoveSession(SessionWrapper session, int reason); + void GracefulRemoveSession(boost::shared_ptr session, int reason); void RemovePlayerData(boost::shared_ptr player, int reason); - void ErrorRemoveSession(SessionWrapper session); - void SessionError(SessionWrapper session, int errorCode); - void MoveSessionToLobby(SessionWrapper session, int reason); + void ErrorRemoveSession(boost::shared_ptr session); + void SessionError(boost::shared_ptr session, int errorCode); + void MoveSessionToLobby(boost::shared_ptr session, int reason); void RemoveDisconnectedPlayers(); size_t GetCurNumberOfPlayers() const; diff --git a/src/net/servergamestate.h b/src/net/servergamestate.h index 399fcb02..eb794509 100644 --- a/src/net/servergamestate.h +++ b/src/net/servergamestate.h @@ -49,10 +49,10 @@ public: virtual void NotifySessionRemoved(boost::shared_ptr server) = 0; // Handling of a new session. - virtual void HandleNewSession(boost::shared_ptr server, SessionWrapper session) = 0; + virtual void HandleNewSession(boost::shared_ptr server, boost::shared_ptr session) = 0; // Main processing function of the current state. - virtual void ProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet) = 0; + virtual void ProcessPacket(boost::shared_ptr server, boost::shared_ptr session, boost::shared_ptr packet) = 0; }; // Abstract State: Receiving. @@ -63,11 +63,11 @@ public: // Globally handle packets which are allowed in all running states. // Calls InternalProcess if packet has not been processed. - virtual void ProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet); + virtual void ProcessPacket(boost::shared_ptr server, boost::shared_ptr session, boost::shared_ptr packet); protected: - virtual void InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet) = 0; + virtual void InternalProcessPacket(boost::shared_ptr server, boost::shared_ptr session, boost::shared_ptr packet) = 0; }; // State: Initialization. @@ -83,7 +83,7 @@ public: virtual void NotifyGameAdminChanged(boost::shared_ptr server); virtual void NotifySessionRemoved(boost::shared_ptr server); - virtual void HandleNewSession(boost::shared_ptr server, SessionWrapper session); + virtual void HandleNewSession(boost::shared_ptr server, boost::shared_ptr session); protected: ServerGameStateInit(); @@ -97,7 +97,7 @@ protected: void TimerAdminTimeout(const boost::system::error_code &ec, boost::shared_ptr server); void SendStartEvent(ServerGame &server, bool fillWithComputerPlayers); - virtual void InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet); + virtual void InternalProcessPacket(boost::shared_ptr server, boost::shared_ptr session, boost::shared_ptr packet); static boost::shared_ptr CreateNetPacketPlayerJoined(unsigned gameId, const PlayerData &playerData); @@ -117,12 +117,12 @@ public: virtual void NotifyGameAdminChanged(boost::shared_ptr /*server*/) {} virtual void NotifySessionRemoved(boost::shared_ptr /*server*/) {} - virtual void HandleNewSession(boost::shared_ptr server, SessionWrapper session); + virtual void HandleNewSession(boost::shared_ptr server, boost::shared_ptr session); protected: ServerGameStateStartGame(); - virtual void InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet); + virtual void InternalProcessPacket(boost::shared_ptr server, boost::shared_ptr session, boost::shared_ptr packet); void TimerTimeout(const boost::system::error_code &ec, boost::shared_ptr server); void DoStart(boost::shared_ptr server); @@ -142,12 +142,12 @@ public: virtual void NotifyGameAdminChanged(boost::shared_ptr /*server*/) {} virtual void NotifySessionRemoved(boost::shared_ptr /*server*/) {} - virtual void HandleNewSession(boost::shared_ptr server, SessionWrapper session); + virtual void HandleNewSession(boost::shared_ptr server, boost::shared_ptr session); protected: ServerGameStateHand(); - virtual void InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet); + virtual void InternalProcessPacket(boost::shared_ptr server, boost::shared_ptr session, boost::shared_ptr packet); void TimerLoop(const boost::system::error_code &ec, boost::shared_ptr server); void EngineLoop(boost::shared_ptr server); void TimerShowCards(const boost::system::error_code &ec, boost::shared_ptr server); @@ -176,12 +176,12 @@ public: virtual void NotifyGameAdminChanged(boost::shared_ptr /*server*/) {} virtual void NotifySessionRemoved(boost::shared_ptr /*server*/) {} - virtual void HandleNewSession(boost::shared_ptr server, SessionWrapper session); + virtual void HandleNewSession(boost::shared_ptr server, boost::shared_ptr session); protected: ServerGameStateWaitPlayerAction(); - virtual void InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet); + virtual void InternalProcessPacket(boost::shared_ptr server, boost::shared_ptr session, boost::shared_ptr packet); void TimerTimeout(const boost::system::error_code &ec, boost::shared_ptr server); private: @@ -200,12 +200,12 @@ public: virtual void NotifyGameAdminChanged(boost::shared_ptr /*server*/) {} virtual void NotifySessionRemoved(boost::shared_ptr /*server*/) {} - virtual void HandleNewSession(boost::shared_ptr server, SessionWrapper session); + virtual void HandleNewSession(boost::shared_ptr server, boost::shared_ptr session); protected: ServerGameStateWaitNextHand(); - virtual void InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet); + virtual void InternalProcessPacket(boost::shared_ptr server, boost::shared_ptr session, boost::shared_ptr packet); void TimerTimeout(const boost::system::error_code &ec, boost::shared_ptr server); private: @@ -225,10 +225,10 @@ public: virtual void NotifySessionRemoved(boost::shared_ptr /*server*/) {} // Handling of a new session. - virtual void HandleNewSession(boost::shared_ptr /*server*/, SessionWrapper /*session*/) {} + virtual void HandleNewSession(boost::shared_ptr /*server*/, boost::shared_ptr /*session*/) {} // Main processing function of the current state. - virtual void ProcessPacket(boost::shared_ptr /*server*/, SessionWrapper /*session*/, boost::shared_ptr /*packet*/) {} + virtual void ProcessPacket(boost::shared_ptr /*server*/, boost::shared_ptr /*session*/, boost::shared_ptr /*packet*/) {} protected: ServerGameStateFinal() {} diff --git a/src/net/serverlobbythread.h b/src/net/serverlobbythread.h index 30135e6b..1ac066c7 100644 --- a/src/net/serverlobbythread.h +++ b/src/net/serverlobbythread.h @@ -61,11 +61,11 @@ public: virtual void SignalTermination(); void AddConnection(boost::shared_ptr sock); - void ReAddSession(SessionWrapper session, int reason); - void MoveSessionToGame(ServerGame &game, SessionWrapper session, bool autoLeave); - void RemoveSessionFromGame(SessionWrapper session); - void SessionError(SessionWrapper session, int errorCode); - void ResubscribeLobbyMsg(SessionWrapper session); + void ReAddSession(boost::shared_ptr session, int reason); + void MoveSessionToGame(ServerGame &game, boost::shared_ptr session, bool autoLeave); + void RemoveSessionFromGame(boost::shared_ptr session); + void SessionError(boost::shared_ptr session, int errorCode); + void ResubscribeLobbyMsg(boost::shared_ptr session); void NotifyPlayerJoinedLobby(unsigned playerId); void NotifyPlayerLeftLobby(unsigned playerId); void NotifyPlayerJoinedGame(unsigned gameId, unsigned playerId); @@ -75,9 +75,9 @@ public: void NotifyReopeningGame(unsigned gameId); void DispatchPacket(boost::shared_ptr session, boost::shared_ptr packet); - void HandleGameRetrievePlayerInfo(SessionWrapper session, const PlayerInfoRequestMessage_t &playerInfoRequest); - void HandleGameRetrieveAvatar(SessionWrapper session, const AvatarRequestMessage_t &retrieveAvatar); - void HandleChatRequest(SessionWrapper session, const ChatRequestMessage_t &chatRequest); + void HandleGameRetrievePlayerInfo(boost::shared_ptr session, const PlayerInfoRequestMessage_t &playerInfoRequest); + void HandleGameRetrieveAvatar(boost::shared_ptr session, const AvatarRequestMessage_t &retrieveAvatar); + void HandleChatRequest(boost::shared_ptr session, const ChatRequestMessage_t &chatRequest); bool KickPlayerByName(const std::string &playerName); std::string GetPlayerIPAddress(const std::string &playerName) const; @@ -116,7 +116,7 @@ public: protected: typedef std::deque > ConnectQueue; - typedef std::list SessionList; + typedef std::list> SessionList; typedef std::list SessionIdList; typedef std::map TimerSessionMap; typedef std::map > GameMap; @@ -131,33 +131,33 @@ protected: void ClearAuthContext(); void InitChatCleaner(); - void HandlePacket(SessionWrapper session, boost::shared_ptr packet); - void HandleNetPacketInit(SessionWrapper session, const InitMessage_t &initMessage); - void HandleNetPacketAuthClientResponse(SessionWrapper session, const AuthClientResponse_t &clientResponse); - void HandleNetPacketAvatarHeader(SessionWrapper session, unsigned requestId, const AvatarHeader_t &avatarHeader); - void HandleNetPacketUnknownAvatar(SessionWrapper session, unsigned requestId, const UnknownAvatar_t &unknownAvatar); - void HandleNetPacketAvatarFile(SessionWrapper session, unsigned requestId, const AvatarData_t &avatarData); - void HandleNetPacketAvatarEnd(SessionWrapper session, unsigned requestId, const AvatarEnd_t &avatarEnd); - void HandleNetPacketRetrievePlayerInfo(SessionWrapper session, const PlayerInfoRequestMessage_t &playerInfoRequest); - void HandleNetPacketRetrieveAvatar(SessionWrapper session, const AvatarRequestMessage_t &retrieveAvatar); - void HandleNetPacketCreateGame(SessionWrapper session, const std::string &password, bool autoLeave, const JoinNewGame_t &newGame); - void HandleNetPacketJoinGame(SessionWrapper session, const std::string &password, bool autoLeave, const JoinExistingGame_t &joinGame); - void HandleNetPacketChatRequest(SessionWrapper session, const ChatRequestMessage_t &chatRequest); - void HandleNetPacketRejectGameInvitation(SessionWrapper session, const RejectGameInvitationMessage_t &reject); + void HandlePacket(boost::shared_ptr session, boost::shared_ptr packet); + void HandleNetPacketInit(boost::shared_ptr session, const InitMessage_t &initMessage); + void HandleNetPacketAuthClientResponse(boost::shared_ptr session, const AuthClientResponse_t &clientResponse); + void HandleNetPacketAvatarHeader(boost::shared_ptr session, unsigned requestId, const AvatarHeader_t &avatarHeader); + void HandleNetPacketUnknownAvatar(boost::shared_ptr session, unsigned requestId, const UnknownAvatar_t &unknownAvatar); + void HandleNetPacketAvatarFile(boost::shared_ptr session, unsigned requestId, const AvatarData_t &avatarData); + void HandleNetPacketAvatarEnd(boost::shared_ptr session, unsigned requestId, const AvatarEnd_t &avatarEnd); + void HandleNetPacketRetrievePlayerInfo(boost::shared_ptr session, const PlayerInfoRequestMessage_t &playerInfoRequest); + void HandleNetPacketRetrieveAvatar(boost::shared_ptr session, const AvatarRequestMessage_t &retrieveAvatar); + void HandleNetPacketCreateGame(boost::shared_ptr session, const std::string &password, bool autoLeave, const JoinNewGame_t &newGame); + void HandleNetPacketJoinGame(boost::shared_ptr session, const std::string &password, bool autoLeave, const JoinExistingGame_t &joinGame); + void HandleNetPacketChatRequest(boost::shared_ptr session, const ChatRequestMessage_t &chatRequest); + void HandleNetPacketRejectGameInvitation(boost::shared_ptr session, const RejectGameInvitationMessage_t &reject); // TODO would be better to use state pattern here. - void AuthChallenge(SessionWrapper session, const std::string &secret); - void CheckAvatarBlacklist(SessionWrapper session); + void AuthChallenge(boost::shared_ptr session, const std::string &secret); + void CheckAvatarBlacklist(boost::shared_ptr session); void AvatarBlacklisted(unsigned playerId); void AvatarOK(unsigned playerId); - void InitAfterLogin(SessionWrapper session); - void EstablishSession(SessionWrapper session); - void AuthenticatePlayer(SessionWrapper session); + void InitAfterLogin(boost::shared_ptr session); + void EstablishSession(boost::shared_ptr session); + void AuthenticatePlayer(boost::shared_ptr session); void UserValid(unsigned playerId, const DBPlayerData &dbPlayerData); void UserInvalid(unsigned playerId); void UserBlocked(unsigned playerId); void SendReportAvatarResult(unsigned byPlayerId, unsigned reportedPlayerId, bool success); - void RequestPlayerAvatar(SessionWrapper session); + void RequestPlayerAvatar(boost::shared_ptr session); void TimerRemoveGame(const boost::system::error_code &ec); void TimerRemovePlayer(const boost::system::error_code &ec); void TimerUpdateClientLoginLock(const boost::system::error_code &ec); @@ -169,16 +169,16 @@ protected: void InternalAddGame(boost::shared_ptr game); void InternalRemoveGame(boost::shared_ptr game); void InternalRemovePlayer(unsigned playerId, unsigned errorCode); - void InternalResubscribeMsg(SessionWrapper session); + void InternalResubscribeMsg(boost::shared_ptr session); - void HandleReAddedSession(SessionWrapper session); + void HandleReAddedSession(boost::shared_ptr session); - void InternalCheckSessionTimeouts(SessionWrapper session); + void InternalCheckSessionTimeouts(boost::shared_ptr session); void CleanupSessionMap(); void CloseSession(SessionId sessionId); - void CloseSession(SessionWrapper session); + void CloseSession(boost::shared_ptr session); void SendError(boost::shared_ptr s, int errorCode); void SendJoinGameFailed(boost::shared_ptr s, unsigned gameId, int reason); void SendPlayerList(boost::shared_ptr s); diff --git a/src/net/sessiondata.h b/src/net/sessiondata.h index 43dc92eb..8d4e51e7 100644 --- a/src/net/sessiondata.h +++ b/src/net/sessiondata.h @@ -41,6 +41,7 @@ struct Gsasl_session; class ReceiveBuffer; class SendBuffer; class NetPacket; +class PlayerData; class SessionData : public boost::enable_shared_from_this { @@ -99,6 +100,9 @@ public: void MarkActivityNotice(); unsigned GetAutoDisconnectTimerElapsedSec() const; + void SetPlayerData(boost::shared_ptr player); + boost::shared_ptr GetPlayerData(); + protected: SessionData(const SessionData &other); SessionData &operator=(const SessionData &other); @@ -122,6 +126,7 @@ private: int m_curAuthStep; std::string m_nextGsaslMsg; std::string m_password; + boost::shared_ptr m_playerData; mutable boost::mutex m_dataMutex; }; diff --git a/src/net/sessionmanager.h b/src/net/sessionmanager.h index d0a5ff60..dafc303c 100644 --- a/src/net/sessionmanager.h +++ b/src/net/sessionmanager.h @@ -32,14 +32,6 @@ class NetPacket; class SenderHelper; -struct SessionWrapper { - SessionWrapper() {} - SessionWrapper(boost::shared_ptr s, boost::shared_ptr p) - : sessionData(s), playerData(p) {} - boost::shared_ptr sessionData; - boost::shared_ptr playerData; -}; - class SessionManager { public: @@ -48,14 +40,13 @@ public: bool HasSessions() const; - void AddSession(boost::shared_ptr sessionData); // new Sessions without player data - void AddSession(SessionWrapper session); + void AddSession(boost::shared_ptr sessionData); void SetSessionPlayerData(SessionId session, boost::shared_ptr playerData); bool RemoveSession(SessionId session); - SessionWrapper GetSessionById(SessionId id) const; - SessionWrapper GetSessionByPlayerName(const std::string &playerName) const; - SessionWrapper GetSessionByUniquePlayerId(unsigned uniqueId, bool initSessions = false) const; + boost::shared_ptr GetSessionById(SessionId id) const; + boost::shared_ptr GetSessionByPlayerName(const std::string &playerName) const; + boost::shared_ptr GetSessionByUniquePlayerId(unsigned uniqueId, bool initSessions = false) const; PlayerDataList GetPlayerDataList() const; PlayerIdList GetPlayerIdList(SessionData::State state) const; @@ -63,7 +54,7 @@ public: bool IsPlayerConnected(unsigned uniqueId) const; bool IsClientAddressConnected(const std::string &clientAddress) const; - void ForEach(boost::function func); + void ForEach(boost::function)> func); unsigned CountReadySessions() const; void ResetAllReadyFlags(); @@ -78,7 +69,7 @@ public: protected: - typedef std::map SessionMap; + typedef std::map > SessionMap; private: