From 67e81d1631b63a9befff30d1a112ce4c821efff8 Mon Sep 17 00:00:00 2001 From: lotodore Date: Mon, 20 Aug 2007 20:37:54 +0000 Subject: [PATCH] More work on the server code. Still broken. --- pokerth_lib.pro | 4 ++ src/net/common/servergamestate.cpp | 9 ++-- src/net/common/servergamethread.cpp | 36 ++++++++++------ src/net/common/serverlobbythread.cpp | 63 +++++++++++++++++++++++++++- src/net/servergamestate.h | 6 +-- src/net/servergamethread.h | 37 +++++++++------- src/net/serverlobbythread.h | 6 +++ 7 files changed, 128 insertions(+), 33 deletions(-) diff --git a/pokerth_lib.pro b/pokerth_lib.pro index a19e5bcd..b12d7052 100644 --- a/pokerth_lib.pro +++ b/pokerth_lib.pro @@ -57,6 +57,8 @@ HEADERS += \ src/net/resolverthread.h \ src/net/senderthread.h \ src/net/serveracceptthread.h \ + src/net/servergamethread.h \ + src/net/servergamestate.h \ src/net/serverlobbythread.h \ src/net/socket_helper.h \ src/net/socket_msg.h \ @@ -130,6 +132,8 @@ SOURCES += \ src/net/common/servercontext.cpp \ src/net/common/serverexception.cpp \ src/net/common/serveracceptthread.cpp \ + src/net/common/servergamethread.cpp \ + src/net/common/servergamestate.cpp \ src/net/common/serverlobbythread.cpp \ src/net/common/servercallback.cpp \ src/net/common/sessiondata.cpp \ diff --git a/src/net/common/servergamestate.cpp b/src/net/common/servergamestate.cpp index 3695442b..c58ef872 100644 --- a/src/net/common/servergamestate.cpp +++ b/src/net/common/servergamestate.cpp @@ -215,9 +215,10 @@ ServerGameStateInit::~ServerGameStateInit() { } -void +bool ServerGameStateInit::HandleNewSession(ServerGameThread &server, SessionWrapper session) { + bool retVal = false; if (session.sessionData.get() && session.playerData.get()) { size_t curNumPlayers = server.GetCurNumberOfPlayers(); @@ -253,8 +254,10 @@ ServerGameStateInit::HandleNewSession(ServerGameThread &server, SessionWrapper s session.sessionData->SetState(SessionData::Game); // Accept session. server.GetSessionManager().AddSession(session); + retVal = true; } } + return retVal; } int @@ -321,11 +324,11 @@ AbstractServerGameStateRunning::~AbstractServerGameStateRunning() { } -void +bool AbstractServerGameStateRunning::HandleNewSession(ServerGameThread &server, SessionWrapper session) { // Do not accept new sessions in this state. - server.RejectSession(session); + return false; } //----------------------------------------------------------------------------- diff --git a/src/net/common/servergamethread.cpp b/src/net/common/servergamethread.cpp index 9da6e966..d902f70f 100644 --- a/src/net/common/servergamethread.cpp +++ b/src/net/common/servergamethread.cpp @@ -50,12 +50,13 @@ private: }; -ServerGameThread::ServerGameThread(ServerLobbyThread &lobbyThread, GuiInterface &gui, ConfigFile *playerConfig) -: m_lobbyThread(lobbyThread), m_gui(gui), m_gameId(0), m_playerConfig(playerConfig), m_curState(NULL) +ServerGameThread::ServerGameThread(ServerLobbyThread &lobbyThread, u_int32_t id, const string &name, GuiInterface &gui, ConfigFile *playerConfig) +: m_lobbyThread(lobbyThread), m_gui(gui), m_id(id), m_name(name), m_playerConfig(playerConfig), m_curState(NULL), m_gameNum(1) { m_senderCallback.reset(new ServerSenderCallback(*this)); m_sender.reset(new SenderThread(GetSenderCallback())); m_receiver.reset(new ReceiverHelper); + SetState(SERVER_INITIAL_STATE::Instance()); } ServerGameThread::~ServerGameThread() @@ -69,10 +70,22 @@ ServerGameThread::Init(const string &pwd, const GameData &gameData) m_gameData = gameData; } -void +u_int32_t +ServerGameThread::GetId() const +{ + return m_id; +} + +const std::string & +ServerGameThread::GetName() const +{ + return m_name; +} + +bool ServerGameThread::AddSession(SessionWrapper session) { - GetState().HandleNewSession(*this, session); + return GetState().HandleNewSession(*this, session); } GameState @@ -90,7 +103,6 @@ ServerGameThread::SendToAllPlayers(boost::shared_ptr packet) void ServerGameThread::Main() { - SetState(SERVER_INITIAL_STATE::Instance()); GetSender().Run(); try @@ -149,7 +161,7 @@ ServerGameThread::InternalStartGame() SetStartData(startData); - m_game.reset(new Game(&gui, factory, playerData, GetGameData(), GetStartData(), GetNextGameId())); + m_game.reset(new Game(&gui, factory, playerData, GetGameData(), GetStartData(), GetNextGameNum())); } void @@ -260,12 +272,6 @@ ServerGameThread::AssignPlayerNumbers() } } -unsigned -ServerGameThread::GetNextGameId() -{ - return m_gameId++; -} - SessionManager & ServerGameThread::GetSessionManager() { @@ -369,3 +375,9 @@ ServerGameThread::GetGui() return m_gui; } +unsigned +ServerGameThread::GetNextGameNum() +{ + return m_gameNum++; +} + diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index e2851d92..eb23d461 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -18,6 +18,7 @@ ***************************************************************************/ #include +#include #include #include #include @@ -54,7 +55,7 @@ private: ServerLobbyThread::ServerLobbyThread(GuiInterface &gui, ConfigFile *playerConfig) -: m_gui(gui), m_playerConfig(playerConfig) +: m_gui(gui), m_playerConfig(playerConfig), m_curUniquePlayerId(0), m_curGameId(0) { m_senderCallback.reset(new ServerSenderCallback(*this)); m_sender.reset(new SenderThread(GetSenderCallback())); @@ -98,6 +99,12 @@ ServerLobbyThread::GetNextUniquePlayerId() return m_curUniquePlayerId++; } +u_int32_t +ServerLobbyThread::GetNextGameId() +{ + return m_curGameId++; +} + void ServerLobbyThread::Main() { @@ -250,11 +257,65 @@ ServerLobbyThread::HandleNetPacketInit(SessionWrapper session, const NetPacketIn void ServerLobbyThread::HandleNetPacketCreateGame(SessionWrapper session, const NetPacketCreateGame &tmpPacket) { + // Create a new game. + NetPacketCreateGame::Data createGameData; + tmpPacket.GetData(createGameData); + + boost::shared_ptr game( + new ServerGameThread(*this, GetNextGameId(), createGameData.gameName, GetGui(), m_playerConfig)); + game->Init(createGameData.password, createGameData.gameData); + + // Add session to the game. + if (game->AddSession(session)) + { + // Remove session from the lobby. + m_sessionManager.RemoveSession(session.sessionData->GetSocket()); + + // Add game to list. + m_gameMap.insert(GameMap::value_type(game->GetId(), game)); + + // Start the game. + game->Run(); + + // Send ack to client. + boost::shared_ptr createGameAck(new NetPacketCreateGameAck); + NetPacketCreateGameAck::Data createGameAckData; + createGameAckData.gameId = game->GetId(); + static_cast(createGameAck.get())->SetData(createGameAckData); + GetSender().Send(session.sessionData->GetSocket(), createGameAck); + } } void ServerLobbyThread::HandleNetPacketJoinGame(SessionWrapper session, const NetPacketJoinGame &tmpPacket) { + // Join an existing game. + NetPacketJoinGame::Data joinGameData; + tmpPacket.GetData(joinGameData); + + GameMap::iterator pos = m_gameMap.find(joinGameData.gameId); + + // TODO: handle errors + if (pos != m_gameMap.end()) + { + ServerGameThread &game = *pos->second; + if (game.CheckPassword(joinGameData.password)) + { + // Add session to the game. + if (game.AddSession(session)) + { + // Remove session from the lobby. + m_sessionManager.RemoveSession(session.sessionData->GetSocket()); + + // Send ack to client. + boost::shared_ptr joinGameAck(new NetPacketJoinGameAck); + NetPacketJoinGameAck::Data joinGameAckData; + joinGameAckData.gameData = game.GetGameData(); + static_cast(joinGameAck.get())->SetData(joinGameAckData); + GetSender().Send(session.sessionData->GetSocket(), joinGameAck); + } + } + } } void diff --git a/src/net/servergamestate.h b/src/net/servergamestate.h index 50b1c001..9af09362 100644 --- a/src/net/servergamestate.h +++ b/src/net/servergamestate.h @@ -47,7 +47,7 @@ public: virtual void Init() = 0; // Handling of a new TCP connection. - virtual void HandleNewSession(ServerGameThread &server, SessionWrapper session) = 0; + virtual bool HandleNewSession(ServerGameThread &server, SessionWrapper session) = 0; // Main processing function of the current state. virtual int Process(ServerGameThread &server) = 0; @@ -95,7 +95,7 @@ public: virtual ~AbstractServerGameStateRunning(); // Reject new connections. - virtual void HandleNewSession(ServerGameThread &server, SessionWrapper session); + virtual bool HandleNewSession(ServerGameThread &server, SessionWrapper session); protected: @@ -113,7 +113,7 @@ public: virtual void Init() {} // - virtual void HandleNewSession(ServerGameThread &server, SessionWrapper session); + virtual bool HandleNewSession(ServerGameThread &server, SessionWrapper session); protected: diff --git a/src/net/servergamethread.h b/src/net/servergamethread.h index fde9e9d1..93c9521d 100644 --- a/src/net/servergamethread.h +++ b/src/net/servergamethread.h @@ -25,6 +25,8 @@ #include #include +#include + #define GAME_THREAD_TERMINATE_TIMEOUT 200 @@ -40,20 +42,28 @@ class Game; class ServerGameThread : public Thread { public: - ServerGameThread(ServerLobbyThread &lobbyThread, GuiInterface &gui, ConfigFile *playerConfig); + ServerGameThread(ServerLobbyThread &lobbyThread, u_int32_t id, const std::string &name, GuiInterface &gui, ConfigFile *playerConfig); virtual ~ServerGameThread(); void Init(const std::string &pwd, const GameData &gameData); - void AddSession(SessionWrapper session); + u_int32_t GetId() const; + const std::string &GetName() const; + + bool AddSession(SessionWrapper session); ServerCallback &GetCallback(); GameState GetCurRound() const; void SendToAllPlayers(boost::shared_ptr packet); + bool CheckPassword(const std::string &password) const; + const GameData &GetGameData() const; + protected: + typedef std::deque SessionQueue; + // Main function of the thread. virtual void Main(); @@ -72,8 +82,6 @@ protected: size_t GetCurNumberOfPlayers() const; void AssignPlayerNumbers(); - unsigned GetNextGameId(); - SessionManager &GetSessionManager(); const SessionManager &GetSessionManager() const; ServerLobbyThread &GetLobbyThread(); @@ -86,16 +94,15 @@ protected: Game &GetGame(); const Game &GetGame() const; - const GameData &GetGameData() const; const StartData &GetStartData() const; void SetStartData(const StartData &startData); - bool CheckPassword(const std::string &password) const; - ServerSenderCallback &GetSenderCallback(); GuiInterface &GetGui(); + unsigned GetNextGameNum(); + private: SessionManager m_sessionManager; @@ -107,13 +114,15 @@ private: std::auto_ptr m_senderCallback; GuiInterface &m_gui; - GameData m_gameData; - StartData m_startData; - std::auto_ptr m_game; - unsigned m_gameId; - std::string m_password; - ConfigFile *m_playerConfig; - ServerGameState *m_curState; + GameData m_gameData; + StartData m_startData; + std::auto_ptr m_game; + const u_int32_t m_id; + std::string m_name; + std::string m_password; + ConfigFile *m_playerConfig; + ServerGameState *m_curState; + unsigned m_gameNum; friend class AbstractServerGameStateReceiving; friend class AbstractServerGameStateRunning; diff --git a/src/net/serverlobbythread.h b/src/net/serverlobbythread.h index c831e4b6..a4da61eb 100644 --- a/src/net/serverlobbythread.h +++ b/src/net/serverlobbythread.h @@ -37,6 +37,7 @@ class SenderThread; class ReceiverHelper; class ServerSenderCallback; +class ServerGameThread; class ConfigFile; struct GameData; class Game; @@ -53,6 +54,7 @@ public: void CloseSessionDelayed(SessionWrapper session); u_int32_t GetNextUniquePlayerId(); + u_int32_t GetNextGameId(); ServerCallback &GetCallback(); protected: @@ -60,6 +62,7 @@ protected: typedef std::deque > ConnectQueue; typedef std::list SessionList; typedef std::list > > CloseSessionList; + typedef std::map > GameMap; // Main function of the thread. virtual void Main(); @@ -98,6 +101,8 @@ private: CloseSessionList m_closeSessionList; mutable boost::mutex m_closeSessionListMutex; + GameMap m_gameMap; + std::auto_ptr m_receiver; std::auto_ptr m_sender; std::auto_ptr m_senderCallback; @@ -106,6 +111,7 @@ private: std::string m_password; ConfigFile *m_playerConfig; u_int32_t m_curUniquePlayerId; + u_int32_t m_curGameId; }; #endif