diff options
Diffstat (limited to 'examples/dummyresource/resourcefactory.cpp')
-rw-r--r-- | examples/dummyresource/resourcefactory.cpp | 163 |
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 | ||
47 | class 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 | |||
46 | DummyResource::DummyResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline) | 126 | DummyResource::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 | ||
60 | Sink::ApplicationDomain::Event::Ptr DummyResource::createEvent(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &transaction) | 140 | DummyResource::~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 | |||
71 | Sink::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 | ||
84 | Sink::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 | |||
96 | void 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 | |||
111 | KAsync::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 | |||
130 | KAsync::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 | ||
136 | void DummyResource::removeDataFromDisk() | 145 | void 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 | |||
163 | DummyResourceFactory::DummyResourceFactory(QObject *parent) | 173 | DummyResourceFactory::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 | ||
191 | void DummyResourceFactory::registerAdaptorFactories(Sink::AdaptorFactoryRegistry ®istry) | ||
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 | |||