imap: remove unnecessary Imap.connected variable

It is always the same as Imap.session.is_some().
This commit is contained in:
link2xt
2021-09-12 00:04:18 +00:00
parent da2f30786b
commit 15dcd62652

View File

@@ -88,7 +88,6 @@ pub struct Imap {
idle_interrupt: Receiver<InterruptInfo>, idle_interrupt: Receiver<InterruptInfo>,
config: ImapConfig, config: ImapConfig,
session: Option<Session>, session: Option<Session>,
connected: bool,
interrupt: Option<stop_token::StopSource>, interrupt: Option<stop_token::StopSource>,
should_reconnect: bool, should_reconnect: bool,
login_failed_once: bool, login_failed_once: bool,
@@ -200,7 +199,6 @@ impl Imap {
idle_interrupt, idle_interrupt,
config, config,
session: None, session: None,
connected: false,
interrupt: None, interrupt: None,
should_reconnect: false, should_reconnect: false,
login_failed_once: false, login_failed_once: false,
@@ -254,7 +252,7 @@ impl Imap {
if self.should_reconnect() { if self.should_reconnect() {
self.disconnect(context).await; self.disconnect(context).await;
self.should_reconnect = false; self.should_reconnect = false;
} else if self.is_connected() { } else if self.session.is_some() {
return Ok(()); return Ok(());
} }
@@ -347,7 +345,6 @@ impl Imap {
match login_res { match login_res {
Ok(session) => { Ok(session) => {
// needs to be set here to ensure it is set on reconnects. // needs to be set here to ensure it is set on reconnects.
self.connected = true;
self.session = Some(session); self.session = Some(session);
self.login_failed_once = false; self.login_failed_once = false;
context.emit_event(EventType::ImapConnected(format!( context.emit_event(EventType::ImapConnected(format!(
@@ -442,16 +439,11 @@ impl Imap {
warn!(context, "failed to logout: {:?}", err); warn!(context, "failed to logout: {:?}", err);
} }
} }
self.connected = false;
self.capabilities_determined = false; self.capabilities_determined = false;
self.config.selected_folder = None; self.config.selected_folder = None;
self.config.selected_mailbox = None; self.config.selected_mailbox = None;
} }
pub fn is_connected(&self) -> bool {
self.connected
}
pub fn should_reconnect(&self) -> bool { pub fn should_reconnect(&self) -> bool {
self.should_reconnect self.should_reconnect
} }
@@ -882,19 +874,13 @@ impl Imap {
return (None, 0); return (None, 0);
} }
if !self.is_connected() { let session = match self.session.as_mut() {
warn!(context, "Not connected"); Some(session) => session,
return (None, server_uids.len()); None => {
} 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 sets = build_sequence_sets(server_uids.clone()); let sets = build_sequence_sets(server_uids.clone());
let mut read_errors = 0; let mut read_errors = 0;
@@ -1123,7 +1109,7 @@ impl Imap {
if uid == 0 { if uid == 0 {
return Some(ImapActionResult::RetryLater); return Some(ImapActionResult::RetryLater);
} }
if !self.is_connected() { if self.session.is_none() {
// currently jobs are only performed on the INBOX thread // currently jobs are only performed on the INBOX thread
// TODO: make INBOX/SENT/MVBOX perform the jobs on their // TODO: make INBOX/SENT/MVBOX perform the jobs on their
// respective folders to avoid select_folder network traffic // 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<()> { pub async fn configure_folders(&mut self, context: &Context, create_mvbox: bool) -> Result<()> {
if !self.is_connected() { let session = match self.session {
bail!("IMAP No Connection established"); 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 {
let mut folders = match session.list(Some(""), Some("*")).await { Ok(f) => f,
Ok(f) => f, Err(err) => {
Err(err) => { bail!("list_folders failed: {}", err);
bail!("list_folders failed: {}", err); }
} };
};
let mut delimiter = ".".to_string(); let mut delimiter = ".".to_string();
let mut delimiter_is_default = true; let mut delimiter_is_default = true;
let mut mvbox_folder = None; let mut mvbox_folder = None;
let mut folder_configs = BTreeMap::new(); let mut folder_configs = BTreeMap::new();
let mut fallback_folder = get_fallback_folder(&delimiter); let mut fallback_folder = get_fallback_folder(&delimiter);
while let Some(folder) = folders.next().await { while let Some(folder) = folders.next().await {
let folder = folder?; let folder = folder?;
info!(context, "Scanning folder: {:?}", folder); info!(context, "Scanning folder: {:?}", folder);
// Update the delimiter iff there is a different one, but only once. // Update the delimiter iff there is a different one, but only once.
if let Some(d) = folder.delimiter() { if let Some(d) = folder.delimiter() {
if delimiter_is_default && !d.is_empty() && delimiter != d { if delimiter_is_default && !d.is_empty() && delimiter != d {
delimiter = d.to_string(); delimiter = d.to_string();
fallback_folder = get_fallback_folder(&delimiter); fallback_folder = get_fallback_folder(&delimiter);
delimiter_is_default = false; 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());
} }
} }
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, "Using \"{}\" as folder-delimiter.", delimiter);
info!(context, "Creating MVBOX-folder \"DeltaChat\"...",);
match session.create("DeltaChat").await { if mvbox_folder.is_none() && create_mvbox {
Ok(_) => { info!(context, "Creating MVBOX-folder \"DeltaChat\"...",);
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 { match session.create("DeltaChat").await {
Ok(_) => { Ok(_) => {
mvbox_folder = Some(fallback_folder); mvbox_folder = Some("DeltaChat".into());
info!( info!(context, "MVBOX-folder created.",);
context, }
"MVBOX-folder created as INBOX subfolder. ({})", err Err(err) => {
); warn!(
} context,
Err(err) => { "Cannot create MVBOX-folder, trying to create INBOX subfolder. ({})", err
warn!(context, "Cannot create MVBOX-folder. ({})", 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. // SUBSCRIBE is needed to make the folder visible to the LSUB command
// for the LIST command, the folder is always visible. // that may be used by other MUAs to list folders.
if let Some(ref mvbox) = mvbox_folder { // for the LIST command, the folder is always visible.
if let Err(err) = session.subscribe(mvbox).await { if let Some(ref mvbox) = mvbox_folder {
warn!(context, "could not subscribe to {:?}: {:?}", mvbox, err); 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 context
.set_config(Config::ConfiguredInboxFolder, Some("INBOX")) .set_config(Config::ConfiguredMvboxFolder, Some(mvbox_folder))
.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)
.await?; .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."); info!(context, "FINISHED configuring IMAP-folders.");
Ok(()) Ok(())
} }