diff --git a/src/dc_mimeparser.rs b/src/dc_mimeparser.rs index d19278fff..59c83df1f 100644 --- a/src/dc_mimeparser.rs +++ b/src/dc_mimeparser.rs @@ -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 = 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); } diff --git a/src/dc_simplify.rs b/src/dc_simplify.rs index 705c53648..6ee4c63de 100644 --- a/src/dc_simplify.rs +++ b/src/dc_simplify.rs @@ -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::()) 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
\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"text]>text bold]]>\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); } } }