melib: make MailBackend::folders return Result
Change folders() signature: - fn folders(&self) -> FnvHashMap<FolderHash, Folder>; + fn folders(&self) -> Result<FnvHashMap<FolderHash, Folder>>; Imap may not be online, therefore we need the ability to return an error.jmap
parent
3d3ead02e9
commit
41a678c6ef
|
@ -201,7 +201,7 @@ pub trait MailBackend: ::std::fmt::Debug + Send + Sync {
|
||||||
sender: RefreshEventConsumer,
|
sender: RefreshEventConsumer,
|
||||||
work_context: WorkContext,
|
work_context: WorkContext,
|
||||||
) -> Result<std::thread::ThreadId>;
|
) -> Result<std::thread::ThreadId>;
|
||||||
fn folders(&self) -> FnvHashMap<FolderHash, Folder>;
|
fn folders(&self) -> Result<FnvHashMap<FolderHash, Folder>>;
|
||||||
fn operation(&self, hash: EnvelopeHash) -> Box<dyn BackendOp>;
|
fn operation(&self, hash: EnvelopeHash) -> Box<dyn BackendOp>;
|
||||||
|
|
||||||
fn save(&self, bytes: &[u8], folder: &str, flags: Option<Flag>) -> Result<()>;
|
fn save(&self, bytes: &[u8], folder: &str, flags: Option<Flag>) -> Result<()>;
|
||||||
|
|
|
@ -269,17 +269,17 @@ impl MailBackend for ImapType {
|
||||||
Ok(handle.thread().id())
|
Ok(handle.thread().id())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn folders(&self) -> FnvHashMap<FolderHash, Folder> {
|
fn folders(&self) -> Result<FnvHashMap<FolderHash, Folder>> {
|
||||||
{
|
{
|
||||||
let folders = self.folders.read().unwrap();
|
let folders = self.folders.read().unwrap();
|
||||||
if !folders.is_empty() {
|
if !folders.is_empty() {
|
||||||
return folders
|
return Ok(folders
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(h, f)| (*h, Box::new(Clone::clone(f)) as Folder))
|
.map(|(h, f)| (*h, Box::new(Clone::clone(f)) as Folder))
|
||||||
.collect();
|
.collect());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let mut folders = self.folders.write().unwrap();
|
let mut folders = self.folders.write()?;
|
||||||
*folders = ImapType::imap_folders(&self.connection);
|
*folders = ImapType::imap_folders(&self.connection);
|
||||||
folders.retain(|_, f| (self.is_subscribed)(f.path()));
|
folders.retain(|_, f| (self.is_subscribed)(f.path()));
|
||||||
let keys = folders.keys().cloned().collect::<FnvHashSet<FolderHash>>();
|
let keys = folders.keys().cloned().collect::<FnvHashSet<FolderHash>>();
|
||||||
|
@ -287,10 +287,10 @@ impl MailBackend for ImapType {
|
||||||
f.children.retain(|c| keys.contains(c));
|
f.children.retain(|c| keys.contains(c));
|
||||||
}
|
}
|
||||||
*self.online.lock().unwrap() = true;
|
*self.online.lock().unwrap() = true;
|
||||||
folders
|
Ok(folders
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(h, f)| (*h, Box::new(Clone::clone(f)) as Folder))
|
.map(|(h, f)| (*h, Box::new(Clone::clone(f)) as Folder))
|
||||||
.collect()
|
.collect())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn operation(&self, hash: EnvelopeHash) -> Box<dyn BackendOp> {
|
fn operation(&self, hash: EnvelopeHash) -> Box<dyn BackendOp> {
|
||||||
|
|
|
@ -186,12 +186,15 @@ impl MailBackend for MaildirType {
|
||||||
fn is_online(&self) -> bool {
|
fn is_online(&self) -> bool {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
fn folders(&self) -> FnvHashMap<FolderHash, Folder> {
|
|
||||||
self.folders
|
fn folders(&self) -> Result<FnvHashMap<FolderHash, Folder>> {
|
||||||
|
Ok(self
|
||||||
|
.folders
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(h, f)| (*h, f.clone() as Folder))
|
.map(|(h, f)| (*h, f.clone() as Folder))
|
||||||
.collect()
|
.collect())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get(&mut self, folder: &Folder) -> Async<Result<Vec<Envelope>>> {
|
fn get(&mut self, folder: &Folder) -> Async<Result<Vec<Envelope>>> {
|
||||||
self.multicore(4, folder)
|
self.multicore(4, folder)
|
||||||
}
|
}
|
||||||
|
|
|
@ -536,13 +536,14 @@ impl MailBackend for MboxType {
|
||||||
})?;
|
})?;
|
||||||
Ok(handle.thread().id())
|
Ok(handle.thread().id())
|
||||||
}
|
}
|
||||||
fn folders(&self) -> FnvHashMap<FolderHash, Folder> {
|
fn folders(&self) -> Result<FnvHashMap<FolderHash, Folder>> {
|
||||||
self.folders
|
Ok(self
|
||||||
|
.folders
|
||||||
.lock()
|
.lock()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(h, f)| (*h, f.clone() as Folder))
|
.map(|(h, f)| (*h, f.clone() as Folder))
|
||||||
.collect()
|
.collect())
|
||||||
}
|
}
|
||||||
fn operation(&self, hash: EnvelopeHash) -> Box<dyn BackendOp> {
|
fn operation(&self, hash: EnvelopeHash) -> Box<dyn BackendOp> {
|
||||||
let (offset, length) = {
|
let (offset, length) = {
|
||||||
|
|
|
@ -268,13 +268,13 @@ impl MailBackend for NotmuchDb {
|
||||||
.spawn(move || {})?;
|
.spawn(move || {})?;
|
||||||
Ok(handle.thread().id())
|
Ok(handle.thread().id())
|
||||||
}
|
}
|
||||||
fn folders(&self) -> FnvHashMap<FolderHash, Folder> {
|
fn folders(&self) -> Result<FnvHashMap<FolderHash, Folder>> {
|
||||||
self.folders
|
Ok(self.folders
|
||||||
.read()
|
.read()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(k, f)| (*k, BackendFolder::clone(f)))
|
.map(|(k, f)| (*k, BackendFolder::clone(f)))
|
||||||
.collect()
|
.collect())
|
||||||
}
|
}
|
||||||
fn operation(&self, hash: EnvelopeHash) -> Box<dyn BackendOp> {
|
fn operation(&self, hash: EnvelopeHash) -> Box<dyn BackendOp> {
|
||||||
Box::new(NotmuchOp {
|
Box::new(NotmuchOp {
|
||||||
|
|
|
@ -289,8 +289,8 @@ impl Account {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init(&mut self) {
|
fn init(&mut self) {
|
||||||
let mut ref_folders: FnvHashMap<FolderHash, Folder> =
|
let ref_folders: FnvHashMap<FolderHash, Folder> =
|
||||||
self.backend.read().unwrap().folders();
|
self.backend.read().unwrap().folders().unwrap();
|
||||||
let mut folders: FnvHashMap<FolderHash, MailboxEntry> =
|
let mut folders: FnvHashMap<FolderHash, MailboxEntry> =
|
||||||
FnvHashMap::with_capacity_and_hasher(ref_folders.len(), Default::default());
|
FnvHashMap::with_capacity_and_hasher(ref_folders.len(), Default::default());
|
||||||
let mut folders_order: Vec<FolderHash> = Vec::with_capacity(ref_folders.len());
|
let mut folders_order: Vec<FolderHash> = Vec::with_capacity(ref_folders.len());
|
||||||
|
@ -575,7 +575,7 @@ impl Account {
|
||||||
}
|
}
|
||||||
|
|
||||||
let ref_folders: FnvHashMap<FolderHash, Folder> =
|
let ref_folders: FnvHashMap<FolderHash, Folder> =
|
||||||
self.backend.read().unwrap().folders();
|
self.backend.read().unwrap().folders().unwrap();
|
||||||
let folder_conf = &self.settings.folder_confs[&self.folder_names[&folder_hash]];
|
let folder_conf = &self.settings.folder_confs[&self.folder_names[&folder_hash]];
|
||||||
if folder_conf.folder_conf().ignore.is_true() {
|
if folder_conf.folder_conf().ignore.is_true() {
|
||||||
return Some(UIEvent::MailboxUpdate((self.index, folder_hash)));
|
return Some(UIEvent::MailboxUpdate((self.index, folder_hash)));
|
||||||
|
@ -626,7 +626,7 @@ impl Account {
|
||||||
}
|
}
|
||||||
RefreshEventKind::Rescan => {
|
RefreshEventKind::Rescan => {
|
||||||
let ref_folders: FnvHashMap<FolderHash, Folder> =
|
let ref_folders: FnvHashMap<FolderHash, Folder> =
|
||||||
self.backend.read().unwrap().folders();
|
self.backend.read().unwrap().folders().unwrap();
|
||||||
let handle = Account::new_worker(
|
let handle = Account::new_worker(
|
||||||
&self.settings,
|
&self.settings,
|
||||||
ref_folders[&folder_hash].clone(),
|
ref_folders[&folder_hash].clone(),
|
||||||
|
@ -686,8 +686,12 @@ impl Account {
|
||||||
self.folders.is_empty()
|
self.folders.is_empty()
|
||||||
}
|
}
|
||||||
pub fn list_folders(&self) -> Vec<Folder> {
|
pub fn list_folders(&self) -> Vec<Folder> {
|
||||||
let mut folders = self.backend.read().unwrap().folders();
|
|
||||||
let folder_confs = self.settings.conf().folders();
|
let folder_confs = self.settings.conf().folders();
|
||||||
|
let mut folders = if let Ok(folders) = self.backend.read().unwrap().folders() {
|
||||||
|
folders
|
||||||
|
} else {
|
||||||
|
return Vec::new();
|
||||||
|
};
|
||||||
//debug!("folder renames: {:?}", folder_renames);
|
//debug!("folder renames: {:?}", folder_renames);
|
||||||
for f in folders.values_mut() {
|
for f in folders.values_mut() {
|
||||||
if let Some(r) = folder_confs.get(f.path()) {
|
if let Some(r) = folder_confs.get(f.path()) {
|
||||||
|
|
|
@ -147,13 +147,7 @@ impl Context {
|
||||||
let was_online = accounts[account_pos].is_online;
|
let was_online = accounts[account_pos].is_online;
|
||||||
if accounts[account_pos].is_online() {
|
if accounts[account_pos].is_online() {
|
||||||
if !was_online {
|
if !was_online {
|
||||||
for folder in accounts[account_pos]
|
for folder in accounts[account_pos].list_folders() {
|
||||||
.backend
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.folders()
|
|
||||||
.values()
|
|
||||||
{
|
|
||||||
debug!("hash & folder: {:?} {}", folder.hash(), folder.name());
|
debug!("hash & folder: {:?} {}", folder.hash(), folder.name());
|
||||||
mailbox_hashes.insert(folder.hash(), account_pos);
|
mailbox_hashes.insert(folder.hash(), account_pos);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue