diff options
author | Rémi Nicole <nicole@kolabsystems.com> | 2018-02-21 21:11:01 +0100 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2018-02-21 21:19:32 +0100 |
commit | d3228a2899992370e3fb19609eb1433d02de0f40 (patch) | |
tree | a78d3d04de3856ad4da058d16174ef58797a43cc /framework/src/domain/composercontroller.cpp | |
parent | 6299a2fee34e53938d7c230e7e29611a6bcdb2b9 (diff) | |
download | kube-d3228a2899992370e3fb19609eb1433d02de0f40.tar.gz kube-d3228a2899992370e3fb19609eb1433d02de0f40.zip |
T7024 fix: implement attachment-based forwarding
Summary:
Implement attachment-based forwarding.
Some notes:
- `loadAsDraft` was removed in favor of new enum `loadType` in QML, and callback based generic programming in C++
Reviewers: cmollekopf
Tags: #kube
Maniphest Tasks: T7024
Differential Revision: https://phabricator.kde.org/D10676
Diffstat (limited to 'framework/src/domain/composercontroller.cpp')
-rw-r--r-- | framework/src/domain/composercontroller.cpp | 66 |
1 files changed, 38 insertions, 28 deletions
diff --git a/framework/src/domain/composercontroller.cpp b/framework/src/domain/composercontroller.cpp index 60e955ea..4bfc34ab 100644 --- a/framework/src/domain/composercontroller.cpp +++ b/framework/src/domain/composercontroller.cpp | |||
@@ -272,14 +272,8 @@ static QStringList getStringListFromAddresses(const KMime::Types::Mailbox::List | |||
272 | void ComposerController::addAttachmentPart(KMime::Content *partToAttach) | 272 | void ComposerController::addAttachmentPart(KMime::Content *partToAttach) |
273 | { | 273 | { |
274 | QVariantMap map; | 274 | QVariantMap map; |
275 | if (partToAttach->contentType()->mimeType() == "multipart/digest" || | 275 | // May need special care for the multipart/digest MIME type |
276 | partToAttach->contentType()->mimeType() == "message/rfc822") { | 276 | map.insert("content", partToAttach->decodedContent()); |
277 | // if it is a digest or a full message, use the encodedContent() of the attachment, | ||
278 | // which already has the proper headers | ||
279 | map.insert("content", partToAttach->encodedContent()); | ||
280 | } else { | ||
281 | map.insert("content", partToAttach->decodedContent()); | ||
282 | } | ||
283 | map.insert("mimetype", partToAttach->contentType()->mimeType()); | 277 | map.insert("mimetype", partToAttach->contentType()->mimeType()); |
284 | 278 | ||
285 | QMimeDatabase db; | 279 | QMimeDatabase db; |
@@ -337,7 +331,40 @@ void ComposerController::setMessage(const KMime::Message::Ptr &msg) | |||
337 | setExistingMessage(msg); | 331 | setExistingMessage(msg); |
338 | } | 332 | } |
339 | 333 | ||
340 | void ComposerController::loadMessage(const QVariant &message, bool loadAsDraft) | 334 | void ComposerController::loadDraft(const QVariant &message) { |
335 | loadMessage(message, [this] (const KMime::Message::Ptr &mail) { | ||
336 | mRemoveDraft = true; | ||
337 | setMessage(mail); | ||
338 | }); | ||
339 | } | ||
340 | |||
341 | void ComposerController::loadReply(const QVariant &message) { | ||
342 | loadMessage(message, [this] (const KMime::Message::Ptr &mail) { | ||
343 | //Find all personal email addresses to exclude from reply | ||
344 | KMime::Types::AddrSpecList me; | ||
345 | auto list = static_cast<IdentitySelector*>(mIdentitySelector.data())->getAllAddresses(); | ||
346 | for (const auto &a : list) { | ||
347 | KMime::Types::Mailbox mb; | ||
348 | mb.setAddress(a); | ||
349 | me << mb.addrSpec(); | ||
350 | } | ||
351 | |||
352 | MailTemplates::reply(mail, [this] (const KMime::Message::Ptr &reply) { | ||
353 | //We assume reply | ||
354 | setMessage(reply); | ||
355 | }, me); | ||
356 | }); | ||
357 | } | ||
358 | |||
359 | void ComposerController::loadForward(const QVariant &message) { | ||
360 | loadMessage(message, [this] (const KMime::Message::Ptr &mail) { | ||
361 | MailTemplates::forward(mail, [this] (const KMime::Message::Ptr &fwdMessage) { | ||
362 | setMessage(fwdMessage); | ||
363 | }); | ||
364 | }); | ||
365 | } | ||
366 | |||
367 | void ComposerController::loadMessage(const QVariant &message, std::function<void(const KMime::Message::Ptr&)> callback) | ||
341 | { | 368 | { |
342 | using namespace Sink; | 369 | using namespace Sink; |
343 | using namespace Sink::ApplicationDomain; | 370 | using namespace Sink::ApplicationDomain; |
@@ -346,8 +373,7 @@ void ComposerController::loadMessage(const QVariant &message, bool loadAsDraft) | |||
346 | Q_ASSERT(msg); | 373 | Q_ASSERT(msg); |
347 | Query query(*msg); | 374 | Query query(*msg); |
348 | query.request<Mail::MimeMessage>(); | 375 | query.request<Mail::MimeMessage>(); |
349 | Store::fetchOne<Mail>(query).then([this, loadAsDraft](const Mail &mail) { | 376 | Store::fetchOne<Mail>(query).then([this, callback](const Mail &mail) { |
350 | mRemoveDraft = loadAsDraft; | ||
351 | setExistingMail(mail); | 377 | setExistingMail(mail); |
352 | 378 | ||
353 | const auto mailData = KMime::CRLFtoLF(mail.getMimeMessage()); | 379 | const auto mailData = KMime::CRLFtoLF(mail.getMimeMessage()); |
@@ -355,23 +381,7 @@ void ComposerController::loadMessage(const QVariant &message, bool loadAsDraft) | |||
355 | KMime::Message::Ptr mail(new KMime::Message); | 381 | KMime::Message::Ptr mail(new KMime::Message); |
356 | mail->setContent(mailData); | 382 | mail->setContent(mailData); |
357 | mail->parse(); | 383 | mail->parse(); |
358 | if (loadAsDraft) { | 384 | callback(mail); |
359 | setMessage(mail); | ||
360 | } else { | ||
361 | //Find all personal email addresses to exclude from reply | ||
362 | KMime::Types::AddrSpecList me; | ||
363 | auto list = static_cast<IdentitySelector*>(mIdentitySelector.data())->getAllAddresses(); | ||
364 | for (const auto &a : list) { | ||
365 | KMime::Types::Mailbox mb; | ||
366 | mb.setAddress(a); | ||
367 | me << mb.addrSpec(); | ||
368 | } | ||
369 | |||
370 | MailTemplates::reply(mail, [this] (const KMime::Message::Ptr &reply) { | ||
371 | //We assume reply | ||
372 | setMessage(reply); | ||
373 | }, me); | ||
374 | } | ||
375 | } else { | 385 | } else { |
376 | qWarning() << "Retrieved empty message"; | 386 | qWarning() << "Retrieved empty message"; |
377 | } | 387 | } |