diff options
author | Sandro Knauß <sknauss@kde.org> | 2017-01-30 13:10:54 +0100 |
---|---|---|
committer | Sandro Knauß <sknauss@kde.org> | 2017-01-30 13:11:04 +0100 |
commit | 67a4e5d32d35afefee88eef365b3e22e3389adfb (patch) | |
tree | 50f5099c841f22902780e90d471b0544aa32e7f7 /examples | |
parent | e61b0ab5a8eb3b5014892b9fd5ad26ebe57bccf5 (diff) | |
download | sink-67a4e5d32d35afefee88eef365b3e22e3389adfb.tar.gz sink-67a4e5d32d35afefee88eef365b3e22e3389adfb.zip |
sync contacts with kasync
Diffstat (limited to 'examples')
-rw-r--r-- | examples/davresource/davresource.cpp | 136 |
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 | ||
369 | KAsync::Job<QByteArray> replay(const ApplicationDomain::Contact &contact, Sink::Operation operation, const QByteArray &oldRemoteId, const QList<QByteArray> &changedProperties) Q_DECL_OVERRIDE | 371 | KAsync::Job<QByteArray> replay(const ApplicationDomain::Contact &contact, Sink::Operation operation, const QByteArray &oldRemoteId, const QList<QByteArray> &changedProperties) Q_DECL_OVERRIDE |
370 | { | 372 | { |