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 "multipartalternative.h"
0008 
0009 #include "messagepart.h"
0010 #include "objecttreeparser.h"
0011 
0012 #include <KMime/Content>
0013 
0014 using namespace MimeTreeParser;
0015 
0016 const MultiPartAlternativeBodyPartFormatter *MultiPartAlternativeBodyPartFormatter::self;
0017 
0018 const Interface::BodyPartFormatter *MultiPartAlternativeBodyPartFormatter::create()
0019 {
0020     if (!self) {
0021         self = new MultiPartAlternativeBodyPartFormatter();
0022     }
0023     return self;
0024 }
0025 
0026 MessagePart::Ptr MultiPartAlternativeBodyPartFormatter::process(Interface::BodyPart &part) const
0027 {
0028     KMime::Content *node = part.content();
0029     if (node->contents().isEmpty()) {
0030         return {};
0031     }
0032 
0033     auto preferredMode = part.source()->preferredMode();
0034     AlternativeMessagePart::Ptr mp(new AlternativeMessagePart(part.objectTreeParser(), node, preferredMode));
0035     if (mp->childParts().isEmpty()) {
0036         MimeMessagePart::Ptr _mp(new MimeMessagePart(part.objectTreeParser(), node->contents().at(0), false));
0037         return _mp;
0038     }
0039 
0040     KMime::Content *dataIcal = mp->childParts().contains(Util::MultipartIcal) ? mp->childParts()[Util::MultipartIcal]->content() : nullptr;
0041     KMime::Content *dataHtml = mp->childParts().contains(Util::MultipartHtml) ? mp->childParts()[Util::MultipartHtml]->content() : nullptr;
0042     KMime::Content *dataPlain = mp->childParts().contains(Util::MultipartPlain) ? mp->childParts()[Util::MultipartPlain]->content() : nullptr;
0043 
0044     // Make sure that in default ical is preferred over html and plain text
0045     if (dataIcal && ((preferredMode != Util::MultipartHtml && preferredMode != Util::MultipartPlain))) {
0046         if (dataHtml) {
0047             part.nodeHelper()->setNodeProcessed(dataHtml, false);
0048         }
0049         if (dataPlain) {
0050             part.nodeHelper()->setNodeProcessed(dataPlain, false);
0051         }
0052         preferredMode = Util::MultipartIcal;
0053     } else if ((dataHtml && (preferredMode == Util::MultipartHtml || preferredMode == Util::Html)) || (dataHtml && dataPlain && dataPlain->body().isEmpty())) {
0054         if (dataPlain) {
0055             part.nodeHelper()->setNodeProcessed(dataPlain, false);
0056         }
0057         preferredMode = Util::MultipartHtml;
0058     } else if (!(preferredMode == Util::MultipartHtml) && dataPlain) {
0059         part.nodeHelper()->setNodeProcessed(dataHtml, false);
0060         preferredMode = Util::MultipartPlain;
0061     }
0062 
0063     //    qDebug() << " MessagePart::Ptr MultiPartAlternativeBodyPartFormatter::process(Interface::BodyPart &part) const";
0064     //    for (int i = 0; i < mp->availableModes().count(); ++i) {
0065     //        qDebug() << "MultiPartAlternativeBodyPartFormatter::processed Modes " << MimeTreeParser::Util::htmlModeToString(mp->availableModes().at(i));
0066     //    }
0067     //    qDebug() << "MultiPartAlternativeBodyPartFormatter::process preferred " << MimeTreeParser::Util::htmlModeToString(preferredMode);
0068 
0069     part.source()->setHtmlMode(preferredMode, mp->availableModes());
0070     mp->setPreferredMode(preferredMode);
0071     return mp;
0072 }