From c18bdc39e538c9f4a45141757f52800531c2d4a4 Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Sat, 28 Sep 2019 14:35:33 -0600 Subject: [PATCH] refactor(mmime): rustify mailbox_list --- mmime/src/display.rs | 43 ++++------------------ mmime/src/mailimf/types.rs | 59 +++++++++++++++--------------- mmime/src/mailimf/write_generic.rs | 20 +++------- mmime/src/other.rs | 17 ++------- src/dc_mimeparser.rs | 23 +++++------- src/dc_receive_imf.rs | 14 +------ 6 files changed, 57 insertions(+), 119 deletions(-) diff --git a/mmime/src/display.rs b/mmime/src/display.rs index 1d27e2134..03c8b075a 100644 --- a/mmime/src/display.rs +++ b/mmime/src/display.rs @@ -230,55 +230,26 @@ unsafe fn display_mailbox(mut mb: *mut mailimf_mailbox) { print!("<{}>", CStr::from_ptr((*mb).mb_addr_spec).to_str().unwrap()); } unsafe fn display_mailbox_list(mut mb_list: *mut mailimf_mailbox_list) { - let mut cur: *mut clistiter = 0 as *mut clistiter; - cur = (*(*mb_list).mb_list).first; - while !cur.is_null() { - let mut mb: *mut mailimf_mailbox = 0 as *mut mailimf_mailbox; - mb = (if !cur.is_null() { - (*cur).data - } else { - 0 as *mut libc::c_void - }) as *mut mailimf_mailbox; - display_mailbox(mb); - if !if !cur.is_null() { - (*cur).next - } else { - 0 as *mut clistcell - } - .is_null() - { + for (i, mb) in (*mb_list).0.iter().enumerate() { + display_mailbox(*mb); + if i < (*mb_list).0.len() - 1 { print!(", "); } - cur = if !cur.is_null() { - (*cur).next - } else { - 0 as *mut clistcell - } } } + unsafe fn display_group(mut group: *mut mailimf_group) { let mut cur: *mut clistiter = 0 as *mut clistiter; print!( "{}: ", CStr::from_ptr((*group).display_name).to_str().unwrap() ); - cur = (*(*(*group).mb_list).mb_list).first; - while !cur.is_null() { - let mut mb: *mut mailimf_mailbox = 0 as *mut mailimf_mailbox; - mb = (if !cur.is_null() { - (*cur).data - } else { - 0 as *mut libc::c_void - }) as *mut mailimf_mailbox; - display_mailbox(mb); - cur = if !cur.is_null() { - (*cur).next - } else { - 0 as *mut clistcell - } + for mb in &(*(*group).mb_list).0 { + display_mailbox(*mb); } print!("; "); } + unsafe fn display_address(a: *mut mailimf_address) { match *a { mailimf_address::Group(data) => { diff --git a/mmime/src/mailimf/types.rs b/mmime/src/mailimf/types.rs index 6f5d5e9d4..0601a6128 100644 --- a/mmime/src/mailimf/types.rs +++ b/mmime/src/mailimf/types.rs @@ -63,16 +63,18 @@ impl Drop for mailimf_group { } } -/* - mailimf_mailbox_list is a list of mailboxes +/// A list of mailboxes +#[derive(Clone)] +pub struct mailimf_mailbox_list(pub Vec<*mut mailimf_mailbox>); - - list is a list of mailboxes -*/ -#[derive(Copy, Clone)] -#[repr(C)] -pub struct mailimf_mailbox_list { - pub mb_list: *mut clist, +impl Drop for mailimf_mailbox_list { + fn drop(&mut self) { + for mb in &self.0 { + unsafe { mailimf_mailbox_free(*mb) }; + } + } } + /* mailimf_mailbox is a mailbox @@ -507,18 +509,15 @@ pub unsafe fn mailimf_display_name_free(mut display_name: *mut libc::c_char) { pub unsafe fn mailimf_phrase_free(mut phrase: *mut libc::c_char) { free(phrase as *mut libc::c_void); } -#[no_mangle] -pub unsafe fn mailimf_mailbox_list_free(mut mb_list: *mut mailimf_mailbox_list) { - clist_foreach( - (*mb_list).mb_list, - ::std::mem::transmute:: ()>, clist_func>( - Some(mailimf_mailbox_free), - ), - 0 as *mut libc::c_void, - ); - clist_free((*mb_list).mb_list); - free(mb_list as *mut libc::c_void); + +pub unsafe fn mailimf_mailbox_list_free(mb_list: *mut mailimf_mailbox_list) { + if mb_list.is_null() { + return; + } + + let _ = Box::from_raw(mb_list); } + #[no_mangle] pub unsafe fn mailimf_mailbox_free(mut mailbox: *mut mailimf_mailbox) { if !(*mailbox).mb_display_name.is_null() { @@ -558,16 +557,18 @@ pub fn mailimf_group_new( Box::into_raw(Box::new(group)) } -#[no_mangle] -pub unsafe fn mailimf_mailbox_list_new(mut mb_list: *mut clist) -> *mut mailimf_mailbox_list { - let mut mbl: *mut mailimf_mailbox_list = 0 as *mut mailimf_mailbox_list; - mbl = malloc(::std::mem::size_of::() as libc::size_t) - as *mut mailimf_mailbox_list; - if mbl.is_null() { - return 0 as *mut mailimf_mailbox_list; - } - (*mbl).mb_list = mb_list; - return mbl; +pub fn mailimf_mailbox_list_new(mb_list: *mut clist) -> *mut mailimf_mailbox_list { + // convert clist into vec + let list: Vec<_> = unsafe { (*mb_list).into_iter() } + .map(|mb| mb as *mut mailimf_mailbox) + .collect(); + + // free clist + unsafe { clist_free(mb_list) } + + let mbl = mailimf_mailbox_list(list); + + Box::into_raw(Box::new(mbl)) } pub unsafe fn mailimf_address_list_new(mut ad_list: *mut clist) -> *mut mailimf_address_list { diff --git a/mmime/src/mailimf/write_generic.rs b/mmime/src/mailimf/write_generic.rs index 94287885f..a623b23f3 100644 --- a/mmime/src/mailimf/write_generic.rs +++ b/mmime/src/mailimf/write_generic.rs @@ -1050,14 +1050,8 @@ pub unsafe fn mailimf_mailbox_list_write_driver( let mut r: libc::c_int = 0; let mut first: libc::c_int = 0; first = 1i32; - cur = (*(*mb_list).mb_list).first; - while !cur.is_null() { - let mut mb: *mut mailimf_mailbox = 0 as *mut mailimf_mailbox; - mb = (if !cur.is_null() { - (*cur).data - } else { - 0 as *mut libc::c_void - }) as *mut mailimf_mailbox; + + for mb in &(*mb_list).0 { if 0 == first { r = mailimf_string_write_driver( do_write, @@ -1072,18 +1066,14 @@ pub unsafe fn mailimf_mailbox_list_write_driver( } else { first = 0i32 } - r = mailimf_mailbox_write_driver(do_write, data, col, mb); + r = mailimf_mailbox_write_driver(do_write, data, col, *mb); if r != MAILIMF_NO_ERROR as libc::c_int { return r; } - cur = if !cur.is_null() { - (*cur).next - } else { - 0 as *mut clistcell - } } - return MAILIMF_NO_ERROR as libc::c_int; + MAILIMF_NO_ERROR as libc::c_int } + unsafe fn mailimf_mailbox_write_driver( mut do_write: Option< unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int, diff --git a/mmime/src/other.rs b/mmime/src/other.rs index e55d89428..a0dbdd48e 100644 --- a/mmime/src/other.rs +++ b/mmime/src/other.rs @@ -312,19 +312,10 @@ pub unsafe fn mailimf_mailbox_list_new_empty() -> *mut mailimf_mailbox_list { other code will be returned otherwise */ pub unsafe fn mailimf_mailbox_list_add( - mut mailbox_list: *mut mailimf_mailbox_list, - mut mb: *mut mailimf_mailbox, -) -> libc::c_int { - let mut r: libc::c_int = 0; - r = clist_insert_after( - (*mailbox_list).mb_list, - (*(*mailbox_list).mb_list).last, - mb as *mut libc::c_void, - ); - if r < 0i32 { - return MAILIMF_ERROR_MEMORY as libc::c_int; - } - return MAILIMF_NO_ERROR as libc::c_int; + mailbox_list: *mut mailimf_mailbox_list, + mb: *mut mailimf_mailbox, +) { + (*mailbox_list).0.push(mb); } /* diff --git a/src/dc_mimeparser.rs b/src/dc_mimeparser.rs index 25f3e286f..d65f21330 100644 --- a/src/dc_mimeparser.rs +++ b/src/dc_mimeparser.rs @@ -839,14 +839,12 @@ impl<'a> MimeParser<'a> { fld_from.is_null() } || (*fld_from).frm_mb_list.is_null() - || (*(*fld_from).frm_mb_list).mb_list.is_null() - || (*(*(*fld_from).frm_mb_list).mb_list).count != 1i32) + || (*(*(*fld_from).frm_mb_list).0).len() != 1) { - let mb = (if !(*(*(*fld_from).frm_mb_list).mb_list).first.is_null() { - (*(*(*(*fld_from).frm_mb_list).mb_list).first).data - } else { - ptr::null_mut() - }) as *mut mailimf_mailbox; + let mb = (*(*(*fld_from).frm_mb_list).0) + .first() + .map(|v| *v) + .unwrap_or_else(|| ptr::null_mut()); if !mb.is_null() { let from_addr_norm = addr_normalize(as_str((*mb).mb_addr_spec)); @@ -916,8 +914,8 @@ pub fn mailimf_find_first_addr(mb_list: *const mailimf_mailbox_list) -> Option HashSet } mailimf_address::Group(group) => { if !group.is_null() && unsafe { !(*group).mb_list.is_null() } { - for cur3 in unsafe { &(*(*(*group).mb_list).mb_list) } { - mailimf_get_recipients_add_addr( - &mut recipients, - cur3 as *mut mailimf_mailbox, - ); + for mb in unsafe { &((*(*group).mb_list).0) } { + mailimf_get_recipients_add_addr(&mut recipients, *mb); } } } diff --git a/src/dc_receive_imf.rs b/src/dc_receive_imf.rs index b229b4d2b..c1e6ed3b2 100644 --- a/src/dc_receive_imf.rs +++ b/src/dc_receive_imf.rs @@ -1901,13 +1901,8 @@ unsafe fn dc_add_or_lookup_contacts_by_mailbox_list( if mb_list.is_null() { return; } - let mut cur: *mut clistiter = (*(*mb_list).mb_list).first; - while !cur.is_null() { - let mb: *mut mailimf_mailbox = (if !cur.is_null() { - (*cur).data - } else { - ptr::null_mut() - }) as *mut mailimf_mailbox; + for mb in &(*mb_list).0 { + let mb = *mb; if !mb.is_null() { add_or_lookup_contact_by_addr( context, @@ -1918,11 +1913,6 @@ unsafe fn dc_add_or_lookup_contacts_by_mailbox_list( check_self, ); } - cur = if !cur.is_null() { - (*cur).next - } else { - ptr::null_mut() - } } }