File indexing completed on 2024-05-19 07:42:53
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 }