melib/backends: MailBackend::refresh() returns Result

Handle cases were refresh() would fail properly. Fixes a crash reported in #13
memfd
Manos Pitsidianakis 2019-12-15 08:52:22 +02:00
parent 17a0f31b3e
commit 0201241786
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
4 changed files with 16 additions and 9 deletions

View File

@ -252,8 +252,8 @@ pub trait MailBackend: ::std::fmt::Debug + Send + Sync {
&mut self,
folder_hash: FolderHash,
sender: RefreshEventConsumer,
) -> Async<Result<Vec<RefreshEvent>>> {
unimplemented!()
) -> Result<Async<Result<Vec<RefreshEvent>>>> {
Err(MeliError::new("Unimplemented."))
}
fn watch(
&self,

View File

@ -203,7 +203,7 @@ impl MailBackend for MaildirType {
&mut self,
folder_hash: FolderHash,
sender: RefreshEventConsumer,
) -> Async<Result<Vec<RefreshEvent>>> {
) -> Result<Async<Result<Vec<RefreshEvent>>>> {
let w = AsyncBuilder::new();
let cache_dir = xdg::BaseDirectories::with_profile("meli", &self.name).unwrap();
@ -327,7 +327,7 @@ impl MailBackend for MaildirType {
}
})
};
w.build(handle)
Ok(w.build(handle))
}
fn watch(
&self,

View File

@ -676,10 +676,16 @@ impl Component for Listing {
UIEvent::Input(ref key)
if shortcut!(key == shortcuts[Listing::DESCRIPTION]["refresh"]) =>
{
let folder_hash =
context.accounts[self.cursor_pos.0].folders_order[self.cursor_pos.1];
let account = &mut context.accounts[self.cursor_pos.0];
account.refresh(folder_hash);
if let Some(&folder_hash) = account.folders_order.get(self.cursor_pos.1) {
if let Err(err) = account.refresh(folder_hash) {
context.replies.push_back(UIEvent::Notification(
Some("Could not refresh.".to_string()),
err.to_string(),
Some(NotificationType::INFO),
));
}
}
return true;
}
UIEvent::StartupCheck(_) => {

View File

@ -699,13 +699,14 @@ impl Account {
}
None
}
pub fn refresh(&mut self, folder_hash: FolderHash) {
pub fn refresh(&mut self, folder_hash: FolderHash) -> Result<()> {
let sender_ = self.sender.clone();
let r = RefreshEventConsumer::new(Box::new(move |r| {
sender_.send(ThreadEvent::from(r)).unwrap();
}));
let mut h = self.backend.write().unwrap().refresh(folder_hash, r);
let mut h = self.backend.write().unwrap().refresh(folder_hash, r)?;
self.work_context.new_work.send(h.work().unwrap()).unwrap();
Ok(())
}
pub fn watch(&self) {
if self.settings.account().manual_refresh {