summaryrefslogtreecommitdiffstats
path: root/examples/carddavresource/carddavresource.cpp
diff options
context:
space:
mode:
authorRémi Nicole <nicole@kolabsystems.com>2018-03-27 18:26:11 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2018-03-27 18:26:15 +0200
commit761328989492db9bd603c2d7f1134d20e485d2f6 (patch)
tree0e3b4517dd2000fb1cc2738bbb22a3e54dfffb6f /examples/carddavresource/carddavresource.cpp
parent80afd7070f2d8e57cab2fe55fef611623fdb75f0 (diff)
downloadsink-761328989492db9bd603c2d7f1134d20e485d2f6.tar.gz
sink-761328989492db9bd603c2d7f1134d20e485d2f6.zip
Add CalDAV support
Summary: Notes: - Add a `webdavcommon` folder for WebDAV generic resource code - Move `davresource` to `carddaveresource` and make it use the WebDAV code - For now it tests the CalDAV resource directly on KolabNow (to be changed) - Only synchronization, not adding / changing / removing WebDAV collections or items (to be implemented) - Only events are currently supported (todo, freebusy, etc. are to be implemented but should be straightforward) Fixes T8224 Reviewers: cmollekopf Tags: #sink Maniphest Tasks: T8224 Differential Revision: https://phabricator.kde.org/D11741
Diffstat (limited to 'examples/carddavresource/carddavresource.cpp')
-rw-r--r--examples/carddavresource/carddavresource.cpp147
1 files changed, 147 insertions, 0 deletions
diff --git a/examples/carddavresource/carddavresource.cpp b/examples/carddavresource/carddavresource.cpp
new file mode 100644
index 0000000..fc2b946
--- /dev/null
+++ b/examples/carddavresource/carddavresource.cpp
@@ -0,0 +1,147 @@
1/*
2 * Copyright (C) 2015 Christian Mollekopf <chrigi_1@fastmail.fm>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the
16 * Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20#include "carddavresource.h"
21
22#include "../webdavcommon/webdav.h"
23
24#include "facade.h"
25#include "resourceconfig.h"
26#include "log.h"
27#include "definitions.h"
28#include "synchronizer.h"
29#include "inspector.h"
30
31#include "facadefactory.h"
32#include "adaptorfactoryregistry.h"
33
34#include "contactpreprocessor.h"
35
36//This is the resources entity type, and not the domain type
37#define ENTITY_TYPE_CONTACT "contact"
38#define ENTITY_TYPE_ADDRESSBOOK "addressbook"
39
40using namespace Sink;
41
42class ContactSynchronizer : public WebDavSynchronizer
43{
44public:
45 ContactSynchronizer(const Sink::ResourceContext &resourceContext)
46 : WebDavSynchronizer(resourceContext, KDAV2::CardDav,
47 ApplicationDomain::getTypeName<ApplicationDomain::Addressbook>(),
48 ApplicationDomain::getTypeName<ApplicationDomain::Contact>())
49 {}
50 QByteArray createAddressbook(const QString &addressbookName, const QString &addressbookPath, const QString &parentAddressbookRid)
51 {
52 SinkTrace() << "Creating addressbook: " << addressbookName << parentAddressbookRid;
53 const auto remoteId = addressbookPath.toUtf8();
54 const auto bufferType = ENTITY_TYPE_ADDRESSBOOK;
55 Sink::ApplicationDomain::Addressbook addressbook;
56 addressbook.setName(addressbookName);
57 QHash<QByteArray, Query::Comparator> mergeCriteria;
58
59 if (!parentAddressbookRid.isEmpty()) {
60 addressbook.setParent(syncStore().resolveRemoteId(ENTITY_TYPE_ADDRESSBOOK, parentAddressbookRid.toUtf8()));
61 }
62 createOrModify(bufferType, remoteId, addressbook, mergeCriteria);
63 return remoteId;
64 }
65
66protected:
67 void updateLocalCollections(KDAV2::DavCollection::List addressbookList) Q_DECL_OVERRIDE
68 {
69 const QByteArray bufferType = ENTITY_TYPE_ADDRESSBOOK;
70 SinkTrace() << "Found" << addressbookList.size() << "addressbooks";
71
72 for (const auto &f : addressbookList) {
73 const auto &rid = resourceID(f);
74 SinkLog() << "Found addressbook:" << rid << f.displayName();
75 createAddressbook(f.displayName(), rid, "");
76 }
77 }
78
79 void updateLocalItem(KDAV2::DavItem remoteContact, const QByteArray &addressbookLocalId) Q_DECL_OVERRIDE
80 {
81 Sink::ApplicationDomain::Contact localContact;
82
83 localContact.setVcard(remoteContact.data());
84 localContact.setAddressbook(addressbookLocalId);
85
86 QHash<QByteArray, Query::Comparator> mergeCriteria;
87 createOrModify(ENTITY_TYPE_CONTACT, resourceID(remoteContact), localContact, mergeCriteria);
88 }
89
90 QByteArray collectionLocalResourceID(const KDAV2::DavCollection &addressbook) Q_DECL_OVERRIDE
91 {
92 return syncStore().resolveRemoteId(ENTITY_TYPE_ADDRESSBOOK, resourceID(addressbook));
93 }
94
95 KAsync::Job<QByteArray> replay(const ApplicationDomain::Contact &contact, Sink::Operation operation, const QByteArray &oldRemoteId, const QList<QByteArray> &changedProperties) Q_DECL_OVERRIDE
96 {
97 return KAsync::null<QByteArray>();
98 }
99
100 KAsync::Job<QByteArray> replay(const ApplicationDomain::Addressbook &addressbook, Sink::Operation operation, const QByteArray &oldRemoteId, const QList<QByteArray> &changedProperties) Q_DECL_OVERRIDE
101 {
102 return KAsync::null<QByteArray>();
103 }
104};
105
106
107CardDavResource::CardDavResource(const Sink::ResourceContext &resourceContext)
108 : Sink::GenericResource(resourceContext)
109{
110 auto synchronizer = QSharedPointer<ContactSynchronizer>::create(resourceContext);
111 setupSynchronizer(synchronizer);
112
113 setupPreprocessors(ENTITY_TYPE_CONTACT, QVector<Sink::Preprocessor*>() << new ContactPropertyExtractor);
114}
115
116
117CardDavResourceFactory::CardDavResourceFactory(QObject *parent)
118 : Sink::ResourceFactory(parent,
119 {Sink::ApplicationDomain::ResourceCapabilities::Contact::contact,
120 Sink::ApplicationDomain::ResourceCapabilities::Contact::addressbook,
121 Sink::ApplicationDomain::ResourceCapabilities::Contact::storage
122 }
123 )
124{
125}
126
127Sink::Resource *CardDavResourceFactory::createResource(const ResourceContext &context)
128{
129 return new CardDavResource(context);
130}
131
132void CardDavResourceFactory::registerFacades(const QByteArray &name, Sink::FacadeFactory &factory)
133{
134 factory.registerFacade<ApplicationDomain::Contact, DefaultFacade<ApplicationDomain::Contact>>(name);
135 factory.registerFacade<ApplicationDomain::Addressbook, DefaultFacade<ApplicationDomain::Addressbook>>(name);
136}
137
138void CardDavResourceFactory::registerAdaptorFactories(const QByteArray &name, Sink::AdaptorFactoryRegistry &registry)
139{
140 registry.registerFactory<ApplicationDomain::Contact, DefaultAdaptorFactory<ApplicationDomain::Contact>>(name);
141 registry.registerFactory<ApplicationDomain::Addressbook, DefaultAdaptorFactory<ApplicationDomain::Addressbook>>(name);
142}
143
144void CardDavResourceFactory::removeDataFromDisk(const QByteArray &instanceIdentifier)
145{
146 CardDavResource::removeFromDisk(instanceIdentifier);
147}