diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-08-02 16:08:46 -0600 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-08-02 16:08:46 -0600 |
commit | 105474a893bfc6b6cd9fb86cb7b6bb6e39bb23e0 (patch) | |
tree | 57d07f46abccc836088ea27cc69bf0dae3ce9e18 /framework/src/domain/composercontroller.cpp | |
parent | 98efb475c6dacfcc937a9104c019b9aa8429f1b4 (diff) | |
download | kube-105474a893bfc6b6cd9fb86cb7b6bb6e39bb23e0.tar.gz kube-105474a893bfc6b6cd9fb86cb7b6bb6e39bb23e0.zip |
Separate email assembly from controller.
Diffstat (limited to 'framework/src/domain/composercontroller.cpp')
-rw-r--r-- | framework/src/domain/composercontroller.cpp | 73 |
1 files changed, 51 insertions, 22 deletions
diff --git a/framework/src/domain/composercontroller.cpp b/framework/src/domain/composercontroller.cpp index 2cd29bfc..3c2b7fc1 100644 --- a/framework/src/domain/composercontroller.cpp +++ b/framework/src/domain/composercontroller.cpp | |||
@@ -408,31 +408,38 @@ static KMime::Content *createBodyPart(const QByteArray &body) { | |||
408 | return mainMessage; | 408 | return mainMessage; |
409 | } | 409 | } |
410 | 410 | ||
411 | KMime::Message::Ptr ComposerController::assembleMessage() | 411 | struct Attachment { |
412 | QString name; | ||
413 | QString filename; | ||
414 | QByteArray mimeType; | ||
415 | bool isInline; | ||
416 | QByteArray data; | ||
417 | }; | ||
418 | |||
419 | static KMime::Message::Ptr createMessage(KMime::Message::Ptr existingMessage, const QStringList &to, const QStringList &cc, const QStringList &bcc, const KMime::Types::Mailbox &from, const QString &subject, const QString &body, const QList<Attachment> &attachments) | ||
412 | { | 420 | { |
413 | auto mail = mExistingMessage; | 421 | auto mail = existingMessage; |
414 | if (!mail) { | 422 | if (!mail) { |
415 | mail = KMime::Message::Ptr::create(); | 423 | mail = KMime::Message::Ptr::create(); |
416 | } | 424 | } |
417 | mail->to(true)->clear(); | 425 | mail->to(true)->clear(); |
418 | applyAddresses(mToModel->stringList(), [&](const QByteArray &addrSpec, const QByteArray &displayName) { | 426 | applyAddresses(to, [&](const QByteArray &addrSpec, const QByteArray &displayName) { |
419 | mail->to(true)->addAddress(addrSpec, displayName); | 427 | mail->to(true)->addAddress(addrSpec, displayName); |
420 | recordForAutocompletion(addrSpec, displayName); | ||
421 | }); | 428 | }); |
429 | |||
422 | mail->cc(true)->clear(); | 430 | mail->cc(true)->clear(); |
423 | applyAddresses(mCcModel->stringList(), [&](const QByteArray &addrSpec, const QByteArray &displayName) { | 431 | applyAddresses(cc, [&](const QByteArray &addrSpec, const QByteArray &displayName) { |
424 | mail->cc(true)->addAddress(addrSpec, displayName); | 432 | mail->cc(true)->addAddress(addrSpec, displayName); |
425 | recordForAutocompletion(addrSpec, displayName); | ||
426 | }); | 433 | }); |
434 | |||
427 | mail->bcc(true)->clear(); | 435 | mail->bcc(true)->clear(); |
428 | applyAddresses(mBccModel->stringList(), [&](const QByteArray &addrSpec, const QByteArray &displayName) { | 436 | applyAddresses(bcc, [&](const QByteArray &addrSpec, const QByteArray &displayName) { |
429 | mail->bcc(true)->addAddress(addrSpec, displayName); | 437 | mail->bcc(true)->addAddress(addrSpec, displayName); |
430 | recordForAutocompletion(addrSpec, displayName); | ||
431 | }); | 438 | }); |
432 | 439 | ||
433 | mail->from(true)->addAddress(getIdentity()); | 440 | mail->from(true)->addAddress(from); |
434 | 441 | ||
435 | mail->subject(true)->fromUnicodeString(getSubject(), "utf-8"); | 442 | mail->subject(true)->fromUnicodeString(subject, "utf-8"); |
436 | if (!mail->messageID()) { | 443 | if (!mail->messageID()) { |
437 | mail->messageID(true)->generate("org.kde.kube"); | 444 | mail->messageID(true)->generate("org.kde.kube"); |
438 | } | 445 | } |
@@ -440,31 +447,53 @@ KMime::Message::Ptr ComposerController::assembleMessage() | |||
440 | mail->date(true)->setDateTime(QDateTime::currentDateTimeUtc()); | 447 | mail->date(true)->setDateTime(QDateTime::currentDateTimeUtc()); |
441 | } | 448 | } |
442 | 449 | ||
443 | auto root = mAttachmentModel->invisibleRootItem(); | 450 | if (!attachments.isEmpty()) { |
444 | if (root->hasChildren()) { | ||
445 | mail->contentType(true)->setMimeType("multipart/mixed"); | 451 | mail->contentType(true)->setMimeType("multipart/mixed"); |
446 | mail->contentType()->setBoundary(KMime::multiPartBoundary()); | 452 | mail->contentType()->setBoundary(KMime::multiPartBoundary()); |
447 | mail->contentTransferEncoding()->setEncoding(KMime::Headers::CE7Bit); | 453 | mail->contentTransferEncoding()->setEncoding(KMime::Headers::CE7Bit); |
448 | mail->setPreamble("This is a multi-part message in MIME format.\n"); | 454 | mail->setPreamble("This is a multi-part message in MIME format.\n"); |
449 | for (int row = 0; row < root->rowCount(); row++) { | 455 | for (const auto &attachment : attachments) { |
450 | auto item = root->child(row, 0); | 456 | mail->addContent(createAttachmentPart(attachment.data, attachment.filename, attachment.isInline, attachment.mimeType, attachment.name)); |
451 | const auto name = item->data(NameRole).toString(); | ||
452 | const auto filename = item->data(FilenameRole).toString(); | ||
453 | const auto mimeType = item->data(MimeTypeRole).toByteArray(); | ||
454 | const auto isInline = item->data(InlineRole).toBool(); | ||
455 | const auto content = item->data(ContentRole).toByteArray(); | ||
456 | mail->addContent(createAttachmentPart(content, filename, isInline, mimeType, name)); | ||
457 | } | 457 | } |
458 | mail->addContent(createBodyPart(getBody().toUtf8())); | 458 | mail->addContent(createBodyPart(body.toUtf8())); |
459 | } else { | 459 | } else { |
460 | //FIXME same implementation as above for attachments | 460 | //FIXME same implementation as above for attachments |
461 | mail->setBody(getBody().toUtf8()); | 461 | mail->setBody(body.toUtf8()); |
462 | } | 462 | } |
463 | 463 | ||
464 | mail->assemble(); | 464 | mail->assemble(); |
465 | return mail; | 465 | return mail; |
466 | } | 466 | } |
467 | 467 | ||
468 | KMime::Message::Ptr ComposerController::assembleMessage() | ||
469 | { | ||
470 | applyAddresses(mToModel->stringList(), [&](const QByteArray &addrSpec, const QByteArray &displayName) { | ||
471 | recordForAutocompletion(addrSpec, displayName); | ||
472 | }); | ||
473 | applyAddresses(mCcModel->stringList(), [&](const QByteArray &addrSpec, const QByteArray &displayName) { | ||
474 | recordForAutocompletion(addrSpec, displayName); | ||
475 | }); | ||
476 | applyAddresses(mBccModel->stringList(), [&](const QByteArray &addrSpec, const QByteArray &displayName) { | ||
477 | recordForAutocompletion(addrSpec, displayName); | ||
478 | }); | ||
479 | |||
480 | QList<Attachment> attachments; | ||
481 | auto root = mAttachmentModel->invisibleRootItem(); | ||
482 | if (root->hasChildren()) { | ||
483 | for (int row = 0; row < root->rowCount(); row++) { | ||
484 | auto item = root->child(row, 0); | ||
485 | attachments << Attachment{ | ||
486 | item->data(NameRole).toString(), | ||
487 | item->data(FilenameRole).toString(), | ||
488 | item->data(MimeTypeRole).toByteArray(), | ||
489 | item->data(InlineRole).toBool(), | ||
490 | item->data(ContentRole).toByteArray() | ||
491 | }; | ||
492 | } | ||
493 | } | ||
494 | return createMessage(mExistingMessage, mToModel->stringList(), mCcModel->stringList(), mBccModel->stringList(), getIdentity(), getSubject(), getBody(), attachments); | ||
495 | } | ||
496 | |||
468 | void ComposerController::updateSendAction() | 497 | void ComposerController::updateSendAction() |
469 | { | 498 | { |
470 | auto enabled = !mToModel->stringList().isEmpty() && !getSubject().isEmpty() && !getAccountId().isEmpty(); | 499 | auto enabled = !mToModel->stringList().isEmpty() && !getSubject().isEmpty() && !getAccountId().isEmpty(); |