File indexing completed on 2024-05-05 03:54:25

0001 /*
0002     SPDX-FileCopyrightText: 2009 Grégory Oestreicher <greg@kamago.net>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "groupdavprotocol_p.h"
0008 
0009 #include "common/utils_p.h"
0010 
0011 #include <QDomDocument>
0012 
0013 using namespace KDAV;
0014 
0015 class GroupdavCollectionQueryBuilder : public XMLQueryBuilder
0016 {
0017 public:
0018     QDomDocument buildQuery() const override
0019     {
0020         QDomDocument document;
0021 
0022         QDomElement propfindElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("propfind"));
0023         document.appendChild(propfindElement);
0024 
0025         QDomElement propElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("prop"));
0026         propfindElement.appendChild(propElement);
0027 
0028         propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("displayname")));
0029         propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("resourcetype")));
0030 
0031         return document;
0032     }
0033 
0034     QString mimeType() const override
0035     {
0036         return QString();
0037     }
0038 };
0039 
0040 class GroupdavItemQueryBuilder : public XMLQueryBuilder
0041 {
0042 public:
0043     QDomDocument buildQuery() const override
0044     {
0045         QDomDocument document;
0046 
0047         QDomElement propfindElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("propfind"));
0048         document.appendChild(propfindElement);
0049 
0050         QDomElement propElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("prop"));
0051         propfindElement.appendChild(propElement);
0052 
0053         propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("displayname")));
0054         propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("resourcetype")));
0055         propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("getetag")));
0056 
0057         return document;
0058     }
0059 
0060     QString mimeType() const override
0061     {
0062         return QString();
0063     }
0064 };
0065 
0066 GroupdavProtocol::GroupdavProtocol()
0067 {
0068 }
0069 
0070 bool GroupdavProtocol::supportsPrincipals() const
0071 {
0072     return false;
0073 }
0074 
0075 bool GroupdavProtocol::useReport() const
0076 {
0077     return false;
0078 }
0079 
0080 bool GroupdavProtocol::useMultiget() const
0081 {
0082     return false;
0083 }
0084 
0085 XMLQueryBuilder::Ptr GroupdavProtocol::collectionsQuery() const
0086 {
0087     return XMLQueryBuilder::Ptr(new GroupdavCollectionQueryBuilder());
0088 }
0089 
0090 bool GroupdavProtocol::containsCollection(const QDomElement &propElem) const
0091 {
0092     return !propElem.elementsByTagNameNS(QStringLiteral("http://groupdav.org/"), QStringLiteral("vevent-collection")).isEmpty()
0093         || !propElem.elementsByTagNameNS(QStringLiteral("http://groupdav.org/"), QStringLiteral("vtodo-collection")).isEmpty()
0094         || !propElem.elementsByTagNameNS(QStringLiteral("http://groupdav.org/"), QStringLiteral("vcard-collection")).isEmpty();
0095 }
0096 
0097 QList<XMLQueryBuilder::Ptr> GroupdavProtocol::itemsQueries() const
0098 {
0099     QList<XMLQueryBuilder::Ptr> ret;
0100     ret << XMLQueryBuilder::Ptr(new GroupdavItemQueryBuilder());
0101     return ret;
0102 }
0103 
0104 DavCollection::ContentTypes GroupdavProtocol::collectionContentTypes(const QDomElement &propstatElement) const
0105 {
0106     /*
0107      * Extract the content type information from a propstat like the following
0108      *
0109      *  <propstat>
0110      *    <status>HTTP/1.1 200 OK</status>
0111      *    <prop>
0112      *      <displayname>Tasks</displayname>
0113      *      <resourcetype>
0114      *        <collection/>
0115      *        <G:vtodo-collection xmlns:G="http://groupdav.org/"/>
0116      *      </resourcetype>
0117      *      <getlastmodified>Sat, 30 Jan 2010 17:52:41 -0100</getlastmodified>
0118      *    </prop>
0119      *  </propstat>
0120      */
0121 
0122     const QDomElement propElement = Utils::firstChildElementNS(propstatElement, QStringLiteral("DAV:"), QStringLiteral("prop"));
0123     const QDomElement resourcetypeElement = Utils::firstChildElementNS(propElement, QStringLiteral("DAV:"), QStringLiteral("resourcetype"));
0124 
0125     DavCollection::ContentTypes contentTypes;
0126 
0127     if (!Utils::firstChildElementNS(resourcetypeElement, QStringLiteral("http://groupdav.org/"), QStringLiteral("vevent-collection")).isNull()) {
0128         contentTypes |= DavCollection::Events;
0129     }
0130 
0131     if (!Utils::firstChildElementNS(resourcetypeElement, QStringLiteral("http://groupdav.org/"), QStringLiteral("vtodo-collection")).isNull()) {
0132         contentTypes |= DavCollection::Todos;
0133     }
0134 
0135     if (!Utils::firstChildElementNS(resourcetypeElement, QStringLiteral("http://groupdav.org/"), QStringLiteral("vcard-collection")).isNull()) {
0136         contentTypes |= DavCollection::Contacts;
0137     }
0138 
0139     return contentTypes;
0140 }