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