////////////////////////////////////////////////////////////////////////
// OpenTibia - an opensource roleplaying game
////////////////////////////////////////////////////////////////////////
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
////////////////////////////////////////////////////////////////////////
#include "otpch.h"
#include
#include
#include
#include "gameservers.h"
#include "tools.h"
void GameServers::clear()
{
for(GameServersMap::iterator it = serverList.begin(); it != serverList.end(); ++it)
delete it->second;
serverList.clear();
}
bool GameServers::reload(bool showResult/* = true*/)
{
clear();
return loadFromXml(showResult);
}
bool GameServers::loadFromXml(bool showResult/* = true*/)
{
xmlDocPtr doc = xmlParseFile(getFilePath(FILE_TYPE_XML, "servers.xml").c_str());
if(!doc)
{
std::cout << "[Warning - GameServers::loadFromXml] Cannot load servers file." << std::endl;
std::cout << getLastXMLError() << std::endl;
return false;
}
xmlNodePtr p, root = xmlDocGetRootElement(doc);
if(xmlStrcmp(root->name,(const xmlChar*)"servers"))
{
std::cout << "[Error - GameServers::loadFromXml] Malformed servers file." << std::endl;
xmlFreeDoc(doc);
return false;
}
std::string strValue;
int32_t intValue;
p = root->children;
while(p)
{
if(xmlStrcmp(p->name, (const xmlChar*)"server"))
{
p = p->next;
continue;
}
std::string name, address;
uint32_t id, versionMin, versionMax, port;
if(readXMLInteger(p, "id", intValue))
id = intValue;
else
{
std::cout << "[Error - GameServers::loadFromXml] Missing id, skipping" << std::endl;
p = p->next;
continue;
}
if(getServerById(id))
{
std::cout << "[Error - GameServers::loadFromXml] Duplicate server id " << id << ", skipping" << std::endl;
p = p->next;
continue;
}
if(readXMLString(p, "name", strValue))
name = strValue;
else
{
name = "Server #" + id;
std::cout << "[Warning - GameServers::loadFromXml] Missing name for server " << id << ", using default" << std::endl;
}
if(readXMLInteger(p, "versionMin", intValue))
versionMin = intValue;
else
{
versionMin = CLIENT_VERSION_MIN;
std::cout << "[Warning - GameServers::loadFromXml] Missing versionMin for server " << id << ", using default" << std::endl;
}
if(readXMLInteger(p, "versionMax", intValue))
versionMax = intValue;
else
{
versionMax = CLIENT_VERSION_MAX;
std::cout << "[Warning - GameServers::loadFromXml] Missing versionMax for server " << id << ", using default" << std::endl;
}
if(readXMLString(p, "address", strValue) || readXMLString(p, "ip", strValue))
address = strValue;
else
{
address = "localhost";
std::cout << "[Warning - GameServers::loadFromXml] Missing address for server " << id << ", using default" << std::endl;
}
if(readXMLInteger(p, "port", intValue))
port = intValue;
else
{
port = 7171;
std::cout << "[Warning - GameServers::loadFromXml] Missing port for server " << id << ", using default" << std::endl;
}
if(GameServer* server = new GameServer(name, versionMin, versionMax, address, port))
serverList[id] = server;
else
std::cout << "[Error - GameServers::loadFromXml] Couldn't add server " << name << std::endl;
p = p->next;
}
xmlFreeDoc(doc);
if(showResult)
{
std::cout << "> Servers loaded:" << std::endl;
for(GameServersMap::iterator it = serverList.begin(); it != serverList.end(); it++)
std::cout << it->second->getName() << " (" << it->second->getAddress() << ":" << it->second->getPort() << ")" << std::endl;
}
return true;
}
GameServer* GameServers::getServerById(uint32_t id) const
{
GameServersMap::const_iterator it = serverList.find(id);
if(it != serverList.end())
return it->second;
return NULL;
}
GameServer* GameServers::getServerByName(std::string name) const
{
for(GameServersMap::const_iterator it = serverList.begin(); it != serverList.end(); ++it)
{
if(it->second->getName() == name)
return it->second;
}
return NULL;
}
GameServer* GameServers::getServerByAddress(std::string address) const
{
for(GameServersMap::const_iterator it = serverList.begin(); it != serverList.end(); ++it)
{
if(it->second->getAddress() == address)
return it->second;
}
return NULL;
}
GameServer* GameServers::getServerByPort(uint32_t port) const
{
for(GameServersMap::const_iterator it = serverList.begin(); it != serverList.end(); ++it)
{
if(it->second->getPort() == port)
return it->second;
}
return NULL;
}