KDAV

carddavprotocol.cpp
1/*
2 SPDX-FileCopyrightText: 2010 Tobias Koenig <tokoe@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6
7#include "carddavprotocol_p.h"
8#include "libkdav_debug.h"
9
10#include <QDomDocument>
11#include <QStringList>
12#include <QUrl>
13
14using namespace KDAV;
15
16class CarddavCollectionQueryBuilder : public XMLQueryBuilder
17{
18public:
19 QDomDocument buildQuery() const override
20 {
21 QDomDocument document;
22
23 QDomElement propfindElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("propfind"));
24 document.appendChild(propfindElement);
25
26 QDomElement propElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("prop"));
27 propfindElement.appendChild(propElement);
28
29 propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("displayname")));
30 propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("resourcetype")));
31 propElement.appendChild(document.createElementNS(QStringLiteral("http://calendarserver.org/ns/"), QStringLiteral("getctag")));
32
33 return document;
34 }
35
36 QString mimeType() const override
37 {
38 return QString();
39 }
40};
41
42class CarddavListItemsQueryBuilder : public XMLQueryBuilder
43{
44public:
45 QDomDocument buildQuery() const override
46 {
47 QDomDocument document;
48
49 QDomElement propfindElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("propfind"));
50 document.appendChild(propfindElement);
51
52 QDomElement propElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("prop"));
53 propfindElement.appendChild(propElement);
54
55 propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("displayname")));
56 propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("resourcetype")));
57 propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("getetag")));
58
59 return document;
60 }
61
62 QString mimeType() const override
63 {
64 return QStringLiteral("text/directory");
65 }
66};
67
68class CarddavMultigetQueryBuilder : public XMLQueryBuilder
69{
70public:
71 QDomDocument buildQuery() const override
72 {
73 QDomDocument document;
74 const QStringList urls = parameter(QStringLiteral("urls")).toStringList();
75 if (urls.isEmpty()) {
76 return document;
77 }
78
79 QDomElement multigetElement = document.createElementNS(QStringLiteral("urn:ietf:params:xml:ns:carddav"), QStringLiteral("addressbook-multiget"));
80 document.appendChild(multigetElement);
81
82 QDomElement propElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("prop"));
83 multigetElement.appendChild(propElement);
84
85 propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("getetag")));
86 QDomElement addressDataElement = document.createElementNS(QStringLiteral("urn:ietf:params:xml:ns:carddav"), QStringLiteral("address-data"));
87 addressDataElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("allprop")));
88 propElement.appendChild(addressDataElement);
89
90 for (const QString &url : urls) {
91 QDomElement hrefElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("href"));
92 const QUrl pathUrl = QUrl::fromUserInput(url);
93 qCDebug(KDAV_LOG) << pathUrl.toString() << "->" << pathUrl.path();
94 const QDomText textNode = document.createTextNode(pathUrl.path());
95 hrefElement.appendChild(textNode);
96
97 multigetElement.appendChild(hrefElement);
98 }
99
100 return document;
101 }
102
103 QString mimeType() const override
104 {
105 return QString();
106 }
107};
108
109CarddavProtocol::CarddavProtocol()
110{
111}
112
113bool CarddavProtocol::supportsPrincipals() const
114{
115 return true;
116}
117
118bool CarddavProtocol::useReport() const
119{
120 return false;
121}
122
123bool CarddavProtocol::useMultiget() const
124{
125 return true;
126}
127
128QString CarddavProtocol::principalHomeSet() const
129{
130 return QStringLiteral("addressbook-home-set");
131}
132
133QString CarddavProtocol::principalHomeSetNS() const
134{
135 return QStringLiteral("urn:ietf:params:xml:ns:carddav");
136}
137
138XMLQueryBuilder::Ptr CarddavProtocol::collectionsQuery() const
139{
140 return XMLQueryBuilder::Ptr(new CarddavCollectionQueryBuilder());
141}
142
143bool CarddavProtocol::containsCollection(const QDomElement &propElem) const
144{
145 return !propElem.elementsByTagNameNS(QStringLiteral("urn:ietf:params:xml:ns:carddav"), QStringLiteral("addressbook")).isEmpty();
146}
147
148QList<XMLQueryBuilder::Ptr> CarddavProtocol::itemsQueries() const
149{
151 ret << XMLQueryBuilder::Ptr(new CarddavListItemsQueryBuilder());
152 return ret;
153}
154
155XMLQueryBuilder::Ptr CarddavProtocol::itemsReportQuery(const QStringList &urls) const
156{
157 XMLQueryBuilder::Ptr ret(new CarddavMultigetQueryBuilder());
158 ret->setParameter(QStringLiteral("urls"), urls);
159 return ret;
160}
161
162QString CarddavProtocol::responseNamespace() const
163{
164 return QStringLiteral("urn:ietf:params:xml:ns:carddav");
165}
166
167QString CarddavProtocol::dataTagName() const
168{
169 return QStringLiteral("address-data");
170}
171
172DavCollection::ContentTypes CarddavProtocol::collectionContentTypes(const QDomElement &) const
173{
175}
@ Contacts
The collection can contain contact DAV resources.
The KDAV namespace.
QDomElement createElementNS(const QString &nsURI, const QString &qName)
QDomText createTextNode(const QString &value)
QDomNodeList elementsByTagNameNS(const QString &nsURI, const QString &localName) const const
QDomNode appendChild(const QDomNode &newChild)
bool isEmpty() const const
bool isEmpty() const const
QUrl fromUserInput(const QString &userInput, const QString &workingDirectory, UserInputResolutionOptions options)
QString path(ComponentFormattingOptions options) const const
QString toString(FormattingOptions options) const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Feb 28 2025 11:51:48 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.