diff options
| author | Linus Jahn <lnj@kaidan.im> | 2020-07-26 19:02:06 +0200 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2021-01-09 14:37:47 +0100 |
| commit | 9d181aa8e4d31612391586785144dfefa75356ff (patch) | |
| tree | 7332c0203aa49290fd80c444f4017c2b2292a4e8 /src/base/QXmppStream.cpp | |
| parent | 6ebba92c582e4b2ef6d2ff939680a9ede1821308 (diff) | |
| download | qxmpp-9d181aa8e4d31612391586785144dfefa75356ff.tar.gz | |
Clean up QXmppStream (stream management)
Diffstat (limited to 'src/base/QXmppStream.cpp')
| -rw-r--r-- | src/base/QXmppStream.cpp | 69 |
1 files changed, 39 insertions, 30 deletions
diff --git a/src/base/QXmppStream.cpp b/src/base/QXmppStream.cpp index 845c449a..c5862e6c 100644 --- a/src/base/QXmppStream.cpp +++ b/src/base/QXmppStream.cpp @@ -56,13 +56,16 @@ public: QString streamOpenElement; bool streamManagementEnabled; - QMap<unsigned, QByteArray> unacknowledgedStanzas; - unsigned lastOutgoingSequenceNumber; - unsigned lastIncomingSequenceNumber; + QMap<unsigned int, QByteArray> unacknowledgedStanzas; + unsigned int lastOutgoingSequenceNumber; + unsigned int lastIncomingSequenceNumber; }; QXmppStreamPrivate::QXmppStreamPrivate() - : socket(nullptr), streamManagementEnabled(false), lastOutgoingSequenceNumber(0), lastIncomingSequenceNumber(0) + : socket(nullptr), + streamManagementEnabled(false), + lastOutgoingSequenceNumber(0), + lastIncomingSequenceNumber(0) { } @@ -156,13 +159,14 @@ bool QXmppStream::sendPacket(const QXmppStanza &packet) QXmlStreamWriter xmlStream(&data); packet.toXml(&xmlStream); - bool isXmppStanza = packet.isXmppStanza(); - if (isXmppStanza && d->streamManagementEnabled) - d->unacknowledgedStanzas[++d->lastOutgoingSequenceNumber] = data; + // store packet for possible later stream resumption + if (d->streamManagementEnabled && packet.isXmppStanza()) { + d->unacknowledgedStanzas.insert(++d->lastOutgoingSequenceNumber, data); + } // send packet bool success = sendData(data); - if (isXmppStanza) + if (packet.isXmppStanza()) sendAcknowledgementRequest(); return success; } @@ -307,20 +311,21 @@ void QXmppStream::processData(const QString &data) } // process stanzas - QDomElement nodeRecv = doc.documentElement().firstChildElement(); - while (!nodeRecv.isNull()) { - if (QXmppStreamManagementAck::isStreamManagementAck(nodeRecv)) - handleAcknowledgement(nodeRecv); - else if (QXmppStreamManagementReq::isStreamManagementReq(nodeRecv)) + auto stanza = doc.documentElement().firstChildElement(); + for (; !stanza.isNull(); stanza = stanza.nextSiblingElement()) { + if (QXmppStreamManagementAck::isStreamManagementAck(stanza)) { + handleAcknowledgement(stanza); + } else if (QXmppStreamManagementReq::isStreamManagementReq(stanza)) { sendAcknowledgement(); - else { - handleStanza(nodeRecv); - if (nodeRecv.tagName() == QLatin1String("message") || - nodeRecv.tagName() == QLatin1String("presence") || - nodeRecv.tagName() == QLatin1String("iq")) + } else { + handleStanza(stanza); + + if (stanza.tagName() == QLatin1String("message") || + stanza.tagName() == QLatin1String("presence") || + stanza.tagName() == QLatin1String("iq")) { ++d->lastIncomingSequenceNumber; + } } - nodeRecv = nodeRecv.nextSiblingElement(); } // process stream end @@ -346,20 +351,24 @@ void QXmppStream::enableStreamManagement(bool resetSequenceNumber) d->lastIncomingSequenceNumber = 0; // resend unacked stanzas - if (!d->unacknowledgedStanzas.empty()) { - QMap<unsigned, QByteArray> oldUnackedStanzas = d->unacknowledgedStanzas; + if (!d->unacknowledgedStanzas.isEmpty()) { + const auto oldUnackedStanzas = d->unacknowledgedStanzas; d->unacknowledgedStanzas.clear(); - for (QMap<unsigned, QByteArray>::iterator it = oldUnackedStanzas.begin(); it != oldUnackedStanzas.end(); ++it) { - d->unacknowledgedStanzas[++d->lastOutgoingSequenceNumber] = it.value(); - sendData(it.value()); + + for (const auto &value : oldUnackedStanzas) { + d->unacknowledgedStanzas.insert(++d->lastOutgoingSequenceNumber, value); + sendData(value); } + sendAcknowledgementRequest(); } } else { // resend unacked stanzas - if (!d->unacknowledgedStanzas.empty()) { - for (QMap<unsigned, QByteArray>::iterator it = d->unacknowledgedStanzas.begin(); it != d->unacknowledgedStanzas.end(); ++it) - sendData(it.value()); + if (!d->unacknowledgedStanzas.isEmpty()) { + for (const auto &value : std::as_const(d->unacknowledgedStanzas)) { + sendData(value); + } + sendAcknowledgementRequest(); } } @@ -370,7 +379,7 @@ void QXmppStream::enableStreamManagement(bool resetSequenceNumber) /// /// \since QXmpp 1.0 /// -unsigned QXmppStream::lastIncomingSequenceNumber() const +unsigned int QXmppStream::lastIncomingSequenceNumber() const { return d->lastIncomingSequenceNumber; } @@ -381,9 +390,9 @@ unsigned QXmppStream::lastIncomingSequenceNumber() const /// /// \since QXmpp 1.0 /// -void QXmppStream::setAcknowledgedSequenceNumber(unsigned sequenceNumber) +void QXmppStream::setAcknowledgedSequenceNumber(unsigned int sequenceNumber) { - for (QMap<unsigned, QByteArray>::iterator it = d->unacknowledgedStanzas.begin(); it != d->unacknowledgedStanzas.end();) { + for (auto it = d->unacknowledgedStanzas.begin(); it != d->unacknowledgedStanzas.end();) { if (it.key() <= sequenceNumber) it = d->unacknowledgedStanzas.erase(it); else |
