diff options
Diffstat (limited to 'framework')
6 files changed, 12 insertions, 401 deletions
diff --git a/framework/src/domain/mime/mimetreeparser/autotests/nodehelpertest.cpp b/framework/src/domain/mime/mimetreeparser/autotests/nodehelpertest.cpp index 63e9119e..77f31f19 100644 --- a/framework/src/domain/mime/mimetreeparser/autotests/nodehelpertest.cpp +++ b/framework/src/domain/mime/mimetreeparser/autotests/nodehelpertest.cpp | |||
@@ -30,182 +30,6 @@ NodeHelperTest::NodeHelperTest() | |||
30 | 30 | ||
31 | } | 31 | } |
32 | 32 | ||
33 | void NodeHelperTest::testPersistentIndex() | ||
34 | { | ||
35 | NodeHelper helper; | ||
36 | |||
37 | KMime::Content *node = new KMime::Content(); | ||
38 | KMime::Content *node2 = new KMime::Content(); | ||
39 | KMime::Content *node2Extra = new KMime::Content(); | ||
40 | KMime::Content *subNode = new KMime::Content(); | ||
41 | KMime::Content *subsubNode = new KMime::Content(), *subsubNode2 = new KMime::Content(); | ||
42 | KMime::Content *node2ExtraSubNode = new KMime::Content(); | ||
43 | KMime::Content *node2ExtraSubsubNode = new KMime::Content(); | ||
44 | KMime::Content *node2ExtraSubsubNode2 = new KMime::Content(); | ||
45 | KMime::Content *extra = new KMime::Content(), *extra2 = new KMime::Content(); | ||
46 | KMime::Content *subExtra = new KMime::Content(); | ||
47 | KMime::Content *subsubExtra = new KMime::Content(); | ||
48 | KMime::Content *subsubExtraNode = new KMime::Content(); | ||
49 | |||
50 | subNode->addContent(subsubNode); | ||
51 | subNode->addContent(subsubNode2); | ||
52 | node->addContent(subNode); | ||
53 | subsubExtra->addContent(subsubExtraNode); | ||
54 | helper.attachExtraContent(node, extra); | ||
55 | helper.attachExtraContent(node, extra2); | ||
56 | helper.attachExtraContent(subNode, subExtra); | ||
57 | helper.attachExtraContent(subsubNode2, subsubExtra); | ||
58 | |||
59 | // This simulates Opaque S/MIME signed and encrypted message with attachment | ||
60 | // (attachment is node2SubsubNode2) | ||
61 | node2Extra->addContent(node2ExtraSubNode); | ||
62 | node2ExtraSubNode->addContent(node2ExtraSubsubNode); | ||
63 | node2ExtraSubNode->addContent(node2ExtraSubsubNode2); | ||
64 | helper.attachExtraContent(node2, node2Extra); | ||
65 | |||
66 | /* all content has a internal first child, so indexes starts at 2 | ||
67 | * node "" | ||
68 | * -> subNode "2" | ||
69 | * -> subsubNode "2.2" | ||
70 | * -> subsubNode2 "2.3" | ||
71 | * | ||
72 | * node "" | ||
73 | * -> extra "e0" | ||
74 | * -> extra2 "e1" | ||
75 | * | ||
76 | * subNode "2" | ||
77 | * -> subExtra "2:e0" | ||
78 | * | ||
79 | * subsubNode2 "2.3" | ||
80 | * -> subsubExtra "2.3:e0" | ||
81 | * -> subsubExtraNode "2.3:e0:2" | ||
82 | * | ||
83 | * node2 "" | ||
84 | * | ||
85 | * node2 "" | ||
86 | * -> node2Extra "e0" | ||
87 | * -> node2ExtraSubNode "e0:2" | ||
88 | * -> node2ExtraSubsubNode "e0:2.2" | ||
89 | * -> node2ExtraSubsubNode2 "e0:2.3" | ||
90 | */ | ||
91 | |||
92 | QCOMPARE(helper.persistentIndex(node), QStringLiteral("")); | ||
93 | QCOMPARE(helper.contentFromIndex(node, QStringLiteral("")), node); | ||
94 | |||
95 | QCOMPARE(helper.persistentIndex(node->contents()[0]), QStringLiteral("1")); | ||
96 | QCOMPARE(helper.contentFromIndex(node, QStringLiteral("1")), node->contents()[0]); | ||
97 | |||
98 | QCOMPARE(helper.persistentIndex(subNode), QStringLiteral("2")); | ||
99 | QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2")), subNode); | ||
100 | |||
101 | QCOMPARE(helper.persistentIndex(subsubNode), QStringLiteral("2.2")); | ||
102 | QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2.2")), subsubNode); | ||
103 | |||
104 | QCOMPARE(helper.persistentIndex(subsubNode2), QStringLiteral("2.3")); | ||
105 | QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2.3")), subsubNode2); | ||
106 | |||
107 | QCOMPARE(helper.persistentIndex(extra), QStringLiteral("e0")); | ||
108 | QCOMPARE(helper.contentFromIndex(node, QStringLiteral("e0")), extra); | ||
109 | |||
110 | QCOMPARE(helper.persistentIndex(extra2), QStringLiteral("e1")); | ||
111 | QCOMPARE(helper.contentFromIndex(node, QStringLiteral("e1")), extra2); | ||
112 | |||
113 | QCOMPARE(helper.persistentIndex(subExtra), QStringLiteral("2:e0")); | ||
114 | QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2:e0")), subExtra); | ||
115 | |||
116 | QCOMPARE(helper.persistentIndex(subsubExtra), QStringLiteral("2.3:e0")); | ||
117 | QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2.3:e0")), subsubExtra); | ||
118 | |||
119 | QCOMPARE(helper.persistentIndex(subsubExtraNode), QStringLiteral("2.3:e0:2")); | ||
120 | QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2.3:e0:2")), subsubExtraNode); | ||
121 | |||
122 | QCOMPARE(helper.persistentIndex(node2ExtraSubsubNode2), QStringLiteral("e0:2.3")); | ||
123 | QCOMPARE(helper.contentFromIndex(node2, QStringLiteral("e0:2.3")), node2ExtraSubsubNode2); | ||
124 | |||
125 | delete node; | ||
126 | } | ||
127 | |||
128 | void NodeHelperTest::testHREF() | ||
129 | { | ||
130 | NodeHelper helper; | ||
131 | KMime::Message::Ptr msg(new KMime::Message); | ||
132 | QUrl url; | ||
133 | |||
134 | KMime::Content *node = msg->topLevel(); | ||
135 | KMime::Content *subNode = new KMime::Content(); | ||
136 | KMime::Content *subsubNode = new KMime::Content(), *subsubNode2 = new KMime::Content(); | ||
137 | KMime::Content *extra = new KMime::Content(), *extra2 = new KMime::Content(); | ||
138 | KMime::Content *subExtra = new KMime::Content(); | ||
139 | KMime::Content *subsubExtra = new KMime::Content(); | ||
140 | KMime::Content *subsubExtraNode = new KMime::Content(); | ||
141 | |||
142 | subNode->addContent(subsubNode); | ||
143 | subNode->addContent(subsubNode2); | ||
144 | node->addContent(subNode); | ||
145 | subsubExtra->addContent(subsubExtraNode); | ||
146 | helper.attachExtraContent(node, extra); | ||
147 | helper.attachExtraContent(node, extra2); | ||
148 | helper.attachExtraContent(subNode, subExtra); | ||
149 | helper.attachExtraContent(subsubNode2, subsubExtra); | ||
150 | |||
151 | url = QUrl(QStringLiteral("")); | ||
152 | QCOMPARE(helper.fromHREF(msg, url), node); | ||
153 | |||
154 | url = QUrl(QStringLiteral("attachment:e0?place=body")); | ||
155 | QCOMPARE(helper.fromHREF(msg, url), extra); | ||
156 | |||
157 | url = QUrl(QStringLiteral("attachment:2.2?place=body")); | ||
158 | QCOMPARE(helper.fromHREF(msg, url), subsubNode); | ||
159 | |||
160 | url = QUrl(QStringLiteral("attachment:2.3:e0:2?place=body")); | ||
161 | QCOMPARE(helper.fromHREF(msg, url), subsubExtraNode); | ||
162 | |||
163 | QCOMPARE(helper.asHREF(node, QStringLiteral("body")), QStringLiteral("attachment:?place=body")); | ||
164 | QCOMPARE(helper.asHREF(extra, QStringLiteral("body")), QStringLiteral("attachment:e0?place=body")); | ||
165 | QCOMPARE(helper.asHREF(subsubNode, QStringLiteral("body")), QStringLiteral("attachment:2.2?place=body")); | ||
166 | QCOMPARE(helper.asHREF(subsubExtraNode, QStringLiteral("body")), QStringLiteral("attachment:2.3:e0:2?place=body")); | ||
167 | } | ||
168 | |||
169 | void NodeHelperTest::testLocalFiles() | ||
170 | { | ||
171 | NodeHelper helper; | ||
172 | KMime::Message::Ptr msg(new KMime::Message); | ||
173 | |||
174 | KMime::Content *node = msg->topLevel(); | ||
175 | KMime::Content *subNode = new KMime::Content(); | ||
176 | KMime::Content *subsubNode = new KMime::Content(), *subsubNode2 = new KMime::Content(); | ||
177 | KMime::Content *extra = new KMime::Content(), *extra2 = new KMime::Content(); | ||
178 | KMime::Content *subExtra = new KMime::Content(); | ||
179 | KMime::Content *subsubExtra = new KMime::Content(); | ||
180 | KMime::Content *subsubExtraNode = new KMime::Content(); | ||
181 | |||
182 | subNode->addContent(subsubNode); | ||
183 | subNode->addContent(subsubNode2); | ||
184 | node->addContent(subNode); | ||
185 | subsubExtra->addContent(subsubExtraNode); | ||
186 | helper.attachExtraContent(node, extra); | ||
187 | helper.attachExtraContent(node, extra2); | ||
188 | helper.attachExtraContent(subNode, subExtra); | ||
189 | helper.attachExtraContent(subsubNode2, subsubExtra); | ||
190 | |||
191 | // helper.writeNodeToTempFile(node); | ||
192 | // QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(node)), node); | ||
193 | // helper.writeNodeToTempFile(subNode); | ||
194 | // QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subNode)), subNode); | ||
195 | // helper.writeNodeToTempFile(subsubNode); | ||
196 | // QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subsubNode)), subsubNode); | ||
197 | // helper.writeNodeToTempFile(subsubNode2); | ||
198 | // QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subsubNode2)), subsubNode2); | ||
199 | // helper.writeNodeToTempFile(extra); | ||
200 | // QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(extra)), extra); | ||
201 | // helper.writeNodeToTempFile(subExtra); | ||
202 | // QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subExtra)), subExtra); | ||
203 | // helper.writeNodeToTempFile(subsubExtra); | ||
204 | // QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subsubExtra)), subsubExtra); | ||
205 | // helper.writeNodeToTempFile(subsubExtraNode); | ||
206 | // QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subsubExtraNode)), subsubExtraNode); | ||
207 | } | ||
208 | |||
209 | void NodeHelperTest::testFromAsString() | 33 | void NodeHelperTest::testFromAsString() |
210 | { | 34 | { |
211 | const QString tlSender = QStringLiteral("Foo <foo@example.com>"); | 35 | const QString tlSender = QStringLiteral("Foo <foo@example.com>"); |
@@ -241,12 +65,12 @@ void NodeHelperTest::testFromAsString() | |||
241 | node->addContent(encMsg); | 65 | node->addContent(encMsg); |
242 | encNode->addContent(encSubNode); | 66 | encNode->addContent(encSubNode); |
243 | 67 | ||
244 | helper.attachExtraContent(subNode, subExtra); | 68 | // helper.attachExtraContent(subNode, subExtra); |
245 | helper.attachExtraContent(encSubNode, encSubExtra); | 69 | // helper.attachExtraContent(encSubNode, encSubExtra); |
246 | 70 | ||
247 | QCOMPARE(helper.fromAsString(node), tlSender); | 71 | QCOMPARE(helper.fromAsString(node), tlSender); |
248 | QCOMPARE(helper.fromAsString(subNode), tlSender); | 72 | QCOMPARE(helper.fromAsString(subNode), tlSender); |
249 | QCOMPARE(helper.fromAsString(subExtra), tlSender); | 73 | // QCOMPARE(helper.fromAsString(subExtra), tlSender); |
250 | QEXPECT_FAIL("", "Returning sender of encapsulated message is not yet implemented", Continue); | 74 | QEXPECT_FAIL("", "Returning sender of encapsulated message is not yet implemented", Continue); |
251 | QCOMPARE(helper.fromAsString(encNode), encSender); | 75 | QCOMPARE(helper.fromAsString(encNode), encSender); |
252 | QEXPECT_FAIL("", "Returning sender of encapsulated message is not yet implemented", Continue); | 76 | QEXPECT_FAIL("", "Returning sender of encapsulated message is not yet implemented", Continue); |
diff --git a/framework/src/domain/mime/mimetreeparser/autotests/nodehelpertest.h b/framework/src/domain/mime/mimetreeparser/autotests/nodehelpertest.h index ee01d2cb..071285b1 100644 --- a/framework/src/domain/mime/mimetreeparser/autotests/nodehelpertest.h +++ b/framework/src/domain/mime/mimetreeparser/autotests/nodehelpertest.h | |||
@@ -34,9 +34,6 @@ public: | |||
34 | NodeHelperTest(); | 34 | NodeHelperTest(); |
35 | 35 | ||
36 | private Q_SLOTS: | 36 | private Q_SLOTS: |
37 | void testPersistentIndex(); | ||
38 | void testLocalFiles(); | ||
39 | void testHREF(); | ||
40 | void testFromAsString(); | 37 | void testFromAsString(); |
41 | }; | 38 | }; |
42 | 39 | ||
diff --git a/framework/src/domain/mime/mimetreeparser/messagepart.cpp b/framework/src/domain/mime/mimetreeparser/messagepart.cpp index b6dfd30a..d955e663 100644 --- a/framework/src/domain/mime/mimetreeparser/messagepart.cpp +++ b/framework/src/domain/mime/mimetreeparser/messagepart.cpp | |||
@@ -949,7 +949,6 @@ void SignedMessagePart::setVerificationResult(const CryptoBodyPartMemento *m, KM | |||
949 | if (!tempNode->head().isEmpty()) { | 949 | if (!tempNode->head().isEmpty()) { |
950 | tempNode->contentDescription()->from7BitString("signed data"); | 950 | tempNode->contentDescription()->from7BitString("signed data"); |
951 | } | 951 | } |
952 | mOtp->mNodeHelper->attachExtraContent(mNode, tempNode); | ||
953 | 952 | ||
954 | parseInternal(tempNode, false); | 953 | parseInternal(tempNode, false); |
955 | } | 954 | } |
@@ -1193,7 +1192,6 @@ void EncryptedMessagePart::startDecryption(KMime::Content *data) | |||
1193 | if (!tempNode->head().isEmpty()) { | 1192 | if (!tempNode->head().isEmpty()) { |
1194 | tempNode->contentDescription()->from7BitString("encrypted data"); | 1193 | tempNode->contentDescription()->from7BitString("encrypted data"); |
1195 | } | 1194 | } |
1196 | mOtp->mNodeHelper->attachExtraContent(mNode, tempNode); | ||
1197 | 1195 | ||
1198 | parseInternal(tempNode, false); | 1196 | parseInternal(tempNode, false); |
1199 | } | 1197 | } |
diff --git a/framework/src/domain/mime/mimetreeparser/nodehelper.cpp b/framework/src/domain/mime/mimetreeparser/nodehelper.cpp index 4e60fa68..bbd705f9 100644 --- a/framework/src/domain/mime/mimetreeparser/nodehelper.cpp +++ b/framework/src/domain/mime/mimetreeparser/nodehelper.cpp | |||
@@ -46,8 +46,7 @@ | |||
46 | namespace MimeTreeParser | 46 | namespace MimeTreeParser |
47 | { | 47 | { |
48 | 48 | ||
49 | NodeHelper::NodeHelper() : | 49 | NodeHelper::NodeHelper() |
50 | mAttachmentFilesDir(new AttachmentTemporaryFilesDirs()) | ||
51 | { | 50 | { |
52 | //TODO(Andras) add methods to modify these prefixes | 51 | //TODO(Andras) add methods to modify these prefixes |
53 | 52 | ||
@@ -78,11 +77,6 @@ NodeHelper::NodeHelper() : | |||
78 | 77 | ||
79 | NodeHelper::~NodeHelper() | 78 | NodeHelper::~NodeHelper() |
80 | { | 79 | { |
81 | if (mAttachmentFilesDir) { | ||
82 | mAttachmentFilesDir->forceCleanTempFiles(); | ||
83 | delete mAttachmentFilesDir; | ||
84 | mAttachmentFilesDir = nullptr; | ||
85 | } | ||
86 | clear(); | 80 | clear(); |
87 | } | 81 | } |
88 | 82 | ||
@@ -109,20 +103,6 @@ void NodeHelper::setNodeUnprocessed(KMime::Content *node, bool recurse) | |||
109 | } | 103 | } |
110 | mProcessedNodes.removeAll(node); | 104 | mProcessedNodes.removeAll(node); |
111 | 105 | ||
112 | //avoid double addition of extra nodes, eg. encrypted attachments | ||
113 | const QMap<KMime::Content *, QList<KMime::Content *> >::iterator it = mExtraContents.find(node); | ||
114 | if (it != mExtraContents.end()) { | ||
115 | Q_FOREACH (KMime::Content *c, it.value()) { | ||
116 | KMime::Content *p = c->parent(); | ||
117 | if (p) { | ||
118 | p->removeContent(c); | ||
119 | } | ||
120 | } | ||
121 | qDeleteAll(it.value()); | ||
122 | qCDebug(MIMETREEPARSER_LOG) << "mExtraContents deleted for" << it.key(); | ||
123 | mExtraContents.erase(it); | ||
124 | } | ||
125 | |||
126 | qCDebug(MIMETREEPARSER_LOG) << "Node UNprocessed: " << node; | 106 | qCDebug(MIMETREEPARSER_LOG) << "Node UNprocessed: " << node; |
127 | if (recurse) { | 107 | if (recurse) { |
128 | const auto contents = node->contents(); | 108 | const auto contents = node->contents(); |
@@ -144,19 +124,6 @@ void NodeHelper::clear() | |||
144 | { | 124 | { |
145 | mProcessedNodes.clear(); | 125 | mProcessedNodes.clear(); |
146 | mOverrideCodecs.clear(); | 126 | mOverrideCodecs.clear(); |
147 | QMap<KMime::Content *, QList<KMime::Content *> >::ConstIterator end(mExtraContents.constEnd()); | ||
148 | |||
149 | for (QMap<KMime::Content *, QList<KMime::Content *> >::ConstIterator it = mExtraContents.constBegin(); it != end; ++it) { | ||
150 | Q_FOREACH (KMime::Content *c, it.value()) { | ||
151 | KMime::Content *p = c->parent(); | ||
152 | if (p) { | ||
153 | p->removeContent(c); | ||
154 | } | ||
155 | } | ||
156 | qDeleteAll(it.value()); | ||
157 | qCDebug(MIMETREEPARSER_LOG) << "mExtraContents deleted for" << it.key(); | ||
158 | } | ||
159 | mExtraContents.clear(); | ||
160 | } | 127 | } |
161 | 128 | ||
162 | 129 | ||
@@ -170,25 +137,6 @@ void NodeHelper::setPartMetaData(KMime::Content *node, const PartMetaData &metaD | |||
170 | mPartMetaDatas.insert(node, metaData); | 137 | mPartMetaDatas.insert(node, metaData); |
171 | } | 138 | } |
172 | 139 | ||
173 | void NodeHelper::forceCleanTempFiles() | ||
174 | { | ||
175 | mAttachmentFilesDir->forceCleanTempFiles(); | ||
176 | delete mAttachmentFilesDir; | ||
177 | mAttachmentFilesDir = nullptr; | ||
178 | } | ||
179 | |||
180 | void NodeHelper::removeTempFiles() | ||
181 | { | ||
182 | //Don't delete it it will delete in class | ||
183 | mAttachmentFilesDir->removeTempFiles(); | ||
184 | mAttachmentFilesDir = new AttachmentTemporaryFilesDirs(); | ||
185 | } | ||
186 | |||
187 | void NodeHelper::addTempFile(const QString &file) | ||
188 | { | ||
189 | mAttachmentFilesDir->addTempFile(file); | ||
190 | } | ||
191 | |||
192 | bool NodeHelper::isInEncapsulatedMessage(KMime::Content *node) | 140 | bool NodeHelper::isInEncapsulatedMessage(KMime::Content *node) |
193 | { | 141 | { |
194 | const KMime::Content *const topLevel = node->topLevel(); | 142 | const KMime::Content *const topLevel = node->topLevel(); |
@@ -278,114 +226,6 @@ QString NodeHelper::fileName(const KMime::Content *node) | |||
278 | return name; | 226 | return name; |
279 | } | 227 | } |
280 | 228 | ||
281 | /*! | ||
282 | Creates a persistent index string that bridges the gap between the | ||
283 | permanent nodes and the temporary ones. | ||
284 | |||
285 | Used internally for robust indexing. | ||
286 | */ | ||
287 | QString NodeHelper::persistentIndex(const KMime::Content *node) const | ||
288 | { | ||
289 | if (!node) { | ||
290 | return QString(); | ||
291 | } | ||
292 | |||
293 | QString indexStr = node->index().toString(); | ||
294 | if (indexStr.isEmpty()) { | ||
295 | QMapIterator<KMime::Message::Content *, QList<KMime::Content *> > it(mExtraContents); | ||
296 | while (it.hasNext()) { | ||
297 | it.next(); | ||
298 | const auto &extraNodes = it.value(); | ||
299 | for (int i = 0; i < extraNodes.size(); i++) { | ||
300 | if (extraNodes[i] == node) { | ||
301 | indexStr = QString::fromLatin1("e%1").arg(i); | ||
302 | const QString parentIndex = persistentIndex(it.key()); | ||
303 | if (!parentIndex.isEmpty()) { | ||
304 | indexStr = QString::fromLatin1("%1:%2").arg(parentIndex, indexStr); | ||
305 | } | ||
306 | qWarning() << "Persistentindex: " << indexStr; | ||
307 | return indexStr; | ||
308 | } | ||
309 | } | ||
310 | } | ||
311 | } else { | ||
312 | const KMime::Content *const topLevel = node->topLevel(); | ||
313 | //if the node is an extra node, prepend the index of the extra node to the url | ||
314 | QMapIterator<KMime::Message::Content *, QList<KMime::Content *> > it(mExtraContents); | ||
315 | while (it.hasNext()) { | ||
316 | it.next(); | ||
317 | const QList<KMime::Content *> &extraNodes = extraContents(it.key()); | ||
318 | for (int i = 0; i < extraNodes.size(); ++i) { | ||
319 | KMime::Content *const extraNode = extraNodes[i]; | ||
320 | if (topLevel == extraNode) { | ||
321 | indexStr.prepend(QStringLiteral("e%1:").arg(i)); | ||
322 | const QString parentIndex = persistentIndex(it.key()); | ||
323 | if (!parentIndex.isEmpty()) { | ||
324 | indexStr = QStringLiteral("%1:%2").arg(parentIndex, indexStr); | ||
325 | } | ||
326 | qWarning() << "Persistentindex: " << indexStr; | ||
327 | return indexStr; | ||
328 | } | ||
329 | } | ||
330 | } | ||
331 | } | ||
332 | |||
333 | qWarning() << "Persistentindex: " << indexStr; | ||
334 | return indexStr; | ||
335 | } | ||
336 | |||
337 | KMime::Content *NodeHelper::contentFromIndex(KMime::Content *node, const QString &persistentIndex) const | ||
338 | { | ||
339 | KMime::Content *c = node->topLevel(); | ||
340 | if (c) { | ||
341 | const QStringList pathParts = persistentIndex.split(QLatin1Char(':'), QString::SkipEmptyParts); | ||
342 | const int pathPartsSize(pathParts.size()); | ||
343 | for (int i = 0; i < pathPartsSize; ++i) { | ||
344 | const QString &path = pathParts[i]; | ||
345 | if (path.startsWith(QLatin1Char('e'))) { | ||
346 | const QList<KMime::Content *> &extraParts = mExtraContents.value(c); | ||
347 | const int idx = path.midRef(1, -1).toInt(); | ||
348 | c = (idx < extraParts.size()) ? extraParts[idx] : nullptr; | ||
349 | } else { | ||
350 | c = c->content(KMime::ContentIndex(path)); | ||
351 | } | ||
352 | if (!c) { | ||
353 | break; | ||
354 | } | ||
355 | } | ||
356 | } | ||
357 | return c; | ||
358 | } | ||
359 | |||
360 | QString NodeHelper::asHREF(const KMime::Content *node, const QString &place) const | ||
361 | { | ||
362 | return QStringLiteral("attachment:%1?place=%2").arg(persistentIndex(node), place); | ||
363 | } | ||
364 | |||
365 | KMime::Content *NodeHelper::fromHREF(const KMime::Message::Ptr &mMessage, const QUrl &url) const | ||
366 | { | ||
367 | if (url.isEmpty()) { | ||
368 | return mMessage.data(); | ||
369 | } | ||
370 | |||
371 | if (!url.isLocalFile()) { | ||
372 | return contentFromIndex(mMessage.data(), url.adjusted(QUrl::StripTrailingSlash).path()); | ||
373 | } else { | ||
374 | const QString path = url.toLocalFile(); | ||
375 | // extract from /<path>/qttestn28554.index.2.3:0:2/unnamed -> "2.3:0:2" | ||
376 | // start of the index is something that is not a number followed by a dot: \D. | ||
377 | // index is only made of numbers,"." and ":": ([0-9.:]+) | ||
378 | // index is the last part of the folder name: / | ||
379 | const QRegExp rIndex(QStringLiteral("\\D\\.([e0-9.:]+)/")); | ||
380 | |||
381 | //search the occurence at most at the end | ||
382 | if (rIndex.lastIndexIn(path) != -1) { | ||
383 | return contentFromIndex(mMessage.data(), rIndex.cap(1)); | ||
384 | } | ||
385 | return mMessage.data(); | ||
386 | } | ||
387 | } | ||
388 | |||
389 | QString NodeHelper::fixEncoding(const QString &encoding) | 229 | QString NodeHelper::fixEncoding(const QString &encoding) |
390 | { | 230 | { |
391 | QString returnEncoding = encoding; | 231 | QString returnEncoding = encoding; |
@@ -432,28 +272,17 @@ QString NodeHelper::fromAsString(KMime::Content *node) const | |||
432 | { | 272 | { |
433 | if (auto topLevel = dynamic_cast<KMime::Message *>(node->topLevel())) { | 273 | if (auto topLevel = dynamic_cast<KMime::Message *>(node->topLevel())) { |
434 | return topLevel->from()->asUnicodeString(); | 274 | return topLevel->from()->asUnicodeString(); |
435 | } else { | 275 | // } else { |
436 | auto realNode = std::find_if(mExtraContents.cbegin(), mExtraContents.cend(), | 276 | // auto realNode = std::find_if(mExtraContents.cbegin(), mExtraContents.cend(), |
437 | [node](const QList<KMime::Content *> &nodes) { | 277 | // [node](const QList<KMime::Content *> &nodes) { |
438 | return nodes.contains(node); | 278 | // return nodes.contains(node); |
439 | }); | 279 | // }); |
440 | if (realNode != mExtraContents.cend()) { | 280 | // if (realNode != mExtraContents.cend()) { |
441 | return fromAsString(realNode.key()); | 281 | // return fromAsString(realNode.key()); |
442 | } | 282 | // } |
443 | } | 283 | } |
444 | 284 | ||
445 | return QString(); | 285 | return QString(); |
446 | } | 286 | } |
447 | 287 | ||
448 | void NodeHelper::attachExtraContent(KMime::Content *topLevelNode, KMime::Content *content) | ||
449 | { | ||
450 | qCDebug(MIMETREEPARSER_LOG) << "mExtraContents added for" << topLevelNode << " extra content: " << content; | ||
451 | mExtraContents[topLevelNode].append(content); | ||
452 | } | ||
453 | |||
454 | QList< KMime::Content * > NodeHelper::extraContents(KMime::Content *topLevelnode) const | ||
455 | { | ||
456 | return mExtraContents.value(topLevelnode); | ||
457 | } | ||
458 | |||
459 | } | 288 | } |
diff --git a/framework/src/domain/mime/mimetreeparser/nodehelper.h b/framework/src/domain/mime/mimetreeparser/nodehelper.h index bf472413..75b82aaf 100644 --- a/framework/src/domain/mime/mimetreeparser/nodehelper.h +++ b/framework/src/domain/mime/mimetreeparser/nodehelper.h | |||
@@ -70,12 +70,6 @@ public: | |||
70 | */ | 70 | */ |
71 | void magicSetType(KMime::Content *node, bool autoDecode = true); | 71 | void magicSetType(KMime::Content *node, bool autoDecode = true); |
72 | 72 | ||
73 | /** Attach an extra node to an existing node */ | ||
74 | void attachExtraContent(KMime::Content *topLevelNode, KMime::Content *content); | ||
75 | |||
76 | /** Get the extra nodes attached to the @param topLevelNode and all sub-nodes of @param topLevelNode */ | ||
77 | QList<KMime::Content *> extraContents(KMime::Content *topLevelNode) const; | ||
78 | |||
79 | /** Get a QTextCodec suitable for this message part */ | 73 | /** Get a QTextCodec suitable for this message part */ |
80 | const QTextCodec *codec(KMime::Content *node); | 74 | const QTextCodec *codec(KMime::Content *node); |
81 | 75 | ||
@@ -83,21 +77,6 @@ public: | |||
83 | void setOverrideCodec(KMime::Content *node, const QTextCodec *codec); | 77 | void setOverrideCodec(KMime::Content *node, const QTextCodec *codec); |
84 | 78 | ||
85 | /** | 79 | /** |
86 | * Cleanup the attachment temp files | ||
87 | */ | ||
88 | void removeTempFiles(); | ||
89 | |||
90 | /** | ||
91 | * Add a file to the list of managed temporary files | ||
92 | */ | ||
93 | void addTempFile(const QString &file); | ||
94 | |||
95 | // Get a href in the form attachment:<nodeId>?place=<place>, used by ObjectTreeParser and | ||
96 | // UrlHandlerManager. | ||
97 | QString asHREF(const KMime::Content *node, const QString &place) const; | ||
98 | KMime::Content *fromHREF(const KMime::Message::Ptr &mMessage, const QUrl &href) const; | ||
99 | |||
100 | /** | ||
101 | * @return true if this node is a child or an encapsulated message | 80 | * @return true if this node is a child or an encapsulated message |
102 | */ | 81 | */ |
103 | static bool isInEncapsulatedMessage(KMime::Content *node); | 82 | static bool isInEncapsulatedMessage(KMime::Content *node); |
@@ -152,19 +131,6 @@ private: | |||
152 | bool unencryptedMessage_helper(KMime::Content *node, QByteArray &resultingData, bool addHeaders, | 131 | bool unencryptedMessage_helper(KMime::Content *node, QByteArray &resultingData, bool addHeaders, |
153 | int recursionLevel = 1); | 132 | int recursionLevel = 1); |
154 | 133 | ||
155 | /** Creates a persistent index string that bridges the gap between the | ||
156 | permanent nodes and the temporary ones. | ||
157 | |||
158 | Used internally for robust indexing. | ||
159 | **/ | ||
160 | QString persistentIndex(const KMime::Content *node) const; | ||
161 | |||
162 | /** Translates the persistentIndex into a node back | ||
163 | |||
164 | node: any node of the actually message to what the persistentIndex is interpreded | ||
165 | **/ | ||
166 | KMime::Content *contentFromIndex(KMime::Content *node, const QString &persistentIndex) const; | ||
167 | |||
168 | private: | 134 | private: |
169 | QList<KMime::Content *> mProcessedNodes; | 135 | QList<KMime::Content *> mProcessedNodes; |
170 | QList<KMime::Content *> mNodesUnderProcess; | 136 | QList<KMime::Content *> mNodesUnderProcess; |
@@ -173,8 +139,6 @@ private: | |||
173 | QTextCodec *mLocalCodec; | 139 | QTextCodec *mLocalCodec; |
174 | QMap<KMime::Content *, const QTextCodec *> mOverrideCodecs; | 140 | QMap<KMime::Content *, const QTextCodec *> mOverrideCodecs; |
175 | QMap<KMime::Content *, PartMetaData> mPartMetaDatas; | 141 | QMap<KMime::Content *, PartMetaData> mPartMetaDatas; |
176 | QMap<KMime::Message::Content *, QList<KMime::Content *> > mExtraContents; | ||
177 | AttachmentTemporaryFilesDirs *mAttachmentFilesDir; | ||
178 | 142 | ||
179 | friend class NodeHelperTest; | 143 | friend class NodeHelperTest; |
180 | }; | 144 | }; |
diff --git a/framework/src/domain/mime/mimetreeparser/utils.cpp b/framework/src/domain/mime/mimetreeparser/utils.cpp index 574e3489..6fae9022 100644 --- a/framework/src/domain/mime/mimetreeparser/utils.cpp +++ b/framework/src/domain/mime/mimetreeparser/utils.cpp | |||
@@ -31,7 +31,6 @@ MimeMessagePart::Ptr MimeTreeParser::createAndParseTempNode(Interface::BodyPart | |||
31 | if (!newNode->head().isEmpty()) { | 31 | if (!newNode->head().isEmpty()) { |
32 | newNode->contentDescription()->from7BitString(cntDesc); | 32 | newNode->contentDescription()->from7BitString(cntDesc); |
33 | } | 33 | } |
34 | part.nodeHelper()->attachExtraContent(parentNode, newNode); | ||
35 | 34 | ||
36 | return MimeMessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), newNode, false)); | 35 | return MimeMessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), newNode, false)); |
37 | } | 36 | } |