aboutsummaryrefslogtreecommitdiff
path: root/primedev/mods/autodownload/moddownloader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'primedev/mods/autodownload/moddownloader.cpp')
-rw-r--r--primedev/mods/autodownload/moddownloader.cpp35
1 files changed, 32 insertions, 3 deletions
diff --git a/primedev/mods/autodownload/moddownloader.cpp b/primedev/mods/autodownload/moddownloader.cpp
index c20a3adb..21b98942 100644
--- a/primedev/mods/autodownload/moddownloader.cpp
+++ b/primedev/mods/autodownload/moddownloader.cpp
@@ -156,6 +156,14 @@ int ModDownloader::ModFetchingProgressCallback(
{
NOTE_UNUSED(totalToUpload);
NOTE_UNUSED(nowUploaded);
+
+ // Abort download
+ ModDownloader* instance = static_cast<ModDownloader*>(ptr);
+ if (instance->modState.state == ABORTED)
+ {
+ return 1;
+ }
+
if (totalDownloadSize != 0 && finishedDownloadSize != 0)
{
ModDownloader* instance = static_cast<ModDownloader*>(ptr);
@@ -563,6 +571,13 @@ void ModDownloader::ExtractMod(fs::path modPath, VerifiedModPlatform platform)
}
}
+ // Abort mod extraction if needed
+ if (modState.state == ABORTED)
+ {
+ spdlog::info("User cancelled mod installation, aborting mod extraction.");
+ return;
+ }
+
// Go to next file
if ((i + 1) < gi.number_entry)
{
@@ -602,8 +617,7 @@ void ModDownloader::DownloadMod(std::string modName, std::string modVersion)
spdlog::error("Error while removing downloaded archive: {}", a.what());
}
- modState.state = DONE;
- spdlog::info("Done downloading {}.", modName);
+ spdlog::info("Done cleaning after downloading {}.", modName);
});
// Download mod archive
@@ -613,7 +627,10 @@ void ModDownloader::DownloadMod(std::string modName, std::string modVersion)
if (!fetchingResult.has_value())
{
spdlog::error("Something went wrong while fetching archive, aborting.");
- modState.state = MOD_FETCHING_FAILED;
+ if (modState.state != ABORTED)
+ {
+ modState.state = MOD_FETCHING_FAILED;
+ }
return;
}
archiveLocation = fetchingResult.value();
@@ -626,11 +643,17 @@ void ModDownloader::DownloadMod(std::string modName, std::string modVersion)
// Extract downloaded mod archive
ExtractMod(archiveLocation, fullVersion.platform);
+ modState.state = DONE;
});
requestThread.detach();
}
+void ModDownloader::CancelDownload()
+{
+ modState.state = ABORTED;
+}
+
ON_DLL_LOAD_RELIESON("engine.dll", ModDownloader, (ConCommand), (CModule module))
{
g_pModDownloader = new ModDownloader();
@@ -687,3 +710,9 @@ ADD_SQFUNC("ModInstallState", NSGetModInstallState, "", "", ScriptContext::SERVE
return SQRESULT_NOTNULL;
}
+
+ADD_SQFUNC("void", NSCancelModDownload, "", "", ScriptContext::SERVER | ScriptContext::CLIENT | ScriptContext::UI)
+{
+ g_pModDownloader->CancelDownload();
+ return SQRESULT_NULL;
+}