QXmpp  Version: 1.7.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 QXmppPresence;
29 class QXmppMessage;
30 class QXmppIq;
31 class QXmppStream;
32 class QXmppInternalClientExtension;
33 
34 // managers
35 class QXmppDiscoveryIq;
36 class QXmppRosterManager;
37 class QXmppVCardManager;
39 
47 
55 
84 class QXMPP_EXPORT QXmppClient : public QXmppLoggable
85 {
86  Q_OBJECT
87 
89  Q_PROPERTY(QXmppLogger *logger READ logger WRITE setLogger NOTIFY loggerChanged)
91  Q_PROPERTY(State state READ state NOTIFY stateChanged)
92 
93 public:
94  using IqResult = std::variant<QDomElement, QXmppError>;
95  using EmptyResult = std::variant<QXmpp::Success, QXmppError>;
96 
99  enum Error {
104  };
105  Q_ENUM(Error)
106 
107 
108  enum State {
111  ConnectedState
112  };
113  Q_ENUM(State)
114 
115 
122  ResumedStream
123  };
124 
132  };
133 
134  QXmppClient(InitialExtensions, QObject *parent = nullptr);
135  QXmppClient(QObject *parent = nullptr);
136  ~QXmppClient() override;
137 
138  bool addExtension(QXmppClientExtension *extension);
139  template<typename T, typename... Args>
140  T *addNewExtension(Args... args)
141  {
142  // it's impossible that addExtension() returns false: ext is a new object
143  auto *ext = new T(args...);
144  addExtension(ext);
145  return ext;
146  }
147  bool insertExtension(int index, QXmppClientExtension *extension);
148  bool removeExtension(QXmppClientExtension *extension);
149  QXmppE2eeExtension *encryptionExtension() const;
150  void setEncryptionExtension(QXmppE2eeExtension *);
151 
152  QList<QXmppClientExtension *> extensions() const;
153 
167  template<typename T>
168  T *findExtension() const
169  {
170  const QList<QXmppClientExtension *> list = extensions();
171  for (auto ext : list) {
172  T *extension = qobject_cast<T *>(ext);
173  if (extension) {
174  return extension;
175  }
176  }
177  return nullptr;
178  }
179 
195  template<typename T>
196  int indexOfExtension() const
197  {
198  auto list = extensions();
199  for (int i = 0; i < list.size(); ++i) {
200  if (qobject_cast<T *>(list.at(i)) != nullptr) {
201  return i;
202  }
203  }
204  return -1;
205  }
206 
207  bool isAuthenticated() const;
208  bool isConnected() const;
209 
210  bool isActive() const;
211  void setActive(bool active);
212 
213  StreamManagementState streamManagementState() const;
214 
215  QXmppPresence clientPresence() const;
216  void setClientPresence(const QXmppPresence &presence);
217 
218  QXmppConfiguration &configuration();
219 
220  // documentation needs to be here, see https://stackoverflow.com/questions/49192523/
222  QXmppLogger *logger() const;
223  void setLogger(QXmppLogger *logger);
224 
225  QAbstractSocket::SocketError socketError();
226  QString socketErrorString() const;
227 
228  // documentation needs to be here, see https://stackoverflow.com/questions/49192523/
230  State state() const;
231  QXmppStanza::Error::Condition xmppStreamError();
232 
233  QXmppTask<QXmpp::SendResult> sendSensitive(QXmppStanza &&, const std::optional<QXmppSendStanzaParams> & = {});
234  QXmppTask<QXmpp::SendResult> send(QXmppStanza &&, const std::optional<QXmppSendStanzaParams> & = {});
235  QXmppTask<QXmpp::SendResult> reply(QXmppStanza &&stanza, const std::optional<QXmppE2eeMetadata> &e2eeMetadata, const std::optional<QXmppSendStanzaParams> & = {});
236  QXmppTask<IqResult> sendIq(QXmppIq &&, const std::optional<QXmppSendStanzaParams> & = {});
237  QXmppTask<IqResult> sendSensitiveIq(QXmppIq &&, const std::optional<QXmppSendStanzaParams> & = {});
238  QXmppTask<EmptyResult> sendGenericIq(QXmppIq &&, const std::optional<QXmppSendStanzaParams> & = {});
239 
240 #if QXMPP_DEPRECATED_SINCE(1, 1)
241  QT_DEPRECATED_X("Use QXmppClient::findExtension<QXmppRosterManager>() instead")
242  QXmppRosterManager &rosterManager();
243 
244  QT_DEPRECATED_X("Use QXmppClient::findExtension<QXmppVCardManager>() instead")
245  QXmppVCardManager &vCardManager();
246 
247  QT_DEPRECATED_X("Use QXmppClient::findExtension<QXmppVersionManager>() instead")
248  QXmppVersionManager &versionManager();
249 #endif
250 
251 Q_SIGNALS:
252 
273  void connected();
274 
276  void disconnected();
277 
284 
295  Q_SIGNAL void errorOccurred(const QXmppError &error);
296 
298  void loggerChanged(QXmppLogger *logger);
299 
304  void messageReceived(const QXmppMessage &message);
305 
310  void presenceReceived(const QXmppPresence &presence);
311 
318  void iqReceived(const QXmppIq &iq);
319 
322  void sslErrors(const QList<QSslError> &errors);
323 
326 
327 public Q_SLOTS:
328  void connectToServer(const QXmppConfiguration &,
329  const QXmppPresence &initialPresence =
330  QXmppPresence());
331  void connectToServer(const QString &jid,
332  const QString &password);
333  void disconnectFromServer();
334  bool sendPacket(const QXmppNonza &);
335  void sendMessage(const QString &bareJid, const QString &message);
336 
337 private:
338  void injectIq(const QDomElement &element, const std::optional<QXmppE2eeMetadata> &e2eeMetadata);
339  bool injectMessage(QXmppMessage &&message);
340 
341 private Q_SLOTS:
342  void _q_elementReceived(const QDomElement &element, bool &handled);
343  void _q_reconnect();
344  void _q_socketStateChanged(QAbstractSocket::SocketState state);
345  void _q_streamConnected();
346  void _q_streamDisconnected();
347 
348 private:
349  const std::unique_ptr<QXmppClientPrivate> d;
350 
351  friend class QXmppClientExtension;
352  friend class QXmppInternalClientExtension;
353  friend class TestClient;
354 };
355 
356 #endif // QXMPPCLIENT_H
The QXmppClientExtension class is the base class for QXmppClient extensions.
Definition: QXmppClientExtension.h:33
The QXmppClient class is the main class for using QXmpp.
Definition: QXmppClient.h:85
void presenceReceived(const QXmppPresence &presence)
void error(QXmppClient::Error)
int indexOfExtension() const
Returns the index of an extension.
Definition: QXmppClient.h:196
void connected()
std::variant< QDomElement, QXmppError > IqResult
Definition: QXmppClient.h:94
InitialExtensions
Definition: QXmppClient.h:127
@ BasicExtensions
Creates a client with the default set of extensions.
Definition: QXmppClient.h:131
@ NoExtensions
Creates a client without any extensions.
Definition: QXmppClient.h:129
T * findExtension() const
Returns the extension which can be cast into type T*, or 0 if there is no such extension.
Definition: QXmppClient.h:168
State
This enumeration describes a client state.
Definition: QXmppClient.h:108
@ DisconnectedState
Disconnected from the server.
Definition: QXmppClient.h:109
@ ConnectingState
Trying to connect to the server.
Definition: QXmppClient.h:110
Q_SIGNAL void errorOccurred(const QXmppError &error)
void loggerChanged(QXmppLogger *logger)
This signal is emitted when the logger changes.
Error
Definition: QXmppClient.h:99
@ NoError
No error.
Definition: QXmppClient.h:100
@ XmppStreamError
Error due to XML stream.
Definition: QXmppClient.h:103
@ KeepAliveError
Error due to no response to a keep alive.
Definition: QXmppClient.h:102
@ SocketError
Error due to TCP socket.
Definition: QXmppClient.h:101
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:116
@ NoStreamManagement
Stream Management is not used.
Definition: QXmppClient.h:118
@ NewStream
Stream Management is used and the previous stream has not been resumed.
Definition: QXmppClient.h:120
void iqReceived(const QXmppIq &iq)
T * addNewExtension(Args... args)
Definition: QXmppClient.h:140
void disconnected()
This signal is emitted when the XMPP connection disconnects.
std::variant< QXmpp::Success, QXmppError > EmptyResult
Definition: QXmppClient.h:95
The QXmppConfiguration class holds configuration options.
Definition: QXmppConfiguration.h:32
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:39
Definition: QXmppNonza.h:14
The QXmppPresence class represents an XMPP presence stanza.
Definition: QXmppPresence.h:21
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
The QXmppStream class is the base class for all XMPP streams.
Definition: QXmppStream.h:27
Definition: QXmppTask.h:62
The QXmppVCardManager class gets/sets XMPP vCards. It is an implementation of XEP-0054: vcard-temp.
Definition: QXmppVCardManager.h:38
The QXmppVersionManager class makes it possible to request for the software version of an entity as d...
Definition: QXmppVersionManager.h:24
Definition: QXmppError.h:17