QXmpp  Version: 1.15.1
QXmppJingleMessageInitiationManager.h
1 // SPDX-FileCopyrightText: 2023 Tibor Csötönyi <work@taibsu.de>
2 // SPDX-FileCopyrightText: 2023 Melvin Keskin <melvo@olomono.de>
3 //
4 // SPDX-License-Identifier: LGPL-2.1-or-later
5 
6 #ifndef QXMPPJINGLEMESSAGEINITIATIONMANAGER_H
7 #define QXMPPJINGLEMESSAGEINITIATIONMANAGER_H
8 
9 #include "QXmppClientExtension.h"
10 #include "QXmppError.h"
11 #include "QXmppJingleIq.h"
12 #include "QXmppMessageHandler.h"
13 #include "QXmppSendResult.h"
14 #include "QXmppTask.h"
15 
17 class QXmppJingleMessageInitiationPrivate;
18 class QXmppJingleMessageInitiationManagerPrivate;
19 
20 class QXMPP_EXPORT QXmppJingleMessageInitiation : public QObject
21 {
22  Q_OBJECT
23 public:
24  struct Rejected {
25  std::optional<QXmppJingleReason> reason;
26  bool containsTieBreak;
27  };
28 
29  struct Retracted {
30  std::optional<QXmppJingleReason> reason;
31  bool containsTieBreak;
32  };
33 
34  struct Finished {
35  std::optional<QXmppJingleReason> reason;
36  QString migratedTo;
37  };
38 
40  using Result = std::variant<Rejected, Retracted, Finished, QXmppError>;
41 
43 
44  const QString &remoteJid() const;
45 
48  QXmppTask<QXmpp::SendResult> reject(std::optional<QXmppJingleReason> reason, bool containsTieBreak = false);
49  QXmppTask<QXmpp::SendResult> retract(std::optional<QXmppJingleReason> reason, bool containsTieBreak = false);
50  QXmppTask<QXmpp::SendResult> finish(std::optional<QXmppJingleReason> reason, const QString &migratedTo = {});
51 
52  Q_SIGNAL void ringing();
53  Q_SIGNAL void proceeded(const QString &id, const QString &remoteResource);
54  Q_SIGNAL void closed(const Result &result);
55 
56 private:
57  QXmppJingleMessageInitiation(QXmppJingleMessageInitiationManager *manager, const QString &id, const QString &remoteJid);
58 
59  QString id() const;
60  void setId(const QString &id);
61  void setRemoteJid(const QString &remoteJid);
62  bool isProceeded() const;
63  void setIsProceeded(bool isProceeded);
64  bool isFinished() const;
65 
66  std::unique_ptr<QXmppJingleMessageInitiationPrivate> d;
67 
69  friend class tst_QXmppJingleMessageInitiationManager;
70 };
71 
73 {
74  Q_OBJECT
75 public:
76  using ProposeResult = std::variant<std::shared_ptr<QXmppJingleMessageInitiation>, QXmppError>;
77 
80 
82  QStringList discoveryFeatures() const override;
84 
86  const QString &remoteJid,
87  const QXmppJingleRtpDescription &description);
89  const QString &remoteJid,
90  const QList<QXmppJingleRtpDescription> &descriptions);
91 
92  Q_SIGNAL void proposed(
93  const std::shared_ptr<QXmppJingleMessageInitiation> &jmi,
94  const QString &id,
95  const std::optional<QXmppJingleRtpDescription> &description);
96  Q_SIGNAL void proposeReceived(
97  const std::shared_ptr<QXmppJingleMessageInitiation> &jmi,
98  const QString &id,
99  const QList<QXmppJingleRtpDescription> &descriptions);
100 
101 protected:
103  bool handleMessage(const QXmppMessage &) override;
105 
106 private:
107  QXmppTask<ProposeResult> propose(
108  QString id,
109  QString remoteJid,
110  const QList<QXmppJingleRtpDescription> &descriptions);
111  QXmppTask<QXmpp::SendResult> sendMessage(
112  const QXmppJingleMessageInitiationElement &jmiElement,
113  const QString &remoteJid);
114 
115  void clear(const std::shared_ptr<QXmppJingleMessageInitiation> &jmi);
116  void clearAll();
117 
118  bool handleJmiElement(QXmppJingleMessageInitiationElement &&jmiElement, const QString &remoteJid);
119  bool handleExistingJmi(const std::shared_ptr<QXmppJingleMessageInitiation> &existingJmi, const QXmppJingleMessageInitiationElement &jmiElement, const QString &remoteResource);
120  bool handleProposeJmiElement(const QXmppJingleMessageInitiationElement &jmiElement, const QString &remoteJid);
121  bool handleTieBreak(const std::shared_ptr<QXmppJingleMessageInitiation> &existingJmi, const QXmppJingleMessageInitiationElement &jmiElement, const QString &remoteResource);
122  bool handleExistingSession(const std::shared_ptr<QXmppJingleMessageInitiation> &existingJmi, const QString &jmiElementId);
123  bool handleNonExistingSession(const std::shared_ptr<QXmppJingleMessageInitiation> &existingJmi, const QString &jmiElementId, const QString &remoteResource);
124  std::shared_ptr<QXmppJingleMessageInitiation> addJmi(const QString &id, const QString &remoteJid);
125  const QVector<std::shared_ptr<QXmppJingleMessageInitiation>> &jmis() const;
126 
127 private:
128  std::unique_ptr<QXmppJingleMessageInitiationManagerPrivate> d;
129 
130  friend class QXmppJingleMessageInitiationPrivate;
131  friend class tst_QXmppJingleMessageInitiationManager;
132 };
133 
134 Q_DECLARE_METATYPE(QXmppJingleMessageInitiation::Result)
135 
136 #endif // QXMPPJINGLEMESSAGEINITIATIONMANAGER_H
Represents a description for XEP-0167: Jingle RTP Sessions, including media type, streaming source...
Definition: QXmppJingleData.h:252
The QXmppJingleMessageInitiation class holds information about the JMI element in the current context...
Definition: QXmppJingleMessageInitiationManager.h:20
Definition: QXmppError.h:17
std::variant< Rejected, Retracted, Finished, QXmppError > Result
Variant of Rejected, Retracted, Finished or Error result types.
Definition: QXmppJingleMessageInitiationManager.h:40
virtual bool handleMessage(const QXmppMessage &)=0
Definition: QXmppTask.h:67
std::variant< std::shared_ptr< QXmppJingleMessageInitiation >, QXmppError > ProposeResult
Definition: QXmppJingleMessageInitiationManager.h:76
The QXmppJingleMessageInitiationManager class makes it possible to retrieve Jingle Message Initiation...
Definition: QXmppJingleMessageInitiationManager.h:72
virtual QStringList discoveryFeatures() const
Definition: QXmppClientExtension.cpp:22
The QXmppMessage class represents an XMPP message.
Definition: QXmppMessage.h:63
The QXmppJingleMessageInitiationElement class represents a Jingle Message Initiation element as speci...
Definition: QXmppJingleData.h:641
Definition: QXmppMessageHandler.h:15
The QXmppClientExtension class is the base class for QXmppClient extensions.
Definition: QXmppClientExtension.h:31