summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorSandro Knauß <sknauss@kde.org>2017-01-30 13:10:54 +0100
committerSandro Knauß <sknauss@kde.org>2017-01-30 13:11:04 +0100
commit67a4e5d32d35afefee88eef365b3e22e3389adfb (patch)
tree50f5099c841f22902780e90d471b0544aa32e7f7 /examples
parente61b0ab5a8eb3b5014892b9fd5ad26ebe57bccf5 (diff)
downloadsink-67a4e5d32d35afefee88eef365b3e22e3389adfb.tar.gz
sink-67a4e5d32d35afefee88eef365b3e22e3389adfb.zip
sync contacts with kasync
Diffstat (limited to 'examples')
-rw-r--r--examples/davresource/davresource.cpp136
1 files changed, 69 insertions, 67 deletions
diff --git a/examples/davresource/davresource.cpp b/examples/davresource/davresource.cpp
index b0a9ea3..c5beb1c 100644
--- a/examples/davresource/davresource.cpp
+++ b/examples/davresource/davresource.cpp
@@ -35,6 +35,7 @@
35 35
36#include <KDAV/DavCollection> 36#include <KDAV/DavCollection>
37#include <KDAV/DavCollectionsFetchJob> 37#include <KDAV/DavCollectionsFetchJob>
38#include <KDAV/DavItem>
38#include <KDAV/DavItemsListJob> 39#include <KDAV/DavItemsListJob>
39#include <KDAV/DavItemFetchJob> 40#include <KDAV/DavItemFetchJob>
40#include <KDAV/EtagCache> 41#include <KDAV/EtagCache>
@@ -283,7 +284,6 @@ public:
283 list << Synchronizer::SyncRequest{query}; 284 list << Synchronizer::SyncRequest{query};
284 } else { 285 } else {
285 //We want to synchronize everything 286 //We want to synchronize everything
286 list << Synchronizer::SyncRequest{Sink::QueryBase(ApplicationDomain::getTypeName<ApplicationDomain::Folder>())};
287 list << Synchronizer::SyncRequest{Sink::QueryBase(ApplicationDomain::getTypeName<ApplicationDomain::Contact>())}; 287 list << Synchronizer::SyncRequest{Sink::QueryBase(ApplicationDomain::getTypeName<ApplicationDomain::Contact>())};
288 } 288 }
289 return list; 289 return list;
@@ -291,80 +291,82 @@ public:
291 291
292 KAsync::Job<void> synchronizeWithSource(const Sink::QueryBase &query) Q_DECL_OVERRIDE 292 KAsync::Job<void> synchronizeWithSource(const Sink::QueryBase &query) Q_DECL_OVERRIDE
293 { 293 {
294 auto job = KAsync::null<void>();
295
296 if (query.type() == ApplicationDomain::getTypeName<ApplicationDomain::Folder>()) { 294 if (query.type() == ApplicationDomain::getTypeName<ApplicationDomain::Folder>()) {
297 auto collectionsFetchJob = new KDAV::DavCollectionsFetchJob(mResourceUrl); 295 auto collectionsFetchJob = new KDAV::DavCollectionsFetchJob(mResourceUrl);
298 job = runJob(collectionsFetchJob).syncThen<void>([this, collectionsFetchJob] { 296 auto job = runJob(collectionsFetchJob).then<void>([this, collectionsFetchJob] {
299 synchronizeAddressbooks(collectionsFetchJob ->collections()); 297 synchronizeAddressbooks(collectionsFetchJob ->collections());
300 }); 298 });
299 return job;
301 } else if (query.type() == ApplicationDomain::getTypeName<ApplicationDomain::Contact>()) { 300 } else if (query.type() == ApplicationDomain::getTypeName<ApplicationDomain::Contact>()) {
302 // for one Collection/Addressbook 301 auto collectionsFetchJob = new KDAV::DavCollectionsFetchJob(mResourceUrl);
303 /* 302 auto job = runJob(collectionsFetchJob).then<KDAV::DavCollection::List>([this, collectionsFetchJob] {
304 auto cache = std::shared:ptr<KDAV::EtagCache>(new KDAV::EtagCache()); 303 synchronizeAddressbooks(collectionsFetchJob ->collections());
305 foreach(const auto &item, collection) { // item is a Sink item 304 return collectionsFetchJob->collections();
306 cache->setEtag(item.remoteID(), item.etag()); 305 })
307 } 306 .serialEach<void>([this](const KDAV::DavCollection &collection) {
308 auto job = KDAV::DavItemsListJob(davCollection.url(), cache); 307 auto collId = collection.url().toDisplayString().toLatin1();
309 job->exec(); 308 auto ctag = collection.CTag().toLatin1();
310 changedItems = job->changedItems(); 309 if (ctag != syncStore().readValue(collId + "_ctag")) {
311 foreach(const auto &item, changedItems) { // item is a DavItem 310 SinkTrace() << "Syncing " << collId;
312 addOrModifyItem(item); 311 auto cache = std::shared_ptr<KDAV::EtagCache>(new KDAV::EtagCache());
313 } 312 auto davItemsListJob = new KDAV::DavItemsListJob(collection.url(), cache);
314 removedItems = job->deletedItems(); 313 const QByteArray bufferType = ENTITY_TYPE_CONTACT;
315 foreach(const auto &item, removedItems) { // item is a DavItem 314 QHash<QByteArray, Query::Comparator> mergeCriteria;
316 deleteSinkItem(item); 315 QByteArrayList ridList;
317 } 316 auto colljob = runJob(davItemsListJob).then<KDAV::DavItem::List>([davItemsListJob] {
318 */ 317 return KAsync::value(davItemsListJob->items());
319 318 })
320 auto cache = std::shared_ptr<KDAV::EtagCache>(new KDAV::EtagCache()); 319 .serialEach<QByteArray>([this, &ridList, bufferType, mergeCriteria] (const KDAV::DavItem &item) {
321 QVector<KDAV::DavUrl> folders; 320 QByteArray rid = item.url().toDisplayString().toUtf8();
322 if (query.hasFilter<ApplicationDomain::Mail::Folder>()) { 321 if (item.etag().toLatin1() != syncStore().readValue(rid + "_etag")){
323 auto folderFilter = query.getFilter<ApplicationDomain::Mail::Folder>(); 322 SinkTrace() << "Updating " << rid;
324 auto localIds = resolveFilter(folderFilter); 323 auto davItemFetchJob = new KDAV::DavItemFetchJob(item);
325 auto folderRemoteIds = syncStore().resolveLocalIds(ApplicationDomain::getTypeName<ApplicationDomain::Folder>(), localIds); 324 auto itemjob = runJob(davItemFetchJob)
326 for (const auto &r : folderRemoteIds) { 325 .then<KDAV::DavItem>([this, davItemFetchJob, bufferType, mergeCriteria] {
327 auto url = QUrl::fromUserInput(r); 326 const auto item = davItemFetchJob->item();
328 url.setUserInfo(mResourceUrl.url().userInfo()); 327 const auto rid = item.url().toDisplayString().toUtf8();
329 folders << KDAV::DavUrl(url, mResourceUrl.protocol()); 328 Sink::ApplicationDomain::Contact contact;
330 } 329 contact.setVcard(item.data());
331 } else { 330 createOrModify(bufferType, rid, contact, mergeCriteria);
332 //return KAsync::null<void>(); 331 return item;
333 auto url = QUrl::fromUserInput("https://apps.kolabnow.com/addressbooks/test1%40kolab.org/9290e784-c876-412f-8385-be292d64b2c6/"); 332 })
334 url.setUserInfo(mResourceUrl.url().userInfo()); 333 .then<QByteArray>([this, &ridList] (const KDAV::DavItem &item) {
335 folders << KDAV::DavUrl(url, mResourceUrl.protocol()); 334 const auto rid = item.url().toDisplayString().toUtf8();
336 } 335 syncStore().writeValue(rid + "_etag", item.etag().toLatin1());
337 const auto folder = folders.first(); 336 //ridList << rid;
338 SinkTrace() << "Syncing " << folder.toDisplayString(); 337 return rid;
339 auto davItemsListJob = new KDAV::DavItemsListJob(folder, cache); 338 });
340 job = runJob(davItemsListJob).syncThen<void>([this, davItemsListJob, folder] { 339 return itemjob;
341 const QByteArray bufferType = ENTITY_TYPE_CONTACT; 340 } else {
342 QHash<QByteArray, Query::Comparator> mergeCriteria; 341 //ridList << rid;
343 QStringList ridList; 342 return KAsync::value(rid);
344 for(const auto &item : davItemsListJob->items()) { 343 }
345 QByteArray rid = item.url().toDisplayString().toUtf8(); 344 })
346 if (item.etag().toLatin1() != syncStore().readValue(rid + "_etag")) { 345 /*.then<void>([this, ridList, bufferType] () {
347 SinkTrace() << "Updating " << rid; 346 scanForRemovals(bufferType,
348 auto davItemFetchJob = new KDAV::DavItemFetchJob(item); 347 [&ridList](const QByteArray &remoteId) -> bool {
349 davItemFetchJob->exec(); 348 return ridList.contains(remoteId);
350 const auto item = davItemFetchJob->item(); 349 });
351 rid = item.url().toDisplayString().toUtf8(); 350 })*/
352 Sink::ApplicationDomain::Contact contact; 351 /*.then<void>([this, bufferType] (const QByteArrayList &ridList) {
353 contact.setVcard(item.data()); 352 scanForRemovals(bufferType,
354 createOrModify(bufferType, rid, contact, mergeCriteria); 353 [&ridList](const QByteArray &remoteId) -> bool {
355 syncStore().writeValue(rid + "_etag", item.etag().toLatin1()); 354 return ridList.contains(remoteId);
356 } 355 });
357 ridList << rid; 356 })*/
357 .then<void>([this, collId, ctag] () {
358 syncStore().writeValue(collId + "_ctag", ctag);
359 });
360 return colljob;
361 } else {
362 return KAsync::null<void>();
358 } 363 }
359
360 scanForRemovals(bufferType,
361 [&ridList](const QByteArray &remoteId) -> bool {
362 return ridList.contains(remoteId);
363 });
364 }); 364 });
365 return job;
366 } else {
367 return KAsync::null<void>();
368 }
365 } 369 }
366 return job;
367}
368 370
369KAsync::Job<QByteArray> replay(const ApplicationDomain::Contact &contact, Sink::Operation operation, const QByteArray &oldRemoteId, const QList<QByteArray> &changedProperties) Q_DECL_OVERRIDE 371KAsync::Job<QByteArray> replay(const ApplicationDomain::Contact &contact, Sink::Operation operation, const QByteArray &oldRemoteId, const QList<QByteArray> &changedProperties) Q_DECL_OVERRIDE
370 { 372 {