// 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