From 855e3d7d0e3779e76e5af55bbf4c851acbd76e56 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 9 Apr 2015 14:23:16 +0200 Subject: Started a facade base implementation. --- common/facade.h | 88 ++++++++++++++++++++++++++++++++++++++++++++++++ dummyresource/facade.cpp | 34 ++----------------- dummyresource/facade.h | 11 ++---- 3 files changed, 94 insertions(+), 39 deletions(-) create mode 100644 common/facade.h diff --git a/common/facade.h b/common/facade.h new file mode 100644 index 0000000..98bcb38 --- /dev/null +++ b/common/facade.h @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2014 Christian Mollekopf + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#pragma once + +#include "clientapi.h" + +#include + +#include "async/src/async.h" +#include "resourceaccess.h" +#include "commands.h" +#include "createentity_generated.h" +#include "domainadaptor.h" +#include "entitybuffer.h" + +namespace Akonadi2 { + class ResourceAccess; +/** + * Default facade implementation for resources that are implemented in a separate process using the ResourceAccess class. + */ +template +class GenericFacade: public Akonadi2::StoreFacade +{ +public: + GenericFacade(const QByteArray &resourceIdentifier) + : Akonadi2::StoreFacade(), + mResourceAccess(new ResourceAccess(resourceIdentifier)) + { + } + + ~GenericFacade() + { + } + +protected: + Async::Job sendCreateCommand(const QByteArray &t, const QByteArray &buffer) + { + flatbuffers::FlatBufferBuilder fbb; + //This is the resource buffer type and not the domain type + auto type = fbb.CreateString(t.constData()); + auto delta = Akonadi2::EntityBuffer::appendAsVector(fbb, buffer.constData(), buffer.size()); + auto location = Akonadi2::Commands::CreateCreateEntity(fbb, type, delta); + Akonadi2::Commands::FinishCreateEntityBuffer(fbb, location); + mResourceAccess->open(); + return mResourceAccess->sendCommand(Akonadi2::Commands::CreateEntityCommand, fbb); + } + + Async::Job synchronizeResource(bool sync, bool processAll) + { + //TODO check if a sync is necessary + //TODO Only sync what was requested + //TODO timeout + //TODO the synchronization should normally not be necessary: We just return what is already available. + + if (sync || processAll) { + return Async::start([=](Async::Future &future) { + mResourceAccess->open(); + mResourceAccess->synchronizeResource(sync, processAll).then([&future]() { + future.setFinished(); + }).exec(); + }); + } + return Async::null(); + } + +private: + //TODO use one resource access instance per application => make static + QSharedPointer mResourceAccess; +}; + +} diff --git a/dummyresource/facade.cpp b/dummyresource/facade.cpp index 1af735e..209ad0d 100644 --- a/dummyresource/facade.cpp +++ b/dummyresource/facade.cpp @@ -28,7 +28,6 @@ #include "event_generated.h" #include "entity_generated.h" #include "metadata_generated.h" -#include "createentity_generated.h" #include "domainadaptor.h" #include #include @@ -37,9 +36,9 @@ using namespace DummyCalendar; using namespace flatbuffers; + DummyResourceFacade::DummyResourceFacade() - : Akonadi2::StoreFacade(), - mResourceAccess(new Akonadi2::ResourceAccess("org.kde.dummy")), + : Akonadi2::GenericFacade("org.kde.dummy"), mFactory(new DummyEventAdaptorFactory) { } @@ -52,15 +51,7 @@ Async::Job DummyResourceFacade::create(const Akonadi2::Domain::Event &doma { flatbuffers::FlatBufferBuilder entityFbb; mFactory->createBuffer(domainObject, entityFbb); - - flatbuffers::FlatBufferBuilder fbb; - //This is the resource buffer type and not the domain type - auto type = fbb.CreateString("event"); - auto delta = Akonadi2::EntityBuffer::appendAsVector(fbb, entityFbb.GetBufferPointer(), entityFbb.GetSize()); - auto location = Akonadi2::Commands::CreateCreateEntity(fbb, type, delta); - Akonadi2::Commands::FinishCreateEntityBuffer(fbb, location); - mResourceAccess->open(); - return mResourceAccess->sendCommand(Akonadi2::Commands::CreateEntityCommand, fbb); + return sendCreateCommand("event", QByteArray::fromRawData(reinterpret_cast(entityFbb.GetBufferPointer()), entityFbb.GetSize())); } Async::Job DummyResourceFacade::modify(const Akonadi2::Domain::Event &domainObject) @@ -115,25 +106,6 @@ static std::function DummyResourceFacade::synchronizeResource(bool sync, bool processAll) -{ - //TODO check if a sync is necessary - //TODO Only sync what was requested - //TODO timeout - //TODO the synchronization should normally not be necessary: We just return what is already available. - - if (sync || processAll) { - return Async::start([=](Async::Future &future) { - mResourceAccess->open(); - mResourceAccess->synchronizeResource(sync, processAll).then([&future](Async::Future &f) { - future.setFinished(); - f.setFinished(); - }).exec(); - }); - } - return Async::null(); -} - void DummyResourceFacade::readValue(QSharedPointer storage, const QByteArray &key, const std::function &resultCallback, std::function preparedQuery) { storage->scan(key, [=](void *keyValue, int keySize, void *dataValue, int dataSize) -> bool { diff --git a/dummyresource/facade.h b/dummyresource/facade.h index 1f69161..195c50f 100644 --- a/dummyresource/facade.h +++ b/dummyresource/facade.h @@ -19,6 +19,8 @@ #pragma once +#include "common/facade.h" + #include "common/clientapi.h" #include "common/storage.h" #include "resourcefactory.h" @@ -27,12 +29,7 @@ #include "dummycalendar_generated.h" #include "common/domainadaptor.h" -namespace Akonadi2 { - class ResourceAccess; -} - - -class DummyResourceFacade : public Akonadi2::StoreFacade +class DummyResourceFacade : public Akonadi2::GenericFacade { public: DummyResourceFacade(); @@ -44,7 +41,5 @@ public: private: void readValue(QSharedPointer storage, const QByteArray &key, const std::function &resultCallback, std::function); - Async::Job synchronizeResource(bool sync, bool processAll); - QSharedPointer mResourceAccess; QSharedPointer > mFactory; }; -- cgit v1.2.3