Adding stuff for server list (choosing a server). Might not compile (untested yet).

This commit is contained in:
lotodore
2009-04-05 11:19:50 +00:00
parent 725d71e154
commit 009249e41a
6 changed files with 162 additions and 19 deletions
+11
View File
@@ -24,6 +24,7 @@
#include <core/thread.h>
#include <net/senderinterface.h>
#include <guiinterface.h>
#include <serverdata.h>
#include <playerdata.h>
#include <gamedata.h>
#include <string>
@@ -74,6 +75,8 @@ public:
void SendAskKickPlayer(unsigned playerId);
void SendVoteKick(bool doKick);
ServerInfo GetServerInfo(unsigned serverId) const;
GameInfo GetGameInfo(unsigned gameId) const;
PlayerInfo GetPlayerInfo(unsigned playerId) const;
bool GetPlayerIdFromName(const std::string &playerName, unsigned &playerId) const;
@@ -89,6 +92,7 @@ protected:
typedef std::list<boost::shared_ptr<NetPacket> > NetPacketList;
typedef std::map<unsigned, PlayerInfo> PlayerInfoMap;
typedef std::map<unsigned, boost::shared_ptr<AvatarData> > AvatarDataMap;
typedef std::map<unsigned, ServerInfo> ServerInfoMap;
// Main function of the thread.
virtual void Main();
@@ -147,6 +151,10 @@ protected:
void RemoveDisconnectedPlayers();
void AddServerInfo(unsigned serverId, const ServerInfo &info);
void ClearServerInfoMap();
void UseServer(unsigned serverId);
unsigned GetGameIdByName(const std::string &name) const;
void AddGameInfo(unsigned gameId, const GameInfo &info);
void UpdateGameInfoMode(unsigned gameId, GameMode mode);
@@ -188,6 +196,9 @@ private:
StartData m_startData;
PlayerDataList m_playerDataList;
ServerInfoMap m_serverInfoMap;
mutable boost::mutex m_serverInfoMapMutex;
GameInfoMap m_gameInfoMap;
mutable boost::mutex m_gameInfoMapMutex;
+50 -19
View File
@@ -448,36 +448,67 @@ ClientStateReadingServerList::Process(ClientThread &client)
if (doc.LoadFile())
{
TiXmlHandle docHandle(&doc);
const TiXmlElement *firstServer = docHandle.FirstChild("ServerList" ).FirstChild("Server").ToElement();
if (firstServer)
client.ClearServerInfoMap();
int serverCount = 0;
unsigned lastServerInfoId = 0;
TiXmlHandle docHandle(&doc);
const TiXmlElement *nextServer = docHandle.FirstChild("ServerList" ).FirstChild("Server").ToElement();
while (nextServer)
{
const TiXmlNode *addrNode;
if (context.GetAddrFamily() == AF_INET6)
addrNode = firstServer->FirstChild("IPv6Address");
else
addrNode = firstServer->FirstChild("IPv4Address");
const TiXmlNode *portNode = firstServer->FirstChild("Port");
ServerInfo serverInfo;
{
int tmpId;
nextServer->QueryIntAttribute("value", &tmpId);
serverInfo.id = (unsigned)tmpId;
}
const TiXmlNode *nameNode = nextServer->FirstChild("Name");
const TiXmlNode *sponsorNode = nextServer->FirstChild("Sponsor");
const TiXmlNode *countryNode = nextServer->FirstChild("Country");
const TiXmlNode *addr4Node = nextServer->FirstChild("IPv4Address");
const TiXmlNode *addr6Node = nextServer->FirstChild("IPv6Address");
const TiXmlNode *sctpNode = nextServer->FirstChild("SCTP");
const TiXmlNode *portNode = nextServer->FirstChild("Port");
// Currently, only IPv4 is supported for avatar servers.
const TiXmlNode *avatarNode = firstServer->FirstChild("AvatarServerAddress");
// IPv6 support for avatar servers depends on this address and on libcurl.
const TiXmlNode *avatarNode = nextServer->FirstChild("AvatarServerAddress");
if (!addrNode || !addrNode->ToElement() || !portNode || !portNode->ToElement())
if (!nameNode || !nameNode->ToElement() || !addrNode || !addr4Node->ToElement()
|| !addr6Node->ToElement() || !portNode || !portNode->ToElement())
throw ClientException(__FILE__, __LINE__, ERR_SOCK_INVALID_SERVERLIST_XML, 0);
context.SetServerAddr(addrNode->ToElement()->Attribute("value"));
serverInfo.name = nameNode->ToElement()->Attribute("value");
serverInfo.ipv4addr = addr4Node->ToElement()->Attribute("value");
serverInfo.ipv6addr = addr6Node->ToElement()->Attribute("value");
portNode->ToElement()->QueryIntAttribute("value", &serverInfo.port);
int tmpPort = 0;
portNode->ToElement()->QueryIntAttribute("value", &tmpPort);
context.SetServerPort((unsigned)tmpPort);
if (avatarNode && avatarNode->ToElement()) // optional
// Optional parameters:
if (sponsorNode && sponsorNode->ToElement())
serverInfo.sponsor = sponsorNode->ToElement()->Attribute("value");
if (countryNode && countryNode->ToElement())
serverInfo.country = countryNode->ToElement()->Attribute("value");
if (sctpNode && sctpNode->ToElement())
{
context.SetAvatarServerAddr(avatarNode->ToElement()->Attribute("value"));
int tmpSctp;
sctpNode->ToElement()->QueryIntAttribute
}
if (avatarNode && avatarNode->ToElement())
serverInfo.avatarServerAddr = avatarNode->ToElement()->Attribute("value");
client.AddServerInfo(serverInfo.id, serverInfo);
nextServer = nextServer->NextSiblingElement();
lastServerInfoId = serverInfo.id;
serverCount++;
}
if (serverCount == 1)
{
client.UseServer(lastServerInfoId);
retVal = MSG_SOCK_SERVER_LIST_DONE;
}
else if (serverCount > 0)
{
// TODO....
}
else
throw ClientException(__FILE__, __LINE__, ERR_SOCK_INVALID_SERVERLIST_XML, 0);
}
+49
View File
@@ -284,6 +284,19 @@ ClientThread::SendVoteKick(bool doKick)
m_outPacketList.push_back(vote);
}
ServerInfo
ClientThread::GetServerInfo(unsigned serverId) const
{
ServerInfo tmpInfo;
boost::mutex::scoped_lock lock(m_serverInfoMapMutex);
ServerInfoMap::const_iterator pos = m_serverInfoMap.find(serverId);
if (pos != m_serverInfoMap.end())
{
tmpInfo = pos->second;
}
return tmpInfo;
}
GameInfo
ClientThread::GetGameInfo(unsigned gameId) const
{
@@ -941,6 +954,42 @@ ClientThread::RemoveDisconnectedPlayers()
}
}
void
ClientThread::AddServerInfo(unsigned serverId, const ServerInfo &info)
{
{
boost::mutex::scoped_lock lock(m_serverInfoMapMutex);
m_serverInfoMap.insert(ServerInfoMap::value_type(serverId, info));
}
//GetCallback().SignalNetClientServerListAdd(serverId);
}
void
ClientThread::ClearServerInfoMap()
{
{
boost::mutex::scoped_lock lock(m_serverInfoMapMutex);
m_serverInfoMap.clear();
}
//GetCallback().SignalNetClientServerListClear();
}
void
ClientThread::UseServer(unsigned serverId)
{
ClientContext &context = client.GetContext();
ServerInfo useInfo(GetServerInfo(serverId));
if (context.GetAddrFamily() == AF_INET6)
context.SetServerAddr(useInfo.ipv6addr);
else
context.SetServerAddr(useInfo.ipv4addr);
context.SetServerPort((unsigned)useInfo.port);
context.SetAvatarServerAddr(useInfo.avatarServerAddr);
}
unsigned
ClientThread::GetGameIdByName(const std::string &name) const
{