diff --git a/src/dc_receive_imf.rs b/src/dc_receive_imf.rs index 43d9ff1e5..097cd8de0 100644 --- a/src/dc_receive_imf.rs +++ b/src/dc_receive_imf.rs @@ -604,8 +604,9 @@ fn add_parts( bytes, hidden, mime_headers, mime_in_reply_to, mime_references) \ VALUES (?,?,?,?,?,?, ?,?,?,?,?,?, ?,?,?,?,?,?, ?,?);", |mut stmt, conn| { - for i in 0..icnt { - let part = &mut mime_parser.parts[i]; + let subject = mime_parser.get_subject().unwrap_or_default(); + + for part in mime_parser.parts.iter_mut() { if part.is_meta { continue; } @@ -622,11 +623,6 @@ fn add_parts( if part.typ == Viewtype::Text { let msg_raw = part.msg_raw.as_ref().cloned().unwrap_or_default(); - let subject = mime_parser - .subject - .as_ref() - .map(|s| s.to_string()) - .unwrap_or_else(|| "".into()); txt_raw = Some(format!("{}\n\n{}", subject, msg_raw)); } if mime_parser.is_system_message != SystemMessage::Unknown { @@ -1223,11 +1219,9 @@ fn create_or_lookup_adhoc_group( return Ok((0, Blocked::Not)); } // use subject as initial chat name - let grpname = if let Some(subject) = mime_parser.subject.as_ref().filter(|s| !s.is_empty()) { - subject.to_string() - } else { + let grpname = mime_parser.get_subject().unwrap_or_else(|| { context.stock_string_repl_int(StockMessage::Member, member_ids.len() as i32) - }; + }); // create group record let new_chat_id = create_group_record( diff --git a/src/mimeparser.rs b/src/mimeparser.rs index 7447c3275..aa017e645 100644 --- a/src/mimeparser.rs +++ b/src/mimeparser.rs @@ -29,7 +29,6 @@ pub struct MimeParser<'a> { pub context: &'a Context, pub parts: Vec, pub header: HashMap, - pub subject: Option, pub decrypting_failed: bool, pub encrypted: bool, pub signatures: HashSet, @@ -73,7 +72,6 @@ impl<'a> MimeParser<'a> { let mut parser = MimeParser { parts: Vec::new(), header: Default::default(), - subject: None, decrypting_failed: false, encrypted: false, signatures: Default::default(), @@ -147,10 +145,6 @@ impl<'a> MimeParser<'a> { } fn parse_headers(&mut self) -> Result<()> { - if let Some(field) = self.lookup_field("Subject") { - self.subject = Some(field.clone()); - } - if self.lookup_field("Autocrypt-Setup-Message").is_some() { let has_setup_file = self.parts.iter().any(|p| { p.mimetype.is_some() && p.mimetype.as_ref().unwrap().as_ref() == MIME_AC_SETUP_FILE @@ -225,7 +219,7 @@ impl<'a> MimeParser<'a> { std::mem::replace(&mut self.parts[0], filepart); } } - if let Some(ref subject) = self.subject { + if let Some(ref subject) = self.get_subject() { let mut prepend_subject = 1i32; if !self.decrypting_failed { let colon = subject.find(':'); @@ -316,7 +310,7 @@ impl<'a> MimeParser<'a> { let mut part = Part::default(); part.typ = Viewtype::Text; - if let Some(ref subject) = self.subject { + if let Some(ref subject) = self.get_subject() { if !self.has_chat_version() { part.msg = subject.to_string(); } @@ -340,6 +334,17 @@ impl<'a> MimeParser<'a> { self.header.contains_key("chat-version") } + pub(crate) fn get_subject(&self) -> Option { + if let Some(s) = self.header.get("subject") { + if s.is_empty() { + return None; + } + Some(s.to_string()) + } else { + None + } + } + pub fn lookup_field(&self, field_name: &str) -> Option<&String> { self.header.get(&field_name.to_lowercase()) } @@ -1016,7 +1021,7 @@ mod tests { let raw = include_bytes!("../test-data/message/issue_523.txt"); let mimeparser = MimeParser::from_bytes(&context.ctx, &raw[..]).unwrap(); - assert_eq!(mimeparser.subject, None); + assert_eq!(mimeparser.get_subject(), None); assert_eq!(mimeparser.parts.len(), 1); } @@ -1121,7 +1126,7 @@ mod tests { \x00"; let mimeparser = MimeParser::from_bytes(&context.ctx, &raw[..]).unwrap(); - assert_eq!(mimeparser.subject, Some("inner-subject".into())); + assert_eq!(mimeparser.get_subject(), Some("inner-subject".into())); let of = mimeparser.lookup_field("X-Special-A").unwrap(); assert_eq!(of, "special-a");