diff options
| author | Tannin <devnull@localhost> | 2013-06-29 18:04:10 +0200 |
|---|---|---|
| committer | Tannin <devnull@localhost> | 2013-06-29 18:04:10 +0200 |
| commit | fe37b48dffd8edcd6e30f4e304d3e27a731ac8ae (patch) | |
| tree | e996c5d329d9abf77bcd12af4d05238fd6ebca1f /src/downloadmanager.cpp | |
| parent | f8c683f700a3fff30540ff343df2bfba15080e86 (diff) | |
- caching of downloadwidgets to fix performance problem, currently broken and disabled
- added new state for downloads "uninstalled" for mods that were at one point installed and then removed
- user-configured server preference is now used
- updated tutorial to account for removal of integrated browser
- reverted to qt 4
- using performance optimised findfirstfile on win vista and up
- bugfix: it was possible to disable all columns of the mod list
- bugfix: hook.dll doesn't load on win xp
Diffstat (limited to 'src/downloadmanager.cpp')
| -rw-r--r-- | src/downloadmanager.cpp | 95 |
1 files changed, 74 insertions, 21 deletions
diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp index 662034c2..3a2d26eb 100644 --- a/src/downloadmanager.cpp +++ b/src/downloadmanager.cpp @@ -30,6 +30,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include <QRegExp> #include <QDirIterator> #include <QInputDialog> +#include <boost/bind.hpp> #include <regex> #include <QMessageBox> @@ -84,6 +85,8 @@ DownloadManager::DownloadInfo *DownloadManager::DownloadInfo::createFromMeta(con if (metaFile.value("paused", false).toBool()) { info->m_State = STATE_PAUSED; + } else if (metaFile.value("uninstalled", false).toBool()) { + info->m_State = STATE_UNINSTALLED; } else if (metaFile.value("installed", false).toBool()) { info->m_State = STATE_INSTALLED; } else { @@ -177,6 +180,13 @@ void DownloadManager::setOutputDirectory(const QString &outputDirectory) refreshList(); } + +void DownloadManager::setPreferredServers(const std::map<QString, int> &preferredServers) +{ + m_PreferredServers = preferredServers; +} + + void DownloadManager::setSupportedExtensions(const QStringList &extensions) { m_SupportedExtensions = extensions; @@ -606,11 +616,26 @@ void DownloadManager::markInstalled(int index) DownloadInfo *info = m_ActiveDownloads.at(index); QSettings metaFile(info->m_Output.fileName() + ".meta", QSettings::IniFormat); metaFile.setValue("installed", true); + metaFile.setValue("uninstalled", false); setState(m_ActiveDownloads.at(index), STATE_INSTALLED); } +void DownloadManager::markUninstalled(int index) +{ + if ((index < 0) || (index >= m_ActiveDownloads.size())) { + throw MyException(tr("invalid index")); + } + + DownloadInfo *info = m_ActiveDownloads.at(index); + QSettings metaFile(info->m_Output.fileName() + ".meta", QSettings::IniFormat); + metaFile.setValue("uninstalled", true); + + setState(m_ActiveDownloads.at(index), STATE_UNINSTALLED); +} + + QString DownloadManager::getDownloadFileName(const QString &baseName) const { QString fullPath = m_OutputDirectory + "/" + baseName; @@ -643,6 +668,13 @@ QString DownloadManager::getFileNameFromNetworkReply(QNetworkReply *reply) void DownloadManager::setState(DownloadManager::DownloadInfo *info, DownloadManager::DownloadState state) { + int row = 0; + for (int i = 0; i < m_ActiveDownloads.size(); ++i) { + if (m_ActiveDownloads[i] == info) { + row = i; + break; + } + } info->m_State = state; switch (state) { case STATE_PAUSED: @@ -660,15 +692,11 @@ void DownloadManager::setState(DownloadManager::DownloadInfo *info, DownloadMana } break; case STATE_READY: { createMetaFile(info); - for (int i = 0; i < m_ActiveDownloads.size(); ++i) { - if (m_ActiveDownloads[i] == info) { - emit downloadComplete(i); - return; - } - } + emit downloadComplete(row); } break; default: /* NOP */ break; } + emit stateChanged(row, state); } @@ -736,6 +764,7 @@ void DownloadManager::createMetaFile(DownloadInfo *info) metaFile.setValue("newestVersion", info->m_NexusInfo.m_NewestVersion); metaFile.setValue("category", info->m_NexusInfo.m_Category); metaFile.setValue("installed", info->m_State == DownloadManager::STATE_INSTALLED); + metaFile.setValue("uninstalled", info->m_State == DownloadManager::STATE_UNINSTALLED); metaFile.setValue("paused", (info->m_State == DownloadManager::STATE_PAUSED) || (info->m_State == DownloadManager::STATE_ERROR)); @@ -759,7 +788,6 @@ void DownloadManager::nxmDescriptionAvailable(int, QVariant userData, QVariant r QVariantMap result = resultData.toMap(); -// DownloadInfo *info = static_cast<DownloadInfo*>(userData.value<void*>()); DownloadInfo *info = downloadInfoByID(userData.toInt()); if (info == NULL) return; @@ -869,30 +897,45 @@ void DownloadManager::nxmFileInfoAvailable(int modID, int fileID, QVariant, QVar // sort function to sort by best download server -bool DownloadManager::ServerByPreference(const QVariant &LHS, const QVariant &RHS) +bool DownloadManager::ServerByPreference(const std::map<QString, int> &preferredServers, const QVariant &LHS, const QVariant &RHS) { + int LHSVal = 0; + int RHSVal = 0; + QVariantMap LHSMap = LHS.toMap(); QVariantMap RHSMap = RHS.toMap(); + int LHSUsers = LHSMap["ConnectedUsers"].toInt(); int RHSUsers = RHSMap["ConnectedUsers"].toInt(); - bool LHSPremium = LHSMap["IsPremium"].toBool(); - bool RHSPremium = RHSMap["IsPremium"].toBool(); - // 0 users is probably a sign that the server is offline. Since there is currently no // mechanism to try a different server, we avoid those without users - if ((LHSUsers == 0) && (RHSUsers != 0)) return false; - if ((LHSUsers != 0) && (RHSUsers == 0)) return true; + if (LHSUsers == 0) { + LHSVal -= 500; + } else { + LHSVal -= LHSUsers; + } + if (RHSUsers == 0) { + RHSVal -= 500; + } else { + RHSVal -= RHSUsers; + } + // user preference. This is a bit silly because the more servers on the preferred list the higher the boost + auto LHSPreference = preferredServers.find(LHSMap["Name"].toString()); + auto RHSPreference = preferredServers.find(RHSMap["Name"].toString()); - if (LHSPremium && !RHSPremium) { - return true; - } else if (!LHSPremium && RHSPremium) { - return false; + if (LHSPreference != preferredServers.end()) { + LHSVal += 100 + LHSPreference->second * 20; + } + if (RHSPreference != preferredServers.end()) { + RHSVal += 100 + RHSPreference->second * 20; } - // TODO implement country preference + // premium isn't valued high because premium servers already get a massive boost for having few users online + if (LHSMap["IsPremium"].toBool()) LHSVal += 5; + if (RHSMap["IsPremium"].toBool()) RHSVal += 5; - return LHSUsers < RHSUsers; + return RHSVal < LHSVal; } int DownloadManager::startDownloadURLs(const QStringList &urls) @@ -913,6 +956,16 @@ QString DownloadManager::downloadPath(int id) return getFilePath(id); } +int DownloadManager::indexByName(const QString &fileName) const +{ + for (int i = 0; i < m_ActiveDownloads.size(); ++i) { + if (m_ActiveDownloads[i]->m_FileName == fileName) { + return i; + } + } + return -1; +} + void DownloadManager::nxmDownloadURLsAvailable(int modID, int fileID, QVariant userData, QVariant resultData, int requestID) { std::set<int>::iterator idIter = m_RequestIDs.find(requestID); @@ -928,14 +981,14 @@ void DownloadManager::nxmDownloadURLsAvailable(int modID, int fileID, QVariant u emit showMessage(tr("No download server available. Please try again later.")); return; } - qSort(resultList.begin(), resultList.end(), ServerByPreference); + + std::sort(resultList.begin(), resultList.end(), boost::bind(&DownloadManager::ServerByPreference, m_PreferredServers, _1, _2)); QStringList URLs; foreach (const QVariant &server, resultList) { URLs.append(server.toMap()["URI"].toString()); } - qDebug("urls: %s", qPrintable(URLs.join(";"))); addDownload(URLs, modID, fileID, info); } |
