mirror of
https://github.com/chatmail/core.git
synced 2026-05-24 17:26:30 +03:00
imap: remove unnecessary Imap.connected variable
It is always the same as Imap.session.is_some().
This commit is contained in:
213
src/imap.rs
213
src/imap.rs
@@ -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(())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user