summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-08-26 01:07:03 -0400
committerisanae <14251494+isanae@users.noreply.github.com>2019-08-26 01:07:03 -0400
commitaff3ee8fcf427c9ff8c554a179222eabec3a95e2 (patch)
tree3dde0e860cd7dd4bdd8d487d5a84f27715929068
parent36dbb4bad74b097d44b843a2e934aa4a58ef6492 (diff)
moved preferred servers into ServerList
-rw-r--r--src/downloadmanager.cpp40
-rw-r--r--src/downloadmanager.h11
-rw-r--r--src/mainwindow.cpp2
-rw-r--r--src/organizercore.cpp2
-rw-r--r--src/serverinfo.cpp17
-rw-r--r--src/serverinfo.h2
-rw-r--r--src/settings.cpp17
-rw-r--r--src/settings.h16
8 files changed, 57 insertions, 50 deletions
diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp
index 3b084b83..45cfdeed 100644
--- a/src/downloadmanager.cpp
+++ b/src/downloadmanager.cpp
@@ -288,9 +288,9 @@ void DownloadManager::setOutputDirectory(const QString &outputDirectory)
}
-void DownloadManager::setPreferredServers(const std::map<QString, int> &preferredServers)
+void DownloadManager::setServers(const ServerList& servers)
{
- m_PreferredServers = preferredServers;
+ m_Servers = servers;
}
@@ -1667,23 +1667,38 @@ void DownloadManager::nxmFileInfoAvailable(QString gameName, int modID, int file
m_RequestIDs.insert(m_NexusInterface->requestDownloadURL(info->gameName, info->modID, info->fileID, this, qVariantFromValue(test), QString()));
}
-static int evaluateFileInfoMap(const QVariantMap &map, const std::map<QString, int> &preferredServers)
+static int evaluateFileInfoMap(
+ const QVariantMap &map,
+ const QList<ServerInfo>& preferredServers)
{
- int result = 0;
+ int preference = 0;
+ bool found = false;
+ const auto name = map["short_name"].toString();
- auto preference = preferredServers.find(map["short_name"].toString());
+ for (const auto& server : preferredServers) {
+ if (server.name() == name) {
+ preference = server.preferred();
+ found = true;
+ break;
+ }
+ }
- if (preference != preferredServers.end()) {
- result += 100 + preference->second * 20;
+ if (!found) {
+ log::error("server '{}' not found while sorting by preference", name);
+ return 0;
}
- return result;
+ return 100 + preference * 20;
}
// sort function to sort by best download server
-bool DownloadManager::ServerByPreference(const std::map<QString, int> &preferredServers, const QVariant &LHS, const QVariant &RHS)
+bool DownloadManager::ServerByPreference(
+ const QList<ServerInfo>& preferredServers,
+ const QVariant &LHS, const QVariant &RHS)
{
- return evaluateFileInfoMap(LHS.toMap(), preferredServers) > evaluateFileInfoMap(RHS.toMap(), preferredServers);
+ const auto a = evaluateFileInfoMap(LHS.toMap(), preferredServers);
+ const auto b = evaluateFileInfoMap(RHS.toMap(), preferredServers);
+ return (a > b);
}
int DownloadManager::startDownloadURLs(const QStringList &urls)
@@ -1732,7 +1747,10 @@ void DownloadManager::nxmDownloadURLsAvailable(QString gameName, int modID, int
return;
}
- std::sort(resultList.begin(), resultList.end(), boost::bind(&DownloadManager::ServerByPreference, m_PreferredServers, _1, _2));
+ std::sort(
+ resultList.begin(),
+ resultList.end(),
+ boost::bind(&DownloadManager::ServerByPreference, m_Servers.getPreferred(), _1, _2));
info->userData["downloadMap"] = resultList;
diff --git a/src/downloadmanager.h b/src/downloadmanager.h
index feef0eaa..f739f4f0 100644
--- a/src/downloadmanager.h
+++ b/src/downloadmanager.h
@@ -20,6 +20,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#ifndef DOWNLOADMANAGER_H
#define DOWNLOADMANAGER_H
+#include "serverinfo.h"
#include <idownloadmanager.h>
#include <modrepositoryfileinfo.h>
#include <set>
@@ -174,9 +175,9 @@ public:
QString getOutputDirectory() const { return m_OutputDirectory; }
/**
- * @brief setPreferredServers set the list of preferred servers
+ * @brief sets the list of servers
*/
- void setPreferredServers(const std::map<QString, int> &preferredServers);
+ void setServers(const ServerList& servers);
/**
* @brief set the list of supported extensions
@@ -366,7 +367,9 @@ public:
* @param RHS
* @return
*/
- static bool ServerByPreference(const std::map<QString, int> &preferredServers, const QVariant &LHS, const QVariant &RHS);
+ static bool ServerByPreference(
+ const QList<ServerInfo>& preferredServers,
+ const QVariant &LHS, const QVariant &RHS);
virtual int startDownloadURLs(const QStringList &urls);
@@ -548,7 +551,7 @@ private:
QVector<DownloadInfo*> m_ActiveDownloads;
QString m_OutputDirectory;
- std::map<QString, int> m_PreferredServers;
+ ServerList m_Servers;
QStringList m_SupportedExtensions;
std::set<int> m_RequestIDs;
QVector<int> m_AlphabeticalTranslation;
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 9921ad82..79203d29 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -5050,7 +5050,7 @@ void MainWindow::on_actionSettings_triggered()
dlManager->setOutputDirectory(settings.getDownloadDirectory());
}
}
- dlManager->setPreferredServers(settings.getPreferredServers());
+ dlManager->setServers(settings.getServers());
if ((settings.getModDirectory() != oldModDirectory)
|| (settings.displayForeign() != oldDisplayForeign)) {
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index 5a8ee4c2..522d28be 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -276,7 +276,7 @@ OrganizerCore::OrganizerCore(Settings &settings)
, m_PluginListsWriter(std::bind(&OrganizerCore::savePluginList, this))
{
m_DownloadManager.setOutputDirectory(m_Settings.getDownloadDirectory());
- m_DownloadManager.setPreferredServers(m_Settings.getPreferredServers());
+ m_DownloadManager.setServers(m_Settings.getServers());
NexusInterface::instance(m_PluginContainer)->setCacheDirectory(m_Settings.getCacheDirectory());
diff --git a/src/serverinfo.cpp b/src/serverinfo.cpp
index 67a80b9e..70cdec6d 100644
--- a/src/serverinfo.cpp
+++ b/src/serverinfo.cpp
@@ -52,6 +52,10 @@ void ServerInfo::setPreferred(int i)
void ServerList::add(ServerInfo s)
{
m_servers.push_back(std::move(s));
+
+ std::sort(m_servers.begin(), m_servers.end(), [](auto&& a, auto&& b){
+ return (a.preferred() < b.preferred());
+ });
}
ServerList::iterator ServerList::begin()
@@ -83,3 +87,16 @@ bool ServerList::empty() const
{
return m_servers.empty();
}
+
+ServerList::container ServerList::getPreferred() const
+{
+ container v;
+
+ for (const auto& server : m_servers) {
+ if (server.preferred() > 0) {
+ v.push_back(server);
+ }
+ }
+
+ return v;
+}
diff --git a/src/serverinfo.h b/src/serverinfo.h
index 0a8a5028..2e5682fc 100644
--- a/src/serverinfo.h
+++ b/src/serverinfo.h
@@ -50,6 +50,8 @@ public:
std::size_t size() const;
bool empty() const;
+ container getPreferred() const;
+
private:
container m_servers;
};
diff --git a/src/settings.cpp b/src/settings.cpp
index 5ddffd8f..c57530e4 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -867,23 +867,6 @@ void Settings::setDownloadSpeed(const QString &serverName, int bytesPerSecond)
m_Settings.sync();
}
-std::map<QString, int> Settings::getPreferredServers()
-{
- std::map<QString, int> result;
- m_Settings.beginGroup("Servers");
-
- for (const QString &serverKey : m_Settings.childKeys()) {
- QVariantMap data = m_Settings.value(serverKey).toMap();
- int preference = data["preferred"].toInt();
- if (preference > 0) {
- result[serverKey] = preference;
- }
- }
- m_Settings.endGroup();
-
- return result;
-}
-
ServerList Settings::getServers() const
{
ServerList list;
diff --git a/src/settings.h b/src/settings.h
index 31dbf85c..e7337301 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -482,24 +482,8 @@ public:
QString language();
void setLanguage(const QString& name);
- /**
- * @brief register download speed
- * @param url complete download url
- * @param bytesPerSecond download size in bytes per second
- */
void setDownloadSpeed(const QString &serverName, int bytesPerSecond);
-
- /**
- * retrieve a sorted list of preferred servers
- */
- std::map<QString, int> getPreferredServers();
-
ServerList getServers() const;
-
- /**
- * @brief updates the list of known servers
- * @param list of servers from a recent query
- */
void updateServers(const ServerList& servers);
/**