mirror of
https://github.com/Drop-OSS/drop-app.git
synced 2026-07-25 01:13:57 +10:00
refactor(download manager): Added Downloadable trait and replaced references to GameDownloadAgent
Signed-off-by: quexeky <git@quexeky.dev>
This commit is contained in:
@@ -18,7 +18,7 @@ use crate::{
|
|||||||
}, state::GameStatusManager, DB
|
}, 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.
|
// Refactored to consolidate this type. It's a monster.
|
||||||
pub type CurrentProgressObject = Arc<Mutex<Option<Arc<ProgressObject>>>>;
|
pub type CurrentProgressObject = Arc<Mutex<Option<Arc<ProgressObject>>>>;
|
||||||
|
pub type DownloadAgent = Arc<Mutex<dyn Downloadable + Send + Sync>>;
|
||||||
|
|
||||||
pub struct DownloadManagerBuilder {
|
pub struct DownloadManagerBuilder {
|
||||||
download_agent_registry: HashMap<String, Arc<Mutex<GameDownloadAgent>>>,
|
download_agent_registry: HashMap<String, DownloadAgent>,
|
||||||
download_queue: Queue,
|
download_queue: Queue,
|
||||||
command_receiver: Receiver<DownloadManagerSignal>,
|
command_receiver: Receiver<DownloadManagerSignal>,
|
||||||
sender: Sender<DownloadManagerSignal>,
|
sender: Sender<DownloadManagerSignal>,
|
||||||
@@ -156,7 +157,7 @@ impl DownloadManagerBuilder {
|
|||||||
drop(download_thread_lock);
|
drop(download_thread_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn remove_and_cleanup_front_game(&mut self, game_id: &String) -> Arc<Mutex<GameDownloadAgent>> {
|
fn remove_and_cleanup_front_game(&mut self, game_id: &String) -> DownloadAgent {
|
||||||
self.download_queue.pop_front();
|
self.download_queue.pop_front();
|
||||||
let download_agent = self.download_agent_registry.remove(game_id).unwrap();
|
let download_agent = self.download_agent_registry.remove(game_id).unwrap();
|
||||||
self.cleanup_current_download();
|
self.cleanup_current_download();
|
||||||
@@ -331,13 +332,8 @@ impl DownloadManagerBuilder {
|
|||||||
let download_agent = self.remove_and_cleanup_front_game(&game_id);
|
let download_agent = self.remove_and_cleanup_front_game(&game_id);
|
||||||
let download_agent_lock = download_agent.lock().unwrap();
|
let download_agent_lock = download_agent.lock().unwrap();
|
||||||
|
|
||||||
let version = download_agent_lock.version.clone();
|
let version = download_agent_lock.version();
|
||||||
let install_dir = download_agent_lock
|
let install_dir = download_agent_lock.install_dir();
|
||||||
.stored_manifest
|
|
||||||
.base_path
|
|
||||||
.clone()
|
|
||||||
.to_string_lossy()
|
|
||||||
.to_string();
|
|
||||||
|
|
||||||
drop(download_agent_lock);
|
drop(download_agent_lock);
|
||||||
|
|
||||||
@@ -365,7 +361,7 @@ impl DownloadManagerBuilder {
|
|||||||
// Should always give us a value
|
// Should always give us a value
|
||||||
if let Some(download_agent) = self.download_agent_registry.get(&id) {
|
if let Some(download_agent) = self.download_agent_registry.get(&id) {
|
||||||
let download_agent_handle = download_agent.lock().unwrap();
|
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");
|
info!("game with same version already queued, skipping");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -432,12 +428,12 @@ impl DownloadManagerBuilder {
|
|||||||
// Cloning option should be okay because it only clones the Arc inside, not the AgentInterfaceData
|
// 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 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);
|
*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());
|
self.active_control_flag = Some(active_control_flag.clone());
|
||||||
|
|
||||||
let sender = self.sender.clone();
|
let sender = self.sender.clone();
|
||||||
|
|||||||
@@ -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<ProgressObject>;
|
||||||
|
fn version(&self) -> String;
|
||||||
|
fn id(&self) -> String;
|
||||||
|
fn download(&mut self) -> Result<(), GameDownloadError>;
|
||||||
|
fn progress(&self) -> Arc<ProgressObject>;
|
||||||
|
fn control_flag(&self) -> DownloadThreadControl;
|
||||||
|
fn install_dir(&self) -> String;
|
||||||
|
}
|
||||||
@@ -2,4 +2,5 @@ pub mod download_manager;
|
|||||||
pub mod download_manager_builder;
|
pub mod download_manager_builder;
|
||||||
pub mod progress_object;
|
pub mod progress_object;
|
||||||
pub mod queue;
|
pub mod queue;
|
||||||
pub mod download_thread_control_flag;
|
pub mod download_thread_control_flag;
|
||||||
|
pub mod downloadable;
|
||||||
@@ -4,7 +4,7 @@ use std::{
|
|||||||
mpsc::Sender,
|
mpsc::Sender,
|
||||||
Arc, Mutex, RwLock,
|
Arc, Mutex, RwLock,
|
||||||
},
|
},
|
||||||
time::{Duration, Instant},
|
time::Instant,
|
||||||
};
|
};
|
||||||
|
|
||||||
use log::info;
|
use log::info;
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
use crate::auth::generate_authorization_header;
|
use crate::auth::generate_authorization_header;
|
||||||
use crate::db::DatabaseImpls;
|
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::download_thread_control_flag::{DownloadThreadControl, DownloadThreadControlFlag};
|
||||||
|
use crate::download_manager::downloadable::Downloadable;
|
||||||
use crate::download_manager::progress_object::{ProgressHandle, ProgressObject};
|
use crate::download_manager::progress_object::{ProgressHandle, ProgressObject};
|
||||||
use crate::downloads::manifest::{DropDownloadContext, DropManifest};
|
use crate::downloads::manifest::{DropDownloadContext, DropManifest};
|
||||||
use crate::remote::RemoteAccessError;
|
use crate::remote::RemoteAccessError;
|
||||||
@@ -34,6 +35,7 @@ pub struct GameDownloadAgent {
|
|||||||
pub progress: Arc<ProgressObject>,
|
pub progress: Arc<ProgressObject>,
|
||||||
sender: Sender<DownloadManagerSignal>,
|
sender: Sender<DownloadManagerSignal>,
|
||||||
pub stored_manifest: StoredManifest,
|
pub stored_manifest: StoredManifest,
|
||||||
|
status: Mutex<GameDownloadStatus>
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
@@ -102,6 +104,7 @@ impl GameDownloadAgent {
|
|||||||
progress: Arc::new(ProgressObject::new(0, 0, sender.clone())),
|
progress: Arc::new(ProgressObject::new(0, 0, sender.clone())),
|
||||||
sender,
|
sender,
|
||||||
stored_manifest,
|
stored_manifest,
|
||||||
|
status: Mutex::new(GameDownloadStatus::Queued),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -328,3 +331,33 @@ impl GameDownloadAgent {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Downloadable for GameDownloadAgent {
|
||||||
|
fn get_progress_object(&self) -> Arc<ProgressObject> {
|
||||||
|
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<ProgressObject> {
|
||||||
|
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()
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user