diff --git a/mmime/src/display.rs b/mmime/src/display.rs index 209e02cb2..1d27e2134 100644 --- a/mmime/src/display.rs +++ b/mmime/src/display.rs @@ -260,9 +260,9 @@ unsafe fn display_group(mut group: *mut mailimf_group) { let mut cur: *mut clistiter = 0 as *mut clistiter; print!( "{}: ", - CStr::from_ptr((*group).grp_display_name).to_str().unwrap() + CStr::from_ptr((*group).display_name).to_str().unwrap() ); - cur = (*(*(*group).grp_mb_list).mb_list).first; + 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() { diff --git a/mmime/src/mailimf/types.rs b/mmime/src/mailimf/types.rs index eb261d65c..6f5d5e9d4 100644 --- a/mmime/src/mailimf/types.rs +++ b/mmime/src/mailimf/types.rs @@ -41,22 +41,28 @@ pub enum mailimf_address { Group(*mut mailimf_group), } -/* - mailimf_group is a group - - - display_name is the name that will be displayed for this group, - for example 'group_name' in - 'group_name: address1@domain1, address2@domain2;', should be allocated - with malloc() - - - mb_list is a list of mailboxes -*/ -#[derive(Copy, Clone)] -#[repr(C)] +/// Represents a group. +/// - display_name is the name that will be displayed for this group, +/// for example 'group_name' in +/// 'group_name: address1@domain1, address2@domain2;', +/// - mb_list is a list of mailboxes +#[derive(Clone)] pub struct mailimf_group { - pub grp_display_name: *mut libc::c_char, - pub grp_mb_list: *mut mailimf_mailbox_list, + pub display_name: *mut libc::c_char, + pub mb_list: *mut mailimf_mailbox_list, } + +impl Drop for mailimf_group { + fn drop(&mut self) { + unsafe { + if !self.mb_list.is_null() { + mailimf_mailbox_list_free(self.mb_list); + } + mailimf_display_name_free(self.display_name); + } + } +} + /* mailimf_mailbox_list is a list of mailboxes @@ -485,14 +491,14 @@ pub unsafe fn mailimf_address_free(address: *mut mailimf_address) { } } -#[no_mangle] -pub unsafe fn mailimf_group_free(mut group: *mut mailimf_group) { - if !(*group).grp_mb_list.is_null() { - mailimf_mailbox_list_free((*group).grp_mb_list); +pub unsafe fn mailimf_group_free(group: *mut mailimf_group) { + if group.is_null() { + return; } - mailimf_display_name_free((*group).grp_display_name); - free(group as *mut libc::c_void); + + let group = &Box::from_raw(group); } + #[no_mangle] pub unsafe fn mailimf_display_name_free(mut display_name: *mut libc::c_char) { mailimf_phrase_free(display_name); @@ -539,20 +545,19 @@ pub unsafe fn mailimf_mailbox_new( (*mb).mb_addr_spec = mb_addr_spec; return mb; } -#[no_mangle] -pub unsafe fn mailimf_group_new( - mut grp_display_name: *mut libc::c_char, - mut grp_mb_list: *mut mailimf_mailbox_list, + +pub fn mailimf_group_new( + display_name: *mut libc::c_char, + mb_list: *mut mailimf_mailbox_list, ) -> *mut mailimf_group { - let mut group: *mut mailimf_group = 0 as *mut mailimf_group; - group = malloc(::std::mem::size_of::() as libc::size_t) as *mut mailimf_group; - if group.is_null() { - return 0 as *mut mailimf_group; - } - (*group).grp_display_name = grp_display_name; - (*group).grp_mb_list = grp_mb_list; - return group; + let group = mailimf_group { + display_name, + mb_list, + }; + + 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; diff --git a/mmime/src/mailimf/write_generic.rs b/mmime/src/mailimf/write_generic.rs index 929fadc63..94287885f 100644 --- a/mmime/src/mailimf/write_generic.rs +++ b/mmime/src/mailimf/write_generic.rs @@ -1003,8 +1003,8 @@ unsafe fn mailimf_group_write_driver( do_write, data, col, - (*group).grp_display_name, - strlen((*group).grp_display_name), + (*group).display_name, + strlen((*group).display_name), ); if r != MAILIMF_NO_ERROR as libc::c_int { return r; @@ -1019,8 +1019,8 @@ unsafe fn mailimf_group_write_driver( if r != MAILIMF_NO_ERROR as libc::c_int { return r; } - if !(*group).grp_mb_list.is_null() { - r = mailimf_mailbox_list_write_driver(do_write, data, col, (*group).grp_mb_list); + if !(*group).mb_list.is_null() { + r = mailimf_mailbox_list_write_driver(do_write, data, col, (*group).mb_list); if r != MAILIMF_NO_ERROR as libc::c_int { return r; } diff --git a/src/dc_mimeparser.rs b/src/dc_mimeparser.rs index 3dfefc362..25f3e286f 100644 --- a/src/dc_mimeparser.rs +++ b/src/dc_mimeparser.rs @@ -1258,8 +1258,8 @@ pub fn mailimf_get_recipients(imffields: *mut mailimf_fields) -> HashSet mailimf_get_recipients_add_addr(&mut recipients, mailbox); } mailimf_address::Group(group) => { - if !group.is_null() && unsafe { !(*group).grp_mb_list.is_null() } { - for cur3 in unsafe { &(*(*(*group).grp_mb_list).mb_list) } { + 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, diff --git a/src/dc_receive_imf.rs b/src/dc_receive_imf.rs index 48aa1a2f7..b229b4d2b 100644 --- a/src/dc_receive_imf.rs +++ b/src/dc_receive_imf.rs @@ -1877,10 +1877,10 @@ unsafe fn dc_add_or_lookup_contacts_by_address_list( } } mailimf_address::Group(group) => { - if !group.is_null() && !(*group).grp_mb_list.is_null() { + if !group.is_null() && !(*group).mb_list.is_null() { dc_add_or_lookup_contacts_by_mailbox_list( context, - (*group).grp_mb_list, + (*group).mb_list, origin, ids, check_self,