5#ifndef QXMPPSTREAMMANAGEMENT_P_H
6#define QXMPPSTREAMMANAGEMENT_P_H
8#include "QXmppConstants_p.h"
9#include "QXmppGlobal.h"
10#include "QXmppPacket_p.h"
11#include "QXmppSendResult.h"
12#include "QXmppStanza.h"
17#include <QDomDocument>
18#include <QXmlStreamWriter>
20namespace QXmpp::Private {
38namespace QXmpp::Private {
41 static constexpr std::tuple XmlTag = { u
"sm", QXmpp::Private::ns_stream_management };
45 static constexpr std::tuple XmlTag = { u
"enable", QXmpp::Private::ns_stream_management };
46 static std::optional<SmEnable> fromDom(
const QDomElement &);
47 void toXml(XmlWriter &w)
const;
54 static constexpr std::tuple XmlTag = { u
"enabled", QXmpp::Private::ns_stream_management };
55 static std::optional<SmEnabled> fromDom(
const QDomElement &);
56 void toXml(XmlWriter &w)
const;
65 static constexpr std::tuple XmlTag = { u
"resume", QXmpp::Private::ns_stream_management };
66 static std::optional<SmResume> fromDom(
const QDomElement &);
67 void toXml(XmlWriter &w)
const;
74 static constexpr std::tuple XmlTag = { u
"resumed", QXmpp::Private::ns_stream_management };
75 static std::optional<SmResumed> fromDom(
const QDomElement &);
76 void toXml(XmlWriter &w)
const;
83 static constexpr std::tuple XmlTag = { u
"failed", QXmpp::Private::ns_stream_management };
84 static std::optional<SmFailed> fromDom(
const QDomElement &);
85 void toXml(XmlWriter &w)
const;
87 std::optional<QXmppStanza::Error::Condition> error;
91 static constexpr std::tuple XmlTag = { u
"a", QXmpp::Private::ns_stream_management };
92 static std::optional<SmAck> fromDom(
const QDomElement &);
93 void toXml(XmlWriter &w)
const;
99 static constexpr std::tuple XmlTag = { u
"r", QXmpp::Private::ns_stream_management };
100 static std::optional<SmRequest> fromDom(
const QDomElement &);
101 void toXml(XmlWriter &w)
const;
108class StreamAckManager
111 explicit StreamAckManager(XmppSocket &socket);
113 bool enabled()
const {
return m_enabled; }
114 unsigned int lastIncomingSequenceNumber()
const {
return m_lastIncomingSequenceNumber; }
116 void handlePacketSent(QXmppPacket &packet,
bool sentData);
117 bool handleStanza(
const QDomElement &stanza);
118 void onSessionClosed();
121 void enableStreamManagement(
bool resetSequenceNumber);
122 void setAcknowledgedSequenceNumber(
unsigned int sequenceNumber);
124 QXmppTask<QXmpp::SendResult> send(QXmppPacket &&);
125 bool sendPacketCompat(QXmppPacket &&);
126 std::tuple<bool, QXmppTask<QXmpp::SendResult>> internalSend(QXmppPacket &&);
128 void sendAcknowledgementRequest();
131 void handleAcknowledgement(SmAck ack);
133 void sendAcknowledgement();
135 QXmpp::Private::XmppSocket &socket;
137 bool m_enabled =
false;
138 std::deque<std::pair<unsigned int, QXmppPacket>> m_unacknowledgedStanzas;
139 unsigned int m_lastOutgoingSequenceNumber = 0;
140 unsigned int m_lastIncomingSequenceNumber = 0;