From b4d70a35b3a0989f4cf10b5ca5b52063a518a711 Mon Sep 17 00:00:00 2001 From: quexeky Date: Mon, 30 Dec 2024 20:30:38 +1100 Subject: [PATCH] refactor(download manager): Added Downloadable trait and replaced references to GameDownloadAgent Signed-off-by: quexeky --- .../download_manager_builder.rs | 24 ++++++------- .../src/download_manager/downloadable.rs | 18 ++++++++++ src-tauri/src/download_manager/mod.rs | 3 +- .../src/download_manager/progress_object.rs | 2 +- src-tauri/src/downloads/download_agent.rs | 35 ++++++++++++++++++- 5 files changed, 65 insertions(+), 17 deletions(-) create mode 100644 src-tauri/src/download_manager/downloadable.rs diff --git a/src-tauri/src/download_manager/download_manager_builder.rs b/src-tauri/src/download_manager/download_manager_builder.rs index fa32fff..fd53445 100644 --- a/src-tauri/src/download_manager/download_manager_builder.rs +++ b/src-tauri/src/download_manager/download_manager_builder.rs @@ -18,7 +18,7 @@ use crate::{ }, state::GameStatusManager, DB }; -use super::{download_manager::{DownloadManager, DownloadManagerSignal, DownloadManagerStatus, GameDownloadAgentQueueStandin}, download_thread_control_flag::{DownloadThreadControl, DownloadThreadControlFlag}, progress_object::ProgressObject, queue::Queue}; +use super::{download_manager::{DownloadManager, DownloadManagerSignal, DownloadManagerStatus, GameDownloadAgentQueueStandin}, download_thread_control_flag::{DownloadThreadControl, DownloadThreadControlFlag}, downloadable::Downloadable, progress_object::ProgressObject, queue::Queue}; /* @@ -59,9 +59,10 @@ Behold, my madness - quexeky // Refactored to consolidate this type. It's a monster. pub type CurrentProgressObject = Arc>>>; +pub type DownloadAgent = Arc>; pub struct DownloadManagerBuilder { - download_agent_registry: HashMap>>, + download_agent_registry: HashMap, download_queue: Queue, command_receiver: Receiver, sender: Sender, @@ -156,7 +157,7 @@ impl DownloadManagerBuilder { drop(download_thread_lock); } - fn remove_and_cleanup_front_game(&mut self, game_id: &String) -> Arc> { + fn remove_and_cleanup_front_game(&mut self, game_id: &String) -> DownloadAgent { self.download_queue.pop_front(); let download_agent = self.download_agent_registry.remove(game_id).unwrap(); self.cleanup_current_download(); @@ -331,13 +332,8 @@ impl DownloadManagerBuilder { let download_agent = self.remove_and_cleanup_front_game(&game_id); let download_agent_lock = download_agent.lock().unwrap(); - let version = download_agent_lock.version.clone(); - let install_dir = download_agent_lock - .stored_manifest - .base_path - .clone() - .to_string_lossy() - .to_string(); + let version = download_agent_lock.version(); + let install_dir = download_agent_lock.install_dir(); drop(download_agent_lock); @@ -362,7 +358,7 @@ impl DownloadManagerBuilder { // Should always give us a value if let Some(download_agent) = self.download_agent_registry.get(&id) { let download_agent_handle = download_agent.lock().unwrap(); - if download_agent_handle.version == version { + if download_agent_handle.version() == version { info!("game with same version already queued, skipping"); return; } @@ -429,12 +425,12 @@ impl DownloadManagerBuilder { // Cloning option should be okay because it only clones the Arc inside, not the AgentInterfaceData let agent_data = self.current_download_agent.clone().unwrap(); - let version_name = download_agent_lock.version.clone(); + let version_name = download_agent_lock.version().clone(); - let progress_object = download_agent_lock.progress.clone(); + let progress_object = download_agent_lock.progress(); *self.progress.lock().unwrap() = Some(progress_object); - let active_control_flag = download_agent_lock.control_flag.clone(); + let active_control_flag = download_agent_lock.control_flag(); self.active_control_flag = Some(active_control_flag.clone()); let sender = self.sender.clone(); diff --git a/src-tauri/src/download_manager/downloadable.rs b/src-tauri/src/download_manager/downloadable.rs new file mode 100644 index 0000000..52f57d2 --- /dev/null +++ b/src-tauri/src/download_manager/downloadable.rs @@ -0,0 +1,18 @@ +use std::sync::Arc; + +use crate::downloads::download_agent::GameDownloadError; + +use super::{ + download_thread_control_flag::DownloadThreadControl, + progress_object::ProgressObject, +}; + +pub trait Downloadable: Sync { + fn get_progress_object(&self) -> Arc; + fn version(&self) -> String; + fn id(&self) -> String; + fn download(&mut self) -> Result<(), GameDownloadError>; + fn progress(&self) -> Arc; + fn control_flag(&self) -> DownloadThreadControl; + fn install_dir(&self) -> String; +} diff --git a/src-tauri/src/download_manager/mod.rs b/src-tauri/src/download_manager/mod.rs index dd7b78d..1d5ee1f 100644 --- a/src-tauri/src/download_manager/mod.rs +++ b/src-tauri/src/download_manager/mod.rs @@ -2,4 +2,5 @@ pub mod download_manager; pub mod download_manager_builder; pub mod progress_object; pub mod queue; -pub mod download_thread_control_flag; \ No newline at end of file +pub mod download_thread_control_flag; +pub mod downloadable; \ No newline at end of file diff --git a/src-tauri/src/download_manager/progress_object.rs b/src-tauri/src/download_manager/progress_object.rs index 2e0a194..a3c3c24 100644 --- a/src-tauri/src/download_manager/progress_object.rs +++ b/src-tauri/src/download_manager/progress_object.rs @@ -4,7 +4,7 @@ use std::{ mpsc::Sender, Arc, Mutex, RwLock, }, - time::{Duration, Instant}, + time::Instant, }; use log::info; diff --git a/src-tauri/src/downloads/download_agent.rs b/src-tauri/src/downloads/download_agent.rs index a2620d0..d7110d7 100644 --- a/src-tauri/src/downloads/download_agent.rs +++ b/src-tauri/src/downloads/download_agent.rs @@ -1,7 +1,8 @@ use crate::auth::generate_authorization_header; use crate::db::DatabaseImpls; -use crate::download_manager::download_manager::DownloadManagerSignal; +use crate::download_manager::download_manager::{DownloadManagerSignal, GameDownloadStatus}; use crate::download_manager::download_thread_control_flag::{DownloadThreadControl, DownloadThreadControlFlag}; +use crate::download_manager::downloadable::Downloadable; use crate::download_manager::progress_object::{ProgressHandle, ProgressObject}; use crate::downloads::manifest::{DropDownloadContext, DropManifest}; use crate::remote::RemoteAccessError; @@ -34,6 +35,7 @@ pub struct GameDownloadAgent { pub progress: Arc, sender: Sender, pub stored_manifest: StoredManifest, + status: Mutex } #[derive(Debug, Clone)] @@ -102,6 +104,7 @@ impl GameDownloadAgent { progress: Arc::new(ProgressObject::new(0, 0, sender.clone())), sender, stored_manifest, + status: Mutex::new(GameDownloadStatus::Queued), } } @@ -328,3 +331,33 @@ impl GameDownloadAgent { Ok(()) } } + +impl Downloadable for GameDownloadAgent { + fn get_progress_object(&self) -> Arc { + self.progress.clone() + } + + fn id(&self) -> String { + self.id.clone() + } + + fn download(&mut self) -> Result<(), GameDownloadError> { + self.download() + } + + fn version(&self) -> String { + self.version.clone() + } + + fn progress(&self) -> Arc { + self.progress.clone() + } + + fn control_flag(&self) -> DownloadThreadControl { + self.control_flag.clone() + } + + fn install_dir(&self) -> String { + self.stored_manifest.base_path.to_str().unwrap().to_owned() + } +} \ No newline at end of file