15 #include "objecttreeparser.h"
17 #include "bodypartformatterfactory.h"
18 #include "messagepart.h"
19 #include "nodehelper.h"
20 #include "partnodebodypart.h"
22 #include "bodyformatter/utils.h"
23 #include "interfaces/bodypartformatter.h"
24 #include "utils/util.h"
26 #include <KMime/Headers>
27 #include <KMime/Message>
35 using namespace MimeTreeParser;
38 : mSource(topLevelParser->mSource)
39 , mNodeHelper(topLevelParser->mNodeHelper)
40 , mTopLevelContent(topLevelParser->mTopLevelContent)
41 , mAllowAsync(topLevelParser->mAllowAsync)
48 , mNodeHelper(nodeHelper)
49 , mTopLevelContent(nullptr)
55 void ObjectTreeParser::init()
61 mDeleteNodeHelper =
true;
63 mDeleteNodeHelper =
false;
68 : mSource(other.mSource)
69 , mNodeHelper(other.nodeHelper())
70 , mTopLevelContent(other.mTopLevelContent)
71 , mHasPendingAsyncJobs(other.hasPendingAsyncJobs())
72 , mAllowAsync(other.allowAsync())
73 , mDeleteNodeHelper(false)
77 ObjectTreeParser::~ObjectTreeParser()
79 if (mDeleteNodeHelper) {
81 mNodeHelper =
nullptr;
85 void ObjectTreeParser::setAllowAsync(
bool allow)
87 Q_ASSERT(!mHasPendingAsyncJobs);
91 bool ObjectTreeParser::allowAsync()
const
96 bool ObjectTreeParser::hasPendingAsyncJobs()
const
98 return mHasPendingAsyncJobs;
101 QString ObjectTreeParser::plainTextContent()
const
103 return mPlainTextContent;
113 void ObjectTreeParser::parseObjectTree(
KMime::Content *node,
bool parseOnlySingleNode)
115 mTopLevelContent = node;
116 mParsedPart = parseObjectTreeInternal(node, parseOnlySingleNode);
120 if (
auto mp = toplevelTextNode(mParsedPart)) {
122 extractNodeInfos(_mp->content(),
true);
124 if (_mp->childParts().contains(Util::MultipartPlain)) {
125 extractNodeInfos(_mp->childParts()[Util::MultipartPlain]->content(),
true);
128 setPlainTextContent(mp->text());
140 const auto formatters = mSource->bodyPartFormatterFactory()->formattersForType(
QString::fromUtf8(mimeType));
141 Q_ASSERT(!formatters.empty());
142 for (
auto formatter : formatters) {
143 PartNodeBodyPart part(
this, &processResult, mTopLevelContent, node, mNodeHelper);
144 mNodeHelper->setNodeDisplayedEmbedded(node,
true);
151 result->setAttachmentContent(node);
166 mHasPendingAsyncJobs =
false;
168 mNodeHelper->clearOverrideHeaders();
171 if (onlyOneMimePart) {
173 mNodeHelper->setNodeUnprocessed(node,
false);
175 mNodeHelper->setNodeUnprocessed(node,
true);
177 }
else if (!node->
parent()) {
179 mNodeHelper->setNodeUnprocessed(node,
true);
184 parsedPart->setIsRoot(isRoot);
187 if (contents.isEmpty()) {
188 contents.append(node);
190 int i = contents.indexOf(node);
194 for (; i < contents.size(); ++i) {
195 node = contents.at(i);
196 if (mNodeHelper->nodeProcessed(node)) {
208 if (mimeType ==
"application/octet-stream") {
209 NodeHelper::magicSetType(node);
213 const auto mp = processType(node, processResult, mimeType);
215 parsedPart->appendSubPart(mp);
216 mNodeHelper->setNodeProcessed(node,
false);
219 processResult.adjustCryptoStatesOfNode(node);
221 if (onlyOneMimePart) {
229 KMMsgSignatureState ProcessResult::inlineSignatureState()
const
231 return mInlineSignatureState;
234 void ProcessResult::setInlineSignatureState(KMMsgSignatureState state)
236 mInlineSignatureState = state;
239 KMMsgEncryptionState ProcessResult::inlineEncryptionState()
const
241 return mInlineEncryptionState;
244 void ProcessResult::setInlineEncryptionState(KMMsgEncryptionState state)
246 mInlineEncryptionState = state;
249 bool ProcessResult::neverDisplayInline()
const
251 return mNeverDisplayInline;
254 void ProcessResult::setNeverDisplayInline(
bool display)
256 mNeverDisplayInline = display;
259 void ProcessResult::adjustCryptoStatesOfNode(
const KMime::Content *node)
const
261 if ((inlineSignatureState() != KMMsgNotSigned) || (inlineEncryptionState() != KMMsgNotEncrypted)) {
262 mNodeHelper->setSignatureState(node, inlineSignatureState());
263 mNodeHelper->setEncryptionState(node, inlineEncryptionState());
267 void ObjectTreeParser::extractNodeInfos(
KMime::Content *curNode,
bool isFirstTextPart)
269 if (isFirstTextPart) {
271 mPlainTextContentCharset += NodeHelper::charset(curNode);
275 void ObjectTreeParser::setPlainTextContent(
const QString &plainTextContent)
277 mPlainTextContent = plainTextContent;
283 if (mSource->overrideCodec()) {
284 return mSource->overrideCodec();
286 return mNodeHelper->codec(node);
291 return mPlainTextContentCharset;
294 QByteArray ObjectTreeParser::htmlContentCharset()
const
296 return mHtmlContentCharset;