refactor(mmime): rustify address_list

This commit is contained in:
dignifiedquire
2019-09-28 14:51:00 -06:00
parent 50ca75398f
commit 347a4d110a
6 changed files with 52 additions and 91 deletions

View File

@@ -258,33 +258,15 @@ unsafe fn display_address(a: *mut mailimf_address) {
} }
} }
unsafe fn display_address_list(mut addr_list: *mut mailimf_address_list) { unsafe fn display_address_list(addr_list: *mut mailimf_address_list) {
let mut cur: *mut clistiter = 0 as *mut clistiter; for (i, addr) in (*addr_list).0.iter().enumerate() {
cur = (*(*addr_list).ad_list).first; display_address(*addr);
while !cur.is_null() { if i < (*addr_list).0.len() - 1 {
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()
{
print!(", "); print!(", ");
} }
cur = if !cur.is_null() {
(*cur).next
} else {
0 as *mut clistcell
}
} }
} }
unsafe fn display_from(mut from: *mut mailimf_from) { unsafe fn display_from(mut from: *mut mailimf_from) {
display_mailbox_list((*from).frm_mb_list); display_mailbox_list((*from).frm_mb_list);
} }

View File

@@ -46,7 +46,7 @@ pub enum mailimf_address {
/// for example 'group_name' in /// for example 'group_name' in
/// 'group_name: address1@domain1, address2@domain2;', /// 'group_name: address1@domain1, address2@domain2;',
/// - mb_list is a list of mailboxes /// - mb_list is a list of mailboxes
#[derive(Clone)] #[derive(Debug, Clone)]
pub struct mailimf_group { pub struct mailimf_group {
pub display_name: *mut libc::c_char, pub display_name: *mut libc::c_char,
pub mb_list: *mut mailimf_mailbox_list, pub mb_list: *mut mailimf_mailbox_list,
@@ -64,7 +64,7 @@ impl Drop for mailimf_group {
} }
/// A list of mailboxes /// A list of mailboxes
#[derive(Clone)] #[derive(Debug, Clone)]
pub struct mailimf_mailbox_list(pub Vec<*mut mailimf_mailbox>); pub struct mailimf_mailbox_list(pub Vec<*mut mailimf_mailbox>);
impl Drop for mailimf_mailbox_list { impl Drop for mailimf_mailbox_list {
@@ -76,7 +76,7 @@ impl Drop for mailimf_mailbox_list {
} }
/// A single mailbox. /// A single mailbox.
#[derive(Clone)] #[derive(Debug, Clone)]
pub struct mailimf_mailbox { pub struct mailimf_mailbox {
/// The name that will be displayed for this mailbox, /// The name that will be displayed for this mailbox,
/// for example 'name' in '"name" <mailbox@domain>. /// for example 'name' in '"name" <mailbox@domain>.
@@ -95,16 +95,18 @@ impl Drop for mailimf_mailbox {
} }
} }
/* /// A list of addresses.
mailimf_address_list is a list of addresses #[derive(Debug, Clone)]
pub struct mailimf_address_list(pub Vec<*mut mailimf_address>);
- list is a list of addresses impl Drop for mailimf_address_list {
*/ fn drop(&mut self) {
#[derive(Copy, Clone)] for addr in &self.0 {
#[repr(C)] unsafe { mailimf_address_free(*addr) };
pub struct mailimf_address_list { }
pub ad_list: *mut clist, }
} }
/* /*
mailimf_body is the text part of a message 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)) Box::into_raw(Box::new(mbl))
} }
pub unsafe fn mailimf_address_list_new(mut ad_list: *mut clist) -> *mut mailimf_address_list { pub fn mailimf_address_list_new(ad_list: *mut clist) -> *mut mailimf_address_list {
let mut addr_list: *mut mailimf_address_list = 0 as *mut mailimf_address_list; // convert clist into vec
addr_list = malloc(::std::mem::size_of::<mailimf_address_list>() as libc::size_t) let list: Vec<_> = unsafe { (*ad_list).into_iter() }
as *mut mailimf_address_list; .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() { if addr_list.is_null() {
return 0 as *mut mailimf_address_list; return;
} }
(*addr_list).ad_list = ad_list; let _ = Box::from_raw(addr_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::<Option<unsafe fn(_: *mut mailimf_address) -> ()>, 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);
} }
#[no_mangle] #[no_mangle]
pub unsafe fn mailimf_body_new( pub unsafe fn mailimf_body_new(
mut bd_text: *const libc::c_char, mut bd_text: *const libc::c_char,

View File

@@ -930,14 +930,8 @@ pub unsafe fn mailimf_address_list_write_driver(
let mut r: libc::c_int = 0; let mut r: libc::c_int = 0;
let mut first: libc::c_int = 0; let mut first: libc::c_int = 0;
first = 1i32; first = 1i32;
cur = (*(*addr_list).ad_list).first;
while !cur.is_null() { for addr in &(*addr_list).0 {
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;
if 0 == first { if 0 == first {
r = mailimf_string_write_driver( r = mailimf_string_write_driver(
do_write, do_write,
@@ -952,18 +946,14 @@ pub unsafe fn mailimf_address_list_write_driver(
} else { } else {
first = 0i32 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 { if r != MAILIMF_NO_ERROR as libc::c_int {
return r; 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( unsafe fn mailimf_address_write_driver(
mut do_write: Option< mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int, unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,

View File

@@ -325,19 +325,10 @@ pub unsafe fn mailimf_mailbox_list_add(
other code will be returned otherwise other code will be returned otherwise
*/ */
pub unsafe fn mailimf_address_list_add( pub unsafe fn mailimf_address_list_add(
mut address_list: *mut mailimf_address_list, address_list: *mut mailimf_address_list,
mut addr: *mut mailimf_address, addr: *mut mailimf_address,
) -> libc::c_int { ) {
let mut r: libc::c_int = 0; (*address_list).0.push(addr);
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;
} }
/* /*

View File

@@ -1244,20 +1244,18 @@ pub fn mailimf_get_recipients(imffields: *mut mailimf_fields) -> HashSet<String>
} }
if !addr_list.is_null() { if !addr_list.is_null() {
for cur2 in unsafe { &(*(*addr_list).ad_list) } { for adr in unsafe { &(*(*addr_list).0) } {
let adr = cur2 as *mut mailimf_address;
if adr.is_null() { if adr.is_null() {
continue; continue;
} }
match unsafe { *adr } { match unsafe { &**adr } {
mailimf_address::Mailbox(mailbox) => { mailimf_address::Mailbox(mailbox) => {
mailimf_get_recipients_add_addr(&mut recipients, mailbox); mailimf_get_recipients_add_addr(&mut recipients, *mailbox);
} }
mailimf_address::Group(group) => { mailimf_address::Group(group) => {
if !group.is_null() && unsafe { !(*group).mb_list.is_null() } { if !group.is_null() && unsafe { !(**group).mb_list.is_null() } {
for mb in unsafe { &((*(*group).mb_list).0) } { for mb in unsafe { &((*(**group).mb_list).0) } {
mailimf_get_recipients_add_addr(&mut recipients, *mb); mailimf_get_recipients_add_addr(&mut recipients, *mb);
} }
} }

View File

@@ -1857,13 +1857,12 @@ unsafe fn dc_add_or_lookup_contacts_by_address_list(
return; return;
} }
for cur in &(*(*adr_list).ad_list) { for adr in &(*(*adr_list).0) {
let adr = cur as *mut mailimf_address;
if adr.is_null() { if adr.is_null() {
continue; continue;
} }
match *adr { match **adr {
mailimf_address::Mailbox(mb) => { mailimf_address::Mailbox(mb) => {
if !mb.is_null() { if !mb.is_null() {
add_or_lookup_contact_by_addr( add_or_lookup_contact_by_addr(