7#ifndef QXMPPOUTGOINGCLIENT_H
8#define QXMPPOUTGOINGCLIENT_H
10#include "QXmppAuthenticationError.h"
11#include "QXmppBindError.h"
12#include "QXmppClient.h"
13#include "QXmppPromise.h"
14#include "QXmppStanza.h"
15#include "QXmppStreamError.h"
17#include <QAbstractSocket>
28class QXmppOutgoingClientPrivate;
31namespace QXmpp::Private {
32class C2sStreamManager;
35class OutgoingIqManager;
37class SendDataInterface;
38class StreamAckManager;
45struct StreamErrorElement;
48enum HandleElementResult {
54enum class AuthenticationMethod {
64 bool fastTokenChanged;
65 AuthenticationMethod authenticationMethod;
73namespace QXmpp::Private::Sasl2 {
85 using IqResult = std::variant<QDomElement, QXmppError>;
86 using ConnectionError = std::variant<QAbstractSocket::SocketError, QXmpp::TimeoutError, QXmpp::StreamError, QXmpp::AuthenticationError, QXmpp::BindError>;
87 static constexpr QStringView TaskName = u
"client session";
89 explicit QXmppOutgoingClient(QObject *parent);
90 ~QXmppOutgoingClient()
override;
93 void disconnectFromHost();
94 bool isAuthenticated()
const;
95 bool isConnected()
const;
102 QXmpp::Private::XmppSocket &xmppSocket()
const;
103 QXmpp::Private::StreamAckManager &streamAckManager()
const;
104 QXmpp::Private::OutgoingIqManager &iqManager()
const;
105 QXmpp::Private::C2sStreamManager &c2sStreamManager()
const;
106 QXmpp::Private::CarbonManager &carbonManager()
const;
107 QXmpp::Private::CsiManager &csiManager()
const;
110 Q_SIGNAL
void connected(
const QXmpp::Private::SessionBegin &);
113 Q_SIGNAL
void disconnected(
const QXmpp::Private::SessionEnd &);
116 Q_SIGNAL
void errorOccurred(
const QString &text,
const QXmppOutgoingClient::ConnectionError &details,
QXmppClient::Error oldError);
119 Q_SIGNAL
void elementReceived(
const QDomElement &element,
bool &handled);
129 Q_SIGNAL
void iqReceived(
const QXmppIq &);
132 Q_SIGNAL
void sslErrors(
const QList<QSslError> &errors);
136 void handleStream(
const QXmpp::Private::StreamOpen &stream);
137 void handlePacketReceived(
const QDomElement &element);
138 QXmpp::Private::HandleElementResult handleElement(
const QDomElement &nodeRecv);
140 void handleStreamError(
const QXmpp::Private::StreamErrorElement &streamError);
141 bool handleStanza(
const QDomElement &);
144 void handleSocketDisconnected();
145 void handleSocketError(
const QString &text, std::variant<QXmpp::StreamError, QAbstractSocket::SocketError>);
146 void handleSocketSslErrors(
const QList<QSslError> &);
148 void startSasl2Auth(
const QXmpp::Private::Sasl2::StreamFeature &sasl2Feature);
149 void startNonSaslAuth();
150 void startSmResume();
151 void startSmEnable();
152 void startResourceBinding();
155 void setError(
const QString &text, ConnectionError &&details);
156 void throwKeepAliveError();
159 void enableStreamManagement(
bool resetSequenceNumber);
160 bool handleIqResponse(
const QDomElement &);
162 friend class QXmppOutgoingClientPrivate;
163 friend class QXmpp::Private::PingManager;
164 friend class QXmpp::Private::C2sStreamManager;
166 friend class TestClient;
168 const std::unique_ptr<QXmppOutgoingClientPrivate> d;
171namespace QXmpp::Private {
173class C2sStreamManager
176 using Result = std::variant<Success, QXmppError>;
177 static constexpr QStringView TaskName = u
"stream management";
179 explicit C2sStreamManager(QXmppOutgoingClient *q);
181 HandleElementResult handleElement(
const QDomElement &);
182 bool hasResumeAddress()
const {
return m_canResume && !m_resumeHost.isEmpty() && m_resumePort; }
183 std::pair<QString, quint16> resumeAddress()
const {
return { m_resumeHost, m_resumePort }; }
184 void onStreamStart();
186 void onStreamClosed();
187 void onSasl2Authenticate(Sasl2::Authenticate &auth,
const Sasl2::StreamFeature &feature);
188 void onSasl2Success(
const Sasl2::Success &success);
189 void onBind2Request(Bind2Request &request,
const std::vector<QString> &bind2Features);
190 void onBind2Bound(
const Bind2Bound &);
191 bool canResume()
const {
return m_canResume; }
192 bool enabled()
const {
return m_enabled; }
193 bool streamResumed()
const {
return m_streamResumed; }
194 bool canRequestResume()
const {
return m_smAvailable && !m_enabled && m_canResume; }
196 bool canRequestEnable()
const {
return m_smAvailable && !m_enabled; }
198 bool hasOngoingRequest()
const {
return !std::holds_alternative<NoRequest>(m_request); }
201 friend class ::TestClient;
203 void onEnabled(
const SmEnabled &enabled);
204 void onEnableFailed(
const SmFailed &failed);
205 void onResumed(
const SmResumed &resumed);
206 void onResumeFailed(
const SmFailed &failed);
207 bool setResumeAddress(
const QString &address);
208 void setEnabled(
bool enabled) { m_enabled = enabled; }
209 void setResumed(
bool resumed) { m_streamResumed = resumed; }
211 struct NoRequest { };
212 struct ResumeRequest {
215 struct EnableRequest {
219 QXmppOutgoingClient *q;
221 std::variant<NoRequest, ResumeRequest, EnableRequest> m_request;
222 bool m_smAvailable =
false;
224 bool m_canResume =
false;
225 QString m_resumeHost;
226 quint16 m_resumePort = 0;
227 bool m_enabled =
false;
228 bool m_streamResumed =
false;
235 void setEnableViaBind2(
bool enable) { m_enableViaBind2 = enable; }
236 bool enabled()
const {
return m_enabled; }
237 void onBind2Request(Bind2Request &request,
const std::vector<QString> &bind2Features);
238 void onSessionOpened(
const SessionBegin &session);
242 bool m_enableViaBind2 =
false;
244 bool m_enabled =
false;
245 bool m_requested =
false;
257 explicit CsiManager(QXmppOutgoingClient *client);
259 State state()
const {
return m_state; }
260 void setState(State);
261 void onSessionOpened(
const SessionBegin &);
263 void onBind2Request(Bind2Request &request,
const std::vector<QString> &bind2Features);
268 QXmppOutgoingClient *m_client;
269 State m_state = Active;
270 bool m_synced =
true;
271 bool m_featureAvailable =
false;
272 bool m_bind2InactiveSet =
false;
Error
Definition QXmppClient.h:76
The QXmppConfiguration class holds configuration options.
Definition QXmppConfiguration.h:37
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 QXmppMessage class represents an XMPP message.
Definition QXmppMessage.h:64
The QXmppPresence class represents an XMPP presence stanza.
Definition QXmppPresence.h:22
Create and update QXmppTask objects to communicate results of asynchronous operations.
Definition QXmppPromise.h:23
The QXmppRegistrationManager class manages in-band registration and account management tasks like cha...
Definition QXmppRegistrationManager.h:225
Condition
A detailed condition of the error.
Definition QXmppStanza.h:112
The QXmppStreamFeatures class represents the features returned by an XMPP server or client.
Definition QXmppStreamFeatures.h:23
Definition QXmppTask.h:46
std::variant< T, QXmppError > Result
Definition QXmppGlobal.h:205