From 534b6066a8b0b36c852a50ed8e62e9b9d186aefa Mon Sep 17 00:00:00 2001 From: lotodore Date: Sun, 5 Apr 2009 12:31:12 +0000 Subject: [PATCH] More work on server selection. Currently untested. --- src/net/clientstate.h | 16 ++++++++++++ src/net/clientthread.h | 6 +++++ src/net/common/clientstate.cpp | 43 ++++++++++++++++++++++++++++++--- src/net/common/clientthread.cpp | 22 ++++++++++++++++- src/session.cpp | 7 ++++++ src/session.h | 1 + 6 files changed, 90 insertions(+), 5 deletions(-) diff --git a/src/net/clientstate.h b/src/net/clientstate.h index 606dc13f..592b12e4 100644 --- a/src/net/clientstate.h +++ b/src/net/clientstate.h @@ -188,6 +188,22 @@ protected: ClientStateReadingServerList(); }; +// State: Waiting for the user to choose a server. +class ClientStateWaitChooseServer : public ClientState +{ +public: + static ClientStateWaitChooseServer &Instance(); + + virtual ~ClientStateWaitChooseServer(); + + virtual int Process(ClientThread &client); + +protected: + + // Protected constructor - this is a singleton. + ClientStateWaitChooseServer(); +}; + // State: Initiate server connection. class ClientStateStartConnect : public ClientState { diff --git a/src/net/clientthread.h b/src/net/clientthread.h index de96d427..2a367bb3 100644 --- a/src/net/clientthread.h +++ b/src/net/clientthread.h @@ -75,6 +75,7 @@ public: void SendAskKickPlayer(unsigned playerId); void SendVoteKick(bool doKick); + void SelectServer(unsigned serverId); ServerInfo GetServerInfo(unsigned serverId) const; GameInfo GetGameInfo(unsigned gameId) const; @@ -153,6 +154,7 @@ protected: void AddServerInfo(unsigned serverId, const ServerInfo &info); void ClearServerInfoMap(); + bool GetSelectedServer(unsigned &serverId) const; void UseServer(unsigned serverId); unsigned GetGameIdByName(const std::string &name) const; @@ -199,6 +201,10 @@ private: ServerInfoMap m_serverInfoMap; mutable boost::mutex m_serverInfoMapMutex; + bool m_isServerSelected; + unsigned m_selectedServerId; + mutable boost::mutex m_selectServerMutex; + GameInfoMap m_gameInfoMap; mutable boost::mutex m_gameInfoMapMutex; diff --git a/src/net/common/clientstate.cpp b/src/net/common/clientstate.cpp index 083dea3a..6437d2d2 100644 --- a/src/net/common/clientstate.cpp +++ b/src/net/common/clientstate.cpp @@ -504,11 +504,12 @@ ClientStateReadingServerList::Process(ClientThread &client) if (serverCount == 1) { client.UseServer(lastServerInfoId); + client.SetState(ClientStateStartResolve::Instance()); retVal = MSG_SOCK_SERVER_LIST_DONE; } - else if (serverCount > 0) + else if (serverCount > 1) { - // TODO.... + client.SetState(ClientStateWaitChooseServer::Instance()); } else throw ClientException(__FILE__, __LINE__, ERR_SOCK_INVALID_SERVERLIST_XML, 0); @@ -516,7 +517,41 @@ ClientStateReadingServerList::Process(ClientThread &client) else throw ClientException(__FILE__, __LINE__, ERR_SOCK_INVALID_SERVERLIST_XML, 0); - client.SetState(ClientStateStartResolve::Instance()); + + return retVal; +} + +//----------------------------------------------------------------------------- + +ClientStateWaitChooseServer & +ClientStateWaitChooseServer::Instance() +{ + static ClientStateWaitChooseServer state; + return state; +} + +ClientStateWaitChooseServer::ClientStateWaitChooseServer() +{ +} + +ClientStateWaitChooseServer::~ClientStateWaitChooseServer() +{ +} + +int +ClientStateWaitChooseServer::Process(ClientThread &client) +{ + int retVal = MSG_SOCK_INTERNAL_PENDING; + + unsigned serverId; + if (client.GetSelectedServer(serverid)) + { + client.UseServer(serverid); + client.SetState(ClientStateStartResolve::Instance()); + retVal = MSG_SOCK_SERVER_LIST_DONE; + } + else + Thread::Msleep(20); return retVal; } @@ -1593,7 +1628,7 @@ ClientStateFinal::~ClientStateFinal() int ClientStateFinal::Process(ClientThread &/*client*/) { - Thread::Msleep(10); + Thread::Msleep(20); return MSG_SOCK_INTERNAL_PENDING; } diff --git a/src/net/common/clientthread.cpp b/src/net/common/clientthread.cpp index eab332fe..f13600a4 100644 --- a/src/net/common/clientthread.cpp +++ b/src/net/common/clientthread.cpp @@ -60,7 +60,7 @@ private: }; ClientThread::ClientThread(GuiInterface &gui, AvatarManager &avatarManager) -: m_curState(NULL), m_gui(gui), m_avatarManager(avatarManager), +: m_curState(NULL), m_gui(gui), m_avatarManager(avatarManager), m_isServerSelected(false), m_curGameId(0), m_curGameNum(1), m_guiPlayerId(0), m_sessionEstablished(false) { m_ioService.reset(new boost::asio::io_service()); @@ -284,6 +284,14 @@ ClientThread::SendVoteKick(bool doKick) m_outPacketList.push_back(vote); } +void +ClientThread::SelectServer(unsigned serverId) +{ + boost::mutex::scoped_lock lock(m_selectServerMutex); + m_isServerSelected = true; + m_selectedServerId = serverId; +} + ServerInfo ClientThread::GetServerInfo(unsigned serverId) const { @@ -974,6 +982,18 @@ ClientThread::ClearServerInfoMap() //GetCallback().SignalNetClientServerListClear(); } +bool +ClientThread::GetSelectedServer(unsigned &serverId) const +{ + bool retVal = false; + boost::mutex::scoped_lock lock(m_selectServerMutex); + if (m_isServerSelected) + { + retVal = true; + serverId = m_selectedServerId; + } + return retVal; +} void ClientThread::UseServer(unsigned serverId) diff --git a/src/session.cpp b/src/session.cpp index 9365b762..08956906 100755 --- a/src/session.cpp +++ b/src/session.cpp @@ -404,6 +404,13 @@ void Session::startVoteKickPlayer(unsigned playerId) myNetClient->SendAskKickPlayer(playerId); } +void Session::selectServer(unsigned serverId) +{ + if (!myNetClient) + return; // only act if client is running. + myNetClient->SelectServer(serverId); +} + void Session::voteKick(bool doKick) { if (!myNetClient) diff --git a/src/session.h b/src/session.h index 97b2341a..f963889e 100755 --- a/src/session.h +++ b/src/session.h @@ -83,6 +83,7 @@ public: void kickPlayer(const std::string &playerName); void startVoteKickPlayer(unsigned playerId); void voteKick(bool doKick); + void selectServer(unsigned serverId); void resetNetworkTimeout();