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 }