From ee9d458b05ffa0214a4526daf1423916830526bc Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Mon, 28 Nov 2022 15:12:54 +0200 Subject: accounts.rs: implement mailbox {un,}sub actions --- src/components/mail/status.rs | 4 -- src/conf/accounts.rs | 124 +++++++++++++++++------------------------- 2 files changed, 50 insertions(+), 78 deletions(-) diff --git a/src/components/mail/status.rs b/src/components/mail/status.rs index 5926b922..306507d1 100644 --- a/src/components/mail/status.rs +++ b/src/components/mail/status.rs @@ -116,10 +116,6 @@ impl Component for AccountStatus { if let JobRequest::DeleteMailbox { mailbox_hash, .. } | JobRequest::SetMailboxPermissions { mailbox_hash, .. } | JobRequest::SetMailboxSubscription { mailbox_hash, .. } - | JobRequest::CopyTo { - dest_mailbox_hash: mailbox_hash, - .. - } | JobRequest::Refresh { mailbox_hash, .. } | JobRequest::Fetch { mailbox_hash, .. } = req { diff --git a/src/conf/accounts.rs b/src/conf/accounts.rs index 8344840b..86f30718 100644 --- a/src/conf/accounts.rs +++ b/src/conf/accounts.rs @@ -190,10 +190,6 @@ pub enum JobRequest { SendMessageBackground { handle: JoinHandle>, }, - CopyTo { - dest_mailbox_hash: MailboxHash, - handle: JoinHandle>>, - }, DeleteMessages { env_hashes: EnvelopeHashBatch, handle: JoinHandle>, @@ -207,18 +203,13 @@ pub enum JobRequest { handle: JoinHandle>>, }, //RenameMailbox, - Search { - handle: JoinHandle>, - }, - AsBytes { - handle: JoinHandle>, - }, SetMailboxPermissions { mailbox_hash: MailboxHash, handle: JoinHandle>, }, SetMailboxSubscription { mailbox_hash: MailboxHash, + new_value: bool, handle: JoinHandle>, }, Watch { @@ -235,8 +226,6 @@ impl Drop for JobRequest { JobRequest::SetFlags { handle, .. } | JobRequest::SaveMessage { handle, .. } | //JobRequest::RenameMailbox, - JobRequest::Search { handle, .. } | - JobRequest::AsBytes { handle, .. } | JobRequest::SetMailboxPermissions { handle, .. } | JobRequest::SetMailboxSubscription { handle, .. } | JobRequest::Watch { handle, .. } | @@ -258,7 +247,6 @@ impl Drop for JobRequest { JobRequest::Mailboxes { handle, .. } => { handle.cancel(); } - JobRequest::CopyTo { handle, .. } => { handle.cancel(); } JobRequest::SendMessage => {} } } @@ -276,15 +264,12 @@ impl core::fmt::Debug for JobRequest { JobRequest::Refresh { .. } => write!(f, "JobRequest::Refresh"), JobRequest::SetFlags { .. } => write!(f, "JobRequest::SetFlags"), JobRequest::SaveMessage { .. } => write!(f, "JobRequest::SaveMessage"), - JobRequest::CopyTo { .. } => write!(f, "JobRequest::CopyTo"), JobRequest::DeleteMessages { .. } => write!(f, "JobRequest::DeleteMessages"), JobRequest::CreateMailbox { .. } => write!(f, "JobRequest::CreateMailbox"), JobRequest::DeleteMailbox { mailbox_hash, .. } => { write!(f, "JobRequest::DeleteMailbox({})", mailbox_hash) } //JobRequest::RenameMailbox, - JobRequest::Search { .. } => write!(f, "JobRequest::Search"), - JobRequest::AsBytes { .. } => write!(f, "JobRequest::AsBytes"), JobRequest::SetMailboxPermissions { .. } => { write!(f, "JobRequest::SetMailboxPermissions") } @@ -315,7 +300,6 @@ impl core::fmt::Display for JobRequest { if env_hashes.len() == 1 { "" } else { "s" } ), JobRequest::SaveMessage { .. } => write!(f, "Save message"), - JobRequest::CopyTo { .. } => write!(f, "Copy message."), JobRequest::DeleteMessages { env_hashes, .. } => write!( f, "Delete {} message{}", @@ -325,8 +309,6 @@ impl core::fmt::Display for JobRequest { JobRequest::CreateMailbox { path, .. } => write!(f, "Create mailbox {}", path), JobRequest::DeleteMailbox { .. } => write!(f, "Delete mailbox"), //JobRequest::RenameMailbox, - JobRequest::Search { .. } => write!(f, "Search"), - JobRequest::AsBytes { .. } => write!(f, "Message body fetch"), JobRequest::SetMailboxPermissions { .. } => write!(f, "Set mailbox permissions"), JobRequest::SetMailboxSubscription { .. } => write!(f, "Set mailbox subscription"), JobRequest::Watch { .. } => write!(f, "Background watch"), @@ -1502,42 +1484,46 @@ impl Account { } MailboxOperation::Subscribe(path) => { let mailbox_hash = self.mailbox_by_path(&path)?; - self.backend + let job = self + .backend .write() .unwrap() .set_mailbox_subscription(mailbox_hash, true)?; - self.mailbox_entries.entry(mailbox_hash).and_modify(|m| { - m.conf.mailbox_conf.subscribe = super::ToggleFlag::True; - let _ = m.ref_mailbox.set_is_subscribed(true); - }); - - self.sender - .send(ThreadEvent::UIEvent(UIEvent::Notification( - None, - format!("'`{}` has been subscribed.", &path), - Some(crate::types::NotificationType::Info), - ))) - .expect("Could not send event on main channel"); + let handle = if self.backend_capabilities.is_async { + self.job_executor.spawn_specialized(job) + } else { + self.job_executor.spawn_blocking(job) + }; + self.insert_job( + handle.job_id, + JobRequest::SetMailboxSubscription { + mailbox_hash, + new_value: true, + handle, + }, + ); Ok(()) } MailboxOperation::Unsubscribe(path) => { let mailbox_hash = self.mailbox_by_path(&path)?; - self.backend + let job = self + .backend .write() .unwrap() .set_mailbox_subscription(mailbox_hash, false)?; - self.mailbox_entries.entry(mailbox_hash).and_modify(|m| { - m.conf.mailbox_conf.subscribe = super::ToggleFlag::False; - let _ = m.ref_mailbox.set_is_subscribed(false); - }); - - self.sender - .send(ThreadEvent::UIEvent(UIEvent::Notification( - None, - format!("'`{}` has been unsubscribed.", &path), - Some(crate::types::NotificationType::Info), - ))) - .expect("Could not send event on main channel"); + let handle = if self.backend_capabilities.is_async { + self.job_executor.spawn_specialized(job) + } else { + self.job_executor.spawn_blocking(job) + }; + self.insert_job( + handle.job_id, + JobRequest::SetMailboxSubscription { + mailbox_hash, + new_value: false, + handle, + }, + ); Ok(()) } MailboxOperation::Rename(_, _) => Err(MeliError::new("Not implemented.")), @@ -1898,30 +1884,6 @@ impl Account { .expect("Could not send event on main channel"); } } - JobRequest::CopyTo { - dest_mailbox_hash: mailbox_hash, - ref mut handle, - .. - } => { - if let Ok(Some(Err(err))) = handle - .chan - .try_recv() - .map_err(|_: futures::channel::oneshot::Canceled| { - MeliError::new("Job was canceled") - }) - .map(|r| { - r.map(|r| r.and_then(|bytes| self.save(&bytes, mailbox_hash, None))) - }) - { - self.sender - .send(ThreadEvent::UIEvent(UIEvent::Notification( - Some(format!("{}: could not save message", &self.name)), - err.to_string(), - Some(crate::types::NotificationType::Error(err.kind)), - ))) - .expect("Could not send event on main channel"); - } - } JobRequest::DeleteMessages { ref mut handle, .. } => { if let Ok(Some(Err(err))) = handle.chan.try_recv() { self.sender @@ -2093,7 +2055,6 @@ impl Account { } } //JobRequest::RenameMailbox, - JobRequest::Search { .. } | JobRequest::AsBytes { .. } => {} JobRequest::SetMailboxPermissions { ref mut handle, .. } => { match handle.chan.try_recv() { Err(_) => { /* canceled */ } @@ -2124,7 +2085,11 @@ impl Account { } } } - JobRequest::SetMailboxSubscription { ref mut handle, .. } => { + JobRequest::SetMailboxSubscription { + ref mut handle, + ref mailbox_hash, + ref new_value, + } => { match handle.chan.try_recv() { Err(_) => { /* canceled */ } Ok(None) => {} @@ -2140,18 +2105,29 @@ impl Account { ))) .expect("Could not send event on main channel"); } - Ok(Some(Ok(_))) => { + Ok(Some(Ok(()))) if self.mailbox_entries.contains_key(mailbox_hash) => { + self.mailbox_entries.entry(*mailbox_hash).and_modify(|m| { + m.conf.mailbox_conf.subscribe = if *new_value { + super::ToggleFlag::True + } else { + super::ToggleFlag::False + }; + let _ = m.ref_mailbox.set_is_subscribed(*new_value); + }); self.sender .send(ThreadEvent::UIEvent(UIEvent::Notification( Some(format!( - "{}: mailbox subscription set successfully", - &self.name + "{}: `{}` has been {}subscribed.", + &self.name, + self.mailbox_entries[mailbox_hash].name(), + if *new_value { "" } else { "un" } )), String::new(), Some(crate::types::NotificationType::Info), ))) .expect("Could not send event on main channel"); } + Ok(Some(Ok(()))) => {} } } JobRequest::Watch { ref mut handle } => { -- cgit v1.2.3