From 30c177cb371e92fe5e4cfc600cf27586402cf0a8 Mon Sep 17 00:00:00 2001 From: Silarn Date: Mon, 16 Apr 2018 12:47:17 -0500 Subject: Support for multi-game downloads --- src/organizercore.cpp | 51 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 20 deletions(-) (limited to 'src/organizercore.cpp') diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 999c7732..3248a8e0 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -192,15 +192,15 @@ OrganizerCore::OrganizerCore(const QSettings &initSettings) , m_GameName() , m_CurrentProfile(nullptr) , m_Settings(initSettings) - , m_Updater(NexusInterface::instance()) + , m_Updater(NexusInterface::instance(m_PluginContainer)) , m_AboutToRun() , m_FinishedRun() , m_ModInstalled() - , m_ModList(this) + , m_ModList(m_PluginContainer, this) , m_PluginList(this) , m_DirectoryRefresher() , m_DirectoryStructure(new DirectoryEntry(L"data", nullptr, 0)) - , m_DownloadManager(NexusInterface::instance(), this) + , m_DownloadManager(NexusInterface::instance(m_PluginContainer), this) , m_InstallationManager() , m_RefresherThread() , m_AskForNexusPW(false) @@ -211,8 +211,8 @@ OrganizerCore::OrganizerCore(const QSettings &initSettings) m_DownloadManager.setOutputDirectory(m_Settings.getDownloadDirectory()); m_DownloadManager.setPreferredServers(m_Settings.getPreferredServers()); - NexusInterface::instance()->setCacheDirectory(m_Settings.getCacheDirectory()); - NexusInterface::instance()->setNMMVersion(m_Settings.getNMMVersion()); + NexusInterface::instance(m_PluginContainer)->setCacheDirectory(m_Settings.getCacheDirectory()); + NexusInterface::instance(m_PluginContainer)->setNMMVersion(m_Settings.getNMMVersion()); MOBase::QuestionBoxMemory::init(initSettings.fileName()); @@ -227,9 +227,9 @@ OrganizerCore::OrganizerCore(const QSettings &initSettings) connect(&m_ModList, SIGNAL(removeOrigin(QString)), this, SLOT(removeOrigin(QString))); - connect(NexusInterface::instance()->getAccessManager(), + connect(NexusInterface::instance(m_PluginContainer)->getAccessManager(), SIGNAL(loginSuccessful(bool)), this, SLOT(loginSuccessful(bool))); - connect(NexusInterface::instance()->getAccessManager(), + connect(NexusInterface::instance(m_PluginContainer)->getAccessManager(), SIGNAL(loginFailed(QString)), this, SLOT(loginFailed(QString))); // This seems awfully imperative @@ -241,7 +241,7 @@ OrganizerCore::OrganizerCore(const QSettings &initSettings) connect(this, SIGNAL(managedGameChanged(MOBase::IPluginGame const *)), &m_PluginList, SLOT(managedGameChanged(MOBase::IPluginGame const *))); connect(this, SIGNAL(managedGameChanged(MOBase::IPluginGame const *)), - NexusInterface::instance(), + NexusInterface::instance(m_PluginContainer), SLOT(managedGameChanged(MOBase::IPluginGame const *))); connect(&m_PluginList, &PluginList::writePluginsList, &m_PluginListsWriter, @@ -454,7 +454,7 @@ void OrganizerCore::updateExecutablesList(QSettings &settings) // TODO this has nothing to do with executables list move to an appropriate // function! ModInfo::updateFromDisc(m_Settings.getModDirectory(), &m_DirectoryStructure, - m_Settings.displayForeign(), managedGame()); + m_PluginContainer, m_Settings.displayForeign(), managedGame()); } void OrganizerCore::setUserInterface(IUserInterface *userInterface, @@ -504,6 +504,9 @@ void OrganizerCore::connectPlugins(PluginContainer *container) m_DownloadManager.setSupportedExtensions( m_InstallationManager.getSupportedExtensions()); m_PluginContainer = container; + m_Updater.setPluginContainer(m_PluginContainer); + m_DownloadManager.setPluginContainer(m_PluginContainer); + m_ModList.setPluginContainer(m_PluginContainer); if (!m_GameName.isEmpty()) { m_GamePlugin = m_PluginContainer->managedGame(m_GameName); @@ -518,6 +521,9 @@ void OrganizerCore::disconnectPlugins() m_ModInstalled.disconnect_all_slots(); m_ModList.disconnectSlots(); m_PluginList.disconnectSlots(); + m_Updater.setPluginContainer(nullptr); + m_DownloadManager.setPluginContainer(nullptr); + m_ModList.setPluginContainer(nullptr); m_Settings.clearPlugins(); m_GamePlugin = nullptr; @@ -540,7 +546,7 @@ Settings &OrganizerCore::settings() bool OrganizerCore::nexusLogin(bool retry) { NXMAccessManager *accessManager - = NexusInterface::instance()->getAccessManager(); + = NexusInterface::instance(m_PluginContainer)->getAccessManager(); if ((accessManager->loginAttempted() || accessManager->loggedIn()) && !retry) { @@ -612,12 +618,12 @@ void OrganizerCore::externalMessage(const QString &message) } } -void OrganizerCore::downloadRequested(QNetworkReply *reply, int modID, +void OrganizerCore::downloadRequested(QNetworkReply *reply, QString gameName, int modID, const QString &fileName) { try { - if (m_DownloadManager.addDownload(reply, QStringList(), fileName, modID, 0, - new ModRepositoryFileInfo(modID))) { + if (m_DownloadManager.addDownload(reply, QStringList(), fileName, gameName, modID, 0, + new ModRepositoryFileInfo(gameName, modID))) { MessageDialog::showMessage(tr("Download started"), qApp->activeWindow()); } } catch (const std::exception &e) { @@ -739,7 +745,7 @@ void OrganizerCore::setCurrentProfile(const QString &profileName) MOBase::IModRepositoryBridge *OrganizerCore::createNexusBridge() const { - return new NexusBridge(); + return new NexusBridge(m_PluginContainer); } QString OrganizerCore::profileName() const @@ -813,7 +819,7 @@ MOBase::IModInterface *OrganizerCore::createMod(GuessedValue &name) settingsFile.endArray(); } - return ModInfo::createFrom(QDir(targetDirectory), &m_DirectoryStructure) + return ModInfo::createFrom(m_PluginContainer, m_GamePlugin->gameShortName(), QDir(targetDirectory), &m_DirectoryStructure) .data(); } @@ -1552,7 +1558,7 @@ void OrganizerCore::refreshModList(bool saveChanges) m_CurrentProfile->writeModlistNow(true); } ModInfo::updateFromDisc(m_Settings.getModDirectory(), &m_DirectoryStructure, - m_Settings.displayForeign(), managedGame()); + m_PluginContainer, m_Settings.displayForeign(), managedGame()); m_CurrentProfile->refreshModStatus(); @@ -1719,8 +1725,13 @@ void OrganizerCore::requestDownload(const QUrl &url, QNetworkReply *reply) // no mod found that could handle the download. Is it a nexus mod? if (url.host() == "www.nexusmods.com") { + QString gameName = ""; int modID = 0; int fileID = 0; + QRegExp nameExp("www\.nexusmods\.com/(\\a+)/"); + if (nameExp.indexIn(url.toString()) != -1) { + gameName = nameExp.cap(1); + } QRegExp modExp("mods/(\\d+)"); if (modExp.indexIn(url.toString()) != -1) { modID = modExp.cap(1).toInt(); @@ -1730,7 +1741,7 @@ void OrganizerCore::requestDownload(const QUrl &url, QNetworkReply *reply) fileID = fileExp.cap(1).toInt(); } m_DownloadManager.addDownload(reply, - new ModRepositoryFileInfo(modID, fileID)); + new ModRepositoryFileInfo(gameName, modID, fileID)); } else { if (QMessageBox::question(qApp->activeWindow(), tr("Download?"), tr("A download has been started but no installed " @@ -1827,7 +1838,7 @@ void OrganizerCore::profileRefresh() // have to refresh mods twice (again in refreshModList), otherwise the refresh // isn't complete. Not sure why ModInfo::updateFromDisc(m_Settings.getModDirectory(), &m_DirectoryStructure, - m_Settings.displayForeign(), managedGame()); + m_PluginContainer, m_Settings.displayForeign(), managedGame()); m_CurrentProfile->refreshModStatus(); refreshModList(); @@ -1885,7 +1896,7 @@ void OrganizerCore::loginSuccessful(bool necessary) } m_PostLoginTasks.clear(); - NexusInterface::instance()->loginCompleted(); + NexusInterface::instance(m_PluginContainer)->loginCompleted(); } void OrganizerCore::loginSuccessfulUpdate(bool necessary) @@ -1920,7 +1931,7 @@ void OrganizerCore::loginFailed(const QString &message) qApp->activeWindow()); m_PostLoginTasks.clear(); } - NexusInterface::instance()->loginCompleted(); + NexusInterface::instance(m_PluginContainer)->loginCompleted(); } void OrganizerCore::loginFailedUpdate(const QString &message) -- cgit v1.3.1