From a547334afca38baae64e0f5774b1eb7f082a08e3 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 12 Apr 2017 11:46:48 +0200 Subject: Allow the preprocessor to move and use in mailtransport --- common/pipeline.cpp | 54 +++++++++++++++++++++- common/pipeline.h | 24 ++++++++-- .../mailtransportresource.cpp | 23 +++++---- .../tests/mailtransporttest.cpp | 7 +-- 4 files changed, 91 insertions(+), 17 deletions(-) diff --git a/common/pipeline.cpp b/common/pipeline.cpp index 91437d4..019784e 100644 --- a/common/pipeline.cpp +++ b/common/pipeline.cpp @@ -269,7 +269,26 @@ KAsync::Job Pipeline::modifiedEntity(void const *command, size_t size) } foreach (const auto &processor, d->processors[bufferType]) { - processor->modifiedEntity(current, newEntity); + bool exitLoop = false; + const auto result = processor->processModification(Preprocessor::Modification, current, newEntity); + switch (result.action) { + case Preprocessor::MoveToResource: + isMove = true; + exitLoop = true; + break; + case Preprocessor::CopyToResource: + isMove = true; + exitLoop = true; + break; + case Preprocessor::DropModification: + SinkTraceCtx(d->logCtx) << "Dropping modification"; + return KAsync::error(0); + default: + break; + } + if (exitLoop) { + break; + } } //The entity is either being copied or moved @@ -378,6 +397,39 @@ void Preprocessor::finalizeBatch() { } +void Preprocessor::newEntity(ApplicationDomain::ApplicationDomainType &newEntity) +{ + +} + +void Preprocessor::modifiedEntity(const ApplicationDomain::ApplicationDomainType &oldEntity, ApplicationDomain::ApplicationDomainType &newEntity) +{ + +} + +void Preprocessor::deletedEntity(const ApplicationDomain::ApplicationDomainType &oldEntity) +{ + +} + +Preprocessor::Result Preprocessor::processModification(Type type, const ApplicationDomain::ApplicationDomainType ¤t, ApplicationDomain::ApplicationDomainType &diff) +{ + switch(type) { + case Creation: + newEntity(diff); + return {NoAction}; + case Modification: + modifiedEntity(current, diff); + return {NoAction}; + case Deletion: + deletedEntity(current); + return {NoAction}; + default: + break; + } + return {NoAction}; +} + QByteArray Preprocessor::resourceInstanceIdentifier() const { return d->resourceInstanceIdentifier; diff --git a/common/pipeline.h b/common/pipeline.h index c6dc5fe..11d52fd 100644 --- a/common/pipeline.h +++ b/common/pipeline.h @@ -77,10 +77,28 @@ public: Preprocessor(); virtual ~Preprocessor(); + enum Action { + NoAction, + MoveToResource, + CopyToResource, + DropModification, + DeleteEntity + }; + + enum Type { + Creation, + Modification, + Deletion + }; + struct Result { + Action action; + }; + virtual void startBatch(); - virtual void newEntity(ApplicationDomain::ApplicationDomainType &newEntity) {}; - virtual void modifiedEntity(const ApplicationDomain::ApplicationDomainType &oldEntity, ApplicationDomain::ApplicationDomainType &newEntity) {}; - virtual void deletedEntity(const ApplicationDomain::ApplicationDomainType &oldEntity) {}; + virtual void newEntity(ApplicationDomain::ApplicationDomainType &newEntity); + virtual void modifiedEntity(const ApplicationDomain::ApplicationDomainType &oldEntity, ApplicationDomain::ApplicationDomainType &newEntity); + virtual void deletedEntity(const ApplicationDomain::ApplicationDomainType &oldEntity); + virtual Result processModification(Type type, const ApplicationDomain::ApplicationDomainType ¤t, ApplicationDomain::ApplicationDomainType &diff); virtual void finalizeBatch(); void setup(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier, Pipeline *, Storage::EntityStore *entityStore); diff --git a/examples/mailtransportresource/mailtransportresource.cpp b/examples/mailtransportresource/mailtransportresource.cpp index 8e5b22e..8a4ef92 100644 --- a/examples/mailtransportresource/mailtransportresource.cpp +++ b/examples/mailtransportresource/mailtransportresource.cpp @@ -66,18 +66,21 @@ public: return targetResource.identifier(); } - void modifiedEntity(const Sink::ApplicationDomain::ApplicationDomainType &oldEntity, Sink::ApplicationDomain::ApplicationDomainType &newEntity) Q_DECL_OVERRIDE + virtual Result processModification(Type type, const ApplicationDomain::ApplicationDomainType ¤t, ApplicationDomain::ApplicationDomainType &diff) Q_DECL_OVERRIDE { - using namespace Sink::ApplicationDomain; - auto mail = newEntity.cast(); - if (mail.changedProperties().contains(Mail::Trash::name)) { - //Move back to regular resource - newEntity.setResource(getTargetResource()); - } else if (mail.changedProperties().contains(Mail::Draft::name)) { - //Move back to regular resource - newEntity.setResource(getTargetResource()); + if (type == Preprocessor::Modification) { + using namespace Sink::ApplicationDomain; + if (diff.changedProperties().contains(Mail::Trash::name)) { + //Move back to regular resource + diff.setResource(getTargetResource()); + return {MoveToResource}; + } else if (diff.changedProperties().contains(Mail::Draft::name)) { + //Move back to regular resource + diff.setResource(getTargetResource()); + return {MoveToResource}; + } } - //TODO this will only copy it back, but not yet move + return {NoAction}; } }; diff --git a/examples/mailtransportresource/tests/mailtransporttest.cpp b/examples/mailtransportresource/tests/mailtransporttest.cpp index a30fc20..e4cc447 100644 --- a/examples/mailtransportresource/tests/mailtransporttest.cpp +++ b/examples/mailtransportresource/tests/mailtransporttest.cpp @@ -47,7 +47,8 @@ private slots: void cleanup() { - VERIFYEXEC(ResourceControl::shutdown(mResourceInstanceIdentifier)); + VERIFYEXEC(Store::removeDataFromDisk(mResourceInstanceIdentifier)); + VERIFYEXEC(Store::removeDataFromDisk(mStorageResource)); } void init() @@ -107,8 +108,8 @@ private slots: VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier)); QTest::qWait(100); - // auto mailsInOutbox = Store::read(Query().resourceFilter(mResourceInstanceIdentifier)); - // QCOMPARE(mailsInOutbox.size(), 0); + auto mailsInOutbox = Store::read(Query().resourceFilter(mResourceInstanceIdentifier)); + QCOMPARE(mailsInOutbox.size(), 0); auto mailsInDrafts = Store::read(Query().resourceFilter(mStorageResource)); QCOMPARE(mailsInDrafts.size(), 1); -- cgit v1.2.3