From 25b325dbdac21dfaa50c12f0d307e5e9e4373de3 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Wed, 26 Aug 2020 20:00:25 +0300 Subject: [PATCH] Keep bytes copy in SaveMessage job in case of failure --- src/conf/accounts.rs | 49 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/src/conf/accounts.rs b/src/conf/accounts.rs index 16e3b496b..dbb68b5ff 100644 --- a/src/conf/accounts.rs +++ b/src/conf/accounts.rs @@ -182,7 +182,12 @@ pub enum JobRequest { IsOnline(JoinHandle, oneshot::Receiver>), Refresh(MailboxHash, JoinHandle, oneshot::Receiver>), SetFlags(EnvelopeHashBatch, JoinHandle, oneshot::Receiver>), - SaveMessage(MailboxHash, JoinHandle, oneshot::Receiver>), + SaveMessage { + bytes: Vec, + mailbox_hash: MailboxHash, + handle: JoinHandle, + channel: oneshot::Receiver>, + }, SendMessage, SendMessageBackground(JoinHandle, JobChannel<()>), CopyTo(MailboxHash, JoinHandle, oneshot::Receiver>>), @@ -217,7 +222,7 @@ impl Drop for JobRequest { JobRequest::IsOnline(h, _) => h.0.cancel(), JobRequest::Refresh(_, h, _) => h.0.cancel(), JobRequest::SetFlags(_, h, _) => h.0.cancel(), - JobRequest::SaveMessage(_, h, _) => h.0.cancel(), + JobRequest::SaveMessage { handle, .. } => handle.0.cancel(), JobRequest::CopyTo(_, h, _) => h.0.cancel(), JobRequest::DeleteMessages(_, h, _) => h.0.cancel(), JobRequest::CreateMailbox { handle, .. } => handle.0.cancel(), @@ -249,7 +254,7 @@ impl core::fmt::Debug for JobRequest { JobRequest::IsOnline(_, _) => write!(f, "JobRequest::IsOnline"), JobRequest::Refresh(_, _, _) => write!(f, "JobRequest::Refresh"), JobRequest::SetFlags(_, _, _) => write!(f, "JobRequest::SetFlags"), - JobRequest::SaveMessage(_, _, _) => write!(f, "JobRequest::SaveMessage"), + JobRequest::SaveMessage { .. } => write!(f, "JobRequest::SaveMessage"), JobRequest::CopyTo(_, _, _) => write!(f, "JobRequest::CopyTo"), JobRequest::DeleteMessages(_, _, _) => write!(f, "JobRequest::DeleteMessages"), JobRequest::CreateMailbox { .. } => write!(f, "JobRequest::CreateMailbox"), @@ -1124,14 +1129,21 @@ impl Account { .write() .unwrap() .save(bytes.to_vec(), mailbox_hash, flags)?; - let (rcvr, handle, job_id) = self.job_executor.spawn_specialized(job); + let (channel, handle, job_id) = self.job_executor.spawn_specialized(job); self.sender .send(ThreadEvent::UIEvent(UIEvent::StatusEvent( StatusEvent::NewJob(job_id), ))) .unwrap(); - self.active_jobs - .insert(job_id, JobRequest::SaveMessage(mailbox_hash, handle, rcvr)); + self.active_jobs.insert( + job_id, + JobRequest::SaveMessage { + bytes: bytes.to_vec(), + mailbox_hash, + handle, + channel, + }, + ); self.active_job_instants .insert(std::time::Instant::now(), job_id); Ok(()) @@ -1647,14 +1659,31 @@ impl Account { .expect("Could not send event on main channel"); } } - JobRequest::SaveMessage(_, _, ref mut chan) => { - let r = chan.try_recv().unwrap(); + JobRequest::SaveMessage { + ref mut channel, + ref bytes, + .. + } => { + let r = channel.try_recv().unwrap(); if let Some(Err(err)) = r { + melib::log(format!("Could not save message: {}", err), melib::ERROR); + let file = crate::types::create_temp_file(bytes, None, None, false); + debug!("message saved in {}", file.path.display()); + melib::log( + format!( + "Message was stored in {} so that you can restore it manually.", + file.path.display() + ), + melib::INFO, + ); self.sender .send(ThreadEvent::UIEvent(UIEvent::Notification( Some(format!("{}: could not save message", &self.name)), - err.to_string(), - Some(crate::types::NotificationType::ERROR), + format!( + "Message was stored in {} so that you can restore it manually.", + file.path.display() + ), + Some(crate::types::NotificationType::INFO), ))) .expect("Could not send event on main channel"); }