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

0001 /*
0002     SPDX-FileCopyrightText: 2010 Tobias Koenig <tokoe@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "carddavprotocol_p.h"
0008 
0009 #include <QDomDocument>
0010 #include <QStringList>
0011 #include <QUrl>
0012 
0013 using namespace KDAV;
0014 
0015 class CarddavCollectionQueryBuilder : 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         propElement.appendChild(document.createElementNS(QStringLiteral("http://calendarserver.org/ns/"), QStringLiteral("getctag")));
0031 
0032         return document;
0033     }
0034 
0035     QString mimeType() const override
0036     {
0037         return QString();
0038     }
0039 };
0040 
0041 class CarddavListItemsQueryBuilder : public XMLQueryBuilder
0042 {
0043 public:
0044     QDomDocument buildQuery() const override
0045     {
0046         QDomDocument document;
0047 
0048         QDomElement propfindElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("propfind"));
0049         document.appendChild(propfindElement);
0050 
0051         QDomElement propElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("prop"));
0052         propfindElement.appendChild(propElement);
0053 
0054         propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("displayname")));
0055         propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("resourcetype")));
0056         propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("getetag")));
0057 
0058         return document;
0059     }
0060 
0061     QString mimeType() const override
0062     {
0063         return QStringLiteral("text/directory");
0064     }
0065 };
0066 
0067 class CarddavMultigetQueryBuilder : public XMLQueryBuilder
0068 {
0069 public:
0070     QDomDocument buildQuery() const override
0071     {
0072         QDomDocument document;
0073         const QStringList urls = parameter(QStringLiteral("urls")).toStringList();
0074         if (urls.isEmpty()) {
0075             return document;
0076         }
0077 
0078         QDomElement multigetElement = document.createElementNS(QStringLiteral("urn:ietf:params:xml:ns:carddav"), QStringLiteral("addressbook-multiget"));
0079         document.appendChild(multigetElement);
0080 
0081         QDomElement propElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("prop"));
0082         multigetElement.appendChild(propElement);
0083 
0084         propElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("getetag")));
0085         QDomElement addressDataElement = document.createElementNS(QStringLiteral("urn:ietf:params:xml:ns:carddav"), QStringLiteral("address-data"));
0086         addressDataElement.appendChild(document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("allprop")));
0087         propElement.appendChild(addressDataElement);
0088 
0089         for (const QString &url : urls) {
0090             QDomElement hrefElement = document.createElementNS(QStringLiteral("DAV:"), QStringLiteral("href"));
0091             const QUrl pathUrl = QUrl::fromUserInput(url);
0092             const QDomText textNode = document.createTextNode(pathUrl.toString());
0093             hrefElement.appendChild(textNode);
0094 
0095             multigetElement.appendChild(hrefElement);
0096         }
0097 
0098         return document;
0099     }
0100 
0101     QString mimeType() const override
0102     {
0103         return QString();
0104     }
0105 };
0106 
0107 CarddavProtocol::CarddavProtocol()
0108 {
0109 }
0110 
0111 bool CarddavProtocol::supportsPrincipals() const
0112 {
0113     return true;
0114 }
0115 
0116 bool CarddavProtocol::useReport() const
0117 {
0118     return false;
0119 }
0120 
0121 bool CarddavProtocol::useMultiget() const
0122 {
0123     return true;
0124 }
0125 
0126 QString CarddavProtocol::principalHomeSet() const
0127 {
0128     return QStringLiteral("addressbook-home-set");
0129 }
0130 
0131 QString CarddavProtocol::principalHomeSetNS() const
0132 {
0133     return QStringLiteral("urn:ietf:params:xml:ns:carddav");
0134 }
0135 
0136 XMLQueryBuilder::Ptr CarddavProtocol::collectionsQuery() const
0137 {
0138     return XMLQueryBuilder::Ptr(new CarddavCollectionQueryBuilder());
0139 }
0140 
0141 bool CarddavProtocol::containsCollection(const QDomElement &propElem) const
0142 {
0143     return !propElem.elementsByTagNameNS(QStringLiteral("urn:ietf:params:xml:ns:carddav"), QStringLiteral("addressbook")).isEmpty();
0144 }
0145 
0146 QList<XMLQueryBuilder::Ptr> CarddavProtocol::itemsQueries() const
0147 {
0148     QList<XMLQueryBuilder::Ptr> ret;
0149     ret << XMLQueryBuilder::Ptr(new CarddavListItemsQueryBuilder());
0150     return ret;
0151 }
0152 
0153 XMLQueryBuilder::Ptr CarddavProtocol::itemsReportQuery(const QStringList &urls) const
0154 {
0155     XMLQueryBuilder::Ptr ret(new CarddavMultigetQueryBuilder());
0156     ret->setParameter(QStringLiteral("urls"), urls);
0157     return ret;
0158 }
0159 
0160 QString CarddavProtocol::responseNamespace() const
0161 {
0162     return QStringLiteral("urn:ietf:params:xml:ns:carddav");
0163 }
0164 
0165 QString CarddavProtocol::dataTagName() const
0166 {
0167     return QStringLiteral("address-data");
0168 }
0169 
0170 DavCollection::ContentTypes CarddavProtocol::collectionContentTypes(const QDomElement &) const
0171 {
0172     return DavCollection::Contacts;
0173 }