mirror of
https://github.com/chatmail/core.git
synced 2026-04-18 05:56:31 +03:00
Simplify dc_simplify_t implementation
- Replace dc_simplify_new and dc_simplify_unref with ::new() - Move dc_simplify_simplify and dc_simplify_simplify_plain_text into impl
This commit is contained in:
committed by
holger krekel
parent
63ed5c4009
commit
2f204fd2aa
@@ -1150,7 +1150,7 @@ unsafe fn dc_mimeparser_add_single_part_if_known(
|
||||
/* must not be free()'d */
|
||||
let mut decoded_data: *const libc::c_char = 0 as *const libc::c_char;
|
||||
let mut decoded_data_bytes = 0;
|
||||
let mut simplifier: *mut dc_simplify_t = 0 as *mut dc_simplify_t;
|
||||
let mut simplifier: Option<dc_simplify_t> = None;
|
||||
if !(mime.is_null() || (*mime).mm_data.mm_single.is_null()) {
|
||||
mime_type = mailmime_get_mime_type(mime, &mut msg_type, &mut raw_mime);
|
||||
mime_data = (*mime).mm_data.mm_single;
|
||||
@@ -1171,20 +1171,9 @@ unsafe fn dc_mimeparser_add_single_part_if_known(
|
||||
/* no always error - but no data */
|
||||
match mime_type {
|
||||
60 | 70 => {
|
||||
if simplifier.is_null() {
|
||||
simplifier = dc_simplify_new();
|
||||
if simplifier.is_null() {
|
||||
current_block = 8795901732489102124;
|
||||
} else {
|
||||
current_block = 13797916685926291137;
|
||||
}
|
||||
} else {
|
||||
current_block = 13797916685926291137;
|
||||
if simplifier.is_none() {
|
||||
simplifier = Some(dc_simplify_t::new());
|
||||
}
|
||||
// TODO match on enums /rtn
|
||||
match current_block {
|
||||
8795901732489102124 => {}
|
||||
_ => {
|
||||
/* get from `Content-Type: text/...; charset=utf-8`; must not be free()'d */
|
||||
let charset: *const libc::c_char =
|
||||
mailmime_content_charset_get((*mime).mm_content_type);
|
||||
@@ -1241,8 +1230,7 @@ unsafe fn dc_mimeparser_add_single_part_if_known(
|
||||
as *mut mailimf_optional_field)
|
||||
as libc::c_int;
|
||||
let simplified_txt: *mut libc::c_char =
|
||||
dc_simplify_simplify(
|
||||
simplifier,
|
||||
simplifier.unwrap().simplify(
|
||||
decoded_data,
|
||||
decoded_data_bytes as libc::c_int,
|
||||
if mime_type == 70i32 { 1i32 } else { 0i32 },
|
||||
@@ -1264,14 +1252,12 @@ unsafe fn dc_mimeparser_add_single_part_if_known(
|
||||
} else {
|
||||
free(simplified_txt as *mut libc::c_void);
|
||||
}
|
||||
if 0 != (*simplifier).is_forwarded {
|
||||
if 0 != simplifier.unwrap().is_forwarded {
|
||||
(*mimeparser).is_forwarded = 1i32
|
||||
}
|
||||
current_block = 10261677128829721533;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
80 | 90 | 100 | 110 | 111 => {
|
||||
/* try to get file name from
|
||||
@@ -1449,7 +1435,6 @@ unsafe fn dc_mimeparser_add_single_part_if_known(
|
||||
}
|
||||
}
|
||||
/* add object? (we do not add all objects, eg. signatures etc. are ignored) */
|
||||
dc_simplify_unref(simplifier);
|
||||
if !transfer_decoding_buffer.is_null() {
|
||||
mmap_string_unref(transfer_decoding_buffer);
|
||||
}
|
||||
|
||||
@@ -11,26 +11,17 @@ pub struct dc_simplify_t {
|
||||
pub is_cut_at_end: libc::c_int,
|
||||
}
|
||||
|
||||
pub unsafe fn dc_simplify_new() -> *mut dc_simplify_t {
|
||||
let simplify: *mut dc_simplify_t;
|
||||
simplify = calloc(1, ::std::mem::size_of::<dc_simplify_t>()) as *mut dc_simplify_t;
|
||||
assert!(!simplify.is_null());
|
||||
|
||||
simplify
|
||||
}
|
||||
|
||||
pub unsafe fn dc_simplify_unref(simplify: *mut dc_simplify_t) {
|
||||
if simplify.is_null() {
|
||||
return;
|
||||
impl dc_simplify_t {
|
||||
pub fn new() -> Self {
|
||||
dc_simplify_t {
|
||||
is_forwarded: 0,
|
||||
is_cut_at_begin: 0,
|
||||
is_cut_at_end: 0,
|
||||
}
|
||||
}
|
||||
free(simplify as *mut libc::c_void);
|
||||
}
|
||||
|
||||
/* Simplify and normalise text: Remove quotes, signatures, unnecessary
|
||||
lineends etc.
|
||||
The data returned from Simplify() must be free()'d when no longer used, private */
|
||||
pub unsafe fn dc_simplify_simplify(
|
||||
mut simplify: *mut dc_simplify_t,
|
||||
pub unsafe fn simplify(
|
||||
&mut self,
|
||||
in_unterminated: *const libc::c_char,
|
||||
in_bytes: libc::c_int,
|
||||
is_html: libc::c_int,
|
||||
@@ -39,12 +30,9 @@ pub unsafe fn dc_simplify_simplify(
|
||||
/* create a copy of the given buffer */
|
||||
let mut out: *mut libc::c_char;
|
||||
let mut temp: *mut libc::c_char;
|
||||
if simplify.is_null() || in_unterminated.is_null() || in_bytes <= 0i32 {
|
||||
return dc_strdup(b"\x00" as *const u8 as *const libc::c_char);
|
||||
}
|
||||
(*simplify).is_forwarded = 0i32;
|
||||
(*simplify).is_cut_at_begin = 0i32;
|
||||
(*simplify).is_cut_at_end = 0i32;
|
||||
self.is_forwarded = 0i32;
|
||||
self.is_cut_at_begin = 0i32;
|
||||
self.is_cut_at_end = 0i32;
|
||||
out = strndup(
|
||||
in_unterminated as *mut libc::c_char,
|
||||
in_bytes as libc::c_ulong,
|
||||
@@ -60,7 +48,7 @@ pub unsafe fn dc_simplify_simplify(
|
||||
}
|
||||
}
|
||||
dc_remove_cr_chars(out);
|
||||
temp = dc_simplify_simplify_plain_text(simplify, out, is_msgrmsg);
|
||||
temp = self.simplify_plain_text(out, is_msgrmsg);
|
||||
if !temp.is_null() {
|
||||
free(out as *mut libc::c_void);
|
||||
out = temp
|
||||
@@ -73,8 +61,8 @@ pub unsafe fn dc_simplify_simplify(
|
||||
/**
|
||||
* Simplify Plain Text
|
||||
*/
|
||||
unsafe fn dc_simplify_simplify_plain_text(
|
||||
mut simplify: *mut dc_simplify_t,
|
||||
unsafe fn simplify_plain_text(
|
||||
&mut self,
|
||||
buf_terminated: *const libc::c_char,
|
||||
is_msgrmsg: libc::c_int,
|
||||
) -> *mut libc::c_char {
|
||||
@@ -105,7 +93,7 @@ unsafe fn dc_simplify_simplify_plain_text(
|
||||
|| strcmp(line, b"----\x00" as *const u8 as *const libc::c_char) == 0i32
|
||||
{
|
||||
footer_mark = 1i32;
|
||||
(*simplify).is_cut_at_end = 1i32
|
||||
self.is_cut_at_end = 1i32
|
||||
}
|
||||
if 0 != footer_mark {
|
||||
l_last = l - 1i32;
|
||||
@@ -129,7 +117,7 @@ unsafe fn dc_simplify_simplify_plain_text(
|
||||
&& strncmp(line1, b"From: \x00" as *const u8 as *const libc::c_char, 6) == 0i32
|
||||
&& *line2.offset(0isize) as libc::c_int == 0i32
|
||||
{
|
||||
(*simplify).is_forwarded = 1i32;
|
||||
self.is_forwarded = 1i32;
|
||||
l_first += 3i32
|
||||
}
|
||||
}
|
||||
@@ -143,7 +131,7 @@ unsafe fn dc_simplify_simplify_plain_text(
|
||||
|| strncmp(line, b"~~~~~\x00" as *const u8 as *const libc::c_char, 5) == 0i32
|
||||
{
|
||||
l_last = l - 1i32;
|
||||
(*simplify).is_cut_at_end = 1i32;
|
||||
self.is_cut_at_end = 1i32;
|
||||
/* done */
|
||||
break;
|
||||
} else {
|
||||
@@ -164,9 +152,10 @@ unsafe fn dc_simplify_simplify_plain_text(
|
||||
}
|
||||
if l_lastQuotedLine != -1i32 {
|
||||
l_last = l_lastQuotedLine - 1i32;
|
||||
(*simplify).is_cut_at_end = 1i32;
|
||||
self.is_cut_at_end = 1i32;
|
||||
if l_last > 0i32 {
|
||||
if is_empty_line(carray_get(lines, l_last as libc::c_uint) as *mut libc::c_char) {
|
||||
if is_empty_line(carray_get(lines, l_last as libc::c_uint) as *mut libc::c_char)
|
||||
{
|
||||
l_last -= 1
|
||||
}
|
||||
}
|
||||
@@ -187,7 +176,9 @@ unsafe fn dc_simplify_simplify_plain_text(
|
||||
if is_plain_quote(line) {
|
||||
l_lastQuotedLine_0 = l
|
||||
} else if !is_empty_line(line) {
|
||||
if is_quoted_headline(line) && 0 == hasQuotedHeadline && l_lastQuotedLine_0 == -1i32
|
||||
if is_quoted_headline(line)
|
||||
&& 0 == hasQuotedHeadline
|
||||
&& l_lastQuotedLine_0 == -1i32
|
||||
{
|
||||
hasQuotedHeadline = 1i32
|
||||
} else {
|
||||
@@ -199,12 +190,12 @@ unsafe fn dc_simplify_simplify_plain_text(
|
||||
}
|
||||
if l_lastQuotedLine_0 != -1i32 {
|
||||
l_first = l_lastQuotedLine_0 + 1i32;
|
||||
(*simplify).is_cut_at_begin = 1i32
|
||||
self.is_cut_at_begin = 1i32
|
||||
}
|
||||
}
|
||||
/* re-create buffer from the remaining lines */
|
||||
let mut ret = String::new();
|
||||
if 0 != (*simplify).is_cut_at_begin {
|
||||
if 0 != self.is_cut_at_begin {
|
||||
ret += "[...]";
|
||||
}
|
||||
/* we write empty lines only in case and non-empty line follows */
|
||||
@@ -232,15 +223,30 @@ unsafe fn dc_simplify_simplify_plain_text(
|
||||
}
|
||||
l += 1
|
||||
}
|
||||
if 0 != (*simplify).is_cut_at_end
|
||||
&& (0 == (*simplify).is_cut_at_begin || 0 != content_lines_added)
|
||||
{
|
||||
if 0 != self.is_cut_at_end && (0 == self.is_cut_at_begin || 0 != content_lines_added) {
|
||||
ret += " [...]";
|
||||
}
|
||||
dc_free_splitted_lines(lines);
|
||||
|
||||
to_cstring(ret)
|
||||
}
|
||||
}
|
||||
|
||||
/* Simplify and normalise text: Remove quotes, signatures, unnecessary
|
||||
lineends etc.
|
||||
The data returned from Simplify() must be free()'d when no longer used, private */
|
||||
pub unsafe fn dc_simplify_simplify(
|
||||
simplify: *mut dc_simplify_t,
|
||||
in_unterminated: *const libc::c_char,
|
||||
in_bytes: libc::c_int,
|
||||
is_html: libc::c_int,
|
||||
is_msgrmsg: libc::c_int,
|
||||
) -> *mut libc::c_char {
|
||||
if simplify.is_null() || in_unterminated.is_null() || in_bytes <= 0i32 {
|
||||
return dc_strdup(b"\x00" as *const u8 as *const libc::c_char);
|
||||
}
|
||||
(*simplify).simplify(in_unterminated, in_bytes, is_html, is_msgrmsg)
|
||||
}
|
||||
|
||||
/**
|
||||
* Tools
|
||||
@@ -290,11 +296,11 @@ mod tests {
|
||||
#[test]
|
||||
fn test_simplify_trim() {
|
||||
unsafe {
|
||||
let simplify: *mut dc_simplify_t = dc_simplify_new();
|
||||
let mut simplify = dc_simplify_t::new();
|
||||
let html: *const libc::c_char =
|
||||
b"\r\r\nline1<br>\r\n\r\n\r\rline2\n\r\x00" as *const u8 as *const libc::c_char;
|
||||
let plain: *mut libc::c_char =
|
||||
dc_simplify_simplify(simplify, html, strlen(html) as libc::c_int, 1, 0);
|
||||
simplify.simplify(html, strlen(html) as libc::c_int, 1, 0);
|
||||
|
||||
assert_eq!(
|
||||
CStr::from_ptr(plain as *const libc::c_char)
|
||||
@@ -304,18 +310,17 @@ mod tests {
|
||||
);
|
||||
|
||||
free(plain as *mut libc::c_void);
|
||||
dc_simplify_unref(simplify);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_simplify_parse_href() {
|
||||
unsafe {
|
||||
let simplify: *mut dc_simplify_t = dc_simplify_new();
|
||||
let mut simplify = dc_simplify_t::new();
|
||||
let html: *const libc::c_char =
|
||||
b"<a href=url>text</a\x00" as *const u8 as *const libc::c_char;
|
||||
let plain: *mut libc::c_char =
|
||||
dc_simplify_simplify(simplify, html, strlen(html) as libc::c_int, 1, 0);
|
||||
simplify.simplify(html, strlen(html) as libc::c_int, 1, 0);
|
||||
|
||||
assert_eq!(
|
||||
CStr::from_ptr(plain as *const libc::c_char)
|
||||
@@ -325,19 +330,18 @@ mod tests {
|
||||
);
|
||||
|
||||
free(plain as *mut libc::c_void);
|
||||
dc_simplify_unref(simplify);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_simplify_bold_text() {
|
||||
unsafe {
|
||||
let simplify: *mut dc_simplify_t = dc_simplify_new();
|
||||
let mut simplify = dc_simplify_t::new();
|
||||
let html: *const libc::c_char =
|
||||
b"<!DOCTYPE name [<!DOCTYPE ...>]><!-- comment -->text <b><?php echo ... ?>bold</b><![CDATA[<>]]>\x00"
|
||||
as *const u8 as *const libc::c_char;
|
||||
let plain: *mut libc::c_char =
|
||||
dc_simplify_simplify(simplify, html, strlen(html) as libc::c_int, 1, 0);
|
||||
simplify.simplify(html, strlen(html) as libc::c_int, 1, 0);
|
||||
|
||||
assert_eq!(
|
||||
CStr::from_ptr(plain as *const libc::c_char)
|
||||
@@ -347,19 +351,18 @@ mod tests {
|
||||
);
|
||||
|
||||
free(plain as *mut libc::c_void);
|
||||
dc_simplify_unref(simplify);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_simplify_html_encoded() {
|
||||
unsafe {
|
||||
let simplify: *mut dc_simplify_t = dc_simplify_new();
|
||||
let mut simplify = dc_simplify_t::new();
|
||||
let html: *const libc::c_char =
|
||||
b"<>"'& äÄöÖüÜß fooÆçÇ ♦&noent;‎‏‌‍\x00"
|
||||
as *const u8 as *const libc::c_char;
|
||||
let plain: *mut libc::c_char =
|
||||
dc_simplify_simplify(simplify, html, strlen(html) as libc::c_int, 1, 0);
|
||||
simplify.simplify(html, strlen(html) as libc::c_int, 1, 0);
|
||||
|
||||
assert_eq!(
|
||||
strcmp(plain,
|
||||
@@ -369,7 +372,6 @@ mod tests {
|
||||
);
|
||||
|
||||
free(plain as *mut libc::c_void);
|
||||
dc_simplify_unref(simplify);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user