mirror of
https://github.com/chatmail/core.git
synced 2026-04-17 13:36:30 +03:00
387 lines
11 KiB
Rust
387 lines
11 KiB
Rust
use crate::clist::*;
|
|
|
|
use crate::mailimf::types::*;
|
|
use crate::mailmime::types::*;
|
|
|
|
use std::ffi::CStr;
|
|
|
|
pub unsafe fn display_mime(mut mime: *mut Mailmime) {
|
|
let mut cur: *mut clistiter = 0 as *mut clistiter;
|
|
println!("{}", (*mime).mm_type);
|
|
|
|
match (*mime).mm_type as u32 {
|
|
MAILMIME_SINGLE => {
|
|
println!("single part");
|
|
}
|
|
MAILMIME_MULTIPLE => {
|
|
println!("multipart");
|
|
}
|
|
MAILMIME_MESSAGE => println!("message"),
|
|
_ => {}
|
|
}
|
|
if !(*mime).mm_mime_fields.is_null() {
|
|
if !(*(*(*mime).mm_mime_fields).fld_list).first.is_null() {
|
|
print!("MIME headers begin");
|
|
display_mime_fields((*mime).mm_mime_fields);
|
|
println!("MIME headers end");
|
|
}
|
|
}
|
|
display_mime_content((*mime).mm_content_type);
|
|
match (*mime).mm_type as u32 {
|
|
MAILMIME_SINGLE => {
|
|
display_mime_data((*mime).mm_data.mm_single);
|
|
}
|
|
MAILMIME_MULTIPLE => {
|
|
cur = (*(*mime).mm_data.mm_multipart.mm_mp_list).first;
|
|
while !cur.is_null() {
|
|
display_mime(
|
|
(if !cur.is_null() {
|
|
(*cur).data
|
|
} else {
|
|
0 as *mut libc::c_void
|
|
}) as *mut Mailmime,
|
|
);
|
|
cur = if !cur.is_null() {
|
|
(*cur).next
|
|
} else {
|
|
0 as *mut clistcell
|
|
}
|
|
}
|
|
}
|
|
MAILMIME_MESSAGE => {
|
|
if !(*mime).mm_data.mm_message.mm_fields.is_null() {
|
|
if !(*(*(*mime).mm_data.mm_message.mm_fields).fld_list)
|
|
.first
|
|
.is_null()
|
|
{
|
|
println!("headers begin");
|
|
display_fields((*mime).mm_data.mm_message.mm_fields);
|
|
println!("headers end");
|
|
}
|
|
if !(*mime).mm_data.mm_message.mm_msg_mime.is_null() {
|
|
display_mime((*mime).mm_data.mm_message.mm_msg_mime);
|
|
}
|
|
}
|
|
}
|
|
_ => {}
|
|
};
|
|
}
|
|
|
|
unsafe fn display_mime_content(mut content_type: *mut mailmime_content) {
|
|
print!("type: ");
|
|
display_mime_type((*content_type).ct_type);
|
|
println!(
|
|
"/{}",
|
|
CStr::from_ptr((*content_type).ct_subtype).to_str().unwrap()
|
|
);
|
|
}
|
|
unsafe fn display_mime_type(mut type_0: *mut mailmime_type) {
|
|
match (*type_0).tp_type {
|
|
1 => {
|
|
display_mime_discrete_type((*type_0).tp_data.tp_discrete_type);
|
|
}
|
|
2 => {
|
|
display_mime_composite_type((*type_0).tp_data.tp_composite_type);
|
|
}
|
|
_ => {}
|
|
};
|
|
}
|
|
unsafe fn display_mime_composite_type(mut ct: *mut mailmime_composite_type) {
|
|
match (*ct).ct_type {
|
|
1 => {
|
|
print!("message");
|
|
}
|
|
2 => {
|
|
print!("multipart");
|
|
}
|
|
3 => {
|
|
print!("{}", CStr::from_ptr((*ct).ct_token).to_str().unwrap());
|
|
}
|
|
_ => {}
|
|
};
|
|
}
|
|
unsafe fn display_mime_discrete_type(mut discrete_type: *mut mailmime_discrete_type) {
|
|
match (*discrete_type).dt_type {
|
|
1 => {
|
|
print!("text");
|
|
}
|
|
2 => {
|
|
print!("image");
|
|
}
|
|
3 => {
|
|
print!("audio");
|
|
}
|
|
4 => {
|
|
print!("video");
|
|
}
|
|
5 => {
|
|
print!("application");
|
|
}
|
|
6 => {
|
|
print!("{}", (*discrete_type).dt_extension as u8 as char);
|
|
}
|
|
_ => {}
|
|
};
|
|
}
|
|
pub unsafe fn display_mime_data(mut data: *mut mailmime_data) {
|
|
match (*data).dt_type {
|
|
0 => {
|
|
println!(
|
|
"data : {} bytes",
|
|
(*data).dt_data.dt_text.dt_length as libc::c_uint,
|
|
);
|
|
}
|
|
1 => {
|
|
println!(
|
|
"data (file) : {}",
|
|
CStr::from_ptr((*data).dt_data.dt_filename)
|
|
.to_str()
|
|
.unwrap()
|
|
);
|
|
}
|
|
_ => {}
|
|
};
|
|
}
|
|
unsafe fn display_mime_dsp_parm(mut param: *mut mailmime_disposition_parm) {
|
|
match (*param).pa_type {
|
|
0 => {
|
|
println!(
|
|
"filename: {}",
|
|
CStr::from_ptr((*param).pa_data.pa_filename)
|
|
.to_str()
|
|
.unwrap()
|
|
);
|
|
}
|
|
_ => {}
|
|
};
|
|
}
|
|
unsafe fn display_mime_disposition(mut disposition: *mut mailmime_disposition) {
|
|
let mut cur: *mut clistiter = 0 as *mut clistiter;
|
|
cur = (*(*disposition).dsp_parms).first;
|
|
while !cur.is_null() {
|
|
let mut param: *mut mailmime_disposition_parm = 0 as *mut mailmime_disposition_parm;
|
|
param = (if !cur.is_null() {
|
|
(*cur).data
|
|
} else {
|
|
0 as *mut libc::c_void
|
|
}) as *mut mailmime_disposition_parm;
|
|
display_mime_dsp_parm(param);
|
|
cur = if !cur.is_null() {
|
|
(*cur).next
|
|
} else {
|
|
0 as *mut clistcell
|
|
}
|
|
}
|
|
}
|
|
unsafe fn display_mime_field(mut field: *mut mailmime_field) {
|
|
match (*field).fld_type {
|
|
1 => {
|
|
print!("content-type: ");
|
|
display_mime_content((*field).fld_data.fld_content);
|
|
println!("");
|
|
}
|
|
6 => {
|
|
display_mime_disposition((*field).fld_data.fld_disposition);
|
|
}
|
|
_ => {}
|
|
};
|
|
}
|
|
unsafe fn display_mime_fields(mut fields: *mut mailmime_fields) {
|
|
let mut cur: *mut clistiter = 0 as *mut clistiter;
|
|
cur = (*(*fields).fld_list).first;
|
|
while !cur.is_null() {
|
|
let mut field: *mut mailmime_field = 0 as *mut mailmime_field;
|
|
field = (if !cur.is_null() {
|
|
(*cur).data
|
|
} else {
|
|
0 as *mut libc::c_void
|
|
}) as *mut mailmime_field;
|
|
display_mime_field(field);
|
|
cur = if !cur.is_null() {
|
|
(*cur).next
|
|
} else {
|
|
0 as *mut clistcell
|
|
}
|
|
}
|
|
}
|
|
unsafe fn display_date_time(mut d: *mut mailimf_date_time) {
|
|
print!(
|
|
"{:02}/{:02}/{:02} {:02}:{:02}:{:02} +{:04}",
|
|
(*d).dt_day,
|
|
(*d).dt_month,
|
|
(*d).dt_year,
|
|
(*d).dt_hour,
|
|
(*d).dt_min,
|
|
(*d).dt_sec,
|
|
(*d).dt_zone,
|
|
);
|
|
}
|
|
unsafe fn display_orig_date(mut orig_date: *mut mailimf_orig_date) {
|
|
display_date_time((*orig_date).dt_date_time);
|
|
}
|
|
unsafe fn display_mailbox(mut mb: *mut mailimf_mailbox) {
|
|
if !(*mb).mb_display_name.is_null() {
|
|
print!(
|
|
"{}",
|
|
CStr::from_ptr((*mb).mb_display_name).to_str().unwrap()
|
|
);
|
|
}
|
|
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()
|
|
{
|
|
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).grp_display_name).to_str().unwrap()
|
|
);
|
|
cur = (*(*(*group).grp_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
|
|
}
|
|
}
|
|
print!("; ");
|
|
}
|
|
unsafe fn display_address(mut a: *mut mailimf_address) {
|
|
match (*a).ad_type {
|
|
2 => {
|
|
display_group((*a).ad_data.ad_group);
|
|
}
|
|
1 => {
|
|
display_mailbox((*a).ad_data.ad_mailbox);
|
|
}
|
|
_ => {}
|
|
};
|
|
}
|
|
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()
|
|
{
|
|
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);
|
|
}
|
|
unsafe fn display_to(mut to: *mut mailimf_to) {
|
|
display_address_list((*to).to_addr_list);
|
|
}
|
|
unsafe fn display_cc(mut cc: *mut mailimf_cc) {
|
|
display_address_list((*cc).cc_addr_list);
|
|
}
|
|
unsafe fn display_subject(mut subject: *mut mailimf_subject) {
|
|
print!("{}", CStr::from_ptr((*subject).sbj_value).to_str().unwrap());
|
|
}
|
|
unsafe fn display_field(mut field: *mut mailimf_field) {
|
|
match (*field).fld_type {
|
|
9 => {
|
|
print!("Date: ");
|
|
display_orig_date((*field).fld_data.fld_orig_date);
|
|
println!("");
|
|
}
|
|
10 => {
|
|
print!("From: ");
|
|
display_from((*field).fld_data.fld_from);
|
|
println!("");
|
|
}
|
|
13 => {
|
|
print!("To: ");
|
|
display_to((*field).fld_data.fld_to);
|
|
println!("");
|
|
}
|
|
14 => {
|
|
print!("Cc: ");
|
|
display_cc((*field).fld_data.fld_cc);
|
|
println!("");
|
|
}
|
|
19 => {
|
|
print!("Subject: ");
|
|
display_subject((*field).fld_data.fld_subject);
|
|
println!("");
|
|
}
|
|
16 => {
|
|
println!(
|
|
"Message-ID: {}",
|
|
CStr::from_ptr((*(*field).fld_data.fld_message_id).mid_value)
|
|
.to_str()
|
|
.unwrap(),
|
|
);
|
|
}
|
|
_ => {}
|
|
};
|
|
}
|
|
unsafe fn display_fields(mut fields: *mut mailimf_fields) {
|
|
let mut cur: *mut clistiter = 0 as *mut clistiter;
|
|
cur = (*(*fields).fld_list).first;
|
|
while !cur.is_null() {
|
|
let mut f: *mut mailimf_field = 0 as *mut mailimf_field;
|
|
f = (if !cur.is_null() {
|
|
(*cur).data
|
|
} else {
|
|
0 as *mut libc::c_void
|
|
}) as *mut mailimf_field;
|
|
display_field(f);
|
|
cur = if !cur.is_null() {
|
|
(*cur).next
|
|
} else {
|
|
0 as *mut clistcell
|
|
}
|
|
}
|
|
}
|