Server states can now handle multiple games (are multithreading capable).

This commit is contained in:
lotodore
2007-08-11 10:02:04 +00:00
parent 6a580c81d5
commit 26299e80c0
5 changed files with 163 additions and 76 deletions
+8
View File
@@ -199,3 +199,11 @@ boost::shared_ptr<PlayerInterface> Game::getPlayerByUniqueId(unsigned id)
} }
return tmpPlayer; return tmpPlayer;
} }
boost::shared_ptr<PlayerInterface> Game::getCurrentPlayer()
{
int curPlayerNum = getCurrentHand()->getCurrentBeRo()->getPlayersTurn();
assert(curPlayerNum < getStartQuantityPlayers());
return getPlayerArray()[curPlayerNum];
}
+1
View File
@@ -74,6 +74,7 @@ public:
int getActualHandID() const { return actualHandID; } int getActualHandID() const { return actualHandID; }
boost::shared_ptr<PlayerInterface> getPlayerByUniqueId(unsigned id); boost::shared_ptr<PlayerInterface> getPlayerByUniqueId(unsigned id);
boost::shared_ptr<PlayerInterface> getCurrentPlayer();
private: private:
boost::shared_ptr<EngineFactory> myFactory; boost::shared_ptr<EngineFactory> myFactory;
+93 -52
View File
@@ -45,13 +45,6 @@ using namespace std;
// Helper functions // Helper functions
// TODO: these are hacks. // TODO: these are hacks.
static boost::shared_ptr<PlayerInterface> GetCurrentPlayer(Game &curGame)
{
int curPlayerNum = curGame.getCurrentHand()->getCurrentBeRo()->getPlayersTurn();
assert(curPlayerNum < curGame.getStartQuantityPlayers()); // TODO: throw exception
return curGame.getPlayerArray()[curPlayerNum];
}
static void SendNewRoundCards(ServerRecvThread &server, Game &curGame, int state) static void SendNewRoundCards(ServerRecvThread &server, Game &curGame, int state)
{ {
// TODO: no switch needed here if game states are polymorphic // TODO: no switch needed here if game states are polymorphic
@@ -104,40 +97,44 @@ ServerRecvState::~ServerRecvState()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
ServerRecvStateReceiving::ServerRecvStateReceiving() AbstractServerRecvStateReceiving::AbstractServerRecvStateReceiving()
{ {
} }
ServerRecvStateReceiving::~ServerRecvStateReceiving() AbstractServerRecvStateReceiving::~AbstractServerRecvStateReceiving()
{ {
} }
int int
ServerRecvStateReceiving::Process(ServerRecvThread &server) AbstractServerRecvStateReceiving::Process(ServerRecvThread &server)
{ {
// This is the receive loop for the server.
int retVal = MSG_SOCK_INTERNAL_PENDING; int retVal = MSG_SOCK_INTERNAL_PENDING;
SOCKET recvSock = server.Select(); SOCKET recvSock = server.Select();
if (recvSock != INVALID_SOCKET) if (recvSock != INVALID_SOCKET)
{ {
// If data is available, find the corresponding session.
SessionWrapper session = server.GetSession(recvSock); SessionWrapper session = server.GetSession(recvSock);
// The session must exist.
assert(session.sessionData.get());
boost::shared_ptr<NetPacket> packet; boost::shared_ptr<NetPacket> packet;
try try
{ {
// Receive the packet.
packet = server.GetReceiver().Recv(recvSock); packet = server.GetReceiver().Recv(recvSock);
} catch (const NetException &) } catch (const NetException &)
{
if (session.sessionData.get())
{ {
server.CloseSessionDelayed(session); server.CloseSessionDelayed(session);
return retVal; return retVal;
} }
}
// Ignore if no session / no packet. // Process packet if one was received.
if (packet.get() && session.sessionData.get()) if (packet.get())
{ {
if (packet->ToNetPacketSendChatText()) // Chat text is always allowed. // Chat text is always allowed.
if (packet->ToNetPacketSendChatText())
{ {
if (session.playerData.get()) // Only forward if this player is known. if (session.playerData.get()) // Only forward if this player is known.
{ {
@@ -155,7 +152,10 @@ ServerRecvStateReceiving::Process(ServerRecvThread &server)
} }
} }
else else
retVal = InternalProcess(server, session, packet); // Let other class handle this. {
// Packet processing in subclass.
retVal = InternalProcess(server, session, packet);
}
} }
} }
return retVal; return retVal;
@@ -163,16 +163,16 @@ ServerRecvStateReceiving::Process(ServerRecvThread &server)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
ServerRecvStateTimer::ServerRecvStateTimer() AbstractServerRecvStateTimer::AbstractServerRecvStateTimer()
{ {
} }
ServerRecvStateTimer::~ServerRecvStateTimer() AbstractServerRecvStateTimer::~AbstractServerRecvStateTimer()
{ {
} }
void void
ServerRecvStateTimer::Init() AbstractServerRecvStateTimer::Init()
{ {
m_timer.reset(); m_timer.reset();
m_timer.start(); m_timer.start();
@@ -180,11 +180,15 @@ ServerRecvStateTimer::Init()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
boost::thread_specific_ptr<ServerRecvStateInit> ServerRecvStateInit::Ptr;
ServerRecvStateInit & ServerRecvStateInit &
ServerRecvStateInit::Instance() ServerRecvStateInit::Instance()
{ {
static ServerRecvStateInit state; if (!Ptr.get())
return state; Ptr.reset(new ServerRecvStateInit);
return *Ptr;
} }
ServerRecvStateInit::ServerRecvStateInit() ServerRecvStateInit::ServerRecvStateInit()
@@ -358,16 +362,16 @@ ServerRecvStateInit::InternalProcess(ServerRecvThread &server, SessionWrapper se
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
ServerRecvStateRunning::ServerRecvStateRunning() AbstractServerRecvStateRunning::AbstractServerRecvStateRunning()
{ {
} }
ServerRecvStateRunning::~ServerRecvStateRunning() AbstractServerRecvStateRunning::~AbstractServerRecvStateRunning()
{ {
} }
void void
ServerRecvStateRunning::HandleNewConnection(ServerRecvThread &server, boost::shared_ptr<ConnectData> connData) AbstractServerRecvStateRunning::HandleNewConnection(ServerRecvThread &server, boost::shared_ptr<ConnectData> connData)
{ {
// Do not accept new connections in this state. // Do not accept new connections in this state.
server.RejectNewConnection(connData); server.RejectNewConnection(connData);
@@ -375,11 +379,15 @@ ServerRecvStateRunning::HandleNewConnection(ServerRecvThread &server, boost::sha
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
boost::thread_specific_ptr<ServerRecvStateStartGame> ServerRecvStateStartGame::Ptr;
ServerRecvStateStartGame & ServerRecvStateStartGame &
ServerRecvStateStartGame::Instance() ServerRecvStateStartGame::Instance()
{ {
static ServerRecvStateStartGame state; if (!Ptr.get())
return state; Ptr.reset(new ServerRecvStateStartGame);
return *Ptr;
} }
ServerRecvStateStartGame::ServerRecvStateStartGame() ServerRecvStateStartGame::ServerRecvStateStartGame()
@@ -398,7 +406,8 @@ ServerRecvStateStartGame::Process(ServerRecvThread &server)
NetPacketGameStart::Data gameStartData; NetPacketGameStart::Data gameStartData;
gameStartData.startData = server.GetStartData(); gameStartData.startData = server.GetStartData();
// Assign player numbers. Assume Player List is sorted by number. // Send player order to clients.
// Assume player list is sorted by number.
PlayerDataList tmpPlayerList = server.GetPlayerDataList(); PlayerDataList tmpPlayerList = server.GetPlayerDataList();
PlayerDataList::iterator player_i = tmpPlayerList.begin(); PlayerDataList::iterator player_i = tmpPlayerList.begin();
PlayerDataList::iterator player_end = tmpPlayerList.end(); PlayerDataList::iterator player_end = tmpPlayerList.end();
@@ -421,11 +430,15 @@ ServerRecvStateStartGame::Process(ServerRecvThread &server)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
boost::thread_specific_ptr<ServerRecvStateStartHand> ServerRecvStateStartHand::Ptr;
ServerRecvStateStartHand & ServerRecvStateStartHand &
ServerRecvStateStartHand::Instance() ServerRecvStateStartHand::Instance()
{ {
static ServerRecvStateStartHand state; if (!Ptr.get())
return state; Ptr.reset(new ServerRecvStateStartHand);
return *Ptr;
} }
ServerRecvStateStartHand::ServerRecvStateStartHand() ServerRecvStateStartHand::ServerRecvStateStartHand()
@@ -514,11 +527,15 @@ ServerRecvStateStartHand::Process(ServerRecvThread &server)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
boost::thread_specific_ptr<ServerRecvStateStartRound> ServerRecvStateStartRound::Ptr;
ServerRecvStateStartRound & ServerRecvStateStartRound &
ServerRecvStateStartRound::Instance() ServerRecvStateStartRound::Instance()
{ {
static ServerRecvStateStartRound state; if (!Ptr.get())
return state; Ptr.reset(new ServerRecvStateStartRound);
return *Ptr;
} }
ServerRecvStateStartRound::ServerRecvStateStartRound() ServerRecvStateStartRound::ServerRecvStateStartRound()
@@ -595,8 +612,8 @@ ServerRecvStateStartRound::Process(ServerRecvThread &server)
assert (!curGame.getCurrentHand()->getAllInCondition()); // this would be an error. assert (!curGame.getCurrentHand()->getAllInCondition()); // this would be an error.
// Retrieve current player. // Retrieve current player.
boost::shared_ptr<PlayerInterface> curPlayer = GetCurrentPlayer(curGame); boost::shared_ptr<PlayerInterface> curPlayer = curGame.getCurrentPlayer();
assert(curPlayer); // TODO throw exception assert(curPlayer.get()); // TODO throw exception
assert(curPlayer->getMyActiveStatus()); // TODO throw exception assert(curPlayer->getMyActiveStatus()); // TODO throw exception
boost::shared_ptr<NetPacket> notification(new NetPacketPlayersTurn); boost::shared_ptr<NetPacket> notification(new NetPacketPlayersTurn);
@@ -713,11 +730,15 @@ ServerRecvStateStartRound::GetActivePlayers(Game &curGame)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
boost::thread_specific_ptr<ServerRecvStateWaitPlayerAction> ServerRecvStateWaitPlayerAction::Ptr;
ServerRecvStateWaitPlayerAction & ServerRecvStateWaitPlayerAction &
ServerRecvStateWaitPlayerAction::Instance() ServerRecvStateWaitPlayerAction::Instance()
{ {
static ServerRecvStateWaitPlayerAction state; if (!Ptr.get())
return state; Ptr.reset(new ServerRecvStateWaitPlayerAction);
return *Ptr;
} }
ServerRecvStateWaitPlayerAction::ServerRecvStateWaitPlayerAction() ServerRecvStateWaitPlayerAction::ServerRecvStateWaitPlayerAction()
@@ -733,7 +754,7 @@ ServerRecvStateWaitPlayerAction::Process(ServerRecvThread &server)
{ {
int retVal; int retVal;
boost::shared_ptr<PlayerInterface> tmpPlayer = GetCurrentPlayer(server.GetGame()); boost::shared_ptr<PlayerInterface> tmpPlayer = server.GetGame().getCurrentPlayer();
assert(tmpPlayer.get()); assert(tmpPlayer.get());
assert(!tmpPlayer->getMyName().empty()); assert(!tmpPlayer->getMyName().empty());
@@ -766,7 +787,7 @@ ServerRecvStateWaitPlayerAction::Process(ServerRecvThread &server)
retVal = MSG_NET_GAME_SERVER_ACTION; retVal = MSG_NET_GAME_SERVER_ACTION;
} }
else else
retVal = ServerRecvStateReceiving::Process(server); retVal = AbstractServerRecvStateReceiving::Process(server);
return retVal; return retVal;
} }
@@ -835,11 +856,15 @@ ServerRecvStateWaitPlayerAction::SendPlayerAction(ServerRecvThread &server, boos
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
boost::thread_specific_ptr<ServerRecvStateDealCardsDelay> ServerRecvStateDealCardsDelay::Ptr;
ServerRecvStateDealCardsDelay & ServerRecvStateDealCardsDelay &
ServerRecvStateDealCardsDelay::Instance() ServerRecvStateDealCardsDelay::Instance()
{ {
static ServerRecvStateDealCardsDelay state; if (!Ptr.get())
return state; Ptr.reset(new ServerRecvStateDealCardsDelay);
return *Ptr;
} }
ServerRecvStateDealCardsDelay::ServerRecvStateDealCardsDelay() ServerRecvStateDealCardsDelay::ServerRecvStateDealCardsDelay()
@@ -853,7 +878,7 @@ ServerRecvStateDealCardsDelay::~ServerRecvStateDealCardsDelay()
int int
ServerRecvStateDealCardsDelay::Process(ServerRecvThread &server) ServerRecvStateDealCardsDelay::Process(ServerRecvThread &server)
{ {
int retVal = ServerRecvStateReceiving::Process(server); int retVal = AbstractServerRecvStateReceiving::Process(server);
Game &curGame = server.GetGame(); Game &curGame = server.GetGame();
@@ -886,11 +911,15 @@ ServerRecvStateDealCardsDelay::InternalProcess(ServerRecvThread &server, Session
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
boost::thread_specific_ptr<ServerRecvStateShowCardsDelay> ServerRecvStateShowCardsDelay::Ptr;
ServerRecvStateShowCardsDelay & ServerRecvStateShowCardsDelay &
ServerRecvStateShowCardsDelay::Instance() ServerRecvStateShowCardsDelay::Instance()
{ {
static ServerRecvStateShowCardsDelay state; if (!Ptr.get())
return state; Ptr.reset(new ServerRecvStateShowCardsDelay);
return *Ptr;
} }
ServerRecvStateShowCardsDelay::ServerRecvStateShowCardsDelay() ServerRecvStateShowCardsDelay::ServerRecvStateShowCardsDelay()
@@ -904,7 +933,7 @@ ServerRecvStateShowCardsDelay::~ServerRecvStateShowCardsDelay()
int int
ServerRecvStateShowCardsDelay::Process(ServerRecvThread &server) ServerRecvStateShowCardsDelay::Process(ServerRecvThread &server)
{ {
int retVal = ServerRecvStateReceiving::Process(server); int retVal = AbstractServerRecvStateReceiving::Process(server);
if (GetTimer().elapsed().total_seconds() >= SERVER_SHOW_CARDS_DELAY_SEC) if (GetTimer().elapsed().total_seconds() >= SERVER_SHOW_CARDS_DELAY_SEC)
{ {
@@ -926,11 +955,15 @@ ServerRecvStateShowCardsDelay::InternalProcess(ServerRecvThread &server, Session
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
boost::thread_specific_ptr<ServerRecvStateNextHandDelay> ServerRecvStateNextHandDelay::Ptr;
ServerRecvStateNextHandDelay & ServerRecvStateNextHandDelay &
ServerRecvStateNextHandDelay::Instance() ServerRecvStateNextHandDelay::Instance()
{ {
static ServerRecvStateNextHandDelay state; if (!Ptr.get())
return state; Ptr.reset(new ServerRecvStateNextHandDelay);
return *Ptr;
} }
ServerRecvStateNextHandDelay::ServerRecvStateNextHandDelay() ServerRecvStateNextHandDelay::ServerRecvStateNextHandDelay()
@@ -944,7 +977,7 @@ ServerRecvStateNextHandDelay::~ServerRecvStateNextHandDelay()
int int
ServerRecvStateNextHandDelay::Process(ServerRecvThread &server) ServerRecvStateNextHandDelay::Process(ServerRecvThread &server)
{ {
int retVal = ServerRecvStateReceiving::Process(server); int retVal = AbstractServerRecvStateReceiving::Process(server);
if (GetTimer().elapsed().total_seconds() >= SERVER_DELAY_NEXT_HAND_SEC) if (GetTimer().elapsed().total_seconds() >= SERVER_DELAY_NEXT_HAND_SEC)
server.SetState(ServerRecvStateStartHand::Instance()); server.SetState(ServerRecvStateStartHand::Instance());
@@ -960,11 +993,15 @@ ServerRecvStateNextHandDelay::InternalProcess(ServerRecvThread &server, SessionW
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
boost::thread_specific_ptr<ServerRecvStateNextGameDelay> ServerRecvStateNextGameDelay::Ptr;
ServerRecvStateNextGameDelay & ServerRecvStateNextGameDelay &
ServerRecvStateNextGameDelay::Instance() ServerRecvStateNextGameDelay::Instance()
{ {
static ServerRecvStateNextGameDelay state; if (!Ptr.get())
return state; Ptr.reset(new ServerRecvStateNextGameDelay);
return *Ptr;
} }
ServerRecvStateNextGameDelay::ServerRecvStateNextGameDelay() ServerRecvStateNextGameDelay::ServerRecvStateNextGameDelay()
@@ -978,7 +1015,7 @@ ServerRecvStateNextGameDelay::~ServerRecvStateNextGameDelay()
int int
ServerRecvStateNextGameDelay::Process(ServerRecvThread &server) ServerRecvStateNextGameDelay::Process(ServerRecvThread &server)
{ {
int retVal = ServerRecvStateReceiving::Process(server); int retVal = AbstractServerRecvStateReceiving::Process(server);
if (GetTimer().elapsed().total_seconds() >= SERVER_DELAY_NEXT_GAME_SEC) if (GetTimer().elapsed().total_seconds() >= SERVER_DELAY_NEXT_GAME_SEC)
{ {
@@ -1014,11 +1051,15 @@ ServerRecvStateNextGameDelay::InternalProcess(ServerRecvThread &server, SessionW
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
boost::thread_specific_ptr<ServerRecvStateFinal> ServerRecvStateFinal::Ptr;
ServerRecvStateFinal & ServerRecvStateFinal &
ServerRecvStateFinal::Instance() ServerRecvStateFinal::Instance()
{ {
static ServerRecvStateFinal state; if (!Ptr.get())
return state; Ptr.reset(new ServerRecvStateFinal);
return *Ptr;
} }
ServerRecvStateFinal::ServerRecvStateFinal() ServerRecvStateFinal::ServerRecvStateFinal()
+56 -19
View File
@@ -52,10 +52,10 @@ public:
}; };
// Abstract State: Receiving. // Abstract State: Receiving.
class ServerRecvStateReceiving : virtual public ServerRecvState class AbstractServerRecvStateReceiving : virtual public ServerRecvState
{ {
public: public:
virtual ~ServerRecvStateReceiving(); virtual ~AbstractServerRecvStateReceiving();
// Globally handle packets which are allowed in all running states. // Globally handle packets which are allowed in all running states.
// Calls InternalProcess if packet has not been processed. // Calls InternalProcess if packet has not been processed.
@@ -63,16 +63,16 @@ public:
protected: protected:
ServerRecvStateReceiving(); AbstractServerRecvStateReceiving();
virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr<NetPacket> packet) = 0; virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr<NetPacket> packet) = 0;
}; };
// Abstract State: Timer. // Abstract State: Timer.
class ServerRecvStateTimer : virtual public ServerRecvState class AbstractServerRecvStateTimer : virtual public ServerRecvState
{ {
public: public:
virtual ~ServerRecvStateTimer(); virtual ~AbstractServerRecvStateTimer();
virtual void Init(); virtual void Init();
@@ -80,28 +80,28 @@ public:
protected: protected:
ServerRecvStateTimer(); AbstractServerRecvStateTimer();
private: private:
boost::microsec_timer m_timer; boost::microsec_timer m_timer;
}; };
// Abstract State: Game is running. // Abstract State: Game is running.
class ServerRecvStateRunning : virtual public ServerRecvState class AbstractServerRecvStateRunning : virtual public ServerRecvState
{ {
public: public:
virtual ~ServerRecvStateRunning(); virtual ~AbstractServerRecvStateRunning();
// Reject new connections. // Reject new connections.
virtual void HandleNewConnection(ServerRecvThread &server, boost::shared_ptr<ConnectData> data); virtual void HandleNewConnection(ServerRecvThread &server, boost::shared_ptr<ConnectData> data);
protected: protected:
ServerRecvStateRunning(); AbstractServerRecvStateRunning();
}; };
// State: Initialization. // State: Initialization.
class ServerRecvStateInit : public ServerRecvStateReceiving class ServerRecvStateInit : public AbstractServerRecvStateReceiving
{ {
public: public:
// Access the state singleton. // Access the state singleton.
@@ -123,10 +123,11 @@ protected:
private: private:
u_int16_t m_curUniquePlayerId; u_int16_t m_curUniquePlayerId;
static boost::thread_specific_ptr<ServerRecvStateInit> Ptr;
}; };
// State: Start server game. // State: Start server game.
class ServerRecvStateStartGame : public ServerRecvStateRunning class ServerRecvStateStartGame : public AbstractServerRecvStateRunning
{ {
public: public:
// Access the state singleton. // Access the state singleton.
@@ -143,10 +144,14 @@ protected:
// Protected constructor - this is a singleton. // Protected constructor - this is a singleton.
ServerRecvStateStartGame(); ServerRecvStateStartGame();
private:
static boost::thread_specific_ptr<ServerRecvStateStartGame> Ptr;
}; };
// State: Start new hand. // State: Start new hand.
class ServerRecvStateStartHand : public ServerRecvStateRunning class ServerRecvStateStartHand : public AbstractServerRecvStateRunning
{ {
public: public:
// Access the state singleton. // Access the state singleton.
@@ -163,10 +168,14 @@ protected:
// Protected constructor - this is a singleton. // Protected constructor - this is a singleton.
ServerRecvStateStartHand(); ServerRecvStateStartHand();
private:
static boost::thread_specific_ptr<ServerRecvStateStartHand> Ptr;
}; };
// State: Start new round. // State: Start new round.
class ServerRecvStateStartRound : public ServerRecvStateRunning class ServerRecvStateStartRound : public AbstractServerRecvStateRunning
{ {
public: public:
// Access the state singleton. // Access the state singleton.
@@ -185,10 +194,14 @@ protected:
ServerRecvStateStartRound(); ServerRecvStateStartRound();
static std::list<boost::shared_ptr<PlayerInterface> > GetActivePlayers(Game &curGame); static std::list<boost::shared_ptr<PlayerInterface> > GetActivePlayers(Game &curGame);
private:
static boost::thread_specific_ptr<ServerRecvStateStartRound> Ptr;
}; };
// State: Wait for a player action. // State: Wait for a player action.
class ServerRecvStateWaitPlayerAction : public ServerRecvStateReceiving, public ServerRecvStateRunning, public ServerRecvStateTimer class ServerRecvStateWaitPlayerAction : public AbstractServerRecvStateReceiving, public AbstractServerRecvStateRunning, public AbstractServerRecvStateTimer
{ {
public: public:
// Access the state singleton. // Access the state singleton.
@@ -208,10 +221,14 @@ protected:
static void PerformPlayerAction(ServerRecvThread &server, boost::shared_ptr<PlayerInterface> player, PlayerAction action, int bet); static void PerformPlayerAction(ServerRecvThread &server, boost::shared_ptr<PlayerInterface> player, PlayerAction action, int bet);
static void SendPlayerAction(ServerRecvThread &server, boost::shared_ptr<PlayerInterface> player); static void SendPlayerAction(ServerRecvThread &server, boost::shared_ptr<PlayerInterface> player);
private:
static boost::thread_specific_ptr<ServerRecvStateWaitPlayerAction> Ptr;
}; };
// State: Delay after dealing cards // State: Delay after dealing cards
class ServerRecvStateDealCardsDelay : public ServerRecvStateReceiving, public ServerRecvStateRunning, public ServerRecvStateTimer class ServerRecvStateDealCardsDelay : public AbstractServerRecvStateReceiving, public AbstractServerRecvStateRunning, public AbstractServerRecvStateTimer
{ {
public: public:
// Access the state singleton. // Access the state singleton.
@@ -228,10 +245,14 @@ protected:
ServerRecvStateDealCardsDelay(); ServerRecvStateDealCardsDelay();
virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr<NetPacket> packet); virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr<NetPacket> packet);
private:
static boost::thread_specific_ptr<ServerRecvStateDealCardsDelay> Ptr;
}; };
// State: Delay after showing cards (all in) // State: Delay after showing cards (all in)
class ServerRecvStateShowCardsDelay : public ServerRecvStateReceiving, public ServerRecvStateRunning, public ServerRecvStateTimer class ServerRecvStateShowCardsDelay : public AbstractServerRecvStateReceiving, public AbstractServerRecvStateRunning, public AbstractServerRecvStateTimer
{ {
public: public:
// Access the state singleton. // Access the state singleton.
@@ -248,10 +269,14 @@ protected:
ServerRecvStateShowCardsDelay(); ServerRecvStateShowCardsDelay();
virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr<NetPacket> packet); virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr<NetPacket> packet);
private:
static boost::thread_specific_ptr<ServerRecvStateShowCardsDelay> Ptr;
}; };
// State: Delay before next hand. // State: Delay before next hand.
class ServerRecvStateNextHandDelay : public ServerRecvStateReceiving, public ServerRecvStateRunning, public ServerRecvStateTimer class ServerRecvStateNextHandDelay : public AbstractServerRecvStateReceiving, public AbstractServerRecvStateRunning, public AbstractServerRecvStateTimer
{ {
public: public:
// Access the state singleton. // Access the state singleton.
@@ -268,10 +293,14 @@ protected:
ServerRecvStateNextHandDelay(); ServerRecvStateNextHandDelay();
virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr<NetPacket> packet); virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr<NetPacket> packet);
private:
static boost::thread_specific_ptr<ServerRecvStateNextHandDelay> Ptr;
}; };
// State: Delay before next hand. // State: Delay before next hand.
class ServerRecvStateNextGameDelay : public ServerRecvStateReceiving, public ServerRecvStateRunning, public ServerRecvStateTimer class ServerRecvStateNextGameDelay : public AbstractServerRecvStateReceiving, public AbstractServerRecvStateRunning, public AbstractServerRecvStateTimer
{ {
public: public:
// Access the state singleton. // Access the state singleton.
@@ -288,10 +317,14 @@ protected:
ServerRecvStateNextGameDelay(); ServerRecvStateNextGameDelay();
virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr<NetPacket> packet); virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr<NetPacket> packet);
private:
static boost::thread_specific_ptr<ServerRecvStateNextGameDelay> Ptr;
}; };
// State: Final. // State: Final.
class ServerRecvStateFinal : public ServerRecvStateReceiving, public ServerRecvStateRunning class ServerRecvStateFinal : public AbstractServerRecvStateReceiving, public AbstractServerRecvStateRunning
{ {
public: public:
// Access the state singleton. // Access the state singleton.
@@ -307,6 +340,10 @@ protected:
ServerRecvStateFinal(); ServerRecvStateFinal();
virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr<NetPacket> packet); virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr<NetPacket> packet);
private:
static boost::thread_specific_ptr<ServerRecvStateFinal> Ptr;
}; };
#ifdef _MSC_VER #ifdef _MSC_VER
+2 -2
View File
@@ -169,8 +169,8 @@ private:
ConfigFile *m_playerConfig; ConfigFile *m_playerConfig;
friend class ServerRecvStateInit; friend class ServerRecvStateInit;
friend class ServerRecvStateReceiving; friend class AbstractServerRecvStateReceiving;
friend class ServerRecvStateRunning; friend class AbstractServerRecvStateRunning;
friend class ServerRecvStateStartGame; friend class ServerRecvStateStartGame;
friend class ServerRecvStateStartHand; friend class ServerRecvStateStartHand;
friend class ServerRecvStateStartRound; friend class ServerRecvStateStartRound;