Lesson learned: Wrappers are the bane of my existence. Also here's the download cancelling logic.

Signed-off-by: quexeky <git@quexeky.dev>
This commit is contained in:
quexeky
2024-10-31 20:56:10 +11:00
parent 01ce253bda
commit 13df631cc6
5 changed files with 98 additions and 57 deletions

View File

@ -1,4 +1,4 @@
use std::sync::{atomic::Ordering, Arc, Mutex};
use std::{sync::{atomic::Ordering, Arc, Mutex}, thread};
use log::info;
@ -27,41 +27,46 @@ pub async fn start_game_downloads(
state: tauri::State<'_, Mutex<AppState>>,
) -> Result<(), GameDownloadError> {
info!("Downloading Games");
loop {
let mut current_id = String::new();
let mut download_agent = None;
{
let lock = state.lock().unwrap();
for (id, agent) in &lock.game_downloads {
if agent.get_state() == GameDownloadState::Queued {
download_agent = Some(agent.clone());
current_id = id.clone();
info!("Got queued game to download");
break;
let lock = state.lock().unwrap();
let mut game_downloads = lock.game_downloads.clone();
drop(lock);
thread::spawn(move || {
loop {
let mut current_id = String::new();
let mut download_agent = None;
{
for (id, agent) in &game_downloads {
if agent.get_state() == GameDownloadState::Queued {
download_agent = Some(agent.clone());
current_id = id.clone();
info!("Got queued game to download");
break;
}
}
if download_agent.is_none() {
info!("No more games left to download");
return;
}
};
info!("Downloading game");
{
start_game_download(max_threads, download_agent.unwrap()).unwrap();
game_downloads.remove_entry(&current_id);
}
if download_agent.is_none() {
info!("No more games left to download");
return Ok(())
}
};
info!("Downloading game");
{
start_game_download(max_threads, download_agent.unwrap()).await?;
let mut lock = state.lock().unwrap();
lock.game_downloads.remove_entry(&current_id);
}
}
}
});
info!("Spawned download");
return Ok(())
}
pub async fn start_game_download(
pub fn start_game_download(
max_threads: usize,
download_agent: Arc<GameDownloadAgent>
) -> Result<(), GameDownloadError> {
info!("Triggered Game Download");
download_agent.ensure_manifest_exists().await?;
download_agent.ensure_manifest_exists()?;
let local_manifest = {
let manifest = download_agent.manifest.lock().unwrap();
@ -70,19 +75,21 @@ pub async fn start_game_download(
download_agent.generate_job_contexts(&local_manifest, download_agent.version.clone(), download_agent.id.clone()).unwrap();
download_agent.begin_download(max_threads).await?;
download_agent.begin_download(max_threads).unwrap();
Ok(())
}
#[tauri::command]
pub async fn stop_specific_game_download(state: tauri::State<'_, Mutex<AppState>>, game_id: String) -> Result<(), String> {
info!("called stop_specific_game_download");
let lock = state.lock().unwrap();
let download_agent = lock.game_downloads.get(&game_id).unwrap();
let callback = download_agent.callback.clone();
drop(lock);
info!("Stopping callback");
callback.store(true, Ordering::Release);
return Ok(())