Adding stuff for server list (choosing a server). Might not compile (untested yet).
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user