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> 28 class QXmppOutgoingClientPrivate;
32 class C2sStreamManager;
35 class OutgoingIqManager;
37 class SendDataInterface;
38 class StreamAckManager;
45 struct StreamErrorElement;
47 enum HandleElementResult {
53 enum class AuthenticationMethod {
63 bool fastTokenChanged;
64 AuthenticationMethod authenticationMethod;
84 using IqResult = std::variant<QDomElement, QXmppError>;
85 using ConnectionError = std::variant<QAbstractSocket::SocketError, QXmpp::TimeoutError, QXmpp::StreamError, QXmpp::AuthenticationError, QXmpp::BindError>;
86 static constexpr QStringView TaskName = u
"client session";
88 explicit QXmppOutgoingClient(QObject *parent);
89 ~QXmppOutgoingClient()
override;
92 void disconnectFromHost();
93 bool isAuthenticated()
const;
94 bool isConnected()
const;
98 QSslSocket *socket()
const;
103 QXmpp::Private::XmppSocket &xmppSocket()
const;
104 QXmpp::Private::StreamAckManager &streamAckManager()
const;
105 QXmpp::Private::OutgoingIqManager &iqManager()
const;
106 QXmpp::Private::C2sStreamManager &c2sStreamManager()
const;
107 QXmpp::Private::CarbonManager &carbonManager()
const;
108 QXmpp::Private::CsiManager &csiManager()
const;
111 Q_SIGNAL
void connected(
const QXmpp::Private::SessionBegin &);
114 Q_SIGNAL
void disconnected(
const QXmpp::Private::SessionEnd &);
117 Q_SIGNAL
void errorOccurred(
const QString &text,
const QXmppOutgoingClient::ConnectionError &details,
QXmppClient::Error oldError);
120 Q_SIGNAL
void elementReceived(
const QDomElement &element,
bool &handled);
130 Q_SIGNAL
void iqReceived(
const QXmppIq &);
133 Q_SIGNAL
void sslErrors(
const QList<QSslError> &errors);
137 void handleStream(
const QDomElement &element);
138 void handlePacketReceived(
const QDomElement &element);
139 QXmpp::Private::HandleElementResult handleElement(
const QDomElement &nodeRecv);
141 void handleStreamError(
const QXmpp::Private::StreamErrorElement &streamError);
142 bool handleStanza(
const QDomElement &);
145 void _q_socketDisconnected();
146 void socketError(QAbstractSocket::SocketError);
147 void socketSslErrors(
const QList<QSslError> &);
149 void startSasl2Auth(
const QXmpp::Private::Sasl2::StreamFeature &sasl2Feature);
150 void startNonSaslAuth();
151 void startSmResume();
152 void startSmEnable();
153 void startResourceBinding();
156 void setError(
const QString &text, ConnectionError &&details);
157 void throwKeepAliveError();
160 void enableStreamManagement(
bool resetSequenceNumber);
161 bool handleIqResponse(
const QDomElement &);
163 friend class QXmppOutgoingClientPrivate;
164 friend class QXmpp::Private::PingManager;
165 friend class QXmpp::Private::C2sStreamManager;
167 friend class TestClient;
169 const std::unique_ptr<QXmppOutgoingClientPrivate> d;
174 class C2sStreamManager
177 using Result = std::variant<Success, QXmppError>;
178 static constexpr QStringView TaskName = u
"stream management";
180 explicit C2sStreamManager(QXmppOutgoingClient *q);
182 HandleElementResult handleElement(
const QDomElement &);
183 bool hasResumeAddress()
const {
return m_canResume && !m_resumeHost.isEmpty() && m_resumePort; }
184 std::pair<QString, quint16> resumeAddress()
const {
return { m_resumeHost, m_resumePort }; }
185 void onStreamStart();
187 void onStreamClosed();
188 void onSasl2Authenticate(Sasl2::Authenticate &auth,
const Sasl2::StreamFeature &feature);
189 void onSasl2Success(
const Sasl2::Success &success);
190 void onBind2Request(Bind2Request &request,
const std::vector<QString> &bind2Features);
191 void onBind2Bound(
const Bind2Bound &);
192 bool canResume()
const {
return m_canResume; }
193 bool enabled()
const {
return m_enabled; }
194 bool streamResumed()
const {
return m_streamResumed; }
195 bool canRequestResume()
const {
return m_smAvailable && !m_enabled && m_canResume; }
197 bool canRequestEnable()
const {
return m_smAvailable && !m_enabled; }
199 bool hasOngoingRequest()
const {
return !std::holds_alternative<NoRequest>(m_request); }
202 friend class ::TestClient;
204 void onEnabled(
const SmEnabled &enabled);
205 void onEnableFailed(
const SmFailed &failed);
206 void onResumed(
const SmResumed &resumed);
207 void onResumeFailed(
const SmFailed &failed);
208 bool setResumeAddress(
const QString &address);
209 void setEnabled(
bool enabled) { m_enabled = enabled; }
210 void setResumed(
bool resumed) { m_streamResumed = resumed; }
212 struct NoRequest { };
213 struct ResumeRequest {
216 struct EnableRequest {
220 QXmppOutgoingClient *q;
222 std::variant<NoRequest, ResumeRequest, EnableRequest> m_request;
223 bool m_smAvailable =
false;
225 bool m_canResume =
false;
226 QString m_resumeHost;
227 quint16 m_resumePort = 0;
228 bool m_enabled =
false;
229 bool m_streamResumed =
false;
236 void setEnableViaBind2(
bool enable) { m_enableViaBind2 = enable; }
237 bool enabled()
const {
return m_enabled; }
238 void onBind2Request(Bind2Request &request,
const std::vector<QString> &bind2Features);
239 void onSessionOpened(
const SessionBegin &session);
243 bool m_enableViaBind2 =
false;
245 bool m_enabled =
false;
246 bool m_requested =
false;
258 explicit CsiManager(QXmppOutgoingClient *client);
260 State state()
const {
return m_state; }
261 void setState(State);
262 void onSessionOpened(
const SessionBegin &);
264 void onBind2Request(Bind2Request &request,
const std::vector<QString> &bind2Features);
269 QXmppOutgoingClient *m_client;
270 State m_state = Active;
271 bool m_synced =
true;
272 bool m_featureAvailable =
false;
273 bool m_bind2InactiveSet =
false;
278 #endif // QXMPPOUTGOINGCLIENT_H The QXmppConfiguration class holds configuration options.
Definition: QXmppConfiguration.h:36
The QXmppStreamFeatures class represents the features returned by an XMPP server or client...
Definition: QXmppStreamFeatures.h:22
The QXmppLoggable class represents a source of logging messages.
Definition: QXmppLogger.h:109
Definition: QXmppTask.h:61
Error
Definition: QXmppClient.h:76
Definition: QXmppSasl_p.h:160
The QXmppPresence class represents an XMPP presence stanza.
Definition: QXmppPresence.h:21
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:224
The QXmppIq class is the base class for all IQs.
Definition: QXmppIq.h:22
The QXmppMessage class represents an XMPP message.
Definition: QXmppMessage.h:63
Definition: Algorithms.h:12