rustify parts of MimeFactory struct

This commit is contained in:
holger krekel
2019-09-22 03:37:38 +02:00
parent aa5cab9ae7
commit 695ba44a6c
3 changed files with 31 additions and 67 deletions

View File

@@ -36,9 +36,9 @@ pub enum Loaded {
#[derive(Clone)] #[derive(Clone)]
pub struct MimeFactory<'a> { pub struct MimeFactory<'a> {
pub from_addr: *mut libc::c_char, pub from_addr: String,
pub from_displayname: *mut libc::c_char, pub from_displayname: String,
pub selfstatus: Option<String>, pub selfstatus: String,
pub recipients_names: *mut clist, pub recipients_names: *mut clist,
pub recipients_addr: *mut clist, pub recipients_addr: *mut clist,
pub timestamp: i64, pub timestamp: i64,
@@ -59,10 +59,12 @@ pub struct MimeFactory<'a> {
impl<'a> MimeFactory<'a> { impl<'a> MimeFactory<'a> {
fn new(context: &'a Context, msg: Message) -> Self { fn new(context: &'a Context, msg: Message) -> Self {
let cget = |context: &Context, name: &str| context.sql.get_config(context, name);
MimeFactory { MimeFactory {
from_addr: ptr::null_mut(), from_addr: cget(&context, "configured_addr").unwrap_or_default(),
from_displayname: ptr::null_mut(), from_displayname: cget(&context, "displayname").unwrap_or_default(),
selfstatus: None, selfstatus: cget(&context, "selfstatus")
.unwrap_or_else(|| context.stock_str(StockMessage::StatusLine).to_string()),
recipients_names: clist_new(), recipients_names: clist_new(),
recipients_addr: clist_new(), recipients_addr: clist_new(),
timestamp: 0, timestamp: 0,
@@ -86,8 +88,6 @@ impl<'a> MimeFactory<'a> {
impl<'a> Drop for MimeFactory<'a> { impl<'a> Drop for MimeFactory<'a> {
fn drop(&mut self) { fn drop(&mut self) {
unsafe { unsafe {
free(self.from_addr as *mut libc::c_void);
free(self.from_displayname as *mut libc::c_void);
if !self.recipients_names.is_null() { if !self.recipients_names.is_null() {
clist_free_content(self.recipients_names); clist_free_content(self.recipients_names);
clist_free(self.recipients_names); clist_free(self.recipients_names);
@@ -117,8 +117,6 @@ pub unsafe fn dc_mimefactory_load_msg(
let mut factory = MimeFactory::new(context, msg); let mut factory = MimeFactory::new(context, msg);
factory.chat = Some(chat); factory.chat = Some(chat);
load_from(&mut factory);
// just set the chat above // just set the chat above
let chat = factory.chat.as_ref().unwrap(); let chat = factory.chat.as_ref().unwrap();
@@ -126,12 +124,12 @@ pub unsafe fn dc_mimefactory_load_msg(
clist_insert_after( clist_insert_after(
factory.recipients_names, factory.recipients_names,
(*factory.recipients_names).last, (*factory.recipients_names).last,
dc_strdup_keep_null(factory.from_displayname) as *mut libc::c_void, factory.from_displayname.strdup().cast(),
); );
clist_insert_after( clist_insert_after(
factory.recipients_addr, factory.recipients_addr,
(*factory.recipients_addr).last, (*factory.recipients_addr).last,
dc_strdup(factory.from_addr) as *mut libc::c_void, factory.from_addr.strdup().cast(),
); );
} else { } else {
context context
@@ -241,32 +239,6 @@ pub unsafe fn dc_mimefactory_load_msg(
Ok(factory) Ok(factory)
} }
unsafe fn load_from(factory: &mut MimeFactory) {
let context = factory.context;
factory.from_addr = context
.sql
.get_config(context, "configured_addr")
.unwrap_or_default()
.strdup();
factory.from_displayname = context
.sql
.get_config(context, "displayname")
.unwrap_or_default()
.strdup();
factory.selfstatus = context.sql.get_config(context, "selfstatus");
if factory.selfstatus.is_none() {
factory.selfstatus = Some(
factory
.context
.stock_str(StockMessage::StatusLine)
.to_string(),
);
}
}
pub unsafe fn dc_mimefactory_load_mdn<'a>( pub unsafe fn dc_mimefactory_load_mdn<'a>(
context: &'a Context, context: &'a Context,
msg_id: u32, msg_id: u32,
@@ -308,9 +280,8 @@ pub unsafe fn dc_mimefactory_load_mdn<'a>(
(*factory.recipients_addr).last, (*factory.recipients_addr).last,
contact.get_addr().strdup() as *mut libc::c_void, contact.get_addr().strdup() as *mut libc::c_void,
); );
load_from(&mut factory);
factory.timestamp = dc_create_smeared_timestamp(factory.context); factory.timestamp = dc_create_smeared_timestamp(factory.context);
factory.rfc724_mid = dc_create_outgoing_rfc724_mid(None, as_str(factory.from_addr)); factory.rfc724_mid = dc_create_outgoing_rfc724_mid(None, &factory.from_addr);
factory.loaded = Loaded::MDN; factory.loaded = Loaded::MDN;
Ok(factory) Ok(factory)
@@ -327,12 +298,12 @@ pub unsafe fn dc_mimefactory_render(
mailimf_mailbox_list_add( mailimf_mailbox_list_add(
from, from,
mailimf_mailbox_new( mailimf_mailbox_new(
if !factory.from_displayname.is_null() { if !factory.from_displayname.is_empty() {
dc_encode_header_words(as_str(factory.from_displayname)) dc_encode_header_words(&factory.from_displayname)
} else { } else {
ptr::null_mut() ptr::null_mut()
}, },
dc_strdup(factory.from_addr), factory.from_addr.strdup(),
), ),
); );
let mut to: *mut mailimf_address_list = ptr::null_mut(); let mut to: *mut mailimf_address_list = ptr::null_mut();
@@ -401,8 +372,11 @@ pub unsafe fn dc_mimefactory_render(
add_mailimf_field(imf_fields, "X-Mailer", &headerval); add_mailimf_field(imf_fields, "X-Mailer", &headerval);
add_mailimf_field(imf_fields, "Chat-Version", "1.0"); add_mailimf_field(imf_fields, "Chat-Version", "1.0");
if factory.req_mdn { if factory.req_mdn {
let headerval = to_string(factory.from_addr); add_mailimf_field(
add_mailimf_field(imf_fields, "Chat-Disposition-Notification-To", &headerval); imf_fields,
"Chat-Disposition-Notification-To",
&factory.from_addr,
);
} }
let cleanup = |message: *mut mailmime| { let cleanup = |message: *mut mailmime| {
@@ -617,21 +591,18 @@ pub unsafe fn dc_mimefactory_render(
} }
}; };
let footer = factory.selfstatus.as_ref(); let footer = &factory.selfstatus;
let message_text = format!( let message_text = format!(
"{}{}{}{}{}", "{}{}{}{}{}",
fwdhint.unwrap_or_default(), fwdhint.unwrap_or_default(),
&final_text, &final_text,
if !final_text.is_empty() && footer.is_some() { if !final_text.is_empty() && !footer.is_empty() {
"\r\n\r\n" "\r\n\r\n"
} else { } else {
"" ""
}, },
if footer.is_some() { "-- \r\n" } else { "" }, if !footer.is_empty() { "-- \r\n" } else { "" },
match footer { footer
Some(x) => x,
None => "",
}
); );
let text_part = build_body_text(&message_text); let text_part = build_body_text(&message_text);
mailmime_smart_add_part(message, text_part); mailmime_smart_add_part(message, text_part);
@@ -740,8 +711,8 @@ pub unsafe fn dc_mimefactory_render(
let message_text2 = format!( let message_text2 = format!(
"Reporting-UA: Delta Chat {}\r\nOriginal-Recipient: rfc822;{}\r\nFinal-Recipient: rfc822;{}\r\nOriginal-Message-ID: <{}>\r\nDisposition: manual-action/MDN-sent-automatically; displayed\r\n", "Reporting-UA: Delta Chat {}\r\nOriginal-Recipient: rfc822;{}\r\nFinal-Recipient: rfc822;{}\r\nOriginal-Message-ID: <{}>\r\nDisposition: manual-action/MDN-sent-automatically; displayed\r\n",
version, version,
as_str(factory.from_addr), factory.from_addr,
as_str(factory.from_addr), factory.from_addr,
factory.msg.rfc724_mid factory.msg.rfc724_mid
); );

View File

@@ -49,15 +49,6 @@ pub unsafe fn dc_strdup(s: *const libc::c_char) -> *mut libc::c_char {
ret ret
} }
/// Duplicates a string, returns null if given string is null
pub(crate) unsafe fn dc_strdup_keep_null(s: *const libc::c_char) -> *mut libc::c_char {
if !s.is_null() {
dc_strdup(s)
} else {
ptr::null_mut()
}
}
pub(crate) fn dc_atoi_null_is_0(s: *const libc::c_char) -> libc::c_int { pub(crate) fn dc_atoi_null_is_0(s: *const libc::c_char) -> libc::c_int {
if !s.is_null() { if !s.is_null() {
as_str(s).parse().unwrap_or_default() as_str(s).parse().unwrap_or_default()

View File

@@ -647,7 +647,7 @@ pub unsafe fn job_send_msg(context: &Context, msg_id: u32) -> libc::c_int {
/* load message data */ /* load message data */
let mimefactory = dc_mimefactory_load_msg(context, msg_id); let mimefactory = dc_mimefactory_load_msg(context, msg_id);
if mimefactory.is_err() || mimefactory.as_ref().unwrap().from_addr.is_null() { if mimefactory.is_err() {
warn!( warn!(
context, context,
"Cannot load data to send, maybe the message is deleted in between.", "Cannot load data to send, maybe the message is deleted in between.",
@@ -691,6 +691,7 @@ pub unsafe fn job_send_msg(context: &Context, msg_id: u32) -> libc::c_int {
.unwrap_or_default() .unwrap_or_default()
&& !mimefactory.out_encrypted && !mimefactory.out_encrypted
{ {
/* unrecoverable */
warn!( warn!(
context, context,
"e2e encryption unavailable {} - {:?}", "e2e encryption unavailable {} - {:?}",
@@ -703,8 +704,8 @@ pub unsafe fn job_send_msg(context: &Context, msg_id: u32) -> libc::c_int {
Some("End-to-end-encryption unavailable unexpectedly."), Some("End-to-end-encryption unavailable unexpectedly."),
); );
} else { } else {
/* unrecoverable */ let from_addr_c = mimefactory.from_addr.strdup();
if !clist_search_string_nocase(mimefactory.recipients_addr, mimefactory.from_addr) { if !clist_search_string_nocase(mimefactory.recipients_addr, from_addr_c) {
clist_insert_after( clist_insert_after(
mimefactory.recipients_names, mimefactory.recipients_names,
(*mimefactory.recipients_names).last, (*mimefactory.recipients_names).last,
@@ -713,9 +714,10 @@ pub unsafe fn job_send_msg(context: &Context, msg_id: u32) -> libc::c_int {
clist_insert_after( clist_insert_after(
mimefactory.recipients_addr, mimefactory.recipients_addr,
(*mimefactory.recipients_addr).last, (*mimefactory.recipients_addr).last,
dc_strdup(mimefactory.from_addr) as *mut libc::c_void, mimefactory.from_addr.strdup().cast(),
); );
} }
libc::free(from_addr_c.cast());
if mimefactory.out_gossiped { if mimefactory.out_gossiped {
chat::set_gossiped_timestamp(context, mimefactory.msg.chat_id, time()); chat::set_gossiped_timestamp(context, mimefactory.msg.chat_id, time());
} }