1 /* 2 * Copyright (C) 2008-2021 The QXmpp developers 3 * 4 * Author: 5 * Niels Ole Salscheider 6 * 7 * Source: 8 * https://github.com/qxmpp-project/qxmpp 9 * 10 * This file is a part of QXmpp library. 11 * 12 * This library is free software; you can redistribute it and/or 13 * modify it under the terms of the GNU Lesser General Public 14 * License as published by the Free Software Foundation; either 15 * version 2.1 of the License, or (at your option) any later version. 16 * 17 * This library is distributed in the hope that it will be useful, 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20 * Lesser General Public License for more details. 21 * 22 */ 23 24 #include "QXmppMamIq.h" 25 26 #include "QXmppConstants_p.h" 27 28 #include <QDomElement> 29 30 class QXmppMamQueryIqPrivate : public QSharedData 31 { 32 public: 33 QXmppDataForm form; 34 QXmppResultSetQuery resultSetQuery; 35 QString node; 36 QString queryId; 37 }; 38 QXmppMamQueryIq()39QXmppMamQueryIq::QXmppMamQueryIq() 40 : QXmppIq(QXmppIq::Set), 41 d(new QXmppMamQueryIqPrivate) 42 { 43 } 44 45 QXmppMamQueryIq::QXmppMamQueryIq(const QXmppMamQueryIq &) = default; 46 47 QXmppMamQueryIq::~QXmppMamQueryIq() = default; 48 49 QXmppMamQueryIq &QXmppMamQueryIq::operator=(const QXmppMamQueryIq &) = default; 50 51 /// Returns the form that specifies the query. form() const52QXmppDataForm QXmppMamQueryIq::form() const 53 { 54 return d->form; 55 } 56 57 /// Sets the data form that specifies the query. 58 /// 59 /// \param form The data form. setForm(const QXmppDataForm & form)60void QXmppMamQueryIq::setForm(const QXmppDataForm &form) 61 { 62 d->form = form; 63 } 64 65 /// Returns the result set query for result set management. resultSetQuery() const66QXmppResultSetQuery QXmppMamQueryIq::resultSetQuery() const 67 { 68 return d->resultSetQuery; 69 } 70 71 /// Sets the result set query for result set management. 72 /// 73 /// \param resultSetQuery The result set query. setResultSetQuery(const QXmppResultSetQuery & resultSetQuery)74void QXmppMamQueryIq::setResultSetQuery(const QXmppResultSetQuery &resultSetQuery) 75 { 76 d->resultSetQuery = resultSetQuery; 77 } 78 79 /// Returns the node to query. node() const80QString QXmppMamQueryIq::node() const 81 { 82 return d->node; 83 } 84 85 /// Sets the node to query. 86 /// 87 /// \param node The node to query. setNode(const QString & node)88void QXmppMamQueryIq::setNode(const QString &node) 89 { 90 d->node = node; 91 } 92 93 /// Returns the queryid that will be included in the results. queryId() const94QString QXmppMamQueryIq::queryId() const 95 { 96 return d->queryId; 97 } 98 99 /// Sets the queryid that will be included in the results. 100 /// 101 /// \param id The query id. setQueryId(const QString & id)102void QXmppMamQueryIq::setQueryId(const QString &id) 103 { 104 d->queryId = id; 105 } 106 107 /// \cond isMamQueryIq(const QDomElement & element)108bool QXmppMamQueryIq::isMamQueryIq(const QDomElement &element) 109 { 110 if (element.tagName() == QStringLiteral("iq")) { 111 QDomElement queryElement = element.firstChildElement(QStringLiteral("query")); 112 if (!queryElement.isNull() && queryElement.namespaceURI() == ns_mam) { 113 return true; 114 } 115 } 116 return false; 117 } 118 parseElementFromChild(const QDomElement & element)119void QXmppMamQueryIq::parseElementFromChild(const QDomElement &element) 120 { 121 QDomElement queryElement = element.firstChildElement(QStringLiteral("query")); 122 d->node = queryElement.attribute(QStringLiteral("node")); 123 d->queryId = queryElement.attribute(QStringLiteral("queryId")); 124 QDomElement resultSetElement = queryElement.firstChildElement(QStringLiteral("set")); 125 if (!resultSetElement.isNull()) { 126 d->resultSetQuery.parse(resultSetElement); 127 } 128 QDomElement formElement = queryElement.firstChildElement(QStringLiteral("x")); 129 if (!formElement.isNull()) { 130 d->form.parse(formElement); 131 } 132 } 133 toXmlElementFromChild(QXmlStreamWriter * writer) const134void QXmppMamQueryIq::toXmlElementFromChild(QXmlStreamWriter *writer) const 135 { 136 writer->writeStartElement(QStringLiteral("query")); 137 writer->writeDefaultNamespace(ns_mam); 138 if (!d->node.isEmpty()) { 139 writer->writeAttribute(QStringLiteral("node"), d->node); 140 } 141 if (!d->queryId.isEmpty()) { 142 writer->writeAttribute(QStringLiteral("queryid"), d->queryId); 143 } 144 d->form.toXml(writer); 145 d->resultSetQuery.toXml(writer); 146 writer->writeEndElement(); 147 } 148 /// \endcond 149 150 class QXmppMamResultIqPrivate : public QSharedData 151 { 152 public: 153 QXmppResultSetReply resultSetReply; 154 bool complete; 155 }; 156 QXmppMamResultIq()157QXmppMamResultIq::QXmppMamResultIq() 158 : d(new QXmppMamResultIqPrivate) 159 { 160 d->complete = false; 161 } 162 163 QXmppMamResultIq::QXmppMamResultIq(const QXmppMamResultIq &) = default; 164 165 QXmppMamResultIq::~QXmppMamResultIq() = default; 166 167 QXmppMamResultIq &QXmppMamResultIq::operator=(const QXmppMamResultIq &) = default; 168 169 /// Returns the result set reply for result set management. resultSetReply() const170QXmppResultSetReply QXmppMamResultIq::resultSetReply() const 171 { 172 return d->resultSetReply; 173 } 174 175 /// Sets the result set reply for result set management setResultSetReply(const QXmppResultSetReply & resultSetReply)176void QXmppMamResultIq::setResultSetReply(const QXmppResultSetReply &resultSetReply) 177 { 178 d->resultSetReply = resultSetReply; 179 } 180 181 /// Returns true if the results returned by the server are complete (not 182 /// limited by the server). complete() const183bool QXmppMamResultIq::complete() const 184 { 185 return d->complete; 186 } 187 188 /// Sets if the results returned by the server are complete (not limited by the 189 /// server). setComplete(bool complete)190void QXmppMamResultIq::setComplete(bool complete) 191 { 192 d->complete = complete; 193 } 194 195 /// \cond isMamResultIq(const QDomElement & element)196bool QXmppMamResultIq::isMamResultIq(const QDomElement &element) 197 { 198 if (element.tagName() == QStringLiteral("iq")) { 199 QDomElement finElement = element.firstChildElement(QStringLiteral("fin")); 200 if (!finElement.isNull() && finElement.namespaceURI() == ns_mam) { 201 return true; 202 } 203 } 204 return false; 205 } 206 parseElementFromChild(const QDomElement & element)207void QXmppMamResultIq::parseElementFromChild(const QDomElement &element) 208 { 209 QDomElement finElement = element.firstChildElement(QStringLiteral("fin")); 210 d->complete = finElement.attribute(QStringLiteral("complete")) == QStringLiteral("true"); 211 QDomElement resultSetElement = finElement.firstChildElement(QStringLiteral("set")); 212 if (!resultSetElement.isNull()) { 213 d->resultSetReply.parse(resultSetElement); 214 } 215 } 216 toXmlElementFromChild(QXmlStreamWriter * writer) const217void QXmppMamResultIq::toXmlElementFromChild(QXmlStreamWriter *writer) const 218 { 219 writer->writeStartElement(QStringLiteral("fin")); 220 writer->writeDefaultNamespace(ns_mam); 221 if (d->complete) { 222 writer->writeAttribute(QStringLiteral("complete"), QStringLiteral("true")); 223 } 224 d->resultSetReply.toXml(writer); 225 writer->writeEndElement(); 226 } 227 /// \endcond 228