1 /*
2 SPDX-FileCopyrightText: 2009 Grégory Oestreicher <greg@kamago.net>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6
7 #include "groupdavprotocol_p.h"
8
9 #include "common/utils_p.h"
10
11 #include <QDomDocument>
12
13 using namespace KDAV;
14
15 class GroupdavCollectionQueryBuilder : public XMLQueryBuilder
16 {
17 public:
buildQuery() const18 QDomDocument buildQuery() const override
19 {
20 QDomDocument document;
21
22 QDomElement propfindElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("propfind"));
23 document.appendChild(propfindElement);
24
25 QDomElement propElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("prop"));
26 propfindElement.appendChild(propElement);
27
28 propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("displayname")));
29 propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("resourcetype")));
30
31 return document;
32 }
33
mimeType() const34 QString mimeType() const override
35 {
36 return QString();
37 }
38 };
39
40 class GroupdavItemQueryBuilder : public XMLQueryBuilder
41 {
42 public:
buildQuery() const43 QDomDocument buildQuery() const override
44 {
45 QDomDocument document;
46
47 QDomElement propfindElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("propfind"));
48 document.appendChild(propfindElement);
49
50 QDomElement propElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("prop"));
51 propfindElement.appendChild(propElement);
52
53 propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("displayname")));
54 propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("resourcetype")));
55 propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("getetag")));
56
57 return document;
58 }
59
mimeType() const60 QString mimeType() const override
61 {
62 return QString();
63 }
64 };
65
GroupdavProtocol()66 GroupdavProtocol::GroupdavProtocol()
67 {
68 }
69
supportsPrincipals() const70 bool GroupdavProtocol::supportsPrincipals() const
71 {
72 return false;
73 }
74
useReport() const75 bool GroupdavProtocol::useReport() const
76 {
77 return false;
78 }
79
useMultiget() const80 bool GroupdavProtocol::useMultiget() const
81 {
82 return false;
83 }
84
collectionsQuery() const85 XMLQueryBuilder::Ptr GroupdavProtocol::collectionsQuery() const
86 {
87 return XMLQueryBuilder::Ptr(new GroupdavCollectionQueryBuilder());
88 }
89
collectionsXQuery() const90 QString GroupdavProtocol::collectionsXQuery() const
91 {
92 const QString query(
93 QStringLiteral("//*[(local-name()='vevent-collection' or local-name()='vtodo-collection' or local-name()='vcard-collection') and "
94 "namespace-uri()='http://groupdav.org/']/ancestor::*[local-name()='response' and namespace-uri()='DAV:']"));
95
96 return query;
97 }
98
itemsQueries() const99 QVector<XMLQueryBuilder::Ptr> GroupdavProtocol::itemsQueries() const
100 {
101 QVector<XMLQueryBuilder::Ptr> ret;
102 ret << XMLQueryBuilder::Ptr(new GroupdavItemQueryBuilder());
103 return ret;
104 }
105
collectionContentTypes(const QDomElement & propstatElement) const106 DavCollection::ContentTypes GroupdavProtocol::collectionContentTypes(const QDomElement &propstatElement) const
107 {
108 /*
109 * Extract the content type information from a propstat like the following
110 *
111 * <propstat>
112 * <status>HTTP/1.1 200 OK</status>
113 * <prop>
114 * <displayname>Tasks</displayname>
115 * <resourcetype>
116 * <collection/>
117 * <G:vtodo-collection xmlns:G="http://groupdav.org/"/>
118 * </resourcetype>
119 * <getlastmodified>Sat, 30 Jan 2010 17:52:41 -0100</getlastmodified>
120 * </prop>
121 * </propstat>
122 */
123
124 const QDomElement propElement = Utils::firstChildElementNS(propstatElement, QStringLiteral("DAV:"), QStringLiteral("prop"));
125 const QDomElement resourcetypeElement = Utils::firstChildElementNS(propElement, QStringLiteral("DAV:"), QStringLiteral("resourcetype"));
126
127 DavCollection::ContentTypes contentTypes;
128
129 if (!Utils::firstChildElementNS(resourcetypeElement, QStringLiteral("http://groupdav.org/"), QStringLiteral("vevent-collection")).isNull()) {
130 contentTypes |= DavCollection::Events;
131 }
132
133 if (!Utils::firstChildElementNS(resourcetypeElement, QStringLiteral("http://groupdav.org/"), QStringLiteral("vtodo-collection")).isNull()) {
134 contentTypes |= DavCollection::Todos;
135 }
136
137 if (!Utils::firstChildElementNS(resourcetypeElement, QStringLiteral("http://groupdav.org/"), QStringLiteral("vcard-collection")).isNull()) {
138 contentTypes |= DavCollection::Contacts;
139 }
140
141 return contentTypes;
142 }
143