From 391a6bf422ff6998012a94dbb266eb18c9984a75 Mon Sep 17 00:00:00 2001 From: Dmitry Bogatov Date: Tue, 17 Sep 2019 15:24:53 +0000 Subject: [PATCH 1/5] Replace numbers with named constants --- src/imap.rs | 8 ++++---- src/job.rs | 9 ++++----- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/imap.rs b/src/imap.rs index 56061c8a0..2f648e4d5 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -19,10 +19,10 @@ use crate::param::Params; const DC_IMAP_SEEN: usize = 0x0001; -const DC_SUCCESS: usize = 3; -const DC_ALREADY_DONE: usize = 2; -const DC_RETRY_LATER: usize = 1; -const DC_FAILED: usize = 0; +pub const DC_SUCCESS: usize = 3; +pub const DC_ALREADY_DONE: usize = 2; +pub const DC_RETRY_LATER: usize = 1; +pub const DC_FAILED: usize = 0; const PREFETCH_FLAGS: &str = "(UID ENVELOPE)"; const BODY_FLAGS: &str = "(FLAGS BODY.PEEK[])"; diff --git a/src/job.rs b/src/job.rs index 1cf074fd9..28d1b3569 100644 --- a/src/job.rs +++ b/src/job.rs @@ -246,15 +246,14 @@ impl Job { msg.server_uid, &dest_folder, &mut dest_uid, - ) as libc::c_uint - { - 1 => { + ) { + DC_RETRY_LATER => { self.try_again_later(3i32, None); } - 3 => { + DC_SUCCESS => { dc_update_server_uid(context, &msg.rfc724_mid, &dest_folder, dest_uid); } - 0 | 2 | _ => {} + DC_FAILED | DC_ALREADY_DONE | _ => {} } } } From 6ee9465d43269cd1b1c9016e9989e0bc86f9b4df Mon Sep 17 00:00:00 2001 From: Dmitry Bogatov Date: Wed, 18 Sep 2019 15:13:56 +0000 Subject: [PATCH 2/5] Make return type of Image::mv an enum Replace named constants with enum to improve type-safety and make exhausiveness checks possible. Note, that since this enum never pass FFI border, its numeric values does not need to be specified explicitly and can be left on compiler's discretion. --- src/imap.rs | 28 ++++++++++++++++++---------- src/job.rs | 10 +++++----- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/imap.rs b/src/imap.rs index 2f648e4d5..52458cdcc 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -19,6 +19,14 @@ use crate::param::Params; const DC_IMAP_SEEN: usize = 0x0001; +#[derive(Debug, Display, Clone, Copy, PartialEq, Eq)] +pub enum ImapResult { + Failed, + RetryLater, + AlreadyDone, + Success, +} + pub const DC_SUCCESS: usize = 3; pub const DC_ALREADY_DONE: usize = 2; pub const DC_RETRY_LATER: usize = 1; @@ -1130,12 +1138,12 @@ impl Imap { uid: u32, dest_folder: S2, dest_uid: &mut u32, - ) -> usize { - let mut res = DC_RETRY_LATER; + ) -> ImapResult { + let mut res = ImapResult::RetryLater; let set = format!("{}", uid); if uid == 0 { - res = DC_FAILED; + res = ImapResult::Failed; } else if folder.as_ref() == dest_folder.as_ref() { info!( context, @@ -1145,7 +1153,7 @@ impl Imap { dest_folder.as_ref() ); - res = DC_ALREADY_DONE; + res = ImapResult::AlreadyDone; } else { info!( context, @@ -1165,7 +1173,7 @@ impl Imap { let moved = if let Some(ref mut session) = &mut *self.session.lock().unwrap() { match session.uid_mv(&set, &dest_folder) { Ok(_) => { - res = DC_SUCCESS; + res = ImapResult::Success; true } Err(err) => { @@ -1205,22 +1213,22 @@ impl Imap { warn!(context, "Cannot mark message as \"Deleted\".",); } self.config.write().unwrap().selected_folder_needs_expunge = true; - res = DC_SUCCESS; + res = ImapResult::Success; } } } } - if res == DC_SUCCESS { + if res == ImapResult::Success { // TODO: is this correct? *dest_uid = uid; } - if res == DC_RETRY_LATER { + if res == ImapResult::RetryLater { if self.should_reconnect() { - DC_RETRY_LATER + ImapResult::RetryLater } else { - DC_FAILED + ImapResult::Failed } } else { res diff --git a/src/job.rs b/src/job.rs index 28d1b3569..6b570fa0d 100644 --- a/src/job.rs +++ b/src/job.rs @@ -247,13 +247,13 @@ impl Job { &dest_folder, &mut dest_uid, ) { - DC_RETRY_LATER => { + ImapResult::RetryLater => { self.try_again_later(3i32, None); } - DC_SUCCESS => { + ImapResult::Success => { dc_update_server_uid(context, &msg.rfc724_mid, &dest_folder, dest_uid); } - DC_FAILED | DC_ALREADY_DONE | _ => {} + ImapResult::Failed | ImapResult::AlreadyDone => {} } } } @@ -401,8 +401,8 @@ impl Job { } let dest_folder = context.sql.get_config(context, "configured_mvbox_folder"); if let Some(dest_folder) = dest_folder { - if 1 == inbox.mv(context, folder, uid, dest_folder, &mut dest_uid) - as libc::c_uint + if ImapResult::RetryLater + == inbox.mv(context, folder, uid, dest_folder, &mut dest_uid) { self.try_again_later(3, None); } From 6e2da27f455e193269784c87ab036e4ef969357f Mon Sep 17 00:00:00 2001 From: Dmitry Bogatov Date: Fri, 20 Sep 2019 14:42:41 +0000 Subject: [PATCH 3/5] Change return type of Imap::set_seen to enum --- src/imap.rs | 14 +++++++------- src/job.rs | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/imap.rs b/src/imap.rs index 52458cdcc..9a3332146 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -1262,11 +1262,11 @@ impl Imap { } } - pub fn set_seen>(&self, context: &Context, folder: S, uid: u32) -> usize { - let mut res = DC_RETRY_LATER; + pub fn set_seen>(&self, context: &Context, folder: S, uid: u32) -> ImapResult { + let mut res = ImapResult::RetryLater; if uid == 0 { - res = DC_FAILED + res = ImapResult::Failed } else if self.is_connected() { info!( context, @@ -1284,15 +1284,15 @@ impl Imap { } else if self.add_flag(context, uid, "\\Seen") == 0 { warn!(context, "Cannot mark message as seen.",); } else { - res = DC_SUCCESS + res = ImapResult::Success } } - if res == DC_RETRY_LATER { + if res == ImapResult::RetryLater { if self.should_reconnect() { - DC_RETRY_LATER + ImapResult::RetryLater } else { - DC_FAILED + ImapResult::Failed } } else { res diff --git a/src/job.rs b/src/job.rs index 6b570fa0d..cfbb9b13b 100644 --- a/src/job.rs +++ b/src/job.rs @@ -332,9 +332,9 @@ impl Job { if ok_to_continue { if let Ok(msg) = dc_msg_load_from_db(context, self.foreign_id) { let server_folder = msg.server_folder.as_ref().unwrap(); - match inbox.set_seen(context, server_folder, msg.server_uid) as libc::c_uint { - 0 => {} - 1 => { + match inbox.set_seen(context, server_folder, msg.server_uid) { + ImapResult::Failed => {} + ImapResult::RetryLater => { self.try_again_later(3i32, None); } _ => { @@ -387,7 +387,7 @@ impl Job { ok_to_continue = true; } if ok_to_continue { - if inbox.set_seen(context, &folder, uid) == 0 { + if inbox.set_seen(context, &folder, uid) == ImapResult::Failed { self.try_again_later(3i32, None); } if 0 != self.param.get_int(Param::AlsoMove).unwrap_or_default() { From 4bf5ba594ca034abde0674bb09262c3db230f7dd Mon Sep 17 00:00:00 2001 From: Dmitry Bogatov Date: Fri, 20 Sep 2019 14:47:28 +0000 Subject: [PATCH 4/5] Make Imap::set_mdnseen return enum, not int --- src/imap.rs | 20 ++++++++++---------- src/job.rs | 9 ++++----- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/imap.rs b/src/imap.rs index 9a3332146..75a8019fb 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -1299,13 +1299,13 @@ impl Imap { } } - pub fn set_mdnsent>(&self, context: &Context, folder: S, uid: u32) -> usize { + pub fn set_mdnsent>(&self, context: &Context, folder: S, uid: u32) -> ImapResult { // returns 0=job should be retried later, 1=job done, 2=job done and flag just set - let mut res = DC_RETRY_LATER; + let mut res = ImapResult::RetryLater; let set = format!("{}", uid); if uid == 0 { - res = DC_FAILED; + res = ImapResult::Failed; } else if self.is_connected() { info!( context, @@ -1375,21 +1375,21 @@ impl Imap { .unwrap_or_else(|| false); res = if flag_set { - DC_ALREADY_DONE + ImapResult::AlreadyDone } else if self.add_flag(context, uid, "$MDNSent") != 0 { - DC_SUCCESS + ImapResult::Success } else { res }; - if res == DC_SUCCESS { + if res == ImapResult::Success { info!(context, "$MDNSent just set and MDN will be sent."); } else { info!(context, "$MDNSent already set and MDN already sent."); } } } else { - res = DC_SUCCESS; + res = ImapResult::Success; info!( context, "Cannot store $MDNSent flags, risk sending duplicate MDN.", @@ -1398,11 +1398,11 @@ impl Imap { } } - if res == DC_RETRY_LATER { + if res == ImapResult::RetryLater { if self.should_reconnect() { - DC_RETRY_LATER + ImapResult::RetryLater } else { - DC_FAILED + ImapResult::Failed } } else { res diff --git a/src/job.rs b/src/job.rs index cfbb9b13b..8278d2a1c 100644 --- a/src/job.rs +++ b/src/job.rs @@ -346,15 +346,14 @@ impl Job { { let folder = msg.server_folder.as_ref().unwrap(); - match inbox.set_mdnsent(context, folder, msg.server_uid) as libc::c_uint - { - 1 => { + match inbox.set_mdnsent(context, folder, msg.server_uid) { + ImapResult::RetryLater => { self.try_again_later(3i32, None); } - 3 => { + ImapResult::Success => { send_mdn(context, msg.id); } - 0 | 2 | _ => {} + ImapResult::Failed | ImapResult::AlreadyDone => {} } } } From 2f5d74dbf4830181ad2413405ea2d23a62ff8276 Mon Sep 17 00:00:00 2001 From: Dmitry Bogatov Date: Fri, 20 Sep 2019 14:48:58 +0000 Subject: [PATCH 5/5] Remove unused constants from src/imap.rs --- src/imap.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/imap.rs b/src/imap.rs index 75a8019fb..4297489d6 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -27,11 +27,6 @@ pub enum ImapResult { Success, } -pub const DC_SUCCESS: usize = 3; -pub const DC_ALREADY_DONE: usize = 2; -pub const DC_RETRY_LATER: usize = 1; -pub const DC_FAILED: usize = 0; - const PREFETCH_FLAGS: &str = "(UID ENVELOPE)"; const BODY_FLAGS: &str = "(FLAGS BODY.PEEK[])"; const FETCH_FLAGS: &str = "(FLAGS)";