summaryrefslogtreecommitdiffstats
path: root/examples/imapresource/imapresource.cpp
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-06-14 12:39:29 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-06-14 13:23:28 +0200
commitae1c5a0a53d1fd351b6fd33e8a46ad1034874489 (patch)
tree7971bc16da091821bf0fbb2aa91ca04c22e5c2b0 /examples/imapresource/imapresource.cpp
parent7dc97cc6e338e1d756734e1620a062cdb08635ca (diff)
downloadsink-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/imapresource.cpp')
-rw-r--r--examples/imapresource/imapresource.cpp15
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;