QXmpp  Version: 1.8.1
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 
22 template<typename T>
23 class QXmppTask;
24 
25 class QXmppE2eeExtension;
27 class QXmppClientPrivate;
28 class QXmppMessage;
29 class QXmppOutgoingClient;
30 class QXmppPresence;
31 class QXmppIq;
32 
33 // managers
34 class QXmppDiscoveryIq;
35 class QXmppRosterManager;
36 class QXmppVCardManager;
38 
39 namespace QXmpp::Private {
40 struct SessionBegin;
41 }
42 
50 
58 
59 class 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 
68 public:
69  using IqResult = std::variant<QDomElement, QXmppError>;
70  using EmptyResult = std::variant<QXmpp::Success, QXmppError>;
71 
74  enum Error {
79  };
80  Q_ENUM(Error)
81 
82 
83  enum State {
86  ConnectedState
87  };
88  Q_ENUM(State)
89 
90 
97  ResumedStream
98  };
99 
107  };
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>
171  int indexOfExtension() const
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 
226 Q_SIGNALS:
227 
248  void connected();
249 
251  void disconnected();
252 
258  void error(QXmppClient::Error);
259 
270  Q_SIGNAL void errorOccurred(const QXmppError &error);
271 
273  void loggerChanged(QXmppLogger *logger);
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 
300  void stateChanged(QXmppClient::State state);
301 
307  Q_SIGNAL void credentialsChanged();
308 
309 public 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 
319 private:
320  QXmppOutgoingClient *stream() const;
321  void injectIq(const QDomElement &element, const std::optional<QXmppE2eeMetadata> &e2eeMetadata);
322  bool injectMessage(QXmppMessage &&message);
323 
324 private 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 
331 private:
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 QXmppVersionManager class makes it possible to request for the software version of an entity as d...
Definition: QXmppVersionManager.h:23
InitialExtensions
Definition: QXmppClient.h:102
The QXmppConfiguration class holds configuration options.
Definition: QXmppConfiguration.h:36
Error due to no response to a keep alive.
Definition: QXmppClient.h:77
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:93
Disconnected from the server.
Definition: QXmppClient.h:84
Definition: QXmppE2eeExtension.h:22
Creates a client with the default set of extensions.
Definition: QXmppClient.h:106
Trying to connect to the server.
Definition: QXmppClient.h:85
int indexOfExtension() const
Returns the index of an extension.
Definition: QXmppClient.h:171
The QXmppStanza class is the base class for all XMPP stanzas.
Definition: QXmppStanza.h:87
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
Definition: QXmppError.h:17
std::variant< QDomElement, QXmppError > IqResult
Definition: QXmppClient.h:69
No error.
Definition: QXmppClient.h:75
The QXmppLoggable class represents a source of logging messages.
Definition: QXmppLogger.h:109
Definition: QXmppTask.h:61
Error
Definition: QXmppClient.h:74
Definition: QXmppDiscoveryIq.h:17
Stream Management is used and the previous stream has not been resumed.
Definition: QXmppClient.h:95
Error due to XML stream.
Definition: QXmppClient.h:78
The QXmppRosterManager class provides access to a connected client&#39;s roster.
Definition: QXmppRosterManager.h:55
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:91
The QXmppPresence class represents an XMPP presence stanza.
Definition: QXmppPresence.h:20
Condition
A detailed condition of the error.
Definition: QXmppStanza.h:110
The QXmppRegistrationManager class manages in-band registration and account management tasks like cha...
Definition: QXmppRegistrationManager.h:221
The QXmppIq class is the base class for all IQs.
Definition: QXmppIq.h:22
Creates a client without any extensions.
Definition: QXmppClient.h:104
Definition: QXmppNonza.h:13
The QXmppMessage class represents an XMPP message.
Definition: QXmppMessage.h:45
Definition: Algorithms.h:12
State
This enumeration describes a client state.
Definition: QXmppClient.h:83
The QXmppCarbonManagerV2 class handles message carbons as described in XEP-0280: Message Carbons...
Definition: QXmppCarbonManagerV2.h:10
The QXmppClientExtension class is the base class for QXmppClient extensions.
Definition: QXmppClientExtension.h:31
T * addNewExtension(Args... args)
Definition: QXmppClient.h:115
Error due to TCP socket.
Definition: QXmppClient.h:76
std::variant< QXmpp::Success, QXmppError > EmptyResult
Definition: QXmppClient.h:70
Main class for starting and managing connections to XMPP servers.
Definition: QXmppClient.h:59