Removing SessionWrapper to prepare rejoin. This also improves dispatching network packets.

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