expose empty server functionality and test it (also introducing a new DC_EVENT_IMAP_FOLDER_EMPTIED event)

This commit is contained in:
holger krekel
2019-10-29 19:05:25 +01:00
parent 7628ee1e05
commit 911c0e45dc
10 changed files with 117 additions and 6 deletions

View File

@@ -54,6 +54,12 @@ pub enum Event {
#[strum(props(id = "105"))]
ImapMessageMoved(String),
/// Emitted when an IMAP folder was emptied
///
/// @return 0
#[strum(props(id = "106"))]
ImapFolderEmptied(String),
/// Emitted when an new file in the $BLOBDIR was created
///
/// @return 0

View File

@@ -651,7 +651,8 @@ impl Imap {
}
// deselect existing folder, if needed (it's also done implicitly by SELECT, however, without EXPUNGE then)
if self.config.read().unwrap().selected_folder_needs_expunge {
let needs_expunge = { self.config.read().unwrap().selected_folder_needs_expunge };
if needs_expunge {
if let Some(ref folder) = self.config.read().unwrap().selected_folder {
info!(context, "Expunge messages in \"{}\".", folder);
@@ -659,16 +660,19 @@ impl Imap {
// https://tools.ietf.org/html/rfc3501#section-6.4.2
if let Some(ref mut session) = &mut *self.session.lock().unwrap() {
match session.close() {
Ok(_) => {}
Ok(_) => {
info!(context, "close/expunge succeeded");
}
Err(err) => {
warn!(context, "failed to close session: {:?}", err);
return 0;
}
}
} else {
return 0;
}
self.config.write().unwrap().selected_folder_needs_expunge = true;
}
self.config.write().unwrap().selected_folder_needs_expunge = false;
}
// select new folder
@@ -1510,10 +1514,10 @@ impl Imap {
if self.select_folder::<String>(context, None) == 0 {
warn!(
context,
"could not perform expunge on empty folder {}", folder
"could not perform expunge on empty-marked folder {}", folder
);
} else {
info!(context, "Emptying folder '{}' done.", folder);
emit_event!(context, Event::ImapFolderEmptied(folder.to_string()));
}
}
}

View File

@@ -1276,6 +1276,12 @@ pub fn update_server_uid(
}
}
#[allow(dead_code)]
pub fn dc_empty_server(context: &Context, flags: u32) {
job_kill_action(context, Action::EmptyServer);
job_add(context, Action::EmptyServer, flags as i32, Params::new(), 0);
}
#[cfg(test)]
mod tests {
use super::*;