From 53df06854ffdcf164c195884783cadf8f53fea2c Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 24 May 2016 12:32:55 +0200 Subject: Validate subject and mime message --- examples/imapresource/imapresource.cpp | 53 ++++++++++++++++++++++++++++++++-- tests/mailtest.cpp | 6 ++-- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/examples/imapresource/imapresource.cpp b/examples/imapresource/imapresource.cpp index 6adfeb3..61031d8 100644 --- a/examples/imapresource/imapresource.cpp +++ b/examples/imapresource/imapresource.cpp @@ -51,6 +51,53 @@ using namespace Imap; +class FolderUpdater : public Sink::Preprocessor +{ +public: + FolderUpdater(const QByteArray &drafts) {} + + void updatedIndexedProperties(Sink::ApplicationDomain::BufferAdaptor &newEntity) + { + const auto mimeMessagePath = newEntity.getProperty("mimeMessage").toString(); + QFile f(mimeMessagePath); + if (!f.open(QIODevice::ReadOnly)) { + Warning() << "Failed to open the file: " << mimeMessagePath; + return; + } + auto mapped = f.map(0, qMin((qint64)8000, f.size())); + if (!mapped) { + Warning() << "Failed to map file"; + return; + } + + KMime::Message *msg = new KMime::Message; + msg->setHead(KMime::CRLFtoLF(QByteArray::fromRawData(reinterpret_cast(mapped), f.size()))); + msg->parse(); + + newEntity.setProperty("subject", msg->subject(true)->asUnicodeString()); + newEntity.setProperty("sender", msg->from(true)->asUnicodeString()); + newEntity.setProperty("senderName", msg->from(true)->asUnicodeString()); + newEntity.setProperty("date", msg->date(true)->dateTime()); + } + + void newEntity(const QByteArray &uid, qint64 revision, Sink::ApplicationDomain::BufferAdaptor &newEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE + { + updatedIndexedProperties(newEntity); + } + + void modifiedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::ApplicationDomain::BufferAdaptor &newEntity, + Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE + { + updatedIndexedProperties(newEntity); + } + + void deletedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE + { + } + + QSharedPointer mFolderAdaptorFactory; +}; + ImapResource::ImapResource(const QByteArray &instanceIdentifier, const QSharedPointer &pipeline) : Sink::GenericResource(instanceIdentifier, pipeline), mMailAdaptorFactory(QSharedPointer::create()), @@ -62,9 +109,11 @@ ImapResource::ImapResource(const QByteArray &instanceIdentifier, const QSharedPo mUser = config.value("user").toString(); mPassword = config.value("password").toString(); - // auto folderUpdater = new FolderUpdater(QByteArray()); + auto folderUpdater = new FolderUpdater(QByteArray()); + folderUpdater->mFolderAdaptorFactory = mFolderAdaptorFactory; + addType(ENTITY_TYPE_MAIL, mMailAdaptorFactory, - QVector() << new DefaultIndexUpdater); + QVector() << folderUpdater << new DefaultIndexUpdater); addType(ENTITY_TYPE_FOLDER, mFolderAdaptorFactory, QVector() << new DefaultIndexUpdater); } diff --git a/tests/mailtest.cpp b/tests/mailtest.cpp index c3b33bc..3ca8eaa 100644 --- a/tests/mailtest.cpp +++ b/tests/mailtest.cpp @@ -153,13 +153,13 @@ void MailTest::testCreateModifyDeleteMail() VERIFYEXEC(Store::create(mail)); VERIFYEXEC(ResourceControl::flushMessageQueue(query.resources)); { - auto job = Store::fetchAll(Query::RequestedProperties(QByteArrayList() << Mail::Folder::name << Mail::Subject::name)) + auto job = Store::fetchAll(Query::RequestedProperties(QByteArrayList() << Mail::Folder::name << Mail::Subject::name << Mail::MimeMessage::name)) .then>([=](const QList &mails) { QCOMPARE(mails.size(), 1); auto mail = *mails.first(); - // QCOMPARE(mail.getSubject(), subject); + QCOMPARE(mail.getSubject(), subject); QCOMPARE(mail.getFolder(), folder.identifier()); - // TODO test access to mime message + QVERIFY(QFile(mail.getMimeMessagePath()).exists()); // return Store::remove(*mail) // .then(ResourceControl::flushReplayQueue(query.resources)) // The change needs to be replayed already -- cgit v1.2.3