void ServerDialog::loadServers() { XML::Document doc(mDir + "/serverlist.xml", false); xmlNodePtr rootNode = doc.rootNode(); if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "serverlist")) { logger->log("Error loading server list!"); return; } int version = XML::getProperty(rootNode, "version", 0); if (version != 1) { logger->log("Error: unsupported online server list version: %d", version); return; } for_each_xml_child_node(serverNode, rootNode) { if (!xmlStrEqual(serverNode->name, BAD_CAST "server")) continue; ServerInfo server; std::string type = XML::getProperty(serverNode, "type", "unknown"); server.type = ServerInfo::parseType(type); // Ignore unknown server types if (server.type == ServerInfo::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()); bool meetsMinimumVersion = (compareStrI(version, PACKAGE_VERSION) <= 0); // For display in the list if (meetsMinimumVersion) version.clear(); else if (version.empty()) version = _("requires a newer version"); else version = strprintf(_("requires v%s"), version.c_str()); for_each_xml_child_node(subNode, serverNode) { if (xmlStrEqual(subNode->name, BAD_CAST "connection")) { server.hostname = XML::getProperty(subNode, "hostname", ""); server.port = XML::getProperty(subNode, "port", 0); if (server.port == 0) { // If no port is given, use the default for the given type server.port = defaultPortForServerType(server.type); } } else if (xmlStrEqual(subNode->name, BAD_CAST "description")) { server.description = (const char*) subNode->xmlChildrenNode->content; } } server.version.first = gui->getFont()->getWidth(version); server.version.second = version; MutexLocker lock(&mMutex); // Add the server to the local list if it's not already present bool found = false; for (unsigned int i = 0; i < mServers.size(); i++) { if (mServers[i] == server) { // Use the name listed in the server list mServers[i].name = server.name; mServers[i].version = server.version; mServersListModel->setVersionString(i, version); found = true; break; } } if (!found) mServers.push_back(server); } }
bool operator()(const OnlinePlayer *left, const OnlinePlayer *right) const { return (compareStrI(left->getNick(), right->getNick()) < 0); }