From 67a4e5d32d35afefee88eef365b3e22e3389adfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Knau=C3=9F?= Date: Mon, 30 Jan 2017 13:10:54 +0100 Subject: sync contacts with kasync --- examples/davresource/davresource.cpp | 136 ++++++++++++++++++----------------- 1 file changed, 69 insertions(+), 67 deletions(-) (limited to 'examples/davresource/davresource.cpp') 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 @@ #include #include +#include #include #include #include @@ -283,7 +284,6 @@ public: list << Synchronizer::SyncRequest{query}; } else { //We want to synchronize everything - list << Synchronizer::SyncRequest{Sink::QueryBase(ApplicationDomain::getTypeName())}; list << Synchronizer::SyncRequest{Sink::QueryBase(ApplicationDomain::getTypeName())}; } return list; @@ -291,80 +291,82 @@ public: KAsync::Job synchronizeWithSource(const Sink::QueryBase &query) Q_DECL_OVERRIDE { - auto job = KAsync::null(); - if (query.type() == ApplicationDomain::getTypeName()) { auto collectionsFetchJob = new KDAV::DavCollectionsFetchJob(mResourceUrl); - job = runJob(collectionsFetchJob).syncThen([this, collectionsFetchJob] { + auto job = runJob(collectionsFetchJob).then([this, collectionsFetchJob] { synchronizeAddressbooks(collectionsFetchJob ->collections()); }); + return job; } else if (query.type() == ApplicationDomain::getTypeName()) { - // for one Collection/Addressbook - /* - auto cache = std::shared:ptr(new KDAV::EtagCache()); - foreach(const auto &item, collection) { // item is a Sink item - cache->setEtag(item.remoteID(), item.etag()); - } - auto job = KDAV::DavItemsListJob(davCollection.url(), cache); - job->exec(); - changedItems = job->changedItems(); - foreach(const auto &item, changedItems) { // item is a DavItem - addOrModifyItem(item); - } - removedItems = job->deletedItems(); - foreach(const auto &item, removedItems) { // item is a DavItem - deleteSinkItem(item); - } - */ - - auto cache = std::shared_ptr(new KDAV::EtagCache()); - QVector folders; - if (query.hasFilter()) { - auto folderFilter = query.getFilter(); - auto localIds = resolveFilter(folderFilter); - auto folderRemoteIds = syncStore().resolveLocalIds(ApplicationDomain::getTypeName(), localIds); - for (const auto &r : folderRemoteIds) { - auto url = QUrl::fromUserInput(r); - url.setUserInfo(mResourceUrl.url().userInfo()); - folders << KDAV::DavUrl(url, mResourceUrl.protocol()); - } - } else { - //return KAsync::null(); - auto url = QUrl::fromUserInput("https://apps.kolabnow.com/addressbooks/test1%40kolab.org/9290e784-c876-412f-8385-be292d64b2c6/"); - url.setUserInfo(mResourceUrl.url().userInfo()); - folders << KDAV::DavUrl(url, mResourceUrl.protocol()); - } - const auto folder = folders.first(); - SinkTrace() << "Syncing " << folder.toDisplayString(); - auto davItemsListJob = new KDAV::DavItemsListJob(folder, cache); - job = runJob(davItemsListJob).syncThen([this, davItemsListJob, folder] { - const QByteArray bufferType = ENTITY_TYPE_CONTACT; - QHash mergeCriteria; - QStringList ridList; - for(const auto &item : davItemsListJob->items()) { - QByteArray rid = item.url().toDisplayString().toUtf8(); - if (item.etag().toLatin1() != syncStore().readValue(rid + "_etag")) { - SinkTrace() << "Updating " << rid; - auto davItemFetchJob = new KDAV::DavItemFetchJob(item); - davItemFetchJob->exec(); - const auto item = davItemFetchJob->item(); - rid = item.url().toDisplayString().toUtf8(); - Sink::ApplicationDomain::Contact contact; - contact.setVcard(item.data()); - createOrModify(bufferType, rid, contact, mergeCriteria); - syncStore().writeValue(rid + "_etag", item.etag().toLatin1()); - } - ridList << rid; + auto collectionsFetchJob = new KDAV::DavCollectionsFetchJob(mResourceUrl); + auto job = runJob(collectionsFetchJob).then([this, collectionsFetchJob] { + synchronizeAddressbooks(collectionsFetchJob ->collections()); + return collectionsFetchJob->collections(); + }) + .serialEach([this](const KDAV::DavCollection &collection) { + auto collId = collection.url().toDisplayString().toLatin1(); + auto ctag = collection.CTag().toLatin1(); + if (ctag != syncStore().readValue(collId + "_ctag")) { + SinkTrace() << "Syncing " << collId; + auto cache = std::shared_ptr(new KDAV::EtagCache()); + auto davItemsListJob = new KDAV::DavItemsListJob(collection.url(), cache); + const QByteArray bufferType = ENTITY_TYPE_CONTACT; + QHash mergeCriteria; + QByteArrayList ridList; + auto colljob = runJob(davItemsListJob).then([davItemsListJob] { + return KAsync::value(davItemsListJob->items()); + }) + .serialEach([this, &ridList, bufferType, mergeCriteria] (const KDAV::DavItem &item) { + QByteArray rid = item.url().toDisplayString().toUtf8(); + if (item.etag().toLatin1() != syncStore().readValue(rid + "_etag")){ + SinkTrace() << "Updating " << rid; + auto davItemFetchJob = new KDAV::DavItemFetchJob(item); + auto itemjob = runJob(davItemFetchJob) + .then([this, davItemFetchJob, bufferType, mergeCriteria] { + const auto item = davItemFetchJob->item(); + const auto rid = item.url().toDisplayString().toUtf8(); + Sink::ApplicationDomain::Contact contact; + contact.setVcard(item.data()); + createOrModify(bufferType, rid, contact, mergeCriteria); + return item; + }) + .then([this, &ridList] (const KDAV::DavItem &item) { + const auto rid = item.url().toDisplayString().toUtf8(); + syncStore().writeValue(rid + "_etag", item.etag().toLatin1()); + //ridList << rid; + return rid; + }); + return itemjob; + } else { + //ridList << rid; + return KAsync::value(rid); + } + }) + /*.then([this, ridList, bufferType] () { + scanForRemovals(bufferType, + [&ridList](const QByteArray &remoteId) -> bool { + return ridList.contains(remoteId); + }); + })*/ + /*.then([this, bufferType] (const QByteArrayList &ridList) { + scanForRemovals(bufferType, + [&ridList](const QByteArray &remoteId) -> bool { + return ridList.contains(remoteId); + }); + })*/ + .then([this, collId, ctag] () { + syncStore().writeValue(collId + "_ctag", ctag); + }); + return colljob; + } else { + return KAsync::null(); } - - scanForRemovals(bufferType, - [&ridList](const QByteArray &remoteId) -> bool { - return ridList.contains(remoteId); - }); }); + return job; + } else { + return KAsync::null(); + } } - return job; -} KAsync::Job replay(const ApplicationDomain::Contact &contact, Sink::Operation operation, const QByteArray &oldRemoteId, const QList &changedProperties) Q_DECL_OVERRIDE { -- cgit v1.2.3