Changeset View
Changeset View
Standalone View
Standalone View
framework/domain/mimetreeparser/interface.cpp
Show All 32 Lines | |||||
33 | class PartPrivate | 33 | class PartPrivate | ||
34 | { | 34 | { | ||
35 | public: | 35 | public: | ||
36 | PartPrivate(Part *part); | 36 | PartPrivate(Part *part); | ||
37 | void appendSubPart(Part::Ptr subpart); | 37 | void appendSubPart(Part::Ptr subpart); | ||
38 | 38 | | |||
39 | QVector<Part::Ptr> subParts(); | 39 | QVector<Part::Ptr> subParts(); | ||
40 | 40 | | |||
41 | const std::weak_ptr<Part> &parent() const; | 41 | Part *parent() const; | ||
42 | private: | 42 | private: | ||
43 | Part *q; | 43 | Part *q; | ||
44 | std::weak_ptr<Part> mParent; | 44 | Part *mParent; | ||
45 | QVector<Part::Ptr> mSubParts; | 45 | QVector<Part::Ptr> mSubParts; | ||
46 | }; | 46 | }; | ||
47 | 47 | | |||
48 | PartPrivate::PartPrivate(Part* part) | 48 | PartPrivate::PartPrivate(Part* part) | ||
49 | :q(part) | 49 | : q(part) | ||
50 | , mParent(Q_NULLPTR) | ||||
50 | { | 51 | { | ||
51 | 52 | | |||
52 | } | 53 | } | ||
53 | 54 | | |||
54 | void PartPrivate::appendSubPart(Part::Ptr subpart) | 55 | void PartPrivate::appendSubPart(Part::Ptr subpart) | ||
55 | { | 56 | { | ||
56 | subpart->d->mParent = Part::Ptr(q); | 57 | subpart->d->mParent = q; | ||
57 | mSubParts.append(subpart); | 58 | mSubParts.append(subpart); | ||
58 | } | 59 | } | ||
59 | 60 | | |||
60 | const std::weak_ptr<Part> &PartPrivate::parent() const | 61 | Part *PartPrivate::parent() const | ||
61 | { | 62 | { | ||
62 | return mParent; | 63 | return mParent; | ||
63 | } | 64 | } | ||
64 | 65 | | |||
65 | QVector< Part::Ptr > PartPrivate::subParts() | 66 | QVector< Part::Ptr > PartPrivate::subParts() | ||
66 | { | 67 | { | ||
67 | return mSubParts; | 68 | return mSubParts; | ||
68 | } | 69 | } | ||
Show All 16 Lines | |||||
85 | 86 | | |||
86 | QByteArray Part::type() const | 87 | QByteArray Part::type() const | ||
87 | { | 88 | { | ||
88 | return "Part"; | 89 | return "Part"; | ||
89 | } | 90 | } | ||
90 | 91 | | |||
91 | QVector<Encryption> Part::encryptions() const | 92 | QVector<Encryption> Part::encryptions() const | ||
92 | { | 93 | { | ||
93 | auto parent = d->parent().lock(); | 94 | auto parent = d->parent(); | ||
94 | if (parent) { | 95 | if (parent) { | ||
95 | return parent->encryptions(); | 96 | return parent->encryptions(); | ||
96 | } else { | 97 | } else { | ||
97 | return QVector<Encryption>(); | 98 | return QVector<Encryption>(); | ||
98 | } | 99 | } | ||
99 | } | 100 | } | ||
100 | 101 | | |||
101 | QVector<Signature> Part::signatures() const | 102 | QVector<Signature> Part::signatures() const | ||
102 | { | 103 | { | ||
103 | auto parent = d->parent().lock(); | 104 | auto parent = d->parent(); | ||
104 | if (parent) { | 105 | if (parent) { | ||
105 | return parent->signatures(); | 106 | return parent->signatures(); | ||
106 | } else { | 107 | } else { | ||
107 | return QVector<Signature>(); | 108 | return QVector<Signature>(); | ||
108 | } | 109 | } | ||
109 | } | 110 | } | ||
110 | 111 | | |||
111 | class ContentPrivate | 112 | class ContentPrivate | ||
Show All 29 Lines | |||||
141 | QVector< Signature > Content::signatures() const | 142 | QVector< Signature > Content::signatures() const | ||
142 | { | 143 | { | ||
143 | if (d->mParent) { | 144 | if (d->mParent) { | ||
144 | return d->mParent->signatures(); | 145 | return d->mParent->signatures(); | ||
145 | } | 146 | } | ||
146 | return QVector<Signature>(); | 147 | return QVector<Signature>(); | ||
147 | } | 148 | } | ||
148 | 149 | | |||
150 | QByteArray Content::content() const | ||||
151 | { | ||||
152 | return d->mContent; | ||||
153 | } | ||||
154 | | ||||
155 | QByteArray Content::charset() const | ||||
156 | { | ||||
157 | return d->mCodec; | ||||
158 | } | ||||
159 | | ||||
149 | class ContentPartPrivate | 160 | class ContentPartPrivate | ||
150 | { | 161 | { | ||
151 | public: | 162 | public: | ||
152 | void fillFrom(MimeTreeParser::TextMessagePart::Ptr part); | 163 | void fillFrom(MimeTreeParser::TextMessagePart::Ptr part); | ||
153 | void fillFrom(MimeTreeParser::HtmlMessagePart::Ptr part); | 164 | void fillFrom(MimeTreeParser::HtmlMessagePart::Ptr part); | ||
154 | void fillFrom(MimeTreeParser::AlternativeMessagePart::Ptr part); | 165 | void fillFrom(MimeTreeParser::AlternativeMessagePart::Ptr part); | ||
155 | 166 | | |||
156 | QVector<Content::Ptr> contents() const; | 167 | QVector<Content::Ptr> content() const; | ||
157 | 168 | | |||
158 | ContentPart *q; | 169 | ContentPart *q; | ||
159 | 170 | | |||
171 | ContentPart::Types types() const; | ||||
172 | | ||||
160 | private: | 173 | private: | ||
161 | QVector<Content::Ptr> mContents; | 174 | QVector<Content::Ptr> mContent; | ||
162 | ContentPart::Types mTypes; | 175 | ContentPart::Types mTypes; | ||
163 | }; | 176 | }; | ||
164 | 177 | | |||
165 | void ContentPartPrivate::fillFrom(MimeTreeParser::TextMessagePart::Ptr part) | 178 | void ContentPartPrivate::fillFrom(MimeTreeParser::TextMessagePart::Ptr part) | ||
166 | { | 179 | { | ||
167 | mTypes = ContentPart::PlainText; | 180 | mTypes = ContentPart::PlainText; | ||
168 | foreach (const auto &mp, part->subParts()) { | 181 | foreach (const auto &mp, part->subParts()) { | ||
169 | auto content = std::make_shared<Content>(mp->text().toLocal8Bit(), q); | 182 | auto content = std::make_shared<Content>(mp->text().toLocal8Bit(), q); | ||
170 | mContents.append(content); | 183 | mContent.append(content); | ||
171 | } | 184 | } | ||
172 | } | 185 | } | ||
173 | 186 | | |||
174 | void ContentPartPrivate::fillFrom(MimeTreeParser::HtmlMessagePart::Ptr part) | 187 | void ContentPartPrivate::fillFrom(MimeTreeParser::HtmlMessagePart::Ptr part) | ||
175 | { | 188 | { | ||
176 | mTypes = ContentPart::Html; | 189 | mTypes = ContentPart::Html; | ||
177 | } | 190 | } | ||
178 | 191 | | |||
179 | void ContentPartPrivate::fillFrom(MimeTreeParser::AlternativeMessagePart::Ptr part) | 192 | void ContentPartPrivate::fillFrom(MimeTreeParser::AlternativeMessagePart::Ptr part) | ||
180 | { | 193 | { | ||
181 | mTypes = ContentPart::Html | ContentPart::PlainText; | 194 | mTypes = ContentPart::Html | ContentPart::PlainText; | ||
182 | } | 195 | } | ||
183 | 196 | | |||
197 | ContentPart::Types ContentPartPrivate::types() const | ||||
198 | { | ||||
199 | return mTypes; | ||||
200 | } | ||||
201 | | ||||
202 | QVector<Content::Ptr> ContentPartPrivate::content() const | ||||
203 | { | ||||
204 | return mContent; | ||||
205 | } | ||||
206 | | ||||
207 | QVector<Content::Ptr> ContentPart::content(ContentPart::Type ct) const | ||||
208 | { | ||||
209 | return d->content(); | ||||
210 | } | ||||
211 | | ||||
212 | | ||||
184 | ContentPart::ContentPart() | 213 | ContentPart::ContentPart() | ||
185 | : d(std::unique_ptr<ContentPartPrivate>(new ContentPartPrivate)) | 214 | : d(std::unique_ptr<ContentPartPrivate>(new ContentPartPrivate)) | ||
186 | { | 215 | { | ||
187 | d->q = this; | 216 | d->q = this; | ||
188 | } | 217 | } | ||
189 | 218 | | |||
190 | ContentPart::~ContentPart() | 219 | ContentPart::~ContentPart() | ||
191 | { | 220 | { | ||
192 | 221 | | |||
193 | } | 222 | } | ||
194 | 223 | | |||
195 | QByteArray ContentPart::type() const | 224 | QByteArray ContentPart::type() const | ||
196 | { | 225 | { | ||
197 | return "ContentPart"; | 226 | return "ContentPart"; | ||
198 | } | 227 | } | ||
199 | 228 | | |||
229 | ContentPart::Types ContentPart::availableContents() const | ||||
230 | { | ||||
231 | return d->types(); | ||||
232 | } | ||||
233 | | ||||
200 | class MimePartPrivate | 234 | class MimePartPrivate | ||
201 | { | 235 | { | ||
202 | public: | 236 | public: | ||
203 | void fillFrom(MimeTreeParser::MessagePart::Ptr part); | 237 | void fillFrom(MimeTreeParser::MessagePart::Ptr part); | ||
204 | }; | 238 | }; | ||
205 | 239 | | |||
206 | QByteArray MimePart::type() const | 240 | QByteArray MimePart::type() const | ||
207 | { | 241 | { | ||
Show All 17 Lines | |||||
225 | } | 259 | } | ||
226 | 260 | | |||
227 | class ParserPrivate | 261 | class ParserPrivate | ||
228 | { | 262 | { | ||
229 | public: | 263 | public: | ||
230 | ParserPrivate(Parser *parser); | 264 | ParserPrivate(Parser *parser); | ||
231 | 265 | | |||
232 | void setMessage(const QByteArray &mimeMessage); | 266 | void setMessage(const QByteArray &mimeMessage); | ||
233 | void createTree(MimeTreeParser::MessagePart::Ptr start, Part::Ptr tree); | 267 | void createTree(const MimeTreeParser::MessagePart::Ptr& start, const Part::Ptr& tree); | ||
234 | 268 | | |||
235 | Part::Ptr mTree; | 269 | Part::Ptr mTree; | ||
236 | private: | 270 | private: | ||
237 | Parser *q; | 271 | Parser *q; | ||
238 | 272 | | |||
239 | MimeTreeParser::MessagePart::Ptr mPartTree; | 273 | MimeTreeParser::MessagePart::Ptr mPartTree; | ||
240 | std::shared_ptr<MimeTreeParser::NodeHelper> mNodeHelper; | 274 | std::shared_ptr<MimeTreeParser::NodeHelper> mNodeHelper; | ||
241 | QString mHtml; | 275 | QString mHtml; | ||
Show All 11 Lines | |||||
253 | { | 287 | { | ||
254 | const auto mailData = KMime::CRLFtoLF(mimeMessage); | 288 | const auto mailData = KMime::CRLFtoLF(mimeMessage); | ||
255 | KMime::Message::Ptr msg(new KMime::Message); | 289 | KMime::Message::Ptr msg(new KMime::Message); | ||
256 | msg->setContent(mailData); | 290 | msg->setContent(mailData); | ||
257 | msg->parse(); | 291 | msg->parse(); | ||
258 | 292 | | |||
259 | // render the mail | 293 | // render the mail | ||
260 | StringHtmlWriter htmlWriter; | 294 | StringHtmlWriter htmlWriter; | ||
261 | QImage paintDevice; | 295 | QImage paintDevice; | ||
cmollekopf: Remove | |||||
262 | ObjectTreeSource source(&htmlWriter); | 296 | ObjectTreeSource source(&htmlWriter); | ||
263 | MimeTreeParser::ObjectTreeParser otp(&source, mNodeHelper.get()); | 297 | MimeTreeParser::ObjectTreeParser otp(&source, mNodeHelper.get()); | ||
264 | 298 | | |||
265 | otp.parseObjectTree(msg.data()); | 299 | otp.parseObjectTree(msg.data()); | ||
266 | mPartTree = otp.parsedPart().dynamicCast<MimeTreeParser::MessagePart>(); | 300 | mPartTree = otp.parsedPart().dynamicCast<MimeTreeParser::MessagePart>(); | ||
267 | 301 | | |||
268 | mEmbeddedPartMap = htmlWriter.embeddedParts(); | 302 | mEmbeddedPartMap = htmlWriter.embeddedParts(); | ||
cmollekopf: Remove | |||||
269 | mHtml = htmlWriter.html(); | 303 | mHtml = htmlWriter.html(); | ||
cmollekopf: Remove? | |||||
270 | 304 | | |||
271 | mTree = std::make_shared<Part>(); | 305 | mTree = std::make_shared<Part>(); | ||
272 | createTree(mPartTree, mTree); | 306 | createTree(mPartTree, mTree); | ||
273 | } | 307 | } | ||
274 | 308 | | |||
275 | 309 | | |||
276 | void ParserPrivate::createTree(MimeTreeParser::MessagePart::Ptr start, Part::Ptr tree) | 310 | void ParserPrivate::createTree(const MimeTreeParser::MessagePart::Ptr &start, const Part::Ptr &tree) | ||
277 | { | 311 | { | ||
278 | | ||||
279 | foreach (const auto &mp, start->subParts()) { | 312 | foreach (const auto &mp, start->subParts()) { | ||
280 | const auto m = mp.dynamicCast<MimeTreeParser::MessagePart>(); | 313 | const auto m = mp.dynamicCast<MimeTreeParser::MessagePart>(); | ||
281 | const auto text = mp.dynamicCast<MimeTreeParser::TextMessagePart>(); | 314 | const auto text = mp.dynamicCast<MimeTreeParser::TextMessagePart>(); | ||
282 | const auto alternative = mp.dynamicCast<MimeTreeParser::AlternativeMessagePart>(); | 315 | const auto alternative = mp.dynamicCast<MimeTreeParser::AlternativeMessagePart>(); | ||
283 | const auto html = mp.dynamicCast<MimeTreeParser::HtmlMessagePart>(); | 316 | const auto html = mp.dynamicCast<MimeTreeParser::HtmlMessagePart>(); | ||
284 | const auto attachment = mp.dynamicCast<MimeTreeParser::AttachmentMessagePart>(); | 317 | const auto attachment = mp.dynamicCast<MimeTreeParser::AttachmentMessagePart>(); | ||
285 | if (text) { | 318 | if (text) { | ||
286 | auto part = std::make_shared<ContentPart>(); | 319 | auto part = std::make_shared<ContentPart>(); | ||
Show All 24 Lines | |||||
311 | } | 344 | } | ||
312 | 345 | | |||
313 | Parser::~Parser() | 346 | Parser::~Parser() | ||
314 | { | 347 | { | ||
315 | } | 348 | } | ||
316 | 349 | | |||
317 | ContentPart::Ptr Parser::collectContentPart(const Part::Ptr &start) const | 350 | ContentPart::Ptr Parser::collectContentPart(const Part::Ptr &start) const | ||
318 | { | 351 | { | ||
319 | foreach (const auto &part, start->subParts()) { | 352 | const auto ret = collect<ContentPart>(start, [](const Part::Ptr &p){return p->type() == "ContentPart";}, [](const ContentPart::Ptr &p){return true;}); | ||
320 | if (part->type() == "ContentPart") { | 353 | if (ret.size() > 0) { | ||
321 | return std::dynamic_pointer_cast<ContentPart>(part); | 354 | return ret[0]; | ||
322 | } else { | 355 | }; | ||
323 | auto ret = collectContentPart(part); | | |||
324 | if (ret) { | | |||
325 | return ret; | | |||
326 | } | | |||
327 | } | | |||
328 | } | | |||
329 | return ContentPart::Ptr(); | 356 | return ContentPart::Ptr(); | ||
330 | } | 357 | } | ||
331 | 358 | | |||
332 | ContentPart::Ptr Parser::collectContentPart() const | 359 | ContentPart::Ptr Parser::collectContentPart() const | ||
333 | { | 360 | { | ||
334 | return collectContentPart(d->mTree); | 361 | return collectContentPart(d->mTree); | ||
335 | } | 362 | } | ||
363 | | ||||
364 | template <typename T> | ||||
365 | QVector<typename T::Ptr> Parser::collect(const Part::Ptr &start, std::function<bool(const Part::Ptr &)> select, std::function<bool(const typename T::Ptr &)> filter) const | ||||
366 | { | ||||
367 | QVector<typename T::Ptr> ret; | ||||
368 | foreach (const auto &part, start->subParts()) { | ||||
369 | if (select(part)){ | ||||
370 | const auto p = std::dynamic_pointer_cast<T>(part); | ||||
371 | if (p && filter(p)) { | ||||
372 | ret.append(p); | ||||
373 | } | ||||
374 | ret += collect<T>(part, select, filter); | ||||
375 | } | ||||
376 | } | ||||
377 | return ret; | ||||
378 | } |
Remove