More work on server selection. Currently untested.

This commit is contained in:
lotodore
2009-04-05 12:31:12 +00:00
parent 59a6b35dd1
commit 534b6066a8
6 changed files with 90 additions and 5 deletions
+16
View File
@@ -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
{
+6
View File
@@ -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;
+39 -4
View File
@@ -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;
}
+21 -1
View File
@@ -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)
+7
View File
@@ -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)
+1
View File
@@ -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();