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