diff --git a/hammond-gtk/src/app.rs b/hammond-gtk/src/app.rs index d08df19..8aaadea 100644 --- a/hammond-gtk/src/app.rs +++ b/hammond-gtk/src/app.rs @@ -7,18 +7,13 @@ use gio::{ActionMapExt, ApplicationExt, ApplicationExtManual, SimpleActionExt}; use hammond_data::utils::checkup; use hammond_data::Source; -use manager::Manager; use headerbar::Header; use content::Content; use utils; -use std::sync::{Arc, Mutex}; +use std::sync::Arc; use std::sync::mpsc::{channel, Receiver, Sender}; -lazy_static! { - pub static ref DOWNLOADS_MANAGER: Arc> = Arc::new(Mutex::new(Manager::new())); -} - #[derive(Clone, Debug)] pub enum Action { UpdateSources(Option), diff --git a/hammond-gtk/src/manager.rs b/hammond-gtk/src/manager.rs index 3f51146..2be4804 100644 --- a/hammond-gtk/src/manager.rs +++ b/hammond-gtk/src/manager.rs @@ -4,72 +4,58 @@ use hammond_downloader::downloader::get_episode; use app::Action; -use std::collections::HashSet; -use std::sync::{Arc, Mutex}; +use std::collections::{HashMap, HashSet}; +use std::sync::{Arc, Mutex, RwLock}; use std::sync::mpsc::Sender; +// use std::sync::atomic::AtomicUsize; // use std::path::PathBuf; use std::thread; -// struct DonwloadInstance { -// uri: String, -// // FIXME: MAKE ME A PATHBUF -// local_uri: Option, -// downloaded_bytes: u64, -// total_bytes: u64, -// } - -// impl DonwloadInstance { -// fn new(url: &str, total_bytes: u64) -> Self { -// DonwloadInstance { -// uri: url.into(), -// local_uri: None, -// downloaded_bytes: 0, -// total_bytes, -// } -// } -// } - -#[derive(Debug, Clone)] -// FIXME: privacy stuff -pub struct Manager { - pub active: Arc>>, +#[derive(Debug)] +pub struct Progress { + total_bytes: u64, + downloaded_bytes: u64, } -impl Default for Manager { - fn default() -> Self { - Manager { - active: Arc::new(Mutex::new(HashSet::new())), +impl Progress { + pub fn new(size: u64) -> Self { + Progress { + total_bytes: size, + downloaded_bytes: 0, } } } -impl Manager { - pub fn new() -> Self { - Manager::default() +lazy_static! { + pub static ref ACTIVE_DOWNLOADS: Arc>> = { + Arc::new(RwLock::new(HashSet::new())) + }; + + pub static ref ACTIVE_PROGRESS: Arc>>> = { + Arc::new(RwLock::new(HashMap::new())) + }; +} + +pub fn add(id: i32, directory: &str, sender: Sender) { + { + let mut m = ACTIVE_DOWNLOADS.write().unwrap(); + m.insert(id); } - pub fn add(&self, id: i32, directory: &str, sender: Sender) { + let dir = directory.to_owned(); + thread::spawn(move || { + let episode = dbqueries::get_episode_from_rowid(id).unwrap(); + let e = get_episode(&mut episode.into(), dir.as_str()); + if let Err(err) = e { + error!("Error: {}", err); + }; + { - let mut m = self.active.lock().unwrap(); - m.insert(id); + let mut m = ACTIVE_DOWNLOADS.write().unwrap(); + m.remove(&id); } - - let dir = directory.to_owned(); - let list = self.active.clone(); - thread::spawn(move || { - let episode = dbqueries::get_episode_from_rowid(id).unwrap(); - let e = get_episode(&mut episode.into(), dir.as_str()); - if let Err(err) = e { - error!("Error: {}", err); - }; - - { - let mut m = list.lock().unwrap(); - m.remove(&id); - } - sender.send(Action::RefreshViews).unwrap(); - }); - } + sender.send(Action::RefreshViews).unwrap(); + }); } #[cfg(test)] @@ -117,9 +103,8 @@ mod tests { let (sender, _rx) = channel(); - let manager = Manager::new(); let download_fold = downloader::get_download_folder(&pd.title()).unwrap(); - manager.add(episode.rowid(), download_fold.as_str(), sender); + add(episode.rowid(), download_fold.as_str(), sender); // Give it soem time to download the file thread::sleep(time::Duration::from_secs(40)); diff --git a/hammond-gtk/src/widgets/episode.rs b/hammond-gtk/src/widgets/episode.rs index bdf4146..e7040af 100644 --- a/hammond-gtk/src/widgets/episode.rs +++ b/hammond-gtk/src/widgets/episode.rs @@ -13,8 +13,8 @@ use hammond_data::{EpisodeWidgetQuery, Podcast}; use hammond_data::errors::*; use hammond_downloader::downloader; -use app::DOWNLOADS_MANAGER; use app::Action; +use manager; use std::sync::mpsc::Sender; use std::path::Path; @@ -99,9 +99,8 @@ impl EpisodeWidget { self.show_buttons(episode.local_uri()); { - let m = DOWNLOADS_MANAGER.lock().unwrap(); - let list = m.active.lock().unwrap(); - if list.contains(&episode.rowid()) { + let m = manager::ACTIVE_DOWNLOADS.read().unwrap(); + if m.contains(&episode.rowid()) { self.show_progess_bar() }; } @@ -237,10 +236,8 @@ fn on_download_clicked( progress.show(); download_bttn.hide(); let download_fold = downloader::get_download_folder(&pd_title).unwrap(); - { - let man = DOWNLOADS_MANAGER.lock().unwrap(); - man.add(ep.rowid(), &download_fold, sender.clone()); - } + + manager::add(ep.rowid(), &download_fold, sender.clone()); sender.send(Action::RefreshEpisodesViewBGR).unwrap(); }