From 15dcd62652b67658910c860987d7847a6315c353 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 12 Sep 2021 00:04:18 +0000 Subject: [PATCH] imap: remove unnecessary Imap.connected variable It is always the same as Imap.session.is_some(). --- src/imap.rs | 213 ++++++++++++++++++++++++---------------------------- 1 file changed, 99 insertions(+), 114 deletions(-) diff --git a/src/imap.rs b/src/imap.rs index 7eebd963e..bb0148fa0 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -88,7 +88,6 @@ pub struct Imap { idle_interrupt: Receiver, config: ImapConfig, session: Option, - connected: bool, interrupt: Option, should_reconnect: bool, login_failed_once: bool, @@ -200,7 +199,6 @@ impl Imap { idle_interrupt, config, session: None, - connected: false, interrupt: None, should_reconnect: false, login_failed_once: false, @@ -254,7 +252,7 @@ impl Imap { if self.should_reconnect() { self.disconnect(context).await; self.should_reconnect = false; - } else if self.is_connected() { + } else if self.session.is_some() { return Ok(()); } @@ -347,7 +345,6 @@ impl Imap { match login_res { Ok(session) => { // needs to be set here to ensure it is set on reconnects. - self.connected = true; self.session = Some(session); self.login_failed_once = false; context.emit_event(EventType::ImapConnected(format!( @@ -442,16 +439,11 @@ impl Imap { warn!(context, "failed to logout: {:?}", err); } } - self.connected = false; self.capabilities_determined = false; self.config.selected_folder = None; self.config.selected_mailbox = None; } - pub fn is_connected(&self) -> bool { - self.connected - } - pub fn should_reconnect(&self) -> bool { self.should_reconnect } @@ -882,19 +874,13 @@ impl Imap { return (None, 0); } - if !self.is_connected() { - warn!(context, "Not connected"); - return (None, server_uids.len()); - } - - if self.session.is_none() { - // we could not get a valid imap session, this should be retried - self.trigger_reconnect(context).await; - warn!(context, "Could not get IMAP session"); - return (None, server_uids.len()); - } - - let session = self.session.as_mut().unwrap(); + let session = match self.session.as_mut() { + Some(session) => session, + None => { + warn!(context, "Not connected"); + return (None, server_uids.len()); + } + }; let sets = build_sequence_sets(server_uids.clone()); let mut read_errors = 0; @@ -1123,7 +1109,7 @@ impl Imap { if uid == 0 { return Some(ImapActionResult::RetryLater); } - if !self.is_connected() { + if self.session.is_none() { // currently jobs are only performed on the INBOX thread // TODO: make INBOX/SENT/MVBOX perform the jobs on their // respective folders to avoid select_folder network traffic @@ -1283,115 +1269,114 @@ impl Imap { } pub async fn configure_folders(&mut self, context: &Context, create_mvbox: bool) -> Result<()> { - if !self.is_connected() { - bail!("IMAP No Connection established"); - } + let session = match self.session { + Some(ref mut session) => session, + None => bail!("no IMAP connection established"), + }; - if let Some(ref mut session) = &mut self.session { - let mut folders = match session.list(Some(""), Some("*")).await { - Ok(f) => f, - Err(err) => { - bail!("list_folders failed: {}", err); - } - }; + let mut folders = match session.list(Some(""), Some("*")).await { + Ok(f) => f, + Err(err) => { + bail!("list_folders failed: {}", err); + } + }; - let mut delimiter = ".".to_string(); - let mut delimiter_is_default = true; - let mut mvbox_folder = None; - let mut folder_configs = BTreeMap::new(); - let mut fallback_folder = get_fallback_folder(&delimiter); + let mut delimiter = ".".to_string(); + let mut delimiter_is_default = true; + let mut mvbox_folder = None; + let mut folder_configs = BTreeMap::new(); + let mut fallback_folder = get_fallback_folder(&delimiter); - while let Some(folder) = folders.next().await { - let folder = folder?; - info!(context, "Scanning folder: {:?}", folder); + while let Some(folder) = folders.next().await { + let folder = folder?; + info!(context, "Scanning folder: {:?}", folder); - // Update the delimiter iff there is a different one, but only once. - if let Some(d) = folder.delimiter() { - if delimiter_is_default && !d.is_empty() && delimiter != d { - delimiter = d.to_string(); - fallback_folder = get_fallback_folder(&delimiter); - delimiter_is_default = false; - } - } - - let folder_meaning = get_folder_meaning(&folder); - let folder_name_meaning = get_folder_meaning_by_name(folder.name()); - if folder.name() == "DeltaChat" { - // Always takes precedence - mvbox_folder = Some(folder.name().to_string()); - } else if folder.name() == fallback_folder { - // only set if none has been already set - if mvbox_folder.is_none() { - mvbox_folder = Some(folder.name().to_string()); - } - } else if let Some(config) = folder_meaning.to_config() { - // Always takes precedence - folder_configs.insert(config, folder.name().to_string()); - } else if let Some(config) = folder_name_meaning.to_config() { - // only set if none has been already set - folder_configs - .entry(config) - .or_insert_with(|| folder.name().to_string()); + // Update the delimiter iff there is a different one, but only once. + if let Some(d) = folder.delimiter() { + if delimiter_is_default && !d.is_empty() && delimiter != d { + delimiter = d.to_string(); + fallback_folder = get_fallback_folder(&delimiter); + delimiter_is_default = false; } } - drop(folders); - info!(context, "Using \"{}\" as folder-delimiter.", delimiter); + let folder_meaning = get_folder_meaning(&folder); + let folder_name_meaning = get_folder_meaning_by_name(folder.name()); + if folder.name() == "DeltaChat" { + // Always takes precedence + mvbox_folder = Some(folder.name().to_string()); + } else if folder.name() == fallback_folder { + // only set if none has been already set + if mvbox_folder.is_none() { + mvbox_folder = Some(folder.name().to_string()); + } + } else if let Some(config) = folder_meaning.to_config() { + // Always takes precedence + folder_configs.insert(config, folder.name().to_string()); + } else if let Some(config) = folder_name_meaning.to_config() { + // only set if none has been already set + folder_configs + .entry(config) + .or_insert_with(|| folder.name().to_string()); + } + } + drop(folders); - if mvbox_folder.is_none() && create_mvbox { - info!(context, "Creating MVBOX-folder \"DeltaChat\"...",); + info!(context, "Using \"{}\" as folder-delimiter.", delimiter); - match session.create("DeltaChat").await { - Ok(_) => { - mvbox_folder = Some("DeltaChat".into()); - info!(context, "MVBOX-folder created.",); - } - Err(err) => { - warn!( - context, - "Cannot create MVBOX-folder, trying to create INBOX subfolder. ({})", - err - ); + if mvbox_folder.is_none() && create_mvbox { + info!(context, "Creating MVBOX-folder \"DeltaChat\"...",); - match session.create(&fallback_folder).await { - Ok(_) => { - mvbox_folder = Some(fallback_folder); - info!( - context, - "MVBOX-folder created as INBOX subfolder. ({})", err - ); - } - Err(err) => { - warn!(context, "Cannot create MVBOX-folder. ({})", err); - } + match session.create("DeltaChat").await { + Ok(_) => { + mvbox_folder = Some("DeltaChat".into()); + info!(context, "MVBOX-folder created.",); + } + Err(err) => { + warn!( + context, + "Cannot create MVBOX-folder, trying to create INBOX subfolder. ({})", err + ); + + match session.create(&fallback_folder).await { + Ok(_) => { + mvbox_folder = Some(fallback_folder); + info!( + context, + "MVBOX-folder created as INBOX subfolder. ({})", err + ); + } + Err(err) => { + warn!(context, "Cannot create MVBOX-folder. ({})", err); } } } - // SUBSCRIBE is needed to make the folder visible to the LSUB command - // that may be used by other MUAs to list folders. - // for the LIST command, the folder is always visible. - if let Some(ref mvbox) = mvbox_folder { - if let Err(err) = session.subscribe(mvbox).await { - warn!(context, "could not subscribe to {:?}: {:?}", mvbox, err); - } + } + // SUBSCRIBE is needed to make the folder visible to the LSUB command + // that may be used by other MUAs to list folders. + // for the LIST command, the folder is always visible. + if let Some(ref mvbox) = mvbox_folder { + if let Err(err) = session.subscribe(mvbox).await { + warn!(context, "could not subscribe to {:?}: {:?}", mvbox, err); } } + } + context + .set_config(Config::ConfiguredInboxFolder, Some("INBOX")) + .await?; + if let Some(ref mvbox_folder) = mvbox_folder { context - .set_config(Config::ConfiguredInboxFolder, Some("INBOX")) - .await?; - if let Some(ref mvbox_folder) = mvbox_folder { - context - .set_config(Config::ConfiguredMvboxFolder, Some(mvbox_folder)) - .await?; - } - for (config, name) in folder_configs { - context.set_config(config, Some(&name)).await?; - } - context - .sql - .set_raw_config_int("folders_configured", DC_FOLDERS_CONFIGURED_VERSION) + .set_config(Config::ConfiguredMvboxFolder, Some(mvbox_folder)) .await?; } + for (config, name) in folder_configs { + context.set_config(config, Some(&name)).await?; + } + context + .sql + .set_raw_config_int("folders_configured", DC_FOLDERS_CONFIGURED_VERSION) + .await?; + info!(context, "FINISHED configuring IMAP-folders."); Ok(()) }