aboutsummaryrefslogtreecommitdiff
path: root/src/base/QXmppStreamManagement.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/QXmppStreamManagement.cpp')
-rw-r--r--src/base/QXmppStreamManagement.cpp72
1 files changed, 42 insertions, 30 deletions
diff --git a/src/base/QXmppStreamManagement.cpp b/src/base/QXmppStreamManagement.cpp
index 93a98626..af08dc71 100644
--- a/src/base/QXmppStreamManagement.cpp
+++ b/src/base/QXmppStreamManagement.cpp
@@ -1,32 +1,17 @@
-/*
- * Copyright (C) 2008-2021 The QXmpp developers
- *
- * Authors:
- * Niels Ole Salscheider
- *
- * Source:
- * https://github.com/qxmpp-project/qxmpp
- *
- * This file is a part of QXmpp library.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- */
+// SPDX-FileCopyrightText: 2017 Niels Ole Salscheider <niels_ole@salscheider-online.de>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
#include "QXmppConstants_p.h"
#include "QXmppGlobal.h"
+#include "QXmppPacket_p.h"
#include "QXmppStanza_p.h"
#include "QXmppStream.h"
#include "QXmppStreamManagement_p.h"
+using namespace QXmpp::Private;
+
+/// \cond
QXmppStreamManagementEnable::QXmppStreamManagementEnable(const bool resume, const unsigned max)
: m_resume(resume), m_max(max)
{
@@ -331,6 +316,16 @@ QXmppStreamManager::QXmppStreamManager(QXmppStream *stream)
{
}
+QXmppStreamManager::~QXmppStreamManager()
+{
+ resetCache();
+}
+
+bool QXmppStreamManager::enabled() const
+{
+ return m_enabled;
+}
+
unsigned int QXmppStreamManager::lastIncomingSequenceNumber() const
{
return m_lastIncomingSequenceNumber;
@@ -346,11 +341,20 @@ void QXmppStreamManager::handleStart()
m_enabled = false;
}
-void QXmppStreamManager::handlePacketSent(const QXmppStanza &packet, const QByteArray &data)
+void QXmppStreamManager::handlePacketSent(QXmppPacket &packet, bool sentData)
{
if (m_enabled && packet.isXmppStanza()) {
- m_unacknowledgedStanzas.insert(++m_lastOutgoingSequenceNumber, data);
+ m_unacknowledgedStanzas.insert(++m_lastOutgoingSequenceNumber, packet);
sendAcknowledgementRequest();
+ } else {
+ if (sentData) {
+ packet.reportResult(QXmpp::SendSuccess { false });
+ } else {
+ packet.reportResult(QXmpp::SendError {
+ QStringLiteral("Couldn't write data to socket. No stream management enabled."),
+ QXmpp::SendError::SocketWriteError });
+ }
+ packet.reportFinished();
}
}
@@ -383,12 +387,12 @@ void QXmppStreamManager::enableStreamManagement(bool resetSequenceNumber)
// resend unacked stanzas
if (!m_unacknowledgedStanzas.isEmpty()) {
- const auto oldUnackedStanzas = m_unacknowledgedStanzas;
+ auto oldUnackedStanzas = m_unacknowledgedStanzas;
m_unacknowledgedStanzas.clear();
- for (const auto &value : oldUnackedStanzas) {
- m_unacknowledgedStanzas.insert(++m_lastOutgoingSequenceNumber, value);
- stream->sendData(value);
+ for (auto &packet : oldUnackedStanzas) {
+ m_unacknowledgedStanzas.insert(++m_lastOutgoingSequenceNumber, packet);
+ stream->sendData(packet.data());
}
sendAcknowledgementRequest();
@@ -396,8 +400,8 @@ void QXmppStreamManager::enableStreamManagement(bool resetSequenceNumber)
} else {
// resend unacked stanzas
if (!m_unacknowledgedStanzas.isEmpty()) {
- for (const auto &value : std::as_const(m_unacknowledgedStanzas)) {
- stream->sendData(value);
+ for (auto &packet : m_unacknowledgedStanzas) {
+ stream->sendData(packet.data());
}
sendAcknowledgementRequest();
@@ -409,6 +413,8 @@ void QXmppStreamManager::setAcknowledgedSequenceNumber(unsigned int sequenceNumb
{
for (auto it = m_unacknowledgedStanzas.begin(); it != m_unacknowledgedStanzas.end();) {
if (it.key() <= sequenceNumber) {
+ it->reportResult(QXmpp::SendSuccess { true });
+ it->reportFinished();
it = m_unacknowledgedStanzas.erase(it);
} else {
break;
@@ -457,5 +463,11 @@ void QXmppStreamManager::sendAcknowledgementRequest()
void QXmppStreamManager::resetCache()
{
+ for (auto &packet : m_unacknowledgedStanzas) {
+ packet.reportResult(QXmpp::SendError { QStringLiteral("Disconnected"), QXmpp::SendError::Disconnected });
+ packet.reportFinished();
+ }
+
m_unacknowledgedStanzas.clear();
}
+/// \endcond