summaryrefslogtreecommitdiffstats
path: root/examples/dummyresource/resourcefactory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/dummyresource/resourcefactory.cpp')
-rw-r--r--examples/dummyresource/resourcefactory.cpp163
1 files changed, 90 insertions, 73 deletions
diff --git a/examples/dummyresource/resourcefactory.cpp b/examples/dummyresource/resourcefactory.cpp
index 48858da..609d23e 100644
--- a/examples/dummyresource/resourcefactory.cpp
+++ b/examples/dummyresource/resourcefactory.cpp
@@ -35,6 +35,7 @@
35#include "definitions.h" 35#include "definitions.h"
36#include "facadefactory.h" 36#include "facadefactory.h"
37#include "indexupdater.h" 37#include "indexupdater.h"
38#include "adaptorfactoryregistry.h"
38#include <QDate> 39#include <QDate>
39#include <QUuid> 40#include <QUuid>
40 41
@@ -43,8 +44,87 @@
43#define ENTITY_TYPE_MAIL "mail" 44#define ENTITY_TYPE_MAIL "mail"
44#define ENTITY_TYPE_FOLDER "folder" 45#define ENTITY_TYPE_FOLDER "folder"
45 46
47class DummySynchronizer : public Sink::Synchronizer {
48 public:
49
50 DummySynchronizer(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier)
51 : Sink::Synchronizer(resourceType, resourceInstanceIdentifier)
52 {
53
54 }
55
56 Sink::ApplicationDomain::Event::Ptr createEvent(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data)
57 {
58 static uint8_t rawData[100];
59 auto event = Sink::ApplicationDomain::Event::Ptr::create();
60 event->setProperty("summary", data.value("summary").toString());
61 event->setProperty("remoteId", ridBuffer);
62 event->setProperty("description", data.value("description").toString());
63 event->setProperty("attachment", QByteArray::fromRawData(reinterpret_cast<const char*>(rawData), 100));
64 return event;
65 }
66
67 Sink::ApplicationDomain::Mail::Ptr createMail(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data)
68 {
69 auto mail = Sink::ApplicationDomain::Mail::Ptr::create();
70 mail->setProperty("subject", data.value("subject").toString());
71 mail->setProperty("senderEmail", data.value("senderEmail").toString());
72 mail->setProperty("senderName", data.value("senderName").toString());
73 mail->setProperty("date", data.value("date").toString());
74 mail->setProperty("folder", syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, data.value("parentFolder").toByteArray()));
75 mail->setProperty("unread", data.value("unread").toBool());
76 mail->setProperty("important", data.value("important").toBool());
77 return mail;
78 }
79
80 Sink::ApplicationDomain::Folder::Ptr createFolder(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data)
81 {
82 auto folder = Sink::ApplicationDomain::Folder::Ptr::create();
83 folder->setProperty("name", data.value("name").toString());
84 folder->setProperty("icon", data.value("icon").toString());
85 if (!data.value("parent").toString().isEmpty()) {
86 auto sinkId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, data.value("parent").toByteArray());
87 folder->setProperty("parent", sinkId);
88 }
89 return folder;
90 }
91
92 void synchronize(const QByteArray &bufferType, const QMap<QString, QMap<QString, QVariant> > &data, std::function<Sink::ApplicationDomain::ApplicationDomainType::Ptr(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data)> createEntity)
93 {
94 auto time = QSharedPointer<QTime>::create();
95 time->start();
96 //TODO find items to remove
97 int count = 0;
98 for (auto it = data.constBegin(); it != data.constEnd(); it++) {
99 count++;
100 const auto remoteId = it.key().toUtf8();
101 auto entity = createEntity(remoteId, it.value());
102 createOrModify(bufferType, remoteId, *entity);
103 }
104 Trace() << "Sync of " << count << " entities of type " << bufferType << " done." << Sink::Log::TraceTime(time->elapsed());
105 }
106
107 KAsync::Job<void> synchronizeWithSource() Q_DECL_OVERRIDE
108 {
109 Log() << " Synchronizing with the source";
110 return KAsync::start<void>([this]() {
111 synchronize(ENTITY_TYPE_EVENT, DummyStore::instance().events(), [this](const QByteArray &ridBuffer, const QMap<QString, QVariant> &data) {
112 return createEvent(ridBuffer, data);
113 });
114 synchronize(ENTITY_TYPE_MAIL, DummyStore::instance().mails(), [this](const QByteArray &ridBuffer, const QMap<QString, QVariant> &data) {
115 return createMail(ridBuffer, data);
116 });
117 synchronize(ENTITY_TYPE_FOLDER, DummyStore::instance().folders(), [this](const QByteArray &ridBuffer, const QMap<QString, QVariant> &data) {
118 return createFolder(ridBuffer, data);
119 });
120 Log() << "Done Synchronizing";
121 });
122 }
123
124};
125
46DummyResource::DummyResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline) 126DummyResource::DummyResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline)
47 : Sink::GenericResource(instanceIdentifier, pipeline), 127 : Sink::GenericResource(PLUGIN_NAME, instanceIdentifier, pipeline, QSharedPointer<Sink::NullChangeReplay>::create(), QSharedPointer<DummySynchronizer>::create(PLUGIN_NAME, instanceIdentifier)),
48 mEventAdaptorFactory(QSharedPointer<DummyEventAdaptorFactory>::create()), 128 mEventAdaptorFactory(QSharedPointer<DummyEventAdaptorFactory>::create()),
49 mMailAdaptorFactory(QSharedPointer<DummyMailAdaptorFactory>::create()), 129 mMailAdaptorFactory(QSharedPointer<DummyMailAdaptorFactory>::create()),
50 mFolderAdaptorFactory(QSharedPointer<DummyFolderAdaptorFactory>::create()) 130 mFolderAdaptorFactory(QSharedPointer<DummyFolderAdaptorFactory>::create())
@@ -57,80 +137,9 @@ DummyResource::DummyResource(const QByteArray &instanceIdentifier, const QShared
57 QVector<Sink::Preprocessor*>() << new DefaultIndexUpdater<Sink::ApplicationDomain::Event>); 137 QVector<Sink::Preprocessor*>() << new DefaultIndexUpdater<Sink::ApplicationDomain::Event>);
58} 138}
59 139
60Sink::ApplicationDomain::Event::Ptr DummyResource::createEvent(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &transaction) 140DummyResource::~DummyResource()
61{
62 static uint8_t rawData[100];
63 auto event = Sink::ApplicationDomain::Event::Ptr::create();
64 event->setProperty("summary", data.value("summary").toString());
65 event->setProperty("remoteId", ridBuffer);
66 event->setProperty("description", data.value("description").toString());
67 event->setProperty("attachment", QByteArray::fromRawData(reinterpret_cast<const char*>(rawData), 100));
68 return event;
69}
70
71Sink::ApplicationDomain::Mail::Ptr DummyResource::createMail(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &transaction)
72{ 141{
73 auto mail = Sink::ApplicationDomain::Mail::Ptr::create();
74 mail->setProperty("subject", data.value("subject").toString());
75 mail->setProperty("senderEmail", data.value("senderEmail").toString());
76 mail->setProperty("senderName", data.value("senderName").toString());
77 mail->setProperty("date", data.value("date").toString());
78 mail->setProperty("folder", resolveRemoteId(ENTITY_TYPE_FOLDER, data.value("parentFolder").toByteArray(), transaction));
79 mail->setProperty("unread", data.value("unread").toBool());
80 mail->setProperty("important", data.value("important").toBool());
81 return mail;
82}
83 142
84Sink::ApplicationDomain::Folder::Ptr DummyResource::createFolder(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &transaction)
85{
86 auto folder = Sink::ApplicationDomain::Folder::Ptr::create();
87 folder->setProperty("name", data.value("name").toString());
88 folder->setProperty("icon", data.value("icon").toString());
89 if (!data.value("parent").toString().isEmpty()) {
90 auto sinkId = resolveRemoteId(ENTITY_TYPE_FOLDER, data.value("parent").toByteArray(), transaction);
91 folder->setProperty("parent", sinkId);
92 }
93 return folder;
94}
95
96void DummyResource::synchronize(const QByteArray &bufferType, const QMap<QString, QMap<QString, QVariant> > &data, Sink::Storage::Transaction &transaction, Sink::Storage::Transaction &synchronizationTransaction, DomainTypeAdaptorFactoryInterface &adaptorFactory, std::function<Sink::ApplicationDomain::ApplicationDomainType::Ptr(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &)> createEntity)
97{
98 auto time = QSharedPointer<QTime>::create();
99 time->start();
100 //TODO find items to remove
101 int count = 0;
102 for (auto it = data.constBegin(); it != data.constEnd(); it++) {
103 count++;
104 const auto remoteId = it.key().toUtf8();
105 auto entity = createEntity(remoteId, it.value(), synchronizationTransaction);
106 createOrModify(transaction, synchronizationTransaction, adaptorFactory, bufferType, remoteId, *entity);
107 }
108 Trace() << "Sync of " << count << " entities of type " << bufferType << " done." << Sink::Log::TraceTime(time->elapsed());
109}
110
111KAsync::Job<void> DummyResource::synchronizeWithSource(Sink::Storage &mainStore, Sink::Storage &synchronizationStore)
112{
113 Log() << " Synchronizing";
114 return KAsync::start<void>([this, &mainStore, &synchronizationStore]() {
115 auto transaction = mainStore.createTransaction(Sink::Storage::ReadOnly);
116 auto synchronizationTransaction = synchronizationStore.createTransaction(Sink::Storage::ReadWrite);
117 synchronize(ENTITY_TYPE_EVENT, DummyStore::instance().events(), transaction, synchronizationTransaction, *mEventAdaptorFactory, [this](const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &synchronizationTransaction) {
118 return createEvent(ridBuffer, data, synchronizationTransaction);
119 });
120 synchronize(ENTITY_TYPE_MAIL, DummyStore::instance().mails(), transaction, synchronizationTransaction, *mMailAdaptorFactory, [this](const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &synchronizationTransaction) {
121 return createMail(ridBuffer, data, synchronizationTransaction);
122 });
123 synchronize(ENTITY_TYPE_FOLDER, DummyStore::instance().folders(), transaction, synchronizationTransaction, *mFolderAdaptorFactory, [this](const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &synchronizationTransaction) {
124 return createFolder(ridBuffer, data, synchronizationTransaction);
125 });
126 Log() << "Done Synchronizing";
127 });
128}
129
130KAsync::Job<void> DummyResource::replay(Sink::Storage &synchronizationStore, const QByteArray &type, const QByteArray &key, const QByteArray &value)
131{
132 Trace() << "Replaying " << key;
133 return KAsync::null<void>();
134} 143}
135 144
136void DummyResource::removeDataFromDisk() 145void DummyResource::removeDataFromDisk()
@@ -160,6 +169,7 @@ KAsync::Job<void> DummyResource::inspect(int inspectionType, const QByteArray &i
160 return KAsync::null<void>(); 169 return KAsync::null<void>();
161} 170}
162 171
172
163DummyResourceFactory::DummyResourceFactory(QObject *parent) 173DummyResourceFactory::DummyResourceFactory(QObject *parent)
164 : Sink::ResourceFactory(parent) 174 : Sink::ResourceFactory(parent)
165{ 175{
@@ -178,3 +188,10 @@ void DummyResourceFactory::registerFacades(Sink::FacadeFactory &factory)
178 factory.registerFacade<Sink::ApplicationDomain::Folder, DummyResourceFolderFacade>(PLUGIN_NAME); 188 factory.registerFacade<Sink::ApplicationDomain::Folder, DummyResourceFolderFacade>(PLUGIN_NAME);
179} 189}
180 190
191void DummyResourceFactory::registerAdaptorFactories(Sink::AdaptorFactoryRegistry &registry)
192{
193 registry.registerFactory<Sink::ApplicationDomain::Folder, DummyFolderAdaptorFactory>(PLUGIN_NAME);
194 registry.registerFactory<Sink::ApplicationDomain::Mail, DummyMailAdaptorFactory>(PLUGIN_NAME);
195 registry.registerFactory<Sink::ApplicationDomain::Event, DummyEventAdaptorFactory>(PLUGIN_NAME);
196}
197