QXmpp  Version: 1.15.1
QXmppClient.h
1 // SPDX-FileCopyrightText: 2009 Manjeet Dahiya <manjeetdahiya@gmail.com>
2 // SPDX-FileCopyrightText: 2019 Linus Jahn <lnj@kaidan.im>
3 // SPDX-FileCopyrightText: 2023 Melvin Keskin <melvo@olomono.de>
4 //
5 // SPDX-License-Identifier: LGPL-2.1-or-later
6 
7 #ifndef QXMPPCLIENT_H
8 #define QXMPPCLIENT_H
9 
10 #include "QXmppConfiguration.h"
11 #include "QXmppLogger.h"
12 #include "QXmppPresence.h"
13 #include "QXmppSendResult.h"
14 #include "QXmppSendStanzaParams.h"
15 #include "QXmppStreamError.h"
16 
17 #include <memory>
18 #include <variant>
19 
20 #include <QAbstractSocket>
21 #include <QObject>
22 #include <QSslError>
23 
24 template<typename T>
25 class QXmppTask;
26 
27 class QXmppE2eeExtension;
29 class QXmppClientPrivate;
30 class QXmppMessage;
31 class QXmppOutgoingClient;
32 class QXmppPresence;
33 class QXmppIq;
34 
35 // managers
36 class QXmppDiscoveryIq;
37 class QXmppRosterManager;
38 class QXmppVCardManager;
40 
41 namespace QXmpp::Private {
42 struct SessionBegin;
43 }
44 
52 
60 
61 class QXMPP_EXPORT QXmppClient : public QXmppLoggable
62 {
63  Q_OBJECT
64 
66  Q_PROPERTY(QXmppLogger *logger READ logger WRITE setLogger NOTIFY loggerChanged)
68  Q_PROPERTY(State state READ state NOTIFY stateChanged)
69 
70 public:
71  using IqResult = std::variant<QDomElement, QXmppError>;
72  using EmptyResult = std::variant<QXmpp::Success, QXmppError>;
73 
76  enum Error {
81  };
82  Q_ENUM(Error)
83 
84 
85  enum State {
88  ConnectedState
89  };
90  Q_ENUM(State)
91 
92 
99  ResumedStream
100  };
101 
109  };
110 
111  QXmppClient(InitialExtensions, QObject *parent = nullptr);
112  QXmppClient(QObject *parent = nullptr);
113  ~QXmppClient() override;
114 
115  bool addExtension(QXmppClientExtension *extension);
116  template<typename T, typename... Args>
117  T *addNewExtension(Args... args)
118  {
119  // it's impossible that addExtension() returns false: ext is a new object
120  auto *ext = new T(args...);
121  addExtension(ext);
122  return ext;
123  }
124  bool insertExtension(int index, QXmppClientExtension *extension);
125  bool removeExtension(QXmppClientExtension *extension);
126  QXmppE2eeExtension *encryptionExtension() const;
127  void setEncryptionExtension(QXmppE2eeExtension *);
128 
129  QList<QXmppClientExtension *> extensions() const;
130 
144  template<typename T>
145  T *findExtension() const
146  {
147  const QList<QXmppClientExtension *> list = extensions();
148  for (auto ext : list) {
149  T *extension = qobject_cast<T *>(ext);
150  if (extension) {
151  return extension;
152  }
153  }
154  return nullptr;
155  }
156 
172  template<typename T>
173  int indexOfExtension() const
174  {
175  auto list = extensions();
176  for (int i = 0; i < list.size(); ++i) {
177  if (qobject_cast<T *>(list.at(i)) != nullptr) {
178  return i;
179  }
180  }
181  return -1;
182  }
183 
184  bool isAuthenticated() const;
185  bool isConnected() const;
186 
187  bool isActive() const;
188  void setActive(bool active);
189 
190  StreamManagementState streamManagementState() const;
191 
192  QXmppPresence clientPresence() const;
193  void setClientPresence(const QXmppPresence &presence);
194 
195  QXmppConfiguration &configuration();
196 
197  // documentation needs to be here, see https://stackoverflow.com/questions/49192523/
199  QXmppLogger *logger() const;
200  void setLogger(QXmppLogger *logger);
201 
202  QAbstractSocket::SocketError socketError();
203  QString socketErrorString() const;
204 
205  // documentation needs to be here, see https://stackoverflow.com/questions/49192523/
207  State state() const;
208  QXmppStanza::Error::Condition xmppStreamError();
209 
210  QXmppTask<QXmpp::SendResult> sendSensitive(QXmppStanza &&, const std::optional<QXmppSendStanzaParams> & = {});
211  QXmppTask<QXmpp::SendResult> send(QXmppStanza &&, const std::optional<QXmppSendStanzaParams> & = {});
212  QXmppTask<QXmpp::SendResult> reply(QXmppStanza &&stanza, const std::optional<QXmppE2eeMetadata> &e2eeMetadata, const std::optional<QXmppSendStanzaParams> & = {});
213  QXmppTask<IqResult> sendIq(QXmppIq &&, const std::optional<QXmppSendStanzaParams> & = {});
214  QXmppTask<IqResult> sendSensitiveIq(QXmppIq &&, const std::optional<QXmppSendStanzaParams> & = {});
215  QXmppTask<EmptyResult> sendGenericIq(QXmppIq &&, const std::optional<QXmppSendStanzaParams> & = {});
216 
237  Q_SIGNAL void connected();
238 
240  Q_SIGNAL void disconnected();
241 
247  Q_SIGNAL void error(QXmppClient::Error);
248 
259  Q_SIGNAL void errorOccurred(const QXmppError &error);
260 
262  Q_SIGNAL void loggerChanged(QXmppLogger *logger);
263 
268  Q_SIGNAL void messageReceived(const QXmppMessage &message);
269 
274  Q_SIGNAL void presenceReceived(const QXmppPresence &presence);
275 
282  Q_SIGNAL void iqReceived(const QXmppIq &iq);
283 
286  Q_SIGNAL void sslErrors(const QList<QSslError> &errors);
287 
289  Q_SIGNAL void stateChanged(QXmppClient::State state);
290 
296  Q_SIGNAL void credentialsChanged();
297 
298  Q_SLOT void connectToServer(const QXmppConfiguration &, const QXmppPresence &initialPresence = {});
299  Q_SLOT void connectToServer(const QString &jid, const QString &password);
300  Q_SLOT void disconnectFromServer();
301 
302 #if QXMPP_DEPRECATED_SINCE(1, 1)
303  [[deprecated("Use findExtension<QXmppRosterManager>() instead")]]
304  QXmppRosterManager &rosterManager();
305 
306  [[deprecated("Use findExtension<QXmppVCardManager>() instead")]]
307  QXmppVCardManager &vCardManager();
308 
309  [[deprecated("Use findExtension<QXmppVersionManager>() instead")]]
310  QXmppVersionManager &versionManager();
311 #endif
312 #if QXMPP_DEPRECATED_SINCE(1, 12)
313  [[deprecated("Use async send()")]]
314  Q_SLOT bool sendPacket(const QXmppNonza &);
315  [[deprecated("Use async send()")]]
316  Q_SLOT void sendMessage(const QString &bareJid, const QString &message);
317 #endif
318 
320  bool sendLegacy(const QXmppNonza &s)
321  {
322  QT_WARNING_PUSH
323  QT_WARNING_DISABLE_DEPRECATED
324  return sendPacket(s);
325  QT_WARNING_POP
326  }
327  QString sendLegacyId(const QXmppStanza &s) { return sendLegacy(s) ? s.id() : QString(); }
329 
330 private:
331  QXmppOutgoingClient *stream() const;
332  void injectIq(const QDomElement &element, const std::optional<QXmppE2eeMetadata> &e2eeMetadata);
333  bool injectMessage(QXmppMessage &&message);
334 
335  void setIgnoredStreamErrors(const QVector<QXmpp::StreamError> &);
336 
337  void _q_elementReceived(const QDomElement &element, bool &handled);
338  void _q_reconnect();
339  void onInternalSocketStateChanged();
340  void _q_streamConnected(const QXmpp::Private::SessionBegin &);
341  void _q_streamDisconnected();
342 
343  const std::unique_ptr<QXmppClientPrivate> d;
344 
345  friend class QXmppClientExtension;
346  friend class QXmppCarbonManagerV2;
347  friend class QXmppRegistrationManager;
348  friend class TestClient;
349 };
350 
351 #endif // QXMPPCLIENT_H
The QXmppVersionManager class makes it possible to request for the software version of an entity as d...
Definition: QXmppVersionManager.h:23
InitialExtensions
Definition: QXmppClient.h:104
The QXmppConfiguration class holds configuration options.
Definition: QXmppConfiguration.h:36
Error due to no response to a keep alive.
Definition: QXmppClient.h:79
The QXmppVCardManager class gets/sets XMPP vCards. It is an implementation of XEP-0054: vcard-temp...
Definition: QXmppVCardManager.h:42
Stream Management is not used.
Definition: QXmppClient.h:95
Disconnected from the server.
Definition: QXmppClient.h:86
Definition: QXmppE2eeExtension.h:22
Creates a client with the default set of extensions.
Definition: QXmppClient.h:108
Trying to connect to the server.
Definition: QXmppClient.h:87
int indexOfExtension() const
Returns the index of an extension.
Definition: QXmppClient.h:173
The QXmppStanza class is the base class for all XMPP stanzas.
Definition: QXmppStanza.h:105
T * findExtension() const
Returns the extension which can be cast into type T*, or 0 if there is no such extension.
Definition: QXmppClient.h:145
Definition: QXmppError.h:17
std::variant< QDomElement, QXmppError > IqResult
Definition: QXmppClient.h:71
Definition: QXmppTask.h:646
No error.
Definition: QXmppClient.h:77
The QXmppLoggable class represents a source of logging messages.
Definition: QXmppLogger.h:108
Definition: QXmppTask.h:67
Error
Definition: QXmppClient.h:76
Definition: QXmppDiscoveryIq.h:199
Stream Management is used and the previous stream has not been resumed.
Definition: QXmppClient.h:97
QString id() const
Definition: QXmppStanza.cpp:750
Error due to XML stream.
Definition: QXmppClient.h:80
The QXmppRosterManager class provides access to a connected client&#39;s roster.
Definition: QXmppRosterManager.h:83
The QXmppLogger class represents a sink for logging messages.
Definition: QXmppLogger.h:28
StreamManagementState
Describes the use of XEP-0198: Stream Management
Definition: QXmppClient.h:93
The QXmppPresence class represents an XMPP presence stanza.
Definition: QXmppPresence.h:21
Condition
A detailed condition of the error.
Definition: QXmppStanza.h:128
The QXmppRegistrationManager class manages in-band registration and account management tasks like cha...
Definition: QXmppRegistrationManager.h:212
The QXmppIq class is the base class for all IQs.
Definition: QXmppIq.h:22
Creates a client without any extensions.
Definition: QXmppClient.h:106
Definition: QXmppNonza.h:13
The QXmppMessage class represents an XMPP message.
Definition: QXmppMessage.h:63
Definition: Algorithms.h:14
State
This enumeration describes a client state.
Definition: QXmppClient.h:85
The QXmppCarbonManagerV2 class handles message carbons as described in XEP-0280: Message Carbons...
Definition: QXmppCarbonManagerV2.h:12
The QXmppClientExtension class is the base class for QXmppClient extensions.
Definition: QXmppClientExtension.h:31
T * addNewExtension(Args... args)
Definition: QXmppClient.h:117
Error due to TCP socket.
Definition: QXmppClient.h:78
std::variant< QXmpp::Success, QXmppError > EmptyResult
Definition: QXmppClient.h:72
Main class for starting and managing connections to XMPP servers.
Definition: QXmppClient.h:61