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()39 QXmppMamQueryIq::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() const52 QXmppDataForm 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)60 void QXmppMamQueryIq::setForm(const QXmppDataForm &form)
61 {
62     d->form = form;
63 }
64 
65 /// Returns the result set query for result set management.
resultSetQuery() const66 QXmppResultSetQuery 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)74 void QXmppMamQueryIq::setResultSetQuery(const QXmppResultSetQuery &resultSetQuery)
75 {
76     d->resultSetQuery = resultSetQuery;
77 }
78 
79 /// Returns the node to query.
node() const80 QString 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)88 void QXmppMamQueryIq::setNode(const QString &node)
89 {
90     d->node = node;
91 }
92 
93 /// Returns the queryid that will be included in the results.
queryId() const94 QString 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)102 void QXmppMamQueryIq::setQueryId(const QString &id)
103 {
104     d->queryId = id;
105 }
106 
107 /// \cond
isMamQueryIq(const QDomElement & element)108 bool 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)119 void 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) const134 void 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()157 QXmppMamResultIq::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() const170 QXmppResultSetReply QXmppMamResultIq::resultSetReply() const
171 {
172     return d->resultSetReply;
173 }
174 
175 /// Sets the result set reply for result set management
setResultSetReply(const QXmppResultSetReply & resultSetReply)176 void 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() const183 bool 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)190 void QXmppMamResultIq::setComplete(bool complete)
191 {
192     d->complete = complete;
193 }
194 
195 /// \cond
isMamResultIq(const QDomElement & element)196 bool 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)207 void 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) const217 void 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