15 #include "objecttreeparser.h"
17 #include "bodypartformatterfactory.h"
18 #include "messagepart.h"
19 #include "nodehelper.h"
20 #include "partnodebodypart.h"
22 #include "mimetreeparser_debug.h"
24 #include "bodyformatter/utils.h"
25 #include "interfaces/bodypartformatter.h"
26 #include "utils/util.h"
28 #include <KMime/Headers>
29 #include <KMime/Message>
37 using namespace MimeTreeParser;
40 : mSource(topLevelParser->mSource)
41 , mNodeHelper(topLevelParser->mNodeHelper)
42 , mTopLevelContent(topLevelParser->mTopLevelContent)
43 , mAllowAsync(topLevelParser->mAllowAsync)
50 , mNodeHelper(nodeHelper)
51 , mTopLevelContent(nullptr)
57 void ObjectTreeParser::init()
63 mDeleteNodeHelper =
true;
65 mDeleteNodeHelper =
false;
70 : mSource(other.mSource)
71 , mNodeHelper(other.nodeHelper())
72 , mTopLevelContent(other.mTopLevelContent)
73 , mHasPendingAsyncJobs(other.hasPendingAsyncJobs())
74 , mAllowAsync(other.allowAsync())
75 , mDeleteNodeHelper(false)
79 ObjectTreeParser::~ObjectTreeParser()
81 if (mDeleteNodeHelper) {
83 mNodeHelper =
nullptr;
87 void ObjectTreeParser::setAllowAsync(
bool allow)
89 Q_ASSERT(!mHasPendingAsyncJobs);
93 bool ObjectTreeParser::allowAsync()
const
98 bool ObjectTreeParser::hasPendingAsyncJobs()
const
100 return mHasPendingAsyncJobs;
103 QString ObjectTreeParser::plainTextContent()
const
105 return mPlainTextContent;
115 void ObjectTreeParser::parseObjectTree(
KMime::Content *node,
bool parseOnlySingleNode)
117 mTopLevelContent = node;
118 mParsedPart = parseObjectTreeInternal(node, parseOnlySingleNode);
122 if (
auto mp = toplevelTextNode(mParsedPart)) {
124 extractNodeInfos(_mp->content(),
true);
126 if (_mp->childParts().contains(Util::MultipartPlain)) {
127 extractNodeInfos(_mp->childParts()[Util::MultipartPlain]->content(),
true);
130 setPlainTextContent(mp->text());
142 const auto formatters = mSource->bodyPartFormatterFactory()->formattersForType(
QString::fromUtf8(mimeType));
143 Q_ASSERT(!formatters.empty());
144 for (
auto formatter : formatters) {
145 PartNodeBodyPart part(
this, &processResult, mTopLevelContent, node, mNodeHelper);
146 mNodeHelper->setNodeDisplayedEmbedded(node,
true);
153 result->setAttachmentContent(node);
168 mHasPendingAsyncJobs =
false;
170 mNodeHelper->clearOverrideHeaders();
173 if (onlyOneMimePart) {
175 mNodeHelper->setNodeUnprocessed(node,
false);
177 mNodeHelper->setNodeUnprocessed(node,
true);
179 }
else if (!node->
parent()) {
181 mNodeHelper->setNodeUnprocessed(node,
true);
186 parsedPart->setIsRoot(isRoot);
189 if (contents.isEmpty()) {
190 contents.append(node);
192 int i = contents.indexOf(node);
196 for (; i < contents.size(); ++i) {
197 node = contents.at(i);
198 if (mNodeHelper->nodeProcessed(node)) {
210 if (mimeType ==
"application/octet-stream") {
211 NodeHelper::magicSetType(node);
215 const auto mp = processType(node, processResult, mimeType);
217 parsedPart->appendSubPart(mp);
218 mNodeHelper->setNodeProcessed(node,
false);
221 processResult.adjustCryptoStatesOfNode(node);
223 if (onlyOneMimePart) {
231 KMMsgSignatureState ProcessResult::inlineSignatureState()
const
233 return mInlineSignatureState;
236 void ProcessResult::setInlineSignatureState(KMMsgSignatureState state)
238 mInlineSignatureState = state;
241 KMMsgEncryptionState ProcessResult::inlineEncryptionState()
const
243 return mInlineEncryptionState;
246 void ProcessResult::setInlineEncryptionState(KMMsgEncryptionState state)
248 mInlineEncryptionState = state;
251 bool ProcessResult::neverDisplayInline()
const
253 return mNeverDisplayInline;
256 void ProcessResult::setNeverDisplayInline(
bool display)
258 mNeverDisplayInline = display;
261 void ProcessResult::adjustCryptoStatesOfNode(
const KMime::Content *node)
const
263 if ((inlineSignatureState() != KMMsgNotSigned) || (inlineEncryptionState() != KMMsgNotEncrypted)) {
264 mNodeHelper->setSignatureState(node, inlineSignatureState());
265 mNodeHelper->setEncryptionState(node, inlineEncryptionState());
269 void ObjectTreeParser::extractNodeInfos(
KMime::Content *curNode,
bool isFirstTextPart)
271 if (isFirstTextPart) {
273 mPlainTextContentCharset += NodeHelper::charset(curNode);
277 void ObjectTreeParser::setPlainTextContent(
const QString &plainTextContent)
279 mPlainTextContent = plainTextContent;
285 if (mSource->overrideCodec()) {
286 return mSource->overrideCodec();
288 return mNodeHelper->codec(node);
293 return mPlainTextContentCharset;
296 QByteArray ObjectTreeParser::htmlContentCharset()
const
298 return mHtmlContentCharset;