From 28c6adc21db25de911fddc48912a61b101bfae84 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 12 Jun 2017 23:59:57 +0300 Subject: Load sources url list for each server from servers list xml. --- src/CMakeLists.txt | 1 + src/Makefile.am | 1 + src/gui/windows/serverdialog.cpp | 51 +++++++++++++++++++++++++++++++++++++++- src/net/serverinfo.h | 11 +++++++++ src/net/serverurlinfo.h | 49 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 src/net/serverurlinfo.h (limited to 'src') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8baf3b537..e82b73366 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -581,6 +581,7 @@ SET(SRCS net/sdltcpnet.h net/serverfeatures.h net/serverinfo.h + net/serverurlinfo.h net/skillhandler.h net/tradehandler.h net/updatetypeoperators.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 0be6ca0cc..c16c71395 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1516,6 +1516,7 @@ SRC = ${BASE_SRC} \ net/recvpacketdefine.h \ net/serverfeatures.h \ net/serverinfo.h \ + net/serverurlinfo.h \ net/skillhandler.h \ net/tradehandler.h \ net/updatetypeoperators.cpp \ diff --git a/src/gui/windows/serverdialog.cpp b/src/gui/windows/serverdialog.cpp index 89a4774ee..6192f040d 100644 --- a/src/gui/windows/serverdialog.cpp +++ b/src/gui/windows/serverdialog.cpp @@ -244,6 +244,8 @@ void ServerDialog::connectToSelectedServer() mServerInfo->updateMirrors = server.updateMirrors; mServerInfo->packetVersion = server.packetVersion; mServerInfo->updateHosts = server.updateHosts; + mServerInfo->freeSources = server.freeSources; + mServerInfo->nonFreeSources = server.nonFreeSources; settings.persistentIp = mServerInfo->persistentIp; settings.supportUrl = mServerInfo->supportUrl; @@ -474,8 +476,11 @@ static void loadHostsGroup(XmlNodeConstPtr node, _("Unknown")); for_each_xml_child_node(hostNode, node) { - if (!xmlNameEqual(hostNode, "host")) + if (!xmlNameEqual(hostNode, "host") || + !XmlHaveChildContent(hostNode)) + { continue; + } const std::string host = XmlChildContent(hostNode); if (host.empty()) continue; @@ -491,6 +496,44 @@ static void loadHostsGroup(XmlNodeConstPtr node, server.updateHosts.push_back(group); } +static void loadServerSourcesList(XmlNodeConstPtr node, + std::vector &list) +{ + for_each_xml_child_node(urlNode, node) + { + if (!xmlNameEqual(urlNode, "url") || + !XmlHaveChildContent(urlNode)) + { + continue; + } + const std::string name = XML::langProperty(urlNode, + "name", + ""); + if (name.empty()) + continue; + const std::string url = XmlChildContent(urlNode); + if (url.empty()) + continue; + list.push_back(ServerUrlInfo(name, url)); + } +} + +static void loadServerSources(XmlNodeConstPtr node, + ServerInfo &server) +{ + for_each_xml_child_node(subNode, node) + { + if (xmlNameEqual(subNode, "free")) + { + loadServerSourcesList(subNode, server.freeSources); + } + else if (xmlNameEqual(subNode, "nonfree")) + { + loadServerSourcesList(subNode, server.nonFreeSources); + } + } +} + void ServerDialog::loadServers(const bool addNew) { XML::Document doc(pathJoin(mDir, @@ -618,6 +661,10 @@ void ServerDialog::loadServers(const bool addNew) // TRANSLATORS: default hosts group name subNode, "name", _("default")); } + else if (xmlNameEqual(subNode, "sources")) + { + loadServerSources(subNode, server); + } } server.version.first = font->getWidth(version); @@ -646,6 +693,8 @@ void ServerDialog::loadServers(const bool addNew) mServers[i].defaultHostName = server.defaultHostName; mServers[i].updateHosts = server.updateHosts; mServers[i].packetVersion = server.packetVersion; + mServers[i].freeSources = server.freeSources; + mServers[i].nonFreeSources = server.nonFreeSources; mServersListModel->setVersionString(i, version); found = true; break; diff --git a/src/net/serverinfo.h b/src/net/serverinfo.h index e83e51b56..ab4a99081 100644 --- a/src/net/serverinfo.h +++ b/src/net/serverinfo.h @@ -27,6 +27,7 @@ #include "enums/net/servertype.h" #include "net/hostsgroup.h" +#include "net/serverurlinfo.h" #include "utils/stringutils.h" @@ -49,6 +50,8 @@ class ServerInfo final std::string defaultHostName; std::vector updateMirrors; std::vector updateHosts; + std::vector freeSources; + std::vector nonFreeSources; uint16_t port; VersionString version; int packetVersion; @@ -68,6 +71,8 @@ class ServerInfo final defaultHostName(), updateMirrors(), updateHosts(), + freeSources(), + nonFreeSources(), #ifdef TMWA_SUPPORT port(6901), #else // TMWA_SUPPORT @@ -94,6 +99,8 @@ class ServerInfo final defaultHostName(info.defaultHostName), updateMirrors(info.updateMirrors), updateHosts(info.updateHosts), + freeSources(info.freeSources), + nonFreeSources(info.nonFreeSources), port(info.port), version(), packetVersion(info.packetVersion), @@ -120,6 +127,8 @@ class ServerInfo final defaultHostName = info.defaultHostName; updateMirrors = info.updateMirrors; updateHosts = info.updateHosts; + freeSources = info.freeSources; + nonFreeSources = info.nonFreeSources; port = info.port; save = info.save; persistentIp = info.persistentIp; @@ -150,6 +159,8 @@ class ServerInfo final defaultHostName.clear(); updateMirrors.clear(); updateHosts.clear(); + freeSources.clear(); + nonFreeSources.clear(); version.first = 0; version.second.clear(); packetVersion = 0; diff --git a/src/net/serverurlinfo.h b/src/net/serverurlinfo.h new file mode 100644 index 000000000..8ef5b4d7b --- /dev/null +++ b/src/net/serverurlinfo.h @@ -0,0 +1,49 @@ +/* + * The ManaPlus Client + * Copyright (C) 2016-2017 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * 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 2 of the License, or + * 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 . + */ + +#ifndef NET_SERVERURLINFO_H +#define NET_SERVERURLINFO_H + +#include "localconsts.h" + +#include + +struct ServerUrlInfo final +{ + ServerUrlInfo() : + name(), + url() + { + } + + ServerUrlInfo(const std::string name0, + const std::string url0) : + name(name0), + url(url0) + { + } + + A_DEFAULT_COPY(ServerUrlInfo) + + std::string name; + std::string url; +}; + +#endif // NET_SERVERURLINFO_H -- cgit v1.2.3-70-g09d2