5#ifndef QXMPPOUTGOINGCLIENT_P_H
6#define QXMPPOUTGOINGCLIENT_P_H
8#include "QXmppOutgoingClient.h"
9#include "QXmppPromise.h"
10#include "QXmppSaslManager_p.h"
11#include "QXmppSasl_p.h"
12#include "QXmppStreamError_p.h"
13#include "QXmppStreamManagement_p.h"
15#include "XmppSocket.h"
24using namespace QXmpp::Private;
26namespace QXmpp::Private {
28using LegacyError = std::variant<QAbstractSocket::SocketError, QXmpp::TimeoutError, QXmppStanza::Error::Condition>;
34 static constexpr QStringView TaskName = u
"STARTTLS";
35 QXmppTask<void> task() {
return m_promise.task(); }
36 HandleElementResult handleElement(
const QDomElement &el);
39 QXmppPromise<void> m_promise;
56 using Result = std::variant<BoundAddress, QXmppStanza::Error, ProtocolError>;
57 static constexpr QStringView TaskName = u
"resource binding";
59 explicit BindManager(SendDataInterface *socket) : m_socket(socket) { }
61 QXmppTask<Result> bindAddress(
const QString &resource);
62 HandleElementResult handleElement(
const QDomElement &el);
65 SendDataInterface *m_socket;
67 std::optional<QXmppPromise<Result>> m_promise;
70struct NonSaslAuthOptions {
76class NonSaslAuthManager
79 using OptionsResult = std::variant<NonSaslAuthOptions, QXmppError>;
80 using AuthResult = std::variant<Success, QXmppError>;
81 static constexpr QStringView TaskName = u
"Non-SASL authentication";
83 explicit NonSaslAuthManager(SendDataInterface *socket) : m_socket(socket) { }
85 QXmppTask<OptionsResult> queryOptions(
const QString &streamFrom,
const QString &username);
86 QXmppTask<AuthResult> authenticate(
bool plainText,
const QString &username,
const QString &password,
const QString &resource,
const QString &streamId);
87 HandleElementResult handleElement(
const QDomElement &el);
93 QXmppPromise<OptionsResult> p;
96 QXmppPromise<AuthResult> p;
100 SendDataInterface *m_socket;
101 std::variant<NoQuery, OptionsQuery, AuthQuery> m_query;
108 explicit PingManager(QXmppOutgoingClient *q);
110 void onDataReceived();
115 QXmppOutgoingClient *q;
117 QTimer *timeoutTimer;
120using IqResult = QXmppOutgoingClient::IqResult;
123 QXmppPromise<IqResult> interface;
128class OutgoingIqManager
131 OutgoingIqManager(QXmppLoggable *l, StreamAckManager &streamAckMananger);
132 ~OutgoingIqManager();
134 QXmppTask<IqResult> sendIq(QXmppIq &&,
const QString &to);
135 QXmppTask<IqResult> sendIq(QXmppPacket &&,
const QString &
id,
const QString &to);
137 bool hasId(
const QString &
id)
const;
138 bool isIdValid(
const QString &
id)
const;
140 QXmppTask<IqResult> start(
const QString &
id,
const QString &to);
141 void finish(
const QString &
id, IqResult &&result);
144 void onSessionOpened(
const SessionBegin &);
145 void onSessionClosed(
const SessionEnd &);
146 bool handleStanza(
const QDomElement &stanza);
149 void warning(
const QString &message);
152 StreamAckManager &m_streamAckManager;
153 std::unordered_map<QString, IqState> m_requests;
158class QXmppOutgoingClientPrivate
163 QXmppOutgoingClient::ConnectionError details;
164 LegacyError legacyError;
167 explicit QXmppOutgoingClientPrivate(QXmppOutgoingClient *q);
168 void connectToHost(
const ServerAddress &);
169 void connectToAddressList(std::vector<ServerAddress> &&);
170 void connectToNextAddress();
174 QXmppConfiguration config;
175 std::optional<Error> error;
179 StreamAckManager streamAckManager;
180 OutgoingIqManager iqManager;
183 std::vector<ServerAddress> serverAddresses;
184 std::size_t nextServerAddressIndex = 0;
188 } nextAddressState = Current;
193 QString streamVersion;
196 std::optional<StreamErrorElement::SeeOtherHost> redirect;
199 bool isAuthenticated =
false;
200 bool bindModeAvailable =
false;
201 bool sessionStarted =
false;
202 AuthenticationMethod authenticationMethod = AuthenticationMethod::Sasl;
203 std::optional<Bind2Bound> bind2Bound;
205 std::variant<QXmppOutgoingClient *, StarttlsManager, NonSaslAuthManager, SaslManager, Sasl2Manager, C2sStreamManager *, BindManager> listener;
206 FastTokenManager fastTokenManager;
207 C2sStreamManager c2sStreamManager;
208 CarbonManager carbonManager;
209 CsiManager csiManager;
210 PingManager pingManager;
212 template<
typename T,
typename... Args>
213 T &setListener(Args... args)
215 listener = T { args... };
216 return std::get<T>(listener);
220 QXmppOutgoingClient *q;