From a4dcd906850b5ebecfdf7331059a13192f094f07 Mon Sep 17 00:00:00 2001 From: Tibor Csötönyi Date: Wed, 3 May 2023 14:46:38 +0200 Subject: Add XEP-0353: Jingle Message Initiation manager --- src/client/QXmppJingleMessageInitiationManager.h | 126 +++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 src/client/QXmppJingleMessageInitiationManager.h (limited to 'src/client/QXmppJingleMessageInitiationManager.h') diff --git a/src/client/QXmppJingleMessageInitiationManager.h b/src/client/QXmppJingleMessageInitiationManager.h new file mode 100644 index 00000000..cd5bb494 --- /dev/null +++ b/src/client/QXmppJingleMessageInitiationManager.h @@ -0,0 +1,126 @@ +// SPDX-FileCopyrightText: 2023 Tibor Csötönyi +// SPDX-FileCopyrightText: 2023 Melvin Keskin +// +// SPDX-License-Identifier: LGPL-2.1-or-later + +#ifndef QXMPPJINGLEMESSAGEINITIATIONMANAGER_H +#define QXMPPJINGLEMESSAGEINITIATIONMANAGER_H + +#include "QXmppClientExtension.h" +#include "QXmppError.h" +#include "QXmppJingleIq.h" +#include "QXmppMessageHandler.h" +#include "QXmppSendResult.h" +#include "QXmppTask.h" + +class QXmppJingleMessageInitiationManager; +class QXmppJingleMessageInitiationPrivate; +class QXmppJingleMessageInitiationManagerPrivate; + +class QXMPP_EXPORT QXmppJingleMessageInitiation : public QObject +{ + Q_OBJECT +public: + struct Rejected + { + std::optional reason; + bool containsTieBreak; + }; + + struct Retracted + { + std::optional reason; + bool containsTieBreak; + }; + + struct Finished + { + std::optional reason; + QString migratedTo; + }; + + /// Variant of Rejected, Retracted, Finished or Error result types + using Result = std::variant; + + QXmppJingleMessageInitiation(QXmppJingleMessageInitiationManager *manager); + ~QXmppJingleMessageInitiation(); + + QXmppTask ring(); + QXmppTask proceed(); + QXmppTask reject(std::optional reason, bool containsTieBreak = false); + QXmppTask retract(std::optional reason, bool containsTieBreak = false); + QXmppTask finish(std::optional reason, const QString &migratedTo = {}); + + Q_SIGNAL void ringing(); + Q_SIGNAL void proceeded(const QString &id, const QString &callPartnerResource); + Q_SIGNAL void closed(const Result &result); + +private: + QString id() const; + void setId(const QString &id); + void setCallPartnerJid(const QString &callPartnerJid); + QString callPartnerJid() const; + bool isProceeded() const; + void setIsProceeded(bool isProceeded); + + std::unique_ptr d; + + friend class QXmppJingleMessageInitiationManager; + friend class tst_QXmppJingleMessageInitiationManager; +}; + +class QXMPP_EXPORT QXmppJingleMessageInitiationManager : public QXmppClientExtension, public QXmppMessageHandler +{ + Q_OBJECT +public: + using ProposeResult = std::variant, QXmppError>; + + QXmppJingleMessageInitiationManager(); + ~QXmppJingleMessageInitiationManager(); + + /// \cond + QStringList discoveryFeatures() const override; + /// \endcond + + QXmppTask propose( + const QString &callPartnerJid, + const QXmppJingleDescription &description); + + Q_SIGNAL void proposed( + const std::shared_ptr &jmi, + const QString &id, + const std::optional &description); + +protected: + /// \cond + bool handleMessage(const QXmppMessage &) override; + void setClient(QXmppClient *client) override; + /// \endcond + +private: + QXmppTask sendMessage( + const QXmppJingleMessageInitiationElement &jmiElement, + const QString &callPartnerJid); + + void clear(const std::shared_ptr &jmi); + void clearAll(); + + bool handleJmiElement(QXmppJingleMessageInitiationElement &&jmiElement, const QString &senderJid); + bool handleExistingJmi(const std::shared_ptr &existingJmi, const QXmppJingleMessageInitiationElement &jmiElement, const QString &callPartnerResource); + bool handleProposeJmiElement(const QXmppJingleMessageInitiationElement &jmiElement, const QString &callPartnerJid); + bool handleTieBreak(const std::shared_ptr &existingJmi, const QXmppJingleMessageInitiationElement &jmiElement, const QString &callPartnerResource); + bool handleExistingSession(const std::shared_ptr &existingJmi, const QString &jmiElementId); + bool handleNonExistingSession(const std::shared_ptr &existingJmi, const QString &jmiElementId, const QString &callPartnerResource); + std::shared_ptr addJmi(const QString &callPartnerJid); + const QVector> &jmis() const; + +private: + std::unique_ptr d; + + friend class QXmppJingleMessageInitiationPrivate; + friend class tst_QXmppJingleMessageInitiationManager; +}; + +Q_DECLARE_METATYPE(QXmppJingleMessageInitiation::Result) + +#endif // QXMPPJINGLEMESSAGEINITIATIONMANAGER_H -- cgit v1.2.3