File indexing completed on 2024-04-21 05:18:13
0001 /* 0002 kmime_message.cpp 0003 0004 KMime, the KDE Internet mail/usenet news message library. 0005 SPDX-FileCopyrightText: 2001 the KMime authors. 0006 See file AUTHORS for details 0007 0008 SPDX-License-Identifier: LGPL-2.0-or-later 0009 */ 0010 0011 #include "kmime_message.h" 0012 #include "kmime_util_p.h" 0013 0014 using namespace KMime; 0015 0016 namespace KMime 0017 { 0018 0019 Message::Message() : Content() 0020 { 0021 } 0022 0023 Message::~Message() = default; 0024 0025 QByteArray Message::assembleHeaders() 0026 { 0027 // Create the mandatory fields (RFC5322) if they do not exist already. 0028 date(true); 0029 from(true); 0030 0031 // Make sure the mandatory MIME-Version field (RFC2045) is present and valid. 0032 auto *mimeVersion = header<Headers::MIMEVersion>(true); 0033 mimeVersion->from7BitString("1.0"); 0034 0035 // Assemble all header fields. 0036 return Content::assembleHeaders(); 0037 } 0038 0039 Content *Message::mainBodyPart(const QByteArray &type) 0040 { 0041 KMime::Content *c = this; 0042 while (c) { 0043 // not a multipart message 0044 const KMime::Headers::ContentType *const contentType = c->contentType(); 0045 if (!contentType->isMultipart()) { 0046 if (contentType->mimeType() == type || type.isEmpty()) { 0047 return c; 0048 } 0049 return nullptr; 0050 } 0051 0052 // empty multipart 0053 if (c->contents().isEmpty()) { 0054 return nullptr; 0055 } 0056 0057 // multipart/alternative 0058 if (contentType->subType() == "alternative") { 0059 if (type.isEmpty()) { 0060 return c->contents().at(0); 0061 } 0062 const auto contents = c->contents(); 0063 for (Content *c1 : contents) { 0064 if (c1->contentType()->mimeType() == type) { 0065 return c1; 0066 } 0067 } 0068 return nullptr; 0069 } 0070 0071 c = c->contents().at(0); 0072 } 0073 0074 return nullptr; 0075 } 0076 0077 QString Message::mimeType() 0078 { 0079 return QStringLiteral("message/rfc822"); 0080 } 0081 0082 // @cond PRIVATE 0083 #define kmime_mk_header_accessor( type, method ) \ 0084 Headers::type *Message::method( bool create ) { \ 0085 return header<Headers::type>( create ); \ 0086 } 0087 0088 kmime_mk_header_accessor(MessageID, messageID) 0089 kmime_mk_header_accessor(Subject, subject) 0090 kmime_mk_header_accessor(Date, date) 0091 kmime_mk_header_accessor(Organization, organization) 0092 kmime_mk_header_accessor(From, from) 0093 kmime_mk_header_accessor(ReplyTo, replyTo) 0094 kmime_mk_header_accessor(To, to) 0095 kmime_mk_header_accessor(Cc, cc) 0096 kmime_mk_header_accessor(Bcc, bcc) 0097 kmime_mk_header_accessor(References, references) 0098 kmime_mk_header_accessor(UserAgent, userAgent) 0099 kmime_mk_header_accessor(InReplyTo, inReplyTo) 0100 kmime_mk_header_accessor(Sender, sender) 0101 0102 #undef kmime_mk_header_accessor 0103 // @endcond 0104 0105 } 0106