summaryrefslogtreecommitdiff
path: root/src/gui/windows/serverdialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/windows/serverdialog.cpp')
-rw-r--r--src/gui/windows/serverdialog.cpp902
1 files changed, 0 insertions, 902 deletions
diff --git a/src/gui/windows/serverdialog.cpp b/src/gui/windows/serverdialog.cpp
deleted file mode 100644
index ab630e960..000000000
--- a/src/gui/windows/serverdialog.cpp
+++ /dev/null
@@ -1,902 +0,0 @@
-/*
- * The ManaPlus Client
- * Copyright (C) 2004-2009 The Mana World Development Team
- * Copyright (C) 2009-2010 The Mana Developers
- * Copyright (C) 2011-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 <http://www.gnu.org/licenses/>.
- */
-
-#include "gui/windows/serverdialog.h"
-
-#include "chatlogger.h"
-#include "client.h"
-#include "configuration.h"
-#include "main.h"
-#include "settings.h"
-
-#include "net/download.h"
-
-#include "fs/paths.h"
-
-#include "gui/widgets/checkbox.h"
-#include "gui/widgets/createwidget.h"
-#include "gui/widgets/desktop.h"
-#include "gui/windows/editserverdialog.h"
-#include "gui/windows/logindialog.h"
-#include "gui/windows/serverinfowindow.h"
-
-#include "gui/widgets/button.h"
-#include "gui/widgets/label.h"
-#include "gui/widgets/layout.h"
-#include "gui/widgets/serverslistbox.h"
-#include "gui/widgets/scrollarea.h"
-
-#include "utils/delete2.h"
-#include "utils/foreach.h"
-#include "utils/langs.h"
-
-#include "debug.h"
-
-#ifdef WIN32
-#undef ERROR
-#endif // WIN32
-
-static const int MAX_SERVERLIST = 15;
-
-static std::string serverTypeToString(const ServerTypeT type)
-{
- switch (type)
- {
- case ServerType::TMWATHENA:
-#ifdef TMWA_SUPPORT
- return "TmwAthena";
-#else // TMWA_SUPPORT
-
- return "";
-#endif // TMWA_SUPPORT
-
- case ServerType::EATHENA:
- return "eAthena";
- case ServerType::EVOL2:
- return "Evol2";
- default:
- case ServerType::UNKNOWN:
- return "";
- }
-}
-
-static uint16_t defaultPortForServerType(const ServerTypeT type)
-{
- switch (type)
- {
- default:
- case ServerType::EATHENA:
- case ServerType::EVOL2:
- return 6900;
- case ServerType::UNKNOWN:
- case ServerType::TMWATHENA:
- return 6901;
- }
-}
-
-ServerDialog::ServerDialog(ServerInfo *const serverInfo,
- const std::string &dir) :
- // TRANSLATORS: servers dialog name
- Window(_("Choose Your Server"), Modal_false, nullptr, "server.xml"),
- ActionListener(),
- KeyListener(),
- SelectionListener(),
- mMutex(),
- mServers(ServerInfos()),
- mDir(dir),
- mDescription(new Label(this, std::string())),
- // TRANSLATORS: servers dialog button
- mQuitButton(new Button(this, _("Quit"), "quit", this)),
- // TRANSLATORS: servers dialog button
- mConnectButton(new Button(this, _("Connect"), "connect", this)),
- // TRANSLATORS: servers dialog button
- mAddEntryButton(new Button(this, _("Add"), "addEntry", this)),
- // TRANSLATORS: servers dialog button
- mEditEntryButton(new Button(this, _("Edit"), "editEntry", this)),
- // TRANSLATORS: servers dialog button
- mDeleteButton(new Button(this, _("Delete"), "remove", this)),
- // TRANSLATORS: servers dialog button
- mLoadButton(new Button(this, _("Load"), "load", this)),
- // TRANSLATORS: servers dialog button
- mInfoButton(new Button(this, _("Info"), "info", this)),
- mServersListModel(new ServersListModel(&mServers, this)),
- mServersList(CREATEWIDGETR(ServersListBox, this, mServersListModel)),
- mDownload(nullptr),
- mServerInfo(serverInfo),
- mPersistentIPCheckBox(nullptr),
- mDownloadProgress(-1.0F),
- mDownloadStatus(ServerDialogDownloadStatus::UNKNOWN)
-{
- if (isSafeMode)
- {
- // TRANSLATORS: servers dialog name
- setCaption(_("Choose Your Server *** SAFE MODE ***"));
- }
-
- setWindowName("ServerDialog");
-
- setCloseButton(true);
-
- mPersistentIPCheckBox = new CheckBox(this,
- // TRANSLATORS: servers dialog checkbox
- _("Use same ip for game sub servers"),
- config.getBoolValue("usePersistentIP"),
- this, "persitent ip");
-
- loadCustomServers();
-
- mServersList->addMouseListener(this);
-
- ScrollArea *const usedScroll = new ScrollArea(this, mServersList,
- fromBool(getOptionBool("showbackground"), Opaque),
- "server_background.xml");
- usedScroll->setHorizontalScrollPolicy(ScrollArea::SHOW_NEVER);
-
- mServersList->addSelectionListener(this);
- usedScroll->setVerticalScrollAmount(0);
-
- place(0, 0, usedScroll, 8, 5).setPadding(3);
- place(0, 5, mDescription, 8);
- place(0, 6, mPersistentIPCheckBox, 8);
- place(0, 7, mInfoButton);
- place(1, 7, mAddEntryButton);
- place(2, 7, mEditEntryButton);
- place(3, 7, mLoadButton);
- place(4, 7, mDeleteButton);
- place(6, 7, mQuitButton);
- place(7, 7, mConnectButton);
-
- // Make sure the list has enough height
- getLayout().setRowHeight(0, 80);
-
- // Do this manually instead of calling reflowLayout so we can enforce a
- // minimum width.
- int width = 500;
- int height = 350;
-
- getLayout().reflow(width, height);
- setContentSize(width, height);
-
- setMinWidth(310);
- setMinHeight(220);
- setDefaultSize(getWidth(), getHeight(), ImagePosition::CENTER);
-
- setResizable(true);
- addKeyListener(this);
-
- loadWindowState();
-}
-
-void ServerDialog::postInit()
-{
- Window::postInit();
- setVisible(Visible_true);
-
- mConnectButton->requestFocus();
-
- loadServers(true);
-
- mServersList->setSelected(0); // Do this after for the Delete button
-
- if (needUpdateServers())
- downloadServerList();
- else
- logger->log("Skipping servers list update");
-}
-
-ServerDialog::~ServerDialog()
-{
- if (mDownload != nullptr)
- {
- mDownload->cancel();
- delete2(mDownload)
- }
- delete2(mServersListModel);
-}
-
-void ServerDialog::connectToSelectedServer()
-{
- if (client->getState() == State::CONNECT_SERVER)
- return;
-
- const int index = mServersList->getSelected();
- if (index < 0)
- return;
-
- if (mDownload != nullptr)
- mDownload->cancel();
-
- mQuitButton->setEnabled(false);
- mConnectButton->setEnabled(false);
- mLoadButton->setEnabled(false);
-
- ServerInfo server = mServers.at(index);
- mServerInfo->hostname = server.hostname;
- mServerInfo->althostname = server.althostname;
- mServerInfo->port = server.port;
- mServerInfo->type = server.type;
- mServerInfo->name = server.name;
- mServerInfo->description = server.description;
- mServerInfo->registerUrl = server.registerUrl;
- mServerInfo->onlineListUrl = server.onlineListUrl;
- mServerInfo->supportUrl = server.supportUrl;
- mServerInfo->defaultHostName = server.defaultHostName;
- mServerInfo->save = true;
- mServerInfo->persistentIp = server.persistentIp;
- mServerInfo->freeType = server.freeType;
- mServerInfo->updateMirrors = server.updateMirrors;
- mServerInfo->packetVersion = server.packetVersion;
- mServerInfo->updateHosts = server.updateHosts;
- mServerInfo->freeSources = server.freeSources;
- mServerInfo->nonFreeSources = server.nonFreeSources;
- mServerInfo->docs = server.docs;
- mServerInfo->serverUrl = server.serverUrl;
-
- settings.persistentIp = mServerInfo->persistentIp;
- settings.supportUrl = mServerInfo->supportUrl;
- settings.updateMirrors = mServerInfo->updateMirrors;
-
- if (chatLogger != nullptr)
- chatLogger->setServerName(mServerInfo->hostname);
-
- saveCustomServers(*mServerInfo);
-
- if (!LoginDialog::savedPasswordKey.empty())
- {
- if (mServerInfo->hostname != LoginDialog::savedPasswordKey)
- {
- LoginDialog::savedPassword.clear();
- if (desktop != nullptr)
- desktop->reloadWallpaper();
- }
- }
-
- config.setValue("usePersistentIP",
- mPersistentIPCheckBox->isSelected());
- client->setState(State::CONNECT_SERVER);
-}
-
-void ServerDialog::action(const ActionEvent &event)
-{
- const std::string &eventId = event.getId();
- if (eventId == "connect")
- {
- connectToSelectedServer();
- }
- else if (eventId == "quit")
- {
- close();
- }
- else if (eventId == "load")
- {
- downloadServerList();
- }
- else if (eventId == "addEntry")
- {
- CREATEWIDGET(EditServerDialog, this, ServerInfo(), -1);
- }
- else if (eventId == "editEntry")
- {
- const int index = mServersList->getSelected();
- if (index >= 0)
- {
- CREATEWIDGET(EditServerDialog,
- this,
- mServers.at(index),
- index);
- }
- }
- else if (eventId == "remove")
- {
- const int index = mServersList->getSelected();
- if (index >= 0)
- {
- mServersList->setSelected(0);
- mServers.erase(mServers.begin() + index);
- saveCustomServers();
- }
- }
- else if (eventId == "info")
- {
- const int index = mServersList->getSelected();
- if (index >= 0)
- {
- if (serverInfoWindow != nullptr)
- serverInfoWindow->scheduleDelete();
- serverInfoWindow = CREATEWIDGETR(ServerInfoWindow,
- mServers.at(index));
- }
- }
-}
-
-void ServerDialog::keyPressed(KeyEvent &event)
-{
- PRAGMA45(GCC diagnostic push)
- PRAGMA45(GCC diagnostic ignored "-Wswitch-enum")
- switch (event.getActionId())
- {
- case InputAction::GUI_CANCEL:
- event.consume();
- client->setState(State::EXIT);
- return;
-
- case InputAction::GUI_SELECT:
- case InputAction::GUI_SELECT2:
- event.consume();
- action(ActionEvent(nullptr,
- mConnectButton->getActionEventId()));
- return;
-
- case InputAction::GUI_INSERT:
- CREATEWIDGET(EditServerDialog, this, ServerInfo(), -1);
- return;
-
- case InputAction::GUI_DELETE:
- {
- const int index = mServersList->getSelected();
- if (index >= 0)
- {
- mServersList->setSelected(0);
- mServers.erase(mServers.begin() + index);
- saveCustomServers();
- }
- return;
- }
-
- case InputAction::GUI_BACKSPACE:
- {
- const int index = mServersList->getSelected();
- if (index >= 0)
- {
- CREATEWIDGET(EditServerDialog, this, mServers.at(index),
- index);
- }
- return;
- }
-
- default:
- break;
- }
- PRAGMA45(GCC diagnostic pop)
- if (!event.isConsumed())
- mServersList->keyPressed(event);
-}
-
-void ServerDialog::valueChanged(const SelectionEvent &event A_UNUSED)
-{
- const int index = mServersList->getSelected();
- if (index == -1)
- {
- mDeleteButton->setEnabled(false);
- return;
- }
- mDeleteButton->setEnabled(true);
-}
-
-void ServerDialog::mouseClicked(MouseEvent &event)
-{
- if (event.getButton() == MouseButton::LEFT)
- {
- event.consume();
- if (event.getClickCount() == 2 &&
- event.getSource() == mServersList)
- {
- action(ActionEvent(mConnectButton,
- mConnectButton->getActionEventId()));
- }
- }
-}
-
-void ServerDialog::logic()
-{
- BLOCK_START("ServerDialog::logic")
- {
- MutexLocker tempLock(&mMutex);
- if (mDownloadStatus == ServerDialogDownloadStatus::COMPLETE)
- {
- loadServers();
- mDownloadStatus = ServerDialogDownloadStatus::OVER;
- mDescription->setCaption(std::string());
- logger->log("Servers list updated");
- }
- else if (mDownloadStatus == ServerDialogDownloadStatus::IN_PROGRESS)
- {
- // TRANSLATORS: servers dialog label
- mDescription->setCaption(strprintf(_("Downloading server list..."
- "%2.2f%%"), static_cast<double>(mDownloadProgress * 100)));
- }
- else if (mDownloadStatus == ServerDialogDownloadStatus::IDLE)
- {
- // TRANSLATORS: servers dialog label
- mDescription->setCaption(_("Waiting for server..."));
- }
- else if (mDownloadStatus == ServerDialogDownloadStatus::PREPARING)
- {
- // TRANSLATORS: servers dialog label
- mDescription->setCaption(_("Preparing download"));
- }
- else if (mDownloadStatus == ServerDialogDownloadStatus::ERROR)
- {
- // TRANSLATORS: servers dialog label
- mDescription->setCaption(_("Error retreiving server list!"));
- logger->log("Error: servers list updating error");
- }
- }
-
- Window::logic();
- BLOCK_END("ServerDialog::logic")
-}
-
-void ServerDialog::downloadServerList()
-{
- // Try to load the configuration value for the onlineServerList
- std::string listFile = branding.getStringValue("onlineServerList");
- std::string listFile2 = branding.getStringValue("onlineServerList2");
-
- // Fall back to manaplus.org when neither branding
- // nor config set it
- if (listFile.empty())
- listFile = "http://manaplus.org/serverlist.xml";
-
- if (mDownload != nullptr)
- {
- mDownload->cancel();
- delete2(mDownload)
- }
-
- mDownload = new Net::Download(this, listFile,
- &downloadUpdate, false, false, true);
- mDownload->setFile(pathJoin(mDir,
- branding.getStringValue("onlineServerFile")));
- if (!listFile2.empty())
- mDownload->addMirror(listFile2);
- mDownload->start();
-
- config.setValue("serverslistupdate", getDateString());
-}
-
-static void loadHostsGroup(XmlNodeConstPtr node,
- ServerInfo &server)
-{
- HostsGroup group;
- group.name = XML::langProperty(node,
- "name",
- // TRANSLATORS: unknown hosts group name
- _("Unknown"));
- for_each_xml_child_node(hostNode, node)
- {
- if (!xmlNameEqual(hostNode, "host") ||
- !XmlHaveChildContent(hostNode))
- {
- continue;
- }
- const std::string host = XmlChildContent(hostNode);
- if (host.empty())
- continue;
- if (!checkPath(host))
- {
- logger->log1("Warning: incorrect update server name");
- continue;
- }
-
- group.hosts.push_back(host);
- }
- if (!group.hosts.empty())
- server.updateHosts.push_back(group);
-}
-
-static void loadServerSourcesList(XmlNodeConstPtr node,
- STD_VECTOR<ServerUrlInfo> &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,
- branding.getStringValue("onlineServerFile")),
- UseVirtFs_false,
- SkipError_true);
- XmlNodeConstPtr rootNode = doc.rootNode();
-
- if (rootNode == nullptr ||
- !xmlNameEqual(rootNode, "serverlist"))
- {
- logger->log1("Error loading server list!");
- return;
- }
-
- const int ver = XML::getProperty(rootNode, "version", 0);
- if (ver != 1)
- {
- logger->log("Error: unsupported online server list version: %d",
- ver);
- return;
- }
-
- const std::string lang = getLangShort();
- const std::string description2("description_" + lang);
-
- for_each_xml_child_node(serverNode, rootNode)
- {
- if (!xmlNameEqual(serverNode, "server"))
- continue;
-
- const std::string type = XML::getProperty(
- serverNode, "type", "unknown");
- ServerInfo server;
- server.type = ServerInfo::parseType(type);
- const std::string licenseType = XML::getProperty(
- serverNode, "licenseType", "notset");
- server.freeType = ServerInfo::parseFreeType(licenseType);
-
- // Ignore unknown server types
- if (server.type == ServerType::UNKNOWN)
- {
- logger->log("Ignoring server entry with unknown type: %s",
- type.c_str());
- continue;
- }
-
- server.name = XML::getProperty(serverNode, "name", std::string());
- std::string version = XML::getProperty(serverNode, "minimumVersion",
- std::string());
-
- const bool meetsMinimumVersion = (compareStrI(version, SMALL_VERSION)
- <= 0);
-
- // For display in the list
- if (meetsMinimumVersion)
- version.clear();
- else if (version.empty())
- {
- // TRANSLATORS: servers dialog label
- version = _("requires a newer version");
- }
- else
- {
- // TRANSLATORS: servers dialog label
- version = strprintf(_("requires v%s"), version.c_str());
- }
-
- const Font *const font = gui->getFont();
-
- for_each_xml_child_node(subNode, serverNode)
- {
- if (xmlNameEqual(subNode, "connection"))
- {
- server.hostname = XML::getProperty(subNode, "hostname", "");
- server.althostname = XML::getProperty(
- subNode, "althostname", "");
- server.port = CAST_U16(
- XML::getProperty(subNode, "port", 0));
- server.packetVersion = XML::getProperty(subNode,
- "packetVersion", 0);
-
- if (server.port == 0)
- {
- // If no port is given, use the default for the given type
- server.port = defaultPortForServerType(server.type);
- }
- }
- else if (XmlHaveChildContent(subNode))
- {
- if ((xmlNameEqual(subNode, "description")
- && server.description.empty()) || (!lang.empty()
- && xmlNameEqual(subNode, description2.c_str())))
- {
- server.description = XmlChildContent(subNode);
- }
- else if (xmlNameEqual(subNode, "registerurl"))
- {
- server.registerUrl = XmlChildContent(subNode);
- }
- else if (xmlNameEqual(subNode, "onlineListUrl"))
- {
- server.onlineListUrl = XmlChildContent(subNode);
- }
- else if (xmlNameEqual(subNode, "support"))
- {
- server.supportUrl = XmlChildContent(subNode);
- }
- else if (xmlNameEqual(subNode, "persistentIp"))
- {
- std::string text = XmlChildContent(subNode);
- server.persistentIp = (text == "1" || text == "true");
- }
- else if (xmlNameEqual(subNode, "updateMirror"))
- {
- server.updateMirrors.push_back(XmlChildContent(subNode));
- }
- else if (xmlNameEqual(subNode, "site"))
- {
- server.serverUrl = XmlChildContent(subNode);
- }
- }
- if (xmlNameEqual(subNode, "updates"))
- {
- loadHostsGroup(subNode, server);
- }
- else if (xmlNameEqual(subNode, "defaultUpdateHost"))
- {
- server.defaultHostName = XML::langProperty(
- // TRANSLATORS: default hosts group name
- subNode, "name", _("default"));
- }
- else if (xmlNameEqual(subNode, "sources"))
- {
- loadServerSources(subNode, server);
- }
- else if (xmlNameEqual(subNode, "docs"))
- {
- loadServerSourcesList(subNode, server.docs);
- }
- }
-
- server.version.first = font->getWidth(version);
- server.version.second = version;
-
- MutexLocker tempLock(&mMutex);
- // Add the server to the local list if it's not already present
- bool found = false;
- for (unsigned int i = 0, fsz = CAST_U32(
- mServers.size()); i < fsz; i++)
- {
- if (mServers[i] == server)
- {
- // Use the name listed in the server list
- mServers[i].name = server.name;
- mServers[i].type = server.type;
- mServers[i].freeType = server.freeType;
- mServers[i].version = server.version;
- mServers[i].description = server.description;
- mServers[i].registerUrl = server.registerUrl;
- mServers[i].onlineListUrl = server.onlineListUrl;
- mServers[i].supportUrl = server.supportUrl;
- mServers[i].serverUrl = server.serverUrl;
- mServers[i].althostname = server.althostname;
- mServers[i].persistentIp = server.persistentIp;
- mServers[i].updateMirrors = server.updateMirrors;
- 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;
- mServers[i].docs = server.docs;
- mServersListModel->setVersionString(i, version);
- found = true;
- break;
- }
- }
- if (!found && addNew)
- mServers.push_back(server);
- }
- if (mServersList->getSelected() < 0)
- mServersList->setSelected(0);
-}
-
-void ServerDialog::loadCustomServers()
-{
- for (int i = 0; i < MAX_SERVERLIST; ++i)
- {
- const std::string index = toString(i);
- const std::string nameKey("MostUsedServerDescName" + index);
- const std::string descKey("MostUsedServerDescription" + index);
- const std::string hostKey("MostUsedServerName" + index);
- const std::string typeKey("MostUsedServerType" + index);
- const std::string portKey("MostUsedServerPort" + index);
- const std::string onlineListUrlKey
- ("MostUsedServerOnlineList" + index);
- const std::string persistentIpKey("persistentIp" + index);
- const std::string packetVersionKey
- ("MostUsedServerPacketVersion" + index);
-
- ServerInfo server;
- server.name = config.getValue(nameKey, "");
- server.description = config.getValue(descKey, "");
- server.onlineListUrl = config.getValue(onlineListUrlKey, "");
- server.hostname = config.getValue(hostKey, "");
- server.type = ServerInfo::parseType(config.getValue(typeKey, ""));
- server.persistentIp = config.getValue(
- persistentIpKey, 0) != 0 ? true : false;
- server.packetVersion = config.getValue(packetVersionKey, 0);
-
- const int defaultPort = defaultPortForServerType(server.type);
- server.port = CAST_U16(
- config.getValue(portKey, defaultPort));
-
- // skip invalid server
- if (!server.isValid())
- continue;
-
- server.save = true;
- mServers.push_back(server);
- }
-}
-
-void ServerDialog::saveCustomServers(const ServerInfo &currentServer,
- const int index)
-{
- // Make sure the current server is mentioned first
- if (currentServer.isValid())
- {
- if (index >= 0 && CAST_SIZE(index) < mServers.size())
- {
- mServers[index] = currentServer;
- }
- else
- {
- FOR_EACH (ServerInfos::iterator, i, mServers)
- {
- if (*i == currentServer)
- {
- mServers.erase(i);
- break;
- }
- }
- mServers.insert(mServers.begin(), currentServer);
- }
- }
-
- int savedServerCount = 0;
-
- for (unsigned i = 0, fsz = CAST_U32(mServers.size());
- i < fsz && savedServerCount < MAX_SERVERLIST; ++ i)
- {
- const ServerInfo &server = mServers.at(i);
-
- // Only save servers that were loaded from settings
- if (!(server.save && server.isValid()))
- continue;
-
- const std::string num = toString(savedServerCount);
- const std::string nameKey("MostUsedServerDescName" + num);
- const std::string descKey("MostUsedServerDescription" + num);
- const std::string hostKey("MostUsedServerName" + num);
- const std::string typeKey("MostUsedServerType" + num);
- const std::string portKey("MostUsedServerPort" + num);
- const std::string onlineListUrlKey
- ("MostUsedServerOnlineList" + num);
- const std::string persistentIpKey("persistentIp" + num);
- const std::string packetVersionKey
- ("MostUsedServerPacketVersion" + num);
-
- config.setValue(nameKey, server.name);
- config.setValue(descKey, server.description);
- config.setValue(onlineListUrlKey, server.onlineListUrl);
- config.setValue(hostKey, server.hostname);
- config.setValue(typeKey, serverTypeToString(server.type));
- config.setValue(portKey, toString(server.port));
- config.setValue(persistentIpKey, server.persistentIp);
- config.setValue(packetVersionKey, server.packetVersion);
- ++ savedServerCount;
- }
-
- // Insert an invalid entry at the end to make the loading stop there
- if (savedServerCount < MAX_SERVERLIST)
- config.setValue("MostUsedServerName" + toString(savedServerCount), "");
-}
-
-int ServerDialog::downloadUpdate(void *ptr,
- const DownloadStatusT status,
- size_t total,
- const size_t remaining)
-{
- if ((ptr == nullptr) || status == DownloadStatus::Cancelled)
- return -1;
-
- ServerDialog *const sd = reinterpret_cast<ServerDialog*>(ptr);
- bool finished = false;
-
- if (sd->mDownload == nullptr)
- return -1;
-
- if (status == DownloadStatus::Complete)
- {
- finished = true;
- }
- else if (CAST_S32(status) < 0)
- {
- logger->log("Error retreiving server list: %s\n",
- sd->mDownload->getError());
- sd->mDownloadStatus = ServerDialogDownloadStatus::ERROR;
- }
- else
- {
- float progress = static_cast<float>(remaining);
- if (total != 0u)
- progress /= static_cast<float>(total);
-
- if (progress != progress || progress < 0.0F)
- progress = 0.0f;
- else if (progress > 1.0F)
- progress = 1.0F;
-
- MutexLocker lock1(&sd->mMutex);
- sd->mDownloadStatus = ServerDialogDownloadStatus::IN_PROGRESS;
- sd->mDownloadProgress = progress;
- }
-
- if (finished)
- {
- MutexLocker lock1(&sd->mMutex);
- sd->mDownloadStatus = ServerDialogDownloadStatus::COMPLETE;
- }
-
- return 0;
-}
-
-void ServerDialog::updateServer(const ServerInfo &server, const int index)
-{
- saveCustomServers(server, index);
-}
-
-bool ServerDialog::needUpdateServers() const
-{
- if (mServers.empty() || config.getStringValue("serverslistupdate")
- != getDateString())
- {
- return true;
- }
-
- return false;
-}
-
-void ServerDialog::close()
-{
- if (mDownload != nullptr)
- mDownload->cancel();
- client->setState(State::FORCE_QUIT);
- Window::close();
-}