summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gui/serverdialog.cpp121
-rw-r--r--src/gui/serverdialog.h3
-rw-r--r--src/main.cpp6
-rw-r--r--src/main.h6
-rw-r--r--src/net/serverinfo.h7
5 files changed, 125 insertions, 18 deletions
diff --git a/src/gui/serverdialog.cpp b/src/gui/serverdialog.cpp
index 4f42906a..3d254e59 100644
--- a/src/gui/serverdialog.cpp
+++ b/src/gui/serverdialog.cpp
@@ -36,6 +36,7 @@
#include "net/net.h"
+#include "utils/xml.h"
#include "utils/gettext.h"
#include "utils/stringutils.h"
@@ -52,9 +53,12 @@ int ServersListModel::getNumberOfElements()
std::string ServersListModel::getElementAt(int elementIndex)
{
- std::string myServer = std::string(servers.at(elementIndex).hostname);
+ std::string myServer = servers.at(elementIndex).name;
+ myServer += " (";
+ myServer += std::string(servers.at(elementIndex).hostname);
myServer += ":";
myServer += toString(servers.at(elementIndex).port);
+ myServer += ")";
return myServer;
}
@@ -73,27 +77,51 @@ void ServersListModel::addElement(ServerInfo server)
ServerDialog::ServerDialog(ServerInfo *serverInfo):
Window(_("Choose Your Server")), mServerInfo(serverInfo)
{
+ mServerDescription = new Label(std::string());
gcn::Label *serverLabel = new Label(_("Server:"));
gcn::Label *portLabel = new Label(_("Port:"));
mServerNameField = new TextField(mServerInfo->hostname);
mPortField = new TextField(toString(mServerInfo->port));
- // Add the most used servers from config
mMostUsedServersListModel = new ServersListModel;
ServerInfo currentServer;
+ ServerInfo tempServer;
+
+ // load a list with online servers...
+ loadServerlist();
+
+ // Add the most used servers from config if they are not in the online list
std::string currentConfig = "";
+ bool newEntry;
+
for (int i = 0; i <= MAX_SERVERLIST; i++)
{
currentServer.clear();
+ currentConfig = "MostUsedServerDescription" + toString(i);
+ currentServer.name = config.getValue(currentConfig, "");
+
currentConfig = "MostUsedServerName" + toString(i);
currentServer.hostname = config.getValue(currentConfig, "");
currentConfig = "MostUsedServerPort" + toString(i);
currentServer.port = (short) config.getValue(currentConfig, 0);
+
if (!currentServer.hostname.empty() && currentServer.port != 0)
{
- mMostUsedServersListModel->addElement(currentServer);
+ newEntry = true;
+ for (int i = 0; i < mMostUsedServersListModel->getNumberOfElements(); i++)
+ {
+ tempServer = mMostUsedServersListModel->getServer(i);
+ if (tempServer != currentServer)
+ {
+ newEntry = false;
+ break;
+ }
+ if (!newEntry)
+ mMostUsedServersListModel->addElement(currentServer);
+ }
+
}
}
@@ -113,18 +141,20 @@ ServerDialog::ServerDialog(ServerInfo *serverInfo):
mMostUsedServersList->setSelected(0);
- place(0, 0, serverLabel);
- place(0, 1, portLabel);
- place(1, 0, mServerNameField, 3).setPadding(2);
- place(1, 1, mPortField, 3).setPadding(2);
- place(0, 2, usedScroll, 4, 5).setPadding(2);
- place(2, 7, mQuitButton);
- place(3, 7, mConnectButton);
+ place(0, 0, mServerDescription, 2);
+ place(0, 1, serverLabel);
+ place(0, 2, portLabel);
+ place(1, 1, mServerNameField, 3).setPadding(2);
+ place(1, 2, mPortField, 3).setPadding(2);
+ place(0, 3, usedScroll, 4, 5).setPadding(2);
+ place(2, 8, mQuitButton);
+ place(3, 8, mConnectButton);
// Make sure the list has enough height
- getLayout().setRowHeight(2, 60);
+ getLayout().setRowHeight(3, 80);
+
- reflowLayout(250, 0);
+ reflowLayout(300, 0);
center();
setVisible(true);
@@ -138,6 +168,7 @@ ServerDialog::ServerDialog(ServerInfo *serverInfo):
mConnectButton->requestFocus();
}
}
+
}
ServerDialog::~ServerDialog()
@@ -187,6 +218,9 @@ void ServerDialog::action(const gcn::ActionEvent &event)
{
tempServer = mMostUsedServersListModel->getServer(i);
+ currentConfig = "MostUsedServerDescription" + toString(i);
+ config.setValue(currentConfig, tempServer.name);
+
currentConfig = "MostUsedServerName" + toString(i);
config.setValue(currentConfig, tempServer.hostname);
@@ -212,6 +246,69 @@ void ServerDialog::valueChanged(const gcn::SelectionEvent &event)
// Update the server and post fields according to the new selection
const ServerInfo myServer = mMostUsedServersListModel->getServer(index);
+ mServerDescription->setCaption(myServer.name);
mServerNameField->setText(myServer.hostname);
mPortField->setText(toString(myServer.port));
}
+
+void ServerDialog::loadServerlist()
+{
+ ServerInfo currentServer;
+ currentServer.clear();
+
+ // try to load the configuration value for the onlineServerList
+ std::string listFile = config.getValue("onlineServerList", "void");
+ // if there is no entry, try to load the file from the default updatehost
+ if (listFile == "void")
+ listFile = config.getValue("updatehost", "http://updates.themanaworld.org")
+ + "/serverlist.xml";
+
+ xmlDocPtr doc = xmlReadFile(listFile.c_str(), NULL, 0);
+ if (doc == NULL)
+ {
+ logger->log("Failed to load online serverlist from %s", listFile.c_str());
+ return;
+ }
+
+ xmlNodePtr rootNode = xmlDocGetRootElement(doc);
+ int version = XML::getProperty(rootNode, "version", 3);
+
+ if (version != 1)
+ {
+ fprintf(stderr, "Online server list has wrong version");
+ return;
+ }
+
+ for_each_xml_child_node(server, rootNode)
+ {
+ if (xmlStrEqual(server->name, BAD_CAST "server"))
+ {
+ //check wether the version matches
+ #ifdef TMWSERV_SUPPORT
+ if (XML::getProperty(server, "type", "unknown") != "TMWSERV")
+ continue;
+ #endif
+
+ #ifdef EATHENA_SUPPORT
+ if (XML::getProperty(server, "type", "unknown") != "EATHENA")
+ continue;
+ #endif
+
+ currentServer.clear();
+ currentServer.name = XML::getProperty(server, "name", std::string());
+
+ for_each_xml_child_node(subnode, server)
+ {
+ if (xmlStrEqual(subnode->name, BAD_CAST "connection"))
+ {
+ currentServer.hostname = XML::getProperty(subnode, "hostname", std::string());
+ currentServer.port = XML::getProperty(subnode, "port", DEFAULT_PORT);
+ }
+ }
+
+ mMostUsedServersListModel->addElement(currentServer);
+ }
+ }
+
+ xmlFreeDoc(doc);
+}
diff --git a/src/gui/serverdialog.h b/src/gui/serverdialog.h
index 432d3a99..e6e366b7 100644
--- a/src/gui/serverdialog.h
+++ b/src/gui/serverdialog.h
@@ -106,8 +106,11 @@ class ServerDialog : public Window,
void valueChanged(const gcn::SelectionEvent &event);
private:
+ void loadServerlist();
+
gcn::TextField *mServerNameField;
gcn::TextField *mPortField;
+ gcn::Label *mServerDescription;
gcn::Button *mQuitButton;
gcn::Button *mConnectButton;
diff --git a/src/main.cpp b/src/main.cpp
index 52847b3e..82e8ff50 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -121,12 +121,6 @@
#include <sys/stat.h>
#endif
-#ifdef TWMSERV_SUPPORT
-#define DEFAULT_PORT 9601
-#else
-#define DEFAULT_PORT 6901
-#endif
-
namespace
{
struct SetupListener : public gcn::ActionListener
diff --git a/src/main.h b/src/main.h
index a7ddea7e..1ba25a74 100644
--- a/src/main.h
+++ b/src/main.h
@@ -77,6 +77,12 @@
#define MAX_CHARACTER_COUNT 3
+#ifdef TWMSERV_SUPPORT
+#define DEFAULT_PORT 9601
+#else
+#define DEFAULT_PORT 6901
+#endif
+
/*
* Client different States
*/
diff --git a/src/net/serverinfo.h b/src/net/serverinfo.h
index ebc67722..f410e516 100644
--- a/src/net/serverinfo.h
+++ b/src/net/serverinfo.h
@@ -27,11 +27,13 @@
class ServerInfo
{
public:
+ std::string name;
std::string hostname;
unsigned short port;
void clear()
{
+ name.clear();
hostname.clear();
port = 0;
}
@@ -40,6 +42,11 @@ public:
{
return (hostname == other.hostname && port == other.port);
}
+
+ bool operator!=(const ServerInfo &other)
+ {
+ return (hostname != other.hostname || port != other.port);
+ }
};
#endif // SERVERINFO_H