QXmpp Version: 1.8.3
Loading...
Searching...
No Matches
QXmppClient.h
1// SPDX-FileCopyrightText: 2009 Manjeet Dahiya <manjeetdahiya@gmail.com>
2// SPDX-FileCopyrightText: 2019 Linus Jahn <lnj@kaidan.im>
3//
4// SPDX-License-Identifier: LGPL-2.1-or-later
5
6#ifndef QXMPPCLIENT_H
7#define QXMPPCLIENT_H
8
9#include "QXmppConfiguration.h"
10#include "QXmppLogger.h"
11#include "QXmppPresence.h"
12#include "QXmppSendResult.h"
13#include "QXmppSendStanzaParams.h"
14
15#include <memory>
16#include <variant>
17
18#include <QAbstractSocket>
19#include <QObject>
20#include <QSslError>
21
22template<typename T>
23class QXmppTask;
24
27class QXmppClientPrivate;
28class QXmppMessage;
29class QXmppOutgoingClient;
30class QXmppPresence;
31class QXmppIq;
32
33// managers
38
39namespace QXmpp::Private {
40struct SessionBegin;
41}
42
50
58
59class QXMPP_EXPORT QXmppClient : public QXmppLoggable
60{
61 Q_OBJECT
62
64 Q_PROPERTY(QXmppLogger *logger READ logger WRITE setLogger NOTIFY loggerChanged)
66 Q_PROPERTY(State state READ state NOTIFY stateChanged)
67
68public:
69 using IqResult = std::variant<QDomElement, QXmppError>;
70 using EmptyResult = std::variant<QXmpp::Success, QXmppError>;
71
80 Q_ENUM(Error)
81
82
83 enum State {
86 ConnectedState
87 };
88 Q_ENUM(State)
89
90
99
108
109 QXmppClient(InitialExtensions, QObject *parent = nullptr);
110 QXmppClient(QObject *parent = nullptr);
111 ~QXmppClient() override;
112
113 bool addExtension(QXmppClientExtension *extension);
114 template<typename T, typename... Args>
115 T *addNewExtension(Args... args)
116 {
117 // it's impossible that addExtension() returns false: ext is a new object
118 auto *ext = new T(args...);
119 addExtension(ext);
120 return ext;
121 }
122 bool insertExtension(int index, QXmppClientExtension *extension);
123 bool removeExtension(QXmppClientExtension *extension);
124 QXmppE2eeExtension *encryptionExtension() const;
125 void setEncryptionExtension(QXmppE2eeExtension *);
126
127 QList<QXmppClientExtension *> extensions() const;
128
142 template<typename T>
143 T *findExtension() const
144 {
145 const QList<QXmppClientExtension *> list = extensions();
146 for (auto ext : list) {
147 T *extension = qobject_cast<T *>(ext);
148 if (extension) {
149 return extension;
150 }
151 }
152 return nullptr;
153 }
154
170 template<typename T>
172 {
173 auto list = extensions();
174 for (int i = 0; i < list.size(); ++i) {
175 if (qobject_cast<T *>(list.at(i)) != nullptr) {
176 return i;
177 }
178 }
179 return -1;
180 }
181
182 bool isAuthenticated() const;
183 bool isConnected() const;
184
185 bool isActive() const;
186 void setActive(bool active);
187
188 StreamManagementState streamManagementState() const;
189
190 QXmppPresence clientPresence() const;
191 void setClientPresence(const QXmppPresence &presence);
192
193 QXmppConfiguration &configuration();
194
195 // documentation needs to be here, see https://stackoverflow.com/questions/49192523/
197 QXmppLogger *logger() const;
198 void setLogger(QXmppLogger *logger);
199
200 QAbstractSocket::SocketError socketError();
201 QString socketErrorString() const;
202
203 // documentation needs to be here, see https://stackoverflow.com/questions/49192523/
205 State state() const;
206 QXmppStanza::Error::Condition xmppStreamError();
207
208 QXmppTask<QXmpp::SendResult> sendSensitive(QXmppStanza &&, const std::optional<QXmppSendStanzaParams> & = {});
209 QXmppTask<QXmpp::SendResult> send(QXmppStanza &&, const std::optional<QXmppSendStanzaParams> & = {});
210 QXmppTask<QXmpp::SendResult> reply(QXmppStanza &&stanza, const std::optional<QXmppE2eeMetadata> &e2eeMetadata, const std::optional<QXmppSendStanzaParams> & = {});
211 QXmppTask<IqResult> sendIq(QXmppIq &&, const std::optional<QXmppSendStanzaParams> & = {});
212 QXmppTask<IqResult> sendSensitiveIq(QXmppIq &&, const std::optional<QXmppSendStanzaParams> & = {});
213 QXmppTask<EmptyResult> sendGenericIq(QXmppIq &&, const std::optional<QXmppSendStanzaParams> & = {});
214
215#if QXMPP_DEPRECATED_SINCE(1, 1)
216 QT_DEPRECATED_X("Use QXmppClient::findExtension<QXmppRosterManager>() instead")
217 QXmppRosterManager &rosterManager();
218
219 QT_DEPRECATED_X("Use QXmppClient::findExtension<QXmppVCardManager>() instead")
220 QXmppVCardManager &vCardManager();
221
222 QT_DEPRECATED_X("Use QXmppClient::findExtension<QXmppVersionManager>() instead")
223 QXmppVersionManager &versionManager();
224#endif
225
226Q_SIGNALS:
227
248 void connected();
249
252
259
270 Q_SIGNAL void errorOccurred(const QXmppError &error);
271
274
279 void messageReceived(const QXmppMessage &message);
280
285 void presenceReceived(const QXmppPresence &presence);
286
293 void iqReceived(const QXmppIq &iq);
294
297 void sslErrors(const QList<QSslError> &errors);
298
301
307 Q_SIGNAL void credentialsChanged();
308
309public Q_SLOTS:
310 void connectToServer(const QXmppConfiguration &,
311 const QXmppPresence &initialPresence =
312 QXmppPresence());
313 void connectToServer(const QString &jid,
314 const QString &password);
315 void disconnectFromServer();
316 bool sendPacket(const QXmppNonza &);
317 void sendMessage(const QString &bareJid, const QString &message);
318
319private:
320 QXmppOutgoingClient *stream() const;
321 void injectIq(const QDomElement &element, const std::optional<QXmppE2eeMetadata> &e2eeMetadata);
322 bool injectMessage(QXmppMessage &&message);
323
324private Q_SLOTS:
325 void _q_elementReceived(const QDomElement &element, bool &handled);
326 void _q_reconnect();
327 void _q_socketStateChanged(QAbstractSocket::SocketState state);
328 void _q_streamConnected(const QXmpp::Private::SessionBegin &);
329 void _q_streamDisconnected();
330
331private:
332 const std::unique_ptr<QXmppClientPrivate> d;
333
334 friend class QXmppClientExtension;
335 friend class QXmppCarbonManagerV2;
336 friend class QXmppRegistrationManager;
337 friend class TestClient;
338};
339
340#endif // QXMPPCLIENT_H
The QXmppCarbonManagerV2 class handles message carbons as described in XEP-0280: Message Carbons.
Definition QXmppCarbonManagerV2.h:11
The QXmppClientExtension class is the base class for QXmppClient extensions.
Definition QXmppClientExtension.h:32
Main class for starting and managing connections to XMPP servers.
Definition QXmppClient.h:60
void presenceReceived(const QXmppPresence &presence)
Q_SIGNAL void credentialsChanged()
void error(QXmppClient::Error)
int indexOfExtension() const
Returns the index of an extension.
Definition QXmppClient.h:171
void connected()
T * findExtension() const
Returns the extension which can be cast into type T*, or 0 if there is no such extension.
Definition QXmppClient.h:143
InitialExtensions
Definition QXmppClient.h:102
@ BasicExtensions
Creates a client with the default set of extensions.
Definition QXmppClient.h:106
@ NoExtensions
Creates a client without any extensions.
Definition QXmppClient.h:104
State
This enumeration describes a client state.
Definition QXmppClient.h:83
@ DisconnectedState
Disconnected from the server.
Definition QXmppClient.h:84
@ ConnectingState
Trying to connect to the server.
Definition QXmppClient.h:85
Q_SIGNAL void errorOccurred(const QXmppError &error)
void loggerChanged(QXmppLogger *logger)
This signal is emitted when the logger changes.
Error
Definition QXmppClient.h:74
@ NoError
No error.
Definition QXmppClient.h:75
@ XmppStreamError
Error due to XML stream.
Definition QXmppClient.h:78
@ KeepAliveError
Error due to no response to a keep alive.
Definition QXmppClient.h:77
@ SocketError
Error due to TCP socket.
Definition QXmppClient.h:76
void sslErrors(const QList< QSslError > &errors)
void stateChanged(QXmppClient::State state)
This signal is emitted when the client state changes.
void messageReceived(const QXmppMessage &message)
StreamManagementState
Describes the use of XEP-0198: Stream Management.
Definition QXmppClient.h:91
@ NoStreamManagement
Stream Management is not used.
Definition QXmppClient.h:93
@ NewStream
Stream Management is used and the previous stream has not been resumed.
Definition QXmppClient.h:95
void iqReceived(const QXmppIq &iq)
T * addNewExtension(Args... args)
Definition QXmppClient.h:115
std::variant< QXmpp::Success, QXmppError > EmptyResult
Definition QXmppClient.h:70
void disconnected()
This signal is emitted when the XMPP connection disconnects.
std::variant< QDomElement, QXmppError > IqResult
Definition QXmppClient.h:69
The QXmppConfiguration class holds configuration options.
Definition QXmppConfiguration.h:37
Definition QXmppDiscoveryIq.h:18
Definition QXmppE2eeExtension.h:23
The QXmppIq class is the base class for all IQs.
Definition QXmppIq.h:23
The QXmppLoggable class represents a source of logging messages.
Definition QXmppLogger.h:110
The QXmppLogger class represents a sink for logging messages.
Definition QXmppLogger.h:29
The QXmppMessage class represents an XMPP message.
Definition QXmppMessage.h:46
Definition QXmppNonza.h:14
The QXmppPresence class represents an XMPP presence stanza.
Definition QXmppPresence.h:21
The QXmppRegistrationManager class manages in-band registration and account management tasks like cha...
Definition QXmppRegistrationManager.h:222
The QXmppRosterManager class provides access to a connected client's roster.
Definition QXmppRosterManager.h:56
Condition
A detailed condition of the error.
Definition QXmppStanza.h:110
The QXmppStanza class is the base class for all XMPP stanzas.
Definition QXmppStanza.h:88
Definition QXmppTask.h:62
The QXmppVCardManager class gets/sets XMPP vCards. It is an implementation of XEP-0054: vcard-temp.
Definition QXmppVCardManager.h:43
The QXmppVersionManager class makes it possible to request for the software version of an entity as d...
Definition QXmppVersionManager.h:24
Definition Algorithms.h:12
Definition QXmppError.h:17