mirror of
https://github.com/chatmail/core.git
synced 2026-05-18 22:36:29 +03:00
refactor(mmime): rustify address_list
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user