From afe656a428129d52675f9fecc11af330fea1d4c4 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 2 Aug 2018 19:49:50 +0200 Subject: Carddav changereplay --- examples/carddavresource/carddavresource.cpp | 39 ++++++++++++++++++++- examples/carddavresource/tests/CMakeLists.txt | 2 +- examples/carddavresource/tests/carddavtest.cpp | 48 ++++++++++++++++++++++++-- 3 files changed, 85 insertions(+), 4 deletions(-) diff --git a/examples/carddavresource/carddavresource.cpp b/examples/carddavresource/carddavresource.cpp index fc2b946..0bf851b 100644 --- a/examples/carddavresource/carddavresource.cpp +++ b/examples/carddavresource/carddavresource.cpp @@ -94,7 +94,44 @@ protected: KAsync::Job replay(const ApplicationDomain::Contact &contact, Sink::Operation operation, const QByteArray &oldRemoteId, const QList &changedProperties) Q_DECL_OVERRIDE { - return KAsync::null(); + SinkLog() << "Replaying to:" << serverUrl().url(); + switch (operation) { + case Sink::Operation_Creation: { + const auto vcard = contact.getVcard(); + if (vcard.isEmpty()) { + return KAsync::error("No vcard in item for creation replay."); + } + + auto collectionId = syncStore().resolveLocalId(ENTITY_TYPE_ADDRESSBOOK, contact.getAddressbook()); + + KDAV2::DavItem remoteItem; + remoteItem.setData(vcard); + remoteItem.setContentType("text/vcard"); + remoteItem.setUrl(urlOf(collectionId, contact.getUid())); + SinkLog() << "Creating:" << contact.getUid() << remoteItem.url().url() << vcard; + return createItem(remoteItem).then([=] { return resourceID(remoteItem); }); + } + case Sink::Operation_Removal: { + // We only need the URL in the DAV item for removal + KDAV2::DavItem remoteItem; + remoteItem.setUrl(urlOf(oldRemoteId)); + + SinkLog() << "Removing:" << oldRemoteId; + return removeItem(remoteItem).then([] { return QByteArray{}; }); + } + case Sink::Operation_Modification: + const auto vcard = contact.getVcard(); + if (vcard.isEmpty()) { + return KAsync::error("No ICal in item for modification replay"); + } + + KDAV2::DavItem remoteItem; + remoteItem.setData(vcard); + remoteItem.setContentType("text/vcard"); + remoteItem.setUrl(urlOf(oldRemoteId)); + + return modifyItem(remoteItem).then([=] { return oldRemoteId; }); + } } KAsync::Job replay(const ApplicationDomain::Addressbook &addressbook, Sink::Operation operation, const QByteArray &oldRemoteId, const QList &changedProperties) Q_DECL_OVERRIDE diff --git a/examples/carddavresource/tests/CMakeLists.txt b/examples/carddavresource/tests/CMakeLists.txt index e7e8c18..e59665e 100644 --- a/examples/carddavresource/tests/CMakeLists.txt +++ b/examples/carddavresource/tests/CMakeLists.txt @@ -6,4 +6,4 @@ include(SinkTest) auto_tests ( carddavtest ) -target_link_libraries(carddavtest sink_resource_carddav) +target_link_libraries(carddavtest sink_resource_carddav KF5::Contacts) diff --git a/examples/carddavresource/tests/carddavtest.cpp b/examples/carddavresource/tests/carddavtest.cpp index 6e7cf01..b0f41d1 100644 --- a/examples/carddavresource/tests/carddavtest.cpp +++ b/examples/carddavresource/tests/carddavtest.cpp @@ -12,10 +12,12 @@ #include #include #include +#include +#include -using Sink::ApplicationDomain::Calendar; -using Sink::ApplicationDomain::Event; +using Sink::ApplicationDomain::Addressbook; +using Sink::ApplicationDomain::Contact; using Sink::ApplicationDomain::SinkResource; class CardDavTest : public QObject @@ -109,6 +111,48 @@ private slots: QCOMPARE(contacts.size(), 2); } } + + void testSyncAddressbooks() + { + Sink::SyncScope scope; + scope.setType(); + scope.resourceFilter(mResourceInstanceIdentifier); + + VERIFYEXEC(Sink::Store::synchronize(scope)); + VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier)); + const auto addressbooks = Sink::Store::read(Sink::Query().resourceFilter(mResourceInstanceIdentifier)); + QCOMPARE(addressbooks.size(), 1); + } + + void testAddContact() + { + Sink::SyncScope scope; + scope.setType(); + scope.resourceFilter(mResourceInstanceIdentifier); + + VERIFYEXEC(Sink::Store::synchronize(scope)); + VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier)); + + auto addressbooks = Sink::Store::read(Sink::Query().resourceFilter(mResourceInstanceIdentifier)); + QVERIFY(!addressbooks.isEmpty()); + + KContacts::Addressee addressee; + addressee.setGivenName("John"); + addressee.setFamilyName("Doe"); + addressee.setFormattedName("John Doe"); + KContacts::VCardConverter converter; + const auto vcard = converter.createVCard(addressee, KContacts::VCardConverter::v3_0); + + Contact contact(mResourceInstanceIdentifier); + contact.setVcard(vcard); + contact.setAddressbook(addressbooks.first()); + + VERIFYEXEC(Sink::Store::create(contact)); + VERIFYEXEC(Sink::ResourceControl::flushReplayQueue(mResourceInstanceIdentifier)); + + auto contacts = Sink::Store::read({}); + QVERIFY(!contacts.isEmpty()); + } }; QTEST_MAIN(CardDavTest) -- cgit v1.2.3