diff options
Diffstat (limited to 'src/base/QXmppStreamManagement.cpp')
| -rw-r--r-- | src/base/QXmppStreamManagement.cpp | 72 |
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 |
