diff --git a/mmime/src/display.rs b/mmime/src/display.rs index 4282a58bd..77e3a185d 100644 --- a/mmime/src/display.rs +++ b/mmime/src/display.rs @@ -258,33 +258,15 @@ unsafe fn display_address(a: *mut mailimf_address) { } } -unsafe fn display_address_list(mut addr_list: *mut mailimf_address_list) { - let mut cur: *mut clistiter = 0 as *mut clistiter; - cur = (*(*addr_list).ad_list).first; - while !cur.is_null() { - let mut addr: *mut mailimf_address = 0 as *mut mailimf_address; - addr = (if !cur.is_null() { - (*cur).data - } else { - 0 as *mut libc::c_void - }) as *mut mailimf_address; - display_address(addr); - if !if !cur.is_null() { - (*cur).next - } else { - 0 as *mut clistcell - } - .is_null() - { +unsafe fn display_address_list(addr_list: *mut mailimf_address_list) { + for (i, addr) in (*addr_list).0.iter().enumerate() { + display_address(*addr); + if i < (*addr_list).0.len() - 1 { print!(", "); } - cur = if !cur.is_null() { - (*cur).next - } else { - 0 as *mut clistcell - } } } + unsafe fn display_from(mut from: *mut mailimf_from) { display_mailbox_list((*from).frm_mb_list); } diff --git a/mmime/src/mailimf/types.rs b/mmime/src/mailimf/types.rs index 64b996dcf..2e860a8a8 100644 --- a/mmime/src/mailimf/types.rs +++ b/mmime/src/mailimf/types.rs @@ -46,7 +46,7 @@ pub enum mailimf_address { /// for example 'group_name' in /// 'group_name: address1@domain1, address2@domain2;', /// - mb_list is a list of mailboxes -#[derive(Clone)] +#[derive(Debug, Clone)] pub struct mailimf_group { pub display_name: *mut libc::c_char, pub mb_list: *mut mailimf_mailbox_list, @@ -64,7 +64,7 @@ impl Drop for mailimf_group { } /// A list of mailboxes -#[derive(Clone)] +#[derive(Debug, Clone)] pub struct mailimf_mailbox_list(pub Vec<*mut mailimf_mailbox>); impl Drop for mailimf_mailbox_list { @@ -76,7 +76,7 @@ impl Drop for mailimf_mailbox_list { } /// A single mailbox. -#[derive(Clone)] +#[derive(Debug, Clone)] pub struct mailimf_mailbox { /// The name that will be displayed for this mailbox, /// for example 'name' in '"name" . @@ -95,16 +95,18 @@ impl Drop for mailimf_mailbox { } } -/* - mailimf_address_list is a list of addresses +/// A list of addresses. +#[derive(Debug, Clone)] +pub struct mailimf_address_list(pub Vec<*mut mailimf_address>); - - list is a list of addresses -*/ -#[derive(Copy, Clone)] -#[repr(C)] -pub struct mailimf_address_list { - pub ad_list: *mut clist, +impl Drop for mailimf_address_list { + fn drop(&mut self) { + for addr in &self.0 { + unsafe { mailimf_address_free(*addr) }; + } + } } + /* mailimf_body is the text part of a message @@ -572,28 +574,27 @@ pub fn mailimf_mailbox_list_new(mb_list: *mut clist) -> *mut mailimf_mailbox_lis Box::into_raw(Box::new(mbl)) } -pub unsafe fn mailimf_address_list_new(mut ad_list: *mut clist) -> *mut mailimf_address_list { - let mut addr_list: *mut mailimf_address_list = 0 as *mut mailimf_address_list; - addr_list = malloc(::std::mem::size_of::() as libc::size_t) - as *mut mailimf_address_list; +pub fn mailimf_address_list_new(ad_list: *mut clist) -> *mut mailimf_address_list { + // convert clist into vec + let list: Vec<_> = unsafe { (*ad_list).into_iter() } + .map(|mb| mb as *mut mailimf_address) + .collect(); + + // free clist + unsafe { clist_free(ad_list) } + + let adl = mailimf_address_list(list); + + Box::into_raw(Box::new(adl)) +} + +pub unsafe fn mailimf_address_list_free(addr_list: *mut mailimf_address_list) { if addr_list.is_null() { - return 0 as *mut mailimf_address_list; + return; } - (*addr_list).ad_list = ad_list; - return addr_list; -} -#[no_mangle] -pub unsafe fn mailimf_address_list_free(mut addr_list: *mut mailimf_address_list) { - clist_foreach( - (*addr_list).ad_list, - ::std::mem::transmute:: ()>, clist_func>( - Some(mailimf_address_free), - ), - 0 as *mut libc::c_void, - ); - clist_free((*addr_list).ad_list); - free(addr_list as *mut libc::c_void); + let _ = Box::from_raw(addr_list); } + #[no_mangle] pub unsafe fn mailimf_body_new( mut bd_text: *const libc::c_char, diff --git a/mmime/src/mailimf/write_generic.rs b/mmime/src/mailimf/write_generic.rs index 016686498..32a59fadb 100644 --- a/mmime/src/mailimf/write_generic.rs +++ b/mmime/src/mailimf/write_generic.rs @@ -930,14 +930,8 @@ pub unsafe fn mailimf_address_list_write_driver( let mut r: libc::c_int = 0; let mut first: libc::c_int = 0; first = 1i32; - cur = (*(*addr_list).ad_list).first; - while !cur.is_null() { - let mut addr: *mut mailimf_address = 0 as *mut mailimf_address; - addr = (if !cur.is_null() { - (*cur).data - } else { - 0 as *mut libc::c_void - }) as *mut mailimf_address; + + for addr in &(*addr_list).0 { if 0 == first { r = mailimf_string_write_driver( do_write, @@ -952,18 +946,14 @@ pub unsafe fn mailimf_address_list_write_driver( } else { first = 0i32 } - r = mailimf_address_write_driver(do_write, data, col, addr); + r = mailimf_address_write_driver(do_write, data, col, *addr); 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_address_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 a0dbdd48e..1ef8492c4 100644 --- a/mmime/src/other.rs +++ b/mmime/src/other.rs @@ -325,19 +325,10 @@ pub unsafe fn mailimf_mailbox_list_add( other code will be returned otherwise */ pub unsafe fn mailimf_address_list_add( - mut address_list: *mut mailimf_address_list, - mut addr: *mut mailimf_address, -) -> libc::c_int { - let mut r: libc::c_int = 0; - r = clist_insert_after( - (*address_list).ad_list, - (*(*address_list).ad_list).last, - addr as *mut libc::c_void, - ); - if r < 0i32 { - return MAILIMF_ERROR_MEMORY as libc::c_int; - } - return MAILIMF_NO_ERROR as libc::c_int; + address_list: *mut mailimf_address_list, + addr: *mut mailimf_address, +) { + (*address_list).0.push(addr); } /* diff --git a/src/dc_mimeparser.rs b/src/dc_mimeparser.rs index 6585516b3..bc5afbddd 100644 --- a/src/dc_mimeparser.rs +++ b/src/dc_mimeparser.rs @@ -1244,20 +1244,18 @@ pub fn mailimf_get_recipients(imffields: *mut mailimf_fields) -> HashSet } if !addr_list.is_null() { - for cur2 in unsafe { &(*(*addr_list).ad_list) } { - let adr = cur2 as *mut mailimf_address; - + for adr in unsafe { &(*(*addr_list).0) } { if adr.is_null() { continue; } - match unsafe { *adr } { + match unsafe { &**adr } { mailimf_address::Mailbox(mailbox) => { - mailimf_get_recipients_add_addr(&mut recipients, mailbox); + mailimf_get_recipients_add_addr(&mut recipients, *mailbox); } mailimf_address::Group(group) => { - if !group.is_null() && unsafe { !(*group).mb_list.is_null() } { - for mb in unsafe { &((*(*group).mb_list).0) } { + if !group.is_null() && unsafe { !(**group).mb_list.is_null() } { + 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 dca216573..76daf2745 100644 --- a/src/dc_receive_imf.rs +++ b/src/dc_receive_imf.rs @@ -1857,13 +1857,12 @@ unsafe fn dc_add_or_lookup_contacts_by_address_list( return; } - for cur in &(*(*adr_list).ad_list) { - let adr = cur as *mut mailimf_address; + for adr in &(*(*adr_list).0) { if adr.is_null() { continue; } - match *adr { + match **adr { mailimf_address::Mailbox(mb) => { if !mb.is_null() { add_or_lookup_contact_by_addr(