File indexing completed on 2024-06-23 05:19:20

0001 /*
0002    SPDX-FileCopyrightText: 2016 Sandro Knauß <sknauss@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "utils.h"
0008 
0009 using namespace MimeTreeParser;
0010 
0011 MimeMessagePart::Ptr MimeTreeParser::createAndParseTempNode(Interface::BodyPart &part, KMime::Content *parentNode, const char *content, const char *cntDesc)
0012 {
0013     auto newNode = new KMime::Content();
0014     newNode->setContent(KMime::CRLFtoLF(content));
0015     newNode->parse();
0016 
0017     if (!newNode->head().isEmpty()) {
0018         newNode->contentDescription()->from7BitString(cntDesc);
0019     }
0020     part.nodeHelper()->attachExtraContent(parentNode, newNode);
0021 
0022     return MimeMessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), newNode, false));
0023 }
0024 
0025 KMime::Content *MimeTreeParser::findTypeInDirectChilds(KMime::Content *content, const QByteArray &mimeType)
0026 {
0027     if (mimeType.isEmpty()) {
0028         return content;
0029     }
0030 
0031     const auto contents = content->contents();
0032     for (const auto child : contents) {
0033         if ((!child->contentType()->isEmpty()) && (mimeType == child->contentType(false)->mimeType())) {
0034             return child;
0035         }
0036     }
0037     return nullptr;
0038 }
0039 
0040 MessagePart::Ptr MimeTreeParser::toplevelTextNode(MessagePart::Ptr messageTree)
0041 {
0042     const auto subParts = messageTree->subParts();
0043     for (const auto &mp : subParts) {
0044         auto text = mp.dynamicCast<TextMessagePart>();
0045         auto attach = mp.dynamicCast<AttachmentMessagePart>();
0046         if (text && !attach) {
0047             return text;
0048         } else if (const auto alternative = mp.dynamicCast<AlternativeMessagePart>()) {
0049             return alternative;
0050         } else {
0051             auto ret = toplevelTextNode(mp);
0052             if (ret) {
0053                 return ret;
0054             }
0055         }
0056     }
0057     return {};
0058 }