From d2b4057b7b63d909a2d47339938a8286cf6a7223 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Sat, 14 Dec 2019 18:55:08 +0200 Subject: [PATCH] melib/MailBackend: add connect() method --- melib/src/backends.rs | 1 + melib/src/backends/imap.rs | 11 +++++++++++ melib/src/backends/jmap.rs | 11 +++++++++++ ui/src/conf/accounts.rs | 4 ++++ 4 files changed, 27 insertions(+) diff --git a/melib/src/backends.rs b/melib/src/backends.rs index bfdc5a32a..fa70d43e9 100644 --- a/melib/src/backends.rs +++ b/melib/src/backends.rs @@ -246,6 +246,7 @@ type NewFolderName = String; pub trait MailBackend: ::std::fmt::Debug + Send + Sync { fn is_online(&self) -> Result<()>; + fn connect(&mut self) {} fn get(&mut self, folder: &Folder) -> Async>>; fn watch( &self, diff --git a/melib/src/backends/imap.rs b/melib/src/backends/imap.rs index 8b3fabec4..dc3e39ba4 100644 --- a/melib/src/backends/imap.rs +++ b/melib/src/backends/imap.rs @@ -139,6 +139,17 @@ impl MailBackend for ImapType { fn is_online(&self) -> Result<()> { self.online.lock().unwrap().1.clone() } + + fn connect(&mut self) { + if self.is_online().is_err() { + if Instant::now().duration_since(self.online.lock().unwrap().0) + >= std::time::Duration::new(2, 0) + { + let _ = self.folders(); + } + } + } + fn get(&mut self, folder: &Folder) -> Async>> { macro_rules! exit_on_error { ($tx:expr,$($result:expr)+) => { diff --git a/melib/src/backends/jmap.rs b/melib/src/backends/jmap.rs index 4a574b43d..e1815c198 100644 --- a/melib/src/backends/jmap.rs +++ b/melib/src/backends/jmap.rs @@ -196,6 +196,17 @@ impl MailBackend for JmapType { fn is_online(&self) -> Result<()> { self.online.lock().unwrap().1.clone() } + + fn connect(&mut self) { + if self.is_online().is_err() { + if Instant::now().duration_since(self.online.lock().unwrap().0) + >= std::time::Duration::new(2, 0) + { + let _ = self.folders(); + } + } + } + fn get(&mut self, folder: &Folder) -> Async>> { let mut w = AsyncBuilder::new(); let folders = self.folders.clone(); diff --git a/ui/src/conf/accounts.rs b/ui/src/conf/accounts.rs index 145589efc..c9c1f97ae 100644 --- a/ui/src/conf/accounts.rs +++ b/ui/src/conf/accounts.rs @@ -992,6 +992,10 @@ impl Account { /* Call only in Context::is_online, since only Context can launch the watcher threads if an * account goes from offline to online. */ pub fn is_online(&mut self) -> Result<()> { + if !self.is_online { + self.backend.write().unwrap().connect(); + } + let ret = self.backend.read().unwrap().is_online(); if ret.is_ok() != self.is_online && ret.is_ok() { self.init();