QXmpp Version: 1.15.1
Loading...
Searching...
No Matches
QXmppDiscoveryIq.h
1// SPDX-FileCopyrightText: 2010 Jeremy Lainé <jeremy.laine@m4x.org>
2// SPDX-FileCopyrightText: 2025 Linus Jahn <lnj@kaidan.im>
3//
4// SPDX-License-Identifier: LGPL-2.1-or-later
5
6#ifndef QXMPPDISCOVERY_H
7#define QXMPPDISCOVERY_H
8
9#include "QXmppDataFormBase.h"
10#include "QXmppGlobal.h"
11#include "QXmppIq.h"
12
13#include <QSharedDataPointer>
14
15namespace QXmpp::Disco {
16
23enum class Category {
24 Account,
25 Auth,
26 Automation,
27 Client,
28 Collaboration,
29 Component,
30 Conference,
31 Directory,
32 Gateway,
33 Headline,
34 Hierarchy,
35 Proxy,
36 PubSub,
37 Server,
38 Store,
39};
40
50enum class Type {
51 // client
52 Bot,
53 Console,
54 Game,
55 Handheld,
56 Pc,
57 Phone,
58 Sms,
59 Tablet,
60 Web,
61 // conference
62 Irc,
63 Mix,
64 Text,
65 // gateway
66 // (using generic types that overlap with other categories)
67 // pubsub
68 Collection,
69 Leaf,
70 Pep,
71 Service,
72 // store
73 File,
74};
75
76} // namespace QXmpp::Disco
77
78class QXmppDiscoveryIdentityPrivate;
79class QXmppDiscoveryItemPrivate;
80class QXmppDiscoveryIqPrivate;
81
82class QXMPP_EXPORT QXmppDiscoItem
83{
84public:
85 QXmppDiscoItem() { }
87 explicit QXmppDiscoItem(const QString &jid, const QString &name = {}, const QString &node = {})
88 : m_jid(jid), m_name(name), m_node(node) { }
89
91 const QString &jid() const { return m_jid; }
93 void setJid(const QString &newJid) { m_jid = newJid; }
94
96 const QString &name() const { return m_name; }
98 void setName(const QString &newName) { m_name = newName; }
99
101 const QString &node() const { return m_node; }
103 void setNode(const QString &newNode) { m_node = newNode; }
104
106 static constexpr std::tuple XmlTag = { u"item", QXmpp::Private::ns_disco_items };
107 static std::optional<QXmppDiscoItem> fromDom(const QDomElement &el);
108 void toXml(QXmlStreamWriter *writer) const;
110
111private:
112 QString m_jid;
113 QString m_name;
114 QString m_node;
115};
116
117class QXMPP_EXPORT QXmppDiscoItems
118{
119public:
120 QXmppDiscoItems() { }
122 explicit QXmppDiscoItems(const QString &node, const QList<QXmppDiscoItem> &items = {})
123 : m_node(node), m_items(items) { }
124
126 const QList<QXmppDiscoItem> &items() const { return m_items; }
128 void setItems(const QList<QXmppDiscoItem> &newItems) { m_items = newItems; }
129
131 const QString &node() const { return m_node; }
133 void setNode(const QString &newNode) { m_node = newNode; }
134
136 static constexpr std::tuple XmlTag = { u"query", QXmpp::Private::ns_disco_items };
137 static std::optional<QXmppDiscoItems> fromDom(const QDomElement &el);
138 void toXml(QXmlStreamWriter *writer) const;
140
141private:
142 QList<QXmppDiscoItem> m_items;
143 QString m_node;
144};
145
146class QXMPP_EXPORT QXmppDiscoIdentity
147{
148public:
151 explicit QXmppDiscoIdentity(const QString &category, const QString &type = {}, const QString &name = {}, const QString &lang = {})
152 : m_category(category), m_type(type), m_name(name), m_language(lang) { }
153
155 const QString &category() const { return m_category; }
157 void setCategory(const QString &newCategory) { m_category = newCategory; }
158
164 const QString &type() const { return m_type; }
170 void setType(const QString &newType) { m_type = newType; }
171
173 const QString &name() const { return m_name; }
175 void setName(const QString &newName) { m_name = newName; }
176
183 const QString &language() const { return m_language; }
190 void setLanguage(const QString &newLanguage) { m_language = newLanguage; }
191
193 static constexpr std::tuple XmlTag = { u"identity", QXmpp::Private::ns_disco_info };
194 static std::optional<QXmppDiscoIdentity> fromDom(const QDomElement &el);
195 void toXml(QXmlStreamWriter *writer) const;
197
198private:
199 QString m_category;
200 QString m_type;
201 QString m_name;
202 QString m_language;
203};
204
205class QXMPP_EXPORT QXmppDiscoInfo
206{
207public:
208 QXmppDiscoInfo() { }
210 explicit QXmppDiscoInfo(const QString &node, const QList<QXmppDiscoIdentity> &identities = {}, const QList<QString> &features = {}, const QList<QXmppDataForm> &dataForms = {})
211 : m_node(node), m_identities(identities), m_features(features), m_dataForms(dataForms) { }
212
214 const QString &node() const { return m_node; }
216 void setNode(const QString &newNode) { m_node = newNode; }
217
219 const QList<QXmppDiscoIdentity> &identities() const { return m_identities; }
221 void setIdentities(const QList<QXmppDiscoIdentity> &newIdentities) { m_identities = newIdentities; }
222
224 const QList<QString> &features() const { return m_features; }
226 void setFeatures(const QList<QString> &newFeatures) { m_features = newFeatures; }
227
229 const QList<QXmppDataForm> &dataForms() const { return m_dataForms; }
232 void setDataForms(const QList<QXmppDataForm> &newDataForms) { m_dataForms = newDataForms; }
233 std::optional<QXmppDataForm> dataForm(QStringView formType) const;
234
236 template<QXmpp::Private::DataFormConvertible FormType>
237 std::optional<FormType> dataForm() const
238 {
239 if (auto form = dataForm(QXmpp::Private::DataFormType<FormType>)) {
240 if (auto result = FormType::fromDataForm(*form)) {
241 return *result;
242 }
243 }
244 return {};
245 }
246
247 QByteArray calculateEntityCapabilitiesHash() const;
248
250 static constexpr std::tuple XmlTag = { u"query", QXmpp::Private::ns_disco_info };
251 static std::optional<QXmppDiscoInfo> fromDom(const QDomElement &el);
252 void toXml(QXmlStreamWriter *writer) const;
254
255private:
256 QString m_node;
257 QList<QXmppDiscoIdentity> m_identities;
258 QList<QString> m_features;
259 QList<QXmppDataForm> m_dataForms;
260};
261
269struct QXMPP_EXPORT QXmppDiscoService {
271 QString jid;
274};
275
276#if QXMPP_DEPRECATED_SINCE(1, 12)
277class QXMPP_EXPORT QXmppDiscoveryIq : public QXmppIq
278{
279public:
281 using Identity [[deprecated]] = QXmppDiscoIdentity;
283 using Item [[deprecated]] = QXmppDiscoItem;
284
285 [[deprecated("Use QXmppDiscoInfo/Items")]]
287 QXMPP_PRIVATE_DECLARE_RULE_OF_SIX(QXmppDiscoveryIq)
288
290 InfoQuery,
291 ItemsQuery
292 };
293
294 QStringList features() const;
295 void setFeatures(const QStringList &features);
296
297 QList<QXmppDiscoIdentity> identities() const;
298 void setIdentities(const QList<QXmppDiscoIdentity> &identities);
299
300 QList<QXmppDiscoItem> items() const;
301 void setItems(const QList<QXmppDiscoItem> &items);
302
303 [[deprecated("Use dataForms() instead")]]
304 QXmppDataForm form() const;
305 [[deprecated("Use setDataForms() instead")]]
306 void setForm(const QXmppDataForm &form);
307
308 const QList<QXmppDataForm> &dataForms() const;
309 void setDataForms(const QList<QXmppDataForm> &dataForms);
310 std::optional<QXmppDataForm> dataForm(QStringView formType) const;
311
314 template<QXmpp::Private::DataFormConvertible FormT>
315 std::optional<FormT> dataForm() const
316 {
317 if (auto form = dataForm(QXmpp::Private::DataFormType<FormT>)) {
318 if (auto result = FormT::fromDataForm(*form)) {
319 return *result;
320 }
321 }
322 return {};
323 }
324
325 QString queryNode() const;
326 void setQueryNode(const QString &node);
327
328 enum QueryType queryType() const;
329 void setQueryType(enum QueryType type);
330
331 QByteArray verificationString() const;
332
334 [[deprecated("Use QXmpp::isIqElement()")]]
335 static bool isDiscoveryIq(const QDomElement &element);
336 static bool checkIqType(const QString &tagName, const QString &xmlNamespace);
337
338protected:
339 void parseElementFromChild(const QDomElement &element) override;
340 void toXmlElementFromChild(QXmlStreamWriter *writer) const override;
342
343private:
344 QSharedDataPointer<QXmppDiscoveryIqPrivate> d;
345};
346#endif
347
348#endif
Definition QXmppDataForm.h:28
Definition QXmppDiscoveryIq.h:147
void setName(const QString &newName)
Sets the human-readable name of the service.
Definition QXmppDiscoveryIq.h:175
void setType(const QString &newType)
Definition QXmppDiscoveryIq.h:170
QXmppDiscoIdentity(const QString &category, const QString &type={}, const QString &name={}, const QString &lang={})
Default constructor.
Definition QXmppDiscoveryIq.h:151
const QString & type() const
Definition QXmppDiscoveryIq.h:164
void setLanguage(const QString &newLanguage)
Definition QXmppDiscoveryIq.h:190
const QString & name() const
Returns the human-readable name of the service.
Definition QXmppDiscoveryIq.h:173
const QString & language() const
Definition QXmppDiscoveryIq.h:183
const QString & category() const
Returns the category of the identity.
Definition QXmppDiscoveryIq.h:155
void setCategory(const QString &newCategory)
Sets the category of the identity.
Definition QXmppDiscoveryIq.h:157
Definition QXmppDiscoveryIq.h:206
std::optional< FormType > dataForm() const
Looks for a form with the form type of FormType and parses it if found.
Definition QXmppDiscoveryIq.h:237
void setNode(const QString &newNode)
Sets the node of the query.
Definition QXmppDiscoveryIq.h:216
void setDataForms(const QList< QXmppDataForm > &newDataForms)
Definition QXmppDiscoveryIq.h:232
QXmppDiscoInfo(const QString &node, const QList< QXmppDiscoIdentity > &identities={}, const QList< QString > &features={}, const QList< QXmppDataForm > &dataForms={})
Default constructor.
Definition QXmppDiscoveryIq.h:210
const QString & node() const
Returns the node of the query.
Definition QXmppDiscoveryIq.h:214
const QList< QXmppDataForm > & dataForms() const
Returns additional data forms as specified in XEP-0128: Service Discovery Extensions.
Definition QXmppDiscoveryIq.h:229
const QList< QXmppDiscoIdentity > & identities() const
Returns the identities of the entity.
Definition QXmppDiscoveryIq.h:219
void setFeatures(const QList< QString > &newFeatures)
Sets the features supported by the entity.
Definition QXmppDiscoveryIq.h:226
const QList< QString > & features() const
Returns the features supported by the entity.
Definition QXmppDiscoveryIq.h:224
void setIdentities(const QList< QXmppDiscoIdentity > &newIdentities)
Sets the identities of the entity.
Definition QXmppDiscoveryIq.h:221
Definition QXmppDiscoveryIq.h:83
void setNode(const QString &newNode)
Sets the node for querying the information.
Definition QXmppDiscoveryIq.h:103
void setJid(const QString &newJid)
Sets the JID of the item.
Definition QXmppDiscoveryIq.h:93
const QString & jid() const
Returns the JID of the item.
Definition QXmppDiscoveryIq.h:91
void setName(const QString &newName)
Sets the name of the item.
Definition QXmppDiscoveryIq.h:98
const QString & node() const
Returns the node for querying the information.
Definition QXmppDiscoveryIq.h:101
const QString & name() const
Returns the name of the item.
Definition QXmppDiscoveryIq.h:96
QXmppDiscoItem(const QString &jid, const QString &name={}, const QString &node={})
Default constructor.
Definition QXmppDiscoveryIq.h:87
Definition QXmppDiscoveryIq.h:118
void setNode(const QString &newNode)
Sets the node of the query.
Definition QXmppDiscoveryIq.h:133
void setItems(const QList< QXmppDiscoItem > &newItems)
Sets the items.
Definition QXmppDiscoveryIq.h:128
const QString & node() const
Returns the node of the query.
Definition QXmppDiscoveryIq.h:131
QXmppDiscoItems(const QString &node, const QList< QXmppDiscoItem > &items={})
Default constructor.
Definition QXmppDiscoveryIq.h:122
const QList< QXmppDiscoItem > & items() const
Returns the items.
Definition QXmppDiscoveryIq.h:126
Definition QXmppDiscoveryIq.h:278
std::optional< FormT > dataForm() const
Definition QXmppDiscoveryIq.h:315
QueryType
Definition QXmppDiscoveryIq.h:289
The QXmppIq class is the base class for all IQs.
Definition QXmppIq.h:23
A discovered service with its JID and disco info.
Definition QXmppDiscoveryIq.h:269
QXmppDiscoInfo info
Service discovery information of the service.
Definition QXmppDiscoveryIq.h:273
QString jid
JID of the service.
Definition QXmppDiscoveryIq.h:271