mirror of
https://github.com/chatmail/core.git
synced 2026-05-07 08:56:30 +03:00
rustify parts of MimeFactory struct
This commit is contained in:
@@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
10
src/job.rs
10
src/job.rs
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user