1 /*
2     kmime_message.cpp
3 
4     KMime, the KDE Internet mail/usenet news message library.
5     SPDX-FileCopyrightText: 2001 the KMime authors.
6     See file AUTHORS for details
7 
8     SPDX-License-Identifier: LGPL-2.0-or-later
9 */
10 
11 #include "kmime_message.h"
12 #include "kmime_util_p.h"
13 
14 using namespace KMime;
15 
16 namespace KMime
17 {
18 
Message()19 Message::Message() : Content()
20 {
21 }
22 
~Message()23 Message::~Message()
24 {
25 }
26 
assembleHeaders()27 QByteArray Message::assembleHeaders()
28 {
29     // Create the mandatory fields (RFC5322) if they do not exist already.
30     date(true);
31     from(true);
32 
33     // Make sure the mandatory MIME-Version field (RFC2045) is present and valid.
34     auto *mimeVersion = header<Headers::MIMEVersion>(true);
35     mimeVersion->from7BitString("1.0");
36 
37     // Assemble all header fields.
38     return Content::assembleHeaders();
39 }
40 
mainBodyPart(const QByteArray & type)41 Content *Message::mainBodyPart(const QByteArray &type)
42 {
43     KMime::Content *c = this;
44     while (c) {
45         // not a multipart message
46         const KMime::Headers::ContentType *const contentType = c->contentType();
47         if (!contentType->isMultipart()) {
48             if (contentType->mimeType() == type || type.isEmpty()) {
49                 return c;
50             }
51             return nullptr;
52         }
53 
54         // empty multipart
55         if (c->contents().isEmpty()) {
56             return nullptr;
57         }
58 
59         // multipart/alternative
60         if (contentType->subType() == "alternative") {
61             if (type.isEmpty()) {
62                 return c->contents().at(0);
63             }
64             const auto contents = c->contents();
65             for (Content *c1 : contents) {
66                 if (c1->contentType()->mimeType() == type) {
67                     return c1;
68                 }
69             }
70             return nullptr;
71         }
72 
73         c = c->contents().at(0);
74     }
75 
76     return nullptr;
77 }
78 
mimeType()79 QString Message::mimeType()
80 {
81     return QStringLiteral("message/rfc822");
82 }
83 
84 // @cond PRIVATE
85 #define kmime_mk_header_accessor( type, method ) \
86     Headers::type *Message::method( bool create ) { \
87         return header<Headers::type>( create ); \
88     }
89 
90 kmime_mk_header_accessor(MessageID, messageID)
91 kmime_mk_header_accessor(Subject, subject)
92 kmime_mk_header_accessor(Date, date)
93 kmime_mk_header_accessor(Organization, organization)
94 kmime_mk_header_accessor(From, from)
95 kmime_mk_header_accessor(ReplyTo, replyTo)
96 kmime_mk_header_accessor(To, to)
97 kmime_mk_header_accessor(Cc, cc)
98 kmime_mk_header_accessor(Bcc, bcc)
99 kmime_mk_header_accessor(References, references)
100 kmime_mk_header_accessor(UserAgent, userAgent)
101 kmime_mk_header_accessor(InReplyTo, inReplyTo)
102 kmime_mk_header_accessor(Sender, sender)
103 
104 #undef kmime_mk_header_accessor
105 // @endcond
106 
107 }
108 
109