From ca354ec4e2b9bc35b7d97c41bec68cccf6a6c8c9 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 5 May 2016 10:37:28 +0200 Subject: Create actual messages in maildir --- examples/maildirresource/libmaildir/maildir.cpp | 34 +++++++++++++++++++++++++ examples/maildirresource/libmaildir/maildir.h | 1 + examples/maildirresource/maildirresource.cpp | 2 +- tests/maildirresourcetest.cpp | 14 ++++++++-- 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/examples/maildirresource/libmaildir/maildir.cpp b/examples/maildirresource/libmaildir/maildir.cpp index 8d6de3e..670d4ca 100644 --- a/examples/maildirresource/libmaildir/maildir.cpp +++ b/examples/maildirresource/libmaildir/maildir.cpp @@ -706,6 +706,40 @@ QString Maildir::addEntry(const QByteArray& data) return uniqueKey; } +QString Maildir::addEntryFromPath(const QString& path) +{ + QString uniqueKey; + QString key; + QString finalKey; + QString curKey; + + // QUuid doesn't return globally unique identifiers, therefor we query until we + // get one that doesn't exists yet + do { + uniqueKey = createUniqueFileName() + d->hostName; + key = d->path + QLatin1String("/tmp/") + uniqueKey; + finalKey = d->path + QLatin1String("/new/") + uniqueKey; + curKey = d->path + QLatin1String("/cur/") + uniqueKey; + } while (QFile::exists(key) || QFile::exists(finalKey) || QFile::exists(curKey)); + + QFile f(path); + if (!f.open(QIODevice::ReadWrite)) { + qWarning() << f.errorString(); + qWarning() << "Cannot open mail file: " << key; + return QString(); + } + + if (!f.rename(finalKey)) { + qWarning() << "Maildir: Failed to add entry: " << finalKey << "! Error: " << f.errorString(); + // d->lastError = i18n("Failed to create mail file %1. The error was: %2" , finalKey, f.errorString()); + return QString(); + } + // KeyCache *keyCache = KeyCache::self(); + // keyCache->removeKey(d->path, key); //remove all keys, be it "cur" or "new" first + // keyCache->addNewKey(d->path, key); //and add a key for "new", as the mail was moved there + return uniqueKey; +} + bool Maildir::removeEntry(const QString& key) { QString realKey(d->findRealKey(key)); diff --git a/examples/maildirresource/libmaildir/maildir.h b/examples/maildirresource/libmaildir/maildir.h index 31778ac..8c622c7 100644 --- a/examples/maildirresource/libmaildir/maildir.h +++ b/examples/maildirresource/libmaildir/maildir.h @@ -207,6 +207,7 @@ public: * Adds the given @p data to the maildir. Returns the key of the entry. */ QString addEntry( const QByteArray& data ); + QString addEntryFromPath(const QString& path); /** * Removes the entry with the given @p key. Returns success or failure. diff --git a/examples/maildirresource/maildirresource.cpp b/examples/maildirresource/maildirresource.cpp index 839b427..2ad45cd 100644 --- a/examples/maildirresource/maildirresource.cpp +++ b/examples/maildirresource/maildirresource.cpp @@ -290,7 +290,7 @@ KAsync::Job MaildirResource::replay(Sink::Storage &synchronizationStore, c } //FIXME move the mime message from the mimeMessage property to the proper place. Trace() << "Creating a new mail."; - const auto remoteId = maildir.addEntry("foobar"); + const auto remoteId = maildir.addEntryFromPath(mail.getProperty("mimeMessage").toString()); if (remoteId.isEmpty()) { Warning() << "Failed to create mail: " << remoteId; return KAsync::error(1, "Failed to create mail."); diff --git a/tests/maildirresourcetest.cpp b/tests/maildirresourcetest.cpp index 7b7f819..b91aef2 100644 --- a/tests/maildirresourcetest.cpp +++ b/tests/maildirresourcetest.cpp @@ -1,6 +1,7 @@ #include #include +#include #include "maildirresource/maildirresource.h" #include "store.h" @@ -296,9 +297,12 @@ private slots: // Ensure all local data is processed Sink::ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished(); + auto message = KMime::Message::Ptr::create(); + message->subject(true)->fromUnicodeString(QString::fromLatin1("Foobar"), "utf8"); + message->assemble(); + Sink::ApplicationDomain::Mail mail("org.kde.maildir.instance1"); - mail.setProperty("name", "testCreateMail"); - // FIXME instead of properties, ensure the mimeMessage property is used and the file is moved as expected + mail.setBlobProperty("mimeMessage", message->encodedContent()); Sink::Store::create(mail).exec().waitForFinished(); @@ -309,6 +313,12 @@ private slots: QDir dir(targetPath); dir.setFilter(QDir::Files); QTRY_COMPARE(dir.count(), static_cast(1)); + QFile file(targetPath + "/" + dir.entryList().first()); + QVERIFY(file.open(QIODevice::ReadOnly)); + KMime::Message m; + m.setContent(file.readAll()); + m.parse(); + QCOMPARE(m.subject(true)->asUnicodeString(), QString::fromLatin1("Foobar")); } void testRemoveMail() -- cgit v1.2.3