diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-06-14 12:39:29 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-06-14 13:23:28 +0200 |
commit | ae1c5a0a53d1fd351b6fd33e8a46ad1034874489 (patch) | |
tree | 7971bc16da091821bf0fbb2aa91ca04c22e5c2b0 /examples/imapresource | |
parent | 7dc97cc6e338e1d756734e1620a062cdb08635ca (diff) | |
download | sink-ae1c5a0a53d1fd351b6fd33e8a46ad1034874489.tar.gz sink-ae1c5a0a53d1fd351b6fd33e8a46ad1034874489.zip |
Deal with both CRLF and LF mime messages.
IMAP always requires CRLF, and so does the MIME standard, KMIME expects
LF-only.
We now just try to always use CRLF on disk, but convert LF-only messages should
we have to (e.g. because copied over from maildir or so).
Diffstat (limited to 'examples/imapresource')
-rw-r--r-- | examples/imapresource/imapresource.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/examples/imapresource/imapresource.cpp b/examples/imapresource/imapresource.cpp index 945962f..25d9534 100644 --- a/examples/imapresource/imapresource.cpp +++ b/examples/imapresource/imapresource.cpp | |||
@@ -197,7 +197,7 @@ public: | |||
197 | 197 | ||
198 | auto mail = Sink::ApplicationDomain::Mail::create(mResourceInstanceIdentifier); | 198 | auto mail = Sink::ApplicationDomain::Mail::create(mResourceInstanceIdentifier); |
199 | mail.setFolder(folderLocalId); | 199 | mail.setFolder(folderLocalId); |
200 | mail.setMimeMessage(message.msg->encodedContent()); | 200 | mail.setMimeMessage(message.msg->encodedContent(true)); |
201 | mail.setExtractedFullPayloadAvailable(message.fullPayload); | 201 | mail.setExtractedFullPayloadAvailable(message.fullPayload); |
202 | setFlags(mail, message.flags); | 202 | setFlags(mail, message.flags); |
203 | 203 | ||
@@ -608,6 +608,15 @@ public: | |||
608 | } | 608 | } |
609 | return KAsync::error<void>("Nothing to do"); | 609 | return KAsync::error<void>("Nothing to do"); |
610 | } | 610 | } |
611 | static QByteArray ensureCRLF(const QByteArray &data) { | ||
612 | auto index = data.indexOf('\n'); | ||
613 | if (index > 0 && data.at(index - 1) == '\r') { //First line is LF-only terminated | ||
614 | //Convert back and forth in case there's a mix. We don't want to expand CRLF into CRCRLF. | ||
615 | return KMime::LFtoCRLF(KMime::CRLFtoLF(data)); | ||
616 | } else { | ||
617 | return data; | ||
618 | } | ||
619 | } | ||
611 | 620 | ||
612 | KAsync::Job<QByteArray> replay(const ApplicationDomain::Mail &mail, Sink::Operation operation, const QByteArray &oldRemoteId, const QList<QByteArray> &changedProperties) Q_DECL_OVERRIDE | 621 | KAsync::Job<QByteArray> replay(const ApplicationDomain::Mail &mail, Sink::Operation operation, const QByteArray &oldRemoteId, const QList<QByteArray> &changedProperties) Q_DECL_OVERRIDE |
613 | { | 622 | { |
@@ -616,7 +625,7 @@ public: | |||
616 | KAsync::Job<QByteArray> job = KAsync::null<QByteArray>(); | 625 | KAsync::Job<QByteArray> job = KAsync::null<QByteArray>(); |
617 | if (operation == Sink::Operation_Creation) { | 626 | if (operation == Sink::Operation_Creation) { |
618 | const QString mailbox = syncStore().resolveLocalId(ENTITY_TYPE_FOLDER, mail.getFolder()); | 627 | const QString mailbox = syncStore().resolveLocalId(ENTITY_TYPE_FOLDER, mail.getFolder()); |
619 | const QByteArray content = mail.getMimeMessage(); | 628 | const auto content = ensureCRLF(mail.getMimeMessage()); |
620 | const auto flags = getFlags(mail); | 629 | const auto flags = getFlags(mail); |
621 | const QDateTime internalDate = mail.getDate(); | 630 | const QDateTime internalDate = mail.getDate(); |
622 | job = login.then(imap->append(mailbox, content, flags, internalDate)) | 631 | job = login.then(imap->append(mailbox, content, flags, internalDate)) |
@@ -651,7 +660,7 @@ public: | |||
651 | if (messageChanged || messageMoved) { | 660 | if (messageChanged || messageMoved) { |
652 | const auto folderId = folderIdFromMailRid(oldRemoteId); | 661 | const auto folderId = folderIdFromMailRid(oldRemoteId); |
653 | const QString oldMailbox = syncStore().resolveLocalId(ENTITY_TYPE_FOLDER, folderId); | 662 | const QString oldMailbox = syncStore().resolveLocalId(ENTITY_TYPE_FOLDER, folderId); |
654 | const QByteArray content = mail.getMimeMessage(); | 663 | const auto content = ensureCRLF(mail.getMimeMessage()); |
655 | const QDateTime internalDate = mail.getDate(); | 664 | const QDateTime internalDate = mail.getDate(); |
656 | SinkTrace() << "Replacing message. Old mailbox: " << oldMailbox << "New mailbox: " << mailbox << "Flags: " << flags << "Content: " << content; | 665 | SinkTrace() << "Replacing message. Old mailbox: " << oldMailbox << "New mailbox: " << mailbox << "Flags: " << flags << "Content: " << content; |
657 | KIMAP2::ImapSet set; | 666 | KIMAP2::ImapSet set; |