From fd1a242b154dd74765e4f29ad26e7f743a8bb478 Mon Sep 17 00:00:00 2001 From: Tibor Csötönyi Date: Wed, 3 May 2023 15:13:18 +0200 Subject: Rename QXmppJingleIq.cpp/h to QXmppJingleData.cpp/h and test --- src/base/QXmppJingleData.h | 649 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 649 insertions(+) create mode 100644 src/base/QXmppJingleData.h (limited to 'src/base/QXmppJingleData.h') diff --git a/src/base/QXmppJingleData.h b/src/base/QXmppJingleData.h new file mode 100644 index 00000000..1e425f4d --- /dev/null +++ b/src/base/QXmppJingleData.h @@ -0,0 +1,649 @@ +// SPDX-FileCopyrightText: 2010 Jeremy Lainé +// SPDX-FileCopyrightText: 2022 Melvin Keskin +// SPDX-FileCopyrightText: 2023 Tibor Csötönyi +// +// SPDX-License-Identifier: LGPL-2.1-or-later + +#ifndef QXMPPJINGLEIQ_H +#define QXMPPJINGLEIQ_H + +#include "QXmppIq.h" + +#include + +#include + +class QXmppJingleCandidatePrivate; +class QXmppJingleDescriptionPrivate; +class QXmppJingleIqContentPrivate; +class QXmppJingleIqReasonPrivate; +class QXmppJingleIqPrivate; +class QXmppJinglePayloadTypePrivate; +class QXmppJingleRtpCryptoElementPrivate; +class QXmppJingleRtpEncryptionPrivate; +class QXmppJingleRtpFeedbackPropertyPrivate; +class QXmppJingleRtpHeaderExtensionPropertyPrivate; +class QXmppSdpParameterPrivate; +class QXmppJingleMessageInitiationElementPrivate; + +class QXMPP_EXPORT QXmppSdpParameter +{ +public: + QXmppSdpParameter(); + + QXMPP_PRIVATE_DECLARE_RULE_OF_SIX(QXmppSdpParameter) + + QString name() const; + void setName(const QString &name); + + QString value() const; + void setValue(const QString &value); + + /// \cond + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + /// \endcond + + static bool isSdpParameter(const QDomElement &element); + +private: + QSharedDataPointer d; +}; + +class QXMPP_EXPORT QXmppJingleRtpCryptoElement +{ +public: + QXmppJingleRtpCryptoElement(); + + QXMPP_PRIVATE_DECLARE_RULE_OF_SIX(QXmppJingleRtpCryptoElement) + + uint32_t tag() const; + void setTag(uint32_t tag); + + QString cryptoSuite() const; + void setCryptoSuite(const QString &cryptoSuite); + + QString keyParams() const; + void setKeyParams(const QString &keyParams); + + QString sessionParams() const; + void setSessionParams(const QString &sessionParams); + + /// \cond + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + /// \endcond + + static bool isJingleRtpCryptoElement(const QDomElement &element); + +private: + QSharedDataPointer d; +}; + +class QXMPP_EXPORT QXmppJingleRtpEncryption +{ +public: + QXmppJingleRtpEncryption(); + + QXMPP_PRIVATE_DECLARE_RULE_OF_SIX(QXmppJingleRtpEncryption) + + bool isRequired() const; + void setRequired(bool isRequired); + + QVector cryptoElements() const; + void setCryptoElements(const QVector &cryptoElements); + + /// \cond + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + /// \endcond + + static bool isJingleRtpEncryption(const QDomElement &element); + +private: + QSharedDataPointer d; +}; + +class QXMPP_EXPORT QXmppJingleRtpFeedbackProperty +{ +public: + QXmppJingleRtpFeedbackProperty(); + + QXMPP_PRIVATE_DECLARE_RULE_OF_SIX(QXmppJingleRtpFeedbackProperty) + + QString type() const; + void setType(const QString &type); + + QString subtype() const; + void setSubtype(const QString &subtype); + + QVector parameters() const; + void setParameters(const QVector ¶meters); + + /// \cond + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + /// \endcond + + static bool isJingleRtpFeedbackProperty(const QDomElement &element); + +private: + QSharedDataPointer d; +}; + +class QXMPP_EXPORT QXmppJingleRtpFeedbackInterval +{ +public: + QXmppJingleRtpFeedbackInterval(); + + QXMPP_PRIVATE_DECLARE_RULE_OF_SIX(QXmppJingleRtpFeedbackInterval) + + uint64_t value() const; + void setValue(uint64_t value); + + /// \cond + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + /// \endcond + + static bool isJingleRtpFeedbackInterval(const QDomElement &element); + +private: + uint64_t m_value; +}; + +class QXMPP_EXPORT QXmppJingleRtpHeaderExtensionProperty +{ +public: + enum Senders { + /// The initiator and the sender are allowed. + Both, + /// Only the initiator is allowed. + Initiator, + /// Only the responder is allowed. + Responder + }; + + QXmppJingleRtpHeaderExtensionProperty(); + + QXMPP_PRIVATE_DECLARE_RULE_OF_SIX(QXmppJingleRtpHeaderExtensionProperty) + + uint32_t id() const; + void setId(uint32_t id); + + QString uri() const; + void setUri(const QString &uri); + + Senders senders() const; + void setSenders(Senders senders); + + QVector parameters() const; + void setParameters(const QVector ¶meters); + + /// \cond + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + /// \endcond + + static bool isJingleRtpHeaderExtensionProperty(const QDomElement &element); + +private: + QSharedDataPointer d; +}; + +/// +/// \brief The QXmppJinglePayloadType class represents a payload type +/// as specified by \xep{0167}: Jingle RTP Sessions and RFC 5245. +/// +class QXMPP_EXPORT QXmppJinglePayloadType +{ +public: + QXmppJinglePayloadType(); + QXmppJinglePayloadType(const QXmppJinglePayloadType &other); + ~QXmppJinglePayloadType(); + + unsigned char channels() const; + void setChannels(unsigned char channels); + + unsigned int clockrate() const; + void setClockrate(unsigned int clockrate); + + unsigned char id() const; + void setId(unsigned char id); + + unsigned int maxptime() const; + void setMaxptime(unsigned int maxptime); + + QString name() const; + void setName(const QString &name); + + QMap parameters() const; + void setParameters(const QMap ¶meters); + + unsigned int ptime() const; + void setPtime(unsigned int ptime); + + QVector rtpFeedbackProperties() const; + void setRtpFeedbackProperties(const QVector &rtpFeedbackProperties); + + QVector rtpFeedbackIntervals() const; + void setRtpFeedbackIntervals(const QVector &rtpFeedbackIntervals); + + /// \cond + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + /// \endcond + + QXmppJinglePayloadType &operator=(const QXmppJinglePayloadType &other); + bool operator==(const QXmppJinglePayloadType &other) const; + +private: + QSharedDataPointer d; +}; + +class QXMPP_EXPORT QXmppJingleDescription +{ +public: + QXmppJingleDescription(); + QXMPP_PRIVATE_DECLARE_RULE_OF_SIX(QXmppJingleDescription) + + QString media() const; + void setMedia(const QString &media); + + quint32 ssrc() const; + void setSsrc(quint32 ssrc); + + QString type() const; + void setType(const QString &type); + + void addPayloadType(const QXmppJinglePayloadType &payload); + const QList &payloadTypes() const; + void setPayloadTypes(const QList &payloadTypes); + + /// \cond + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + /// \endcond + +private: + QSharedDataPointer d; +}; + +/// +/// \brief The QXmppJingleCandidate class represents a transport candidate +/// as specified by \xep{0176}: Jingle ICE-UDP Transport Method. +/// +class QXMPP_EXPORT QXmppJingleCandidate +{ +public: + /// This enum is used to describe a candidate's type. + enum Type { + HostType, ///< Host candidate, a local address/port. + PeerReflexiveType, ///< Peer-reflexive candidate, + ///< the address/port as seen from the peer. + ServerReflexiveType, ///< Server-reflexive candidate, + ///< the address/port as seen by the STUN server + RelayedType ///< Relayed candidate, a candidate from + ///< a TURN relay. + }; + + QXmppJingleCandidate(); + QXmppJingleCandidate(const QXmppJingleCandidate &other); + QXmppJingleCandidate(QXmppJingleCandidate &&); + ~QXmppJingleCandidate(); + + QXmppJingleCandidate &operator=(const QXmppJingleCandidate &other); + QXmppJingleCandidate &operator=(QXmppJingleCandidate &&); + + int component() const; + void setComponent(int component); + + QString foundation() const; + void setFoundation(const QString &foundation); + + int generation() const; + void setGeneration(int generation); + + QHostAddress host() const; + void setHost(const QHostAddress &host); + + QString id() const; + void setId(const QString &id); + + int network() const; + void setNetwork(int network); + + quint16 port() const; + void setPort(quint16 port); + + int priority() const; + void setPriority(int priority); + + QString protocol() const; + void setProtocol(const QString &protocol); + + QXmppJingleCandidate::Type type() const; + void setType(QXmppJingleCandidate::Type); + + bool isNull() const; + + /// \cond + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + + static QXmppJingleCandidate::Type typeFromString(const QString &typeStr, bool *ok = nullptr); + static QString typeToString(QXmppJingleCandidate::Type type); + /// \endcond + +private: + QSharedDataPointer d; +}; + +class QXMPP_EXPORT QXmppJingleReason +{ +public: + /// This enum is used to describe a reason's type. + enum Type { + None, + AlternativeSession, + Busy, + Cancel, + ConnectivityError, + Decline, + Expired, + FailedApplication, + FailedTransport, + GeneralError, + Gone, + IncompatibleParameters, + MediaError, + SecurityError, + Success, + Timeout, + UnsupportedApplications, + UnsupportedTransports + }; + + enum RtpErrorCondition { + /// There is no error condition. + NoErrorCondition, + /// The encryption offer is rejected. + InvalidCrypto, + /// Encryption is required but not offered. + CryptoRequired + }; + + QXmppJingleReason(); + + QString text() const; + void setText(const QString &text); + + Type type() const; + void setType(Type type); + + RtpErrorCondition rtpErrorCondition() const; + void setRtpErrorCondition(RtpErrorCondition rtpErrorCondition); + + QString namespaceUri() const; + void setNamespaceUri(const QString &namespaceUri); + + /// \cond + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + + /// \endcond + + QXMPP_PRIVATE_DECLARE_RULE_OF_SIX(QXmppJingleReason) + +private: + QSharedDataPointer d; +}; + +/// +/// \brief The QXmppJingleIq class represents an IQ used for initiating media +/// sessions as specified by \xep{0166}: Jingle. +/// +/// \ingroup Stanzas +/// +class QXMPP_EXPORT QXmppJingleIq : public QXmppIq +{ +public: + /// This enum is used to describe a Jingle action. + enum Action { + ContentAccept, + ContentAdd, + ContentModify, + ContentReject, + ContentRemove, + DescriptionInfo, + SecurityInfo, + SessionAccept, + SessionInfo, + SessionInitiate, + SessionTerminate, + TransportAccept, + TransportInfo, + TransportReject, + TransportReplace + }; + + enum Creator { + /// The initiator generated the content type. + Initiator, + /// The responder generated the content type. + Responder + }; + + struct RtpSessionStateActive + { + }; + + struct RtpSessionStateHold + { + }; + + struct RtpSessionStateUnhold + { + }; + + struct RtpSessionStateMuting + { + /// True when temporarily not sending media to the other party but continuing to accept + /// media from it, false for ending mute state + bool isMute = true; + /// Creator of the corresponding session + Creator creator; + /// Session to be muted (e.g., only audio or video) + QString name; + }; + + struct RtpSessionStateRinging + { + }; + + using RtpSessionState = std::variant; + + /// \internal + /// + /// The QXmppJingleIq::Content class represents the "content" element of a + /// QXmppJingleIq. + /// + class QXMPP_EXPORT Content + { + public: + Content(); + Content(const QXmppJingleIq::Content &other); + Content(QXmppJingleIq::Content &&); + ~Content(); + + Content &operator=(const Content &other); + Content &operator=(Content &&); + + QString creator() const; + void setCreator(const QString &creator); + + QString name() const; + void setName(const QString &name); + + QString senders() const; + void setSenders(const QString &senders); + + // XEP-0167: Jingle RTP Sessions + QXmppJingleDescription description() const; + void setDescription(const QXmppJingleDescription &description); + + bool isRtpMultiplexingSupported() const; + void setRtpMultiplexingSupported(bool isRtpMultiplexingSupported); + + std::optional rtpEncryption() const; + void setRtpEncryption(const std::optional &rtpEncryption); + + void addTransportCandidate(const QXmppJingleCandidate &candidate); + QList transportCandidates() const; + void setTransportCandidates(const QList &candidates); + + QString transportUser() const; + void setTransportUser(const QString &user); + + QString transportPassword() const; + void setTransportPassword(const QString &password); + + QVector rtpFeedbackProperties() const; + void setRtpFeedbackProperties(const QVector &rtpFeedbackProperties); + + QVector rtpFeedbackIntervals() const; + void setRtpFeedbackIntervals(const QVector &rtpFeedbackIntervals); + + QVector rtpHeaderExtensionProperties() const; + void setRtpHeaderExtensionProperties(const QVector &rtpHeaderExtensionProperties); + + bool isRtpHeaderExtensionMixingAllowed() const; + void setRtpHeaderExtensionMixingAllowed(bool isRtpHeaderExtensionMixingAllowed); + + // XEP-0320: Use of DTLS-SRTP in Jingle Sessions + QByteArray transportFingerprint() const; + void setTransportFingerprint(const QByteArray &fingerprint); + + QString transportFingerprintHash() const; + void setTransportFingerprintHash(const QString &hash); + + QString transportFingerprintSetup() const; + void setTransportFingerprintSetup(const QString &setup); + + /// \cond + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + + bool parseSdp(const QString &sdp); + QString toSdp() const; + /// \endcond + + private: + QSharedDataPointer d; + }; + + QXmppJingleIq(); + QXmppJingleIq(const QXmppJingleIq &other); + QXmppJingleIq(QXmppJingleIq &&); + ~QXmppJingleIq() override; + + QXmppJingleIq &operator=(const QXmppJingleIq &other); + QXmppJingleIq &operator=(QXmppJingleIq &&); + + Action action() const; + void setAction(Action action); + + void addContent(const Content &content); + QList contents() const; + void setContents(const QList &contents); + + QString initiator() const; + void setInitiator(const QString &initiator); + + QXmppJingleReason &reason(); + const QXmppJingleReason &reason() const; + + QString responder() const; + void setResponder(const QString &responder); + +#if QXMPP_DEPRECATED_SINCE(1, 5) + QT_DEPRECATED_X("Use QXmpp::rtpSessionState() instead") + bool ringing() const; + QT_DEPRECATED_X("Use QXmpp::setRtpSessionState() instead") + void setRinging(bool ringing); +#endif + + QString sid() const; + void setSid(const QString &sid); + + QString mujiGroupChatJid() const; + void setMujiGroupChatJid(const QString &mujiGroupChatJid); + + std::optional rtpSessionState() const; + void setRtpSessionState(const std::optional &rtpSessionState); + + /// \cond + static bool isJingleIq(const QDomElement &element); + /// \endcond + +protected: + /// \cond + void parseElementFromChild(const QDomElement &element) override; + void toXmlElementFromChild(QXmlStreamWriter *writer) const override; + /// \endcond + +private: + QSharedDataPointer d; +}; + +class QXMPP_EXPORT QXmppJingleMessageInitiationElement +{ +public: + enum class Type { + None, + Propose, + Ringing, + Proceed, + Reject, + Retract, + Finish + }; + + QXmppJingleMessageInitiationElement(); + QXMPP_PRIVATE_DECLARE_RULE_OF_SIX(QXmppJingleMessageInitiationElement) + + Type type() const; + void setType(Type type); + + QString id() const; + void setId(const QString &id); + + std::optional description() const; + void setDescription(std::optional description); + + std::optional reason() const; + void setReason(std::optional reason); + + bool containsTieBreak() const; + void setContainsTieBreak(bool containsTieBreak); + + QString migratedTo() const; + void setMigratedTo(const QString &migratedTo); + + /// \cond + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + /// \endcond + + static bool isJingleMessageInitiationElement(const QDomElement &); + +private: + QString jmiElementTypeToString(Type type) const; + Type stringToJmiElementType(const QString &typeStr) const; + + QSharedDataPointer d; +}; + +Q_DECLARE_METATYPE(QXmppJingleReason::RtpErrorCondition) + +#endif -- cgit v1.2.3 From eab17404ecccc6719decb7e8846d9c8e75e917c1 Mon Sep 17 00:00:00 2001 From: Tibor Csötönyi Date: Sun, 7 May 2023 21:29:44 +0200 Subject: Code review fixes --- src/CMakeLists.txt | 5 ++-- src/base/QXmppJingleData.cpp | 71 +++++++++++++++++++++++++++++++++++++++----- src/base/QXmppJingleData.h | 19 ++++++++++-- src/base/QXmppJingleIq.h | 5 ++++ 4 files changed, 87 insertions(+), 13 deletions(-) create mode 100644 src/base/QXmppJingleIq.h (limited to 'src/base/QXmppJingleData.h') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 56bebdcb..7e94efdc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -35,7 +35,8 @@ set(INSTALL_HEADER_FILES base/QXmppHttpUploadIq.h base/QXmppIbbIq.h base/QXmppIq.h - base/QXmppJingleData.h + base/QXmppJingleIq.h + base/QXmppJingleData.h base/QXmppLogger.h base/QXmppMamIq.h base/QXmppMessage.h @@ -173,7 +174,7 @@ set(SOURCE_FILES base/QXmppHttpUploadIq.cpp base/QXmppIbbIq.cpp base/QXmppIq.cpp - base/QXmppJingleData.cpp + base/QXmppJingleData.cpp base/QXmppLogger.cpp base/QXmppMamIq.cpp base/QXmppMessage.cpp diff --git a/src/base/QXmppJingleData.cpp b/src/base/QXmppJingleData.cpp index 2d497115..78cd4017 100644 --- a/src/base/QXmppJingleData.cpp +++ b/src/base/QXmppJingleData.cpp @@ -375,6 +375,60 @@ void QXmppJingleIq::Content::setDescription(const QXmppJingleDescription &descri d->description = description; } +/// \deprecated This method is deprecated since QXmpp 1.6. Use +/// \c QXmppJingleIq::Conent::description().media() instead. +QString QXmppJingleIq::Content::descriptionMedia() const +{ + return d->description.media(); +} + +/// \deprecated This method is deprecated since QXmpp 1.6. Use +/// \c QXmppJingleIq::Conent::description().setMedia() instead. +void QXmppJingleIq::Content::setDescriptionMedia(const QString &media) +{ + d->description.setMedia(media); +} + +/// Returns the description's 32-bit synchronization source for the media stream as specified by +/// \xep{0167, Jingle RTP Sessions} and RFC 3550. +/// +/// \since QXmpp 0.9 +/// \deprecated This method is deprecated since QXmpp 1.6. Use +/// \c QXmppJingleIq::Content::description().setSsrc() instead. +/// +quint32 QXmppJingleIq::Content::descriptionSsrc() const +{ + return d->description.ssrc(); +} + +/// \deprecated This method is deprecated since QXmpp 1.6. Use +/// \c QXmppJingleIq::Conent::description().setSsrc() instead. +void QXmppJingleIq::Content::setDescriptionSsrc(quint32 ssrc) +{ + d->description.setSsrc(ssrc); +} + +/// \deprecated This method is deprecated since QXmpp 1.6. Use +/// \c QXmppJingleIq::Conent::description().addPayloadType() instead. +void QXmppJingleIq::Content::addPayloadType(const QXmppJinglePayloadType &payload) +{ + d->description.addPayloadType(payload); +} + +/// \deprecated This method is deprecated since QXmpp 1.6. Use +/// \c QXmppJingleIq::Conent::description().payloadTypes() instead. +QList QXmppJingleIq::Content::payloadTypes() const +{ + return d->description.payloadTypes(); +} + +/// \deprecated This method is deprecated since QXmpp 1.6. Use +/// \c QXmppJingleIq::Conent::description().setPayloadTypes() instead. +void QXmppJingleIq::Content::setPayloadTypes(const QList &payloadTypes) +{ + d->description.setPayloadTypes(payloadTypes); +} + /// /// Returns whether multiplexing of RTP data and control packets on a single port is supported as /// specified by \xep{0167, Jingle RTP Sessions} and RFC 5761. @@ -3079,12 +3133,13 @@ void QXmppJingleMessageInitiationElement::setMigratedTo(const QString &migratedT /// \cond void QXmppJingleMessageInitiationElement::parse(const QDomElement &element) { - d->type = stringToJmiElementType(element.nodeName()); + std::optional type { stringToJmiElementType(element.nodeName()) }; - if (d->type == Type::None) { + if (!type.has_value()) { return; } + d->type = type.value(); d->id = element.attribute(QStringLiteral("id")); // Type::Proceed and Type::Ringing don't need any parsing aside of the id. @@ -3108,12 +3163,12 @@ void QXmppJingleMessageInitiationElement::parse(const QDomElement &element) break; case Type::Finish: - if (const auto &reasonElement = element.firstChildElement("reason"); !reasonElement.isNull()) { + if (auto reasonElement = element.firstChildElement("reason"); !reasonElement.isNull()) { d->reason = QXmppJingleReason(); d->reason->parse(reasonElement); } - if (const auto &migratedToElement = element.firstChildElement("migrated"); !migratedToElement.isNull()) { + if (auto migratedToElement = element.firstChildElement("migrated"); !migratedToElement.isNull()) { d->migratedTo = migratedToElement.attribute("to"); } @@ -3158,13 +3213,13 @@ QXMPP_PRIVATE_DEFINE_RULE_OF_SIX(QXmppJingleMessageInitiationElement) /// bool QXmppJingleMessageInitiationElement::isJingleMessageInitiationElement(const QDomElement &element) { - return (element.nodeName() == QStringLiteral("propose") || element.nodeName() == QStringLiteral("ringing") || element.nodeName() == QStringLiteral("proceed") || element.nodeName() == QStringLiteral("retract") || element.nodeName() == QStringLiteral("reject") || element.nodeName() == QStringLiteral("finish")) && element.hasAttribute(QStringLiteral("id")) && element.namespaceURI() == ns_jingle_message_initiation; + return stringToJmiElementType(element.tagName()).has_value() && element.hasAttribute(QStringLiteral("id")) && element.namespaceURI() == ns_jingle_message_initiation; } /// /// Takes a Jingle Message Initiation element type and parses it to a string. /// -QString QXmppJingleMessageInitiationElement::jmiElementTypeToString(Type type) const +QString QXmppJingleMessageInitiationElement::jmiElementTypeToString(Type type) { switch (type) { case Type::Propose: @@ -3187,7 +3242,7 @@ QString QXmppJingleMessageInitiationElement::jmiElementTypeToString(Type type) c /// /// Takes a string and parses it to a Jingle Message Initiation element type. /// -QXmppJingleMessageInitiationElement::Type QXmppJingleMessageInitiationElement::stringToJmiElementType(const QString &typeStr) const +std::optional QXmppJingleMessageInitiationElement::stringToJmiElementType(const QString &typeStr) { if (typeStr == "propose") { return Type::Propose; @@ -3203,5 +3258,5 @@ QXmppJingleMessageInitiationElement::Type QXmppJingleMessageInitiationElement::s return Type::Finish; } - return Type::None; + return std::nullopt; } diff --git a/src/base/QXmppJingleData.h b/src/base/QXmppJingleData.h index 1e425f4d..82ef8c00 100644 --- a/src/base/QXmppJingleData.h +++ b/src/base/QXmppJingleData.h @@ -463,6 +463,8 @@ public: using RtpSessionState = std::variant; + using Reason = QXmppJingleReason; + /// \internal /// /// The QXmppJingleIq::Content class represents the "content" element of a @@ -492,6 +494,18 @@ public: QXmppJingleDescription description() const; void setDescription(const QXmppJingleDescription &description); +#if QXMPP_DEPRECATED_SINCE(1, 6) + QString descriptionMedia() const; + void setDescriptionMedia(const QString &media); + + quint32 descriptionSsrc() const; + void setDescriptionSsrc(quint32 ssrc); + + void addPayloadType(const QXmppJinglePayloadType &payload); + QList payloadTypes() const; + void setPayloadTypes(const QList &payloadTypes); +#endif + bool isRtpMultiplexingSupported() const; void setRtpMultiplexingSupported(bool isRtpMultiplexingSupported); @@ -636,11 +650,10 @@ public: /// \endcond static bool isJingleMessageInitiationElement(const QDomElement &); + static QString jmiElementTypeToString(Type type); + static std::optional stringToJmiElementType(const QString &typeStr); private: - QString jmiElementTypeToString(Type type) const; - Type stringToJmiElementType(const QString &typeStr) const; - QSharedDataPointer d; }; diff --git a/src/base/QXmppJingleIq.h b/src/base/QXmppJingleIq.h new file mode 100644 index 00000000..358f7d0b --- /dev/null +++ b/src/base/QXmppJingleIq.h @@ -0,0 +1,5 @@ +// SPDX-FileCopyrightText: 2010 Jeremy Lainé +// +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include "QXmppJingleData.h" -- cgit v1.2.3 From 8fc2225897de24f29bc3c36383cf97d5dc89a719 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Tue, 9 May 2023 22:22:54 +0200 Subject: Jingle: Remove namespaceUri attribute --- src/base/QXmppJingleData.cpp | 30 +--------------------- src/base/QXmppJingleData.h | 3 --- tests/qxmppjingledata/tst_qxmppjingledata.cpp | 11 +++----- .../tst_qxmppjinglemessageinitiationmanager.cpp | 21 --------------- 4 files changed, 5 insertions(+), 60 deletions(-) (limited to 'src/base/QXmppJingleData.h') diff --git a/src/base/QXmppJingleData.cpp b/src/base/QXmppJingleData.cpp index 78cd4017..ec926556 100644 --- a/src/base/QXmppJingleData.cpp +++ b/src/base/QXmppJingleData.cpp @@ -1023,7 +1023,6 @@ public: QString m_text; QXmppJingleReason::Type m_type; QXmppJingleReason::RtpErrorCondition m_rtpErrorCondition; - QString m_namespaceUri; }; QXmppJingleIqReasonPrivate::QXmppJingleIqReasonPrivate() @@ -1104,22 +1103,6 @@ void QXmppJingleReason::setRtpErrorCondition(RtpErrorCondition rtpErrorCondition d->m_rtpErrorCondition = rtpErrorCondition; } -/// -/// Returns the namespace URI of a reason element. -/// -QString QXmppJingleReason::namespaceUri() const -{ - return d->m_namespaceUri; -} - -/// -/// Sets the namespace URI of a reason element. -/// -void QXmppJingleReason::setNamespaceUri(const QString &namespaceUri) -{ - d->m_namespaceUri = namespaceUri; -} - /// \cond void QXmppJingleReason::parse(const QDomElement &element) { @@ -1142,10 +1125,6 @@ void QXmppJingleReason::parse(const QDomElement &element) break; } } - - if (!element.namespaceURI().isEmpty() && !element.parentNode().isNull() && element.parentNode().namespaceURI() != element.namespaceURI()) { - d->m_namespaceUri = element.namespaceURI(); - } } void QXmppJingleReason::toXml(QXmlStreamWriter *writer) const @@ -1155,10 +1134,7 @@ void QXmppJingleReason::toXml(QXmlStreamWriter *writer) const } writer->writeStartElement(QStringLiteral("reason")); - - if (!d->m_namespaceUri.isEmpty()) { - writer->writeDefaultNamespace(d->m_namespaceUri); - } + writer->writeDefaultNamespace(ns_jingle); if (!d->m_text.isEmpty()) { helperToXmlAddTextElement(writer, QStringLiteral("text"), d->m_text); @@ -3090,10 +3066,6 @@ std::optional QXmppJingleMessageInitiationElement::reason() c void QXmppJingleMessageInitiationElement::setReason(std::optional reason) { d->reason = reason; - - if (d->reason) { - d->reason->setNamespaceUri(ns_jingle); - } } /// diff --git a/src/base/QXmppJingleData.h b/src/base/QXmppJingleData.h index 82ef8c00..997eb3c3 100644 --- a/src/base/QXmppJingleData.h +++ b/src/base/QXmppJingleData.h @@ -384,9 +384,6 @@ public: RtpErrorCondition rtpErrorCondition() const; void setRtpErrorCondition(RtpErrorCondition rtpErrorCondition); - QString namespaceUri() const; - void setNamespaceUri(const QString &namespaceUri); - /// \cond void parse(const QDomElement &element); void toXml(QXmlStreamWriter *writer) const; diff --git a/tests/qxmppjingledata/tst_qxmppjingledata.cpp b/tests/qxmppjingledata/tst_qxmppjingledata.cpp index 62187998..9322f242 100644 --- a/tests/qxmppjingledata/tst_qxmppjingledata.cpp +++ b/tests/qxmppjingledata/tst_qxmppjingledata.cpp @@ -1086,7 +1086,7 @@ void tst_QXmppJingleData::testTerminate() "" - "" + "" "" "" "" @@ -1336,7 +1336,7 @@ void tst_QXmppJingleData::testRtpErrorCondition_data() QTest::newRow("NoErrorCondition") << QByteArrayLiteral("" "" - "" + "" "" "" "" @@ -1345,7 +1345,7 @@ void tst_QXmppJingleData::testRtpErrorCondition_data() QTest::newRow("InvalidCrypto") << QByteArrayLiteral("" "" - "" + "" "" "" "" @@ -1355,7 +1355,7 @@ void tst_QXmppJingleData::testRtpErrorCondition_data() QTest::newRow("CryptoRequired") << QByteArrayLiteral("" "" - "" + "" "" "" "" @@ -1632,7 +1632,6 @@ void tst_QXmppJingleData::testJingleMessageInitiationElement() QCOMPARE(rejectElement.id(), QStringLiteral("a73sjjvkla37jfea")); QCOMPARE(rejectElement.reason()->text(), QStringLiteral("Busy")); QCOMPARE(rejectElement.reason()->type(), ReasonType::Busy); - QCOMPARE(rejectElement.reason()->namespaceUri(), QStringLiteral("urn:xmpp:jingle:1")); QCOMPARE(rejectElement.containsTieBreak(), true); serializePacket(rejectElement, rejectXml); @@ -1652,7 +1651,6 @@ void tst_QXmppJingleData::testJingleMessageInitiationElement() QCOMPARE(retractElement.id(), QStringLiteral("a73sjjvkla37jfea")); QCOMPARE(retractElement.reason()->text(), QStringLiteral("Retracted")); QCOMPARE(retractElement.reason()->type(), ReasonType::Cancel); - QCOMPARE(retractElement.reason()->namespaceUri(), QStringLiteral("urn:xmpp:jingle:1")); serializePacket(retractElement, retractXml); // --- Finish --- @@ -1672,7 +1670,6 @@ void tst_QXmppJingleData::testJingleMessageInitiationElement() QCOMPARE(finishElement.id(), QStringLiteral("a73sjjvkla37jfea")); QCOMPARE(finishElement.reason()->text(), QStringLiteral("Success")); QCOMPARE(finishElement.reason()->type(), ReasonType::Success); - QCOMPARE(finishElement.reason()->namespaceUri(), QStringLiteral("urn:xmpp:jingle:1")); QCOMPARE(finishElement.migratedTo(), QStringLiteral("989a46a6-f202-4910-a7c3-83c6ba3f3947")); serializePacket(finishElement, finishXml); } diff --git a/tests/qxmppjinglemessageinitiationmanager/tst_qxmppjinglemessageinitiationmanager.cpp b/tests/qxmppjinglemessageinitiationmanager/tst_qxmppjinglemessageinitiationmanager.cpp index 00b599aa..e09b6cd8 100644 --- a/tests/qxmppjinglemessageinitiationmanager/tst_qxmppjinglemessageinitiationmanager.cpp +++ b/tests/qxmppjinglemessageinitiationmanager/tst_qxmppjinglemessageinitiationmanager.cpp @@ -154,7 +154,6 @@ void tst_QXmppJingleMessageInitiationManager::testReject() QXmppJingleReason reason; reason.setType(QXmppJingleReason::Decline); reason.setText("Declined"); - reason.setNamespaceUri(ns_jingle); connect(&m_logger, &QXmppLogger::message, this, [jmiCallPartnerJid = jmi->callPartnerJid()](QXmppLogger::MessageType type, const QString &text) { if (type == QXmppLogger::SentMessage) { @@ -166,7 +165,6 @@ void tst_QXmppJingleMessageInitiationManager::testReject() QCOMPARE(message.jingleMessageInitiationElement()->type(), JmiType::Reject); QCOMPARE(message.jingleMessageInitiationElement()->reason()->type(), QXmppJingleReason::Decline); QCOMPARE(message.jingleMessageInitiationElement()->reason()->text(), "Declined"); - QCOMPARE(message.jingleMessageInitiationElement()->reason()->namespaceUri(), ns_jingle); QCOMPARE(message.jingleMessageInitiationElement()->containsTieBreak(), true); } } @@ -190,7 +188,6 @@ void tst_QXmppJingleMessageInitiationManager::testRetract() QXmppJingleReason reason; reason.setType(QXmppJingleReason::Gone); reason.setText("Gone"); - reason.setNamespaceUri(ns_jingle); connect(&m_logger, &QXmppLogger::message, this, [jmicallPartnerJid = jmi->callPartnerJid()](QXmppLogger::MessageType type, const QString &text) { if (type == QXmppLogger::SentMessage) { @@ -202,7 +199,6 @@ void tst_QXmppJingleMessageInitiationManager::testRetract() QCOMPARE(message.jingleMessageInitiationElement()->type(), JmiType::Retract); QCOMPARE(message.jingleMessageInitiationElement()->reason()->type(), QXmppJingleReason::Gone); QCOMPARE(message.jingleMessageInitiationElement()->reason()->text(), "Gone"); - QCOMPARE(message.jingleMessageInitiationElement()->reason()->namespaceUri(), ns_jingle); QCOMPARE(message.jingleMessageInitiationElement()->containsTieBreak(), true); } } @@ -226,7 +222,6 @@ void tst_QXmppJingleMessageInitiationManager::testFinish() QXmppJingleReason reason; reason.setType(QXmppJingleReason::Success); reason.setText("Finished"); - reason.setNamespaceUri(ns_jingle); connect(&m_logger, &QXmppLogger::message, this, [jmicallPartnerJid = jmi->callPartnerJid()](QXmppLogger::MessageType type, const QString &text) { if (type == QXmppLogger::SentMessage) { @@ -238,7 +233,6 @@ void tst_QXmppJingleMessageInitiationManager::testFinish() QCOMPARE(message.jingleMessageInitiationElement()->type(), JmiType::Finish); QCOMPARE(message.jingleMessageInitiationElement()->reason()->type(), QXmppJingleReason::Success); QCOMPARE(message.jingleMessageInitiationElement()->reason()->text(), "Finished"); - QCOMPARE(message.jingleMessageInitiationElement()->reason()->namespaceUri(), ns_jingle); QCOMPARE(message.jingleMessageInitiationElement()->migratedTo(), "fecbea35-08d3-404f-9ec7-2b57c566fa74"); } } @@ -347,7 +341,6 @@ void tst_QXmppJingleMessageInitiationManager::testHandleNonExistingSessionLowerI QXmppJingleReason reason; reason.setType(QXmppJingleReason::Expired); reason.setText("Tie-Break"); - reason.setNamespaceUri(ns_jingle); // make sure that request with higher ID is being retracted connect(&m_logger, &QXmppLogger::message, this, [jmiWithHigherId, reason](QXmppLogger::MessageType type, const QString &text) { @@ -364,7 +357,6 @@ void tst_QXmppJingleMessageInitiationManager::testHandleNonExistingSessionLowerI QVERIFY(jmiElement->reason()); QCOMPARE(jmiElement->reason()->type(), reason.type()); QCOMPARE(jmiElement->reason()->text(), reason.text()); - QCOMPARE(jmiElement->reason()->namespaceUri(), reason.namespaceUri()); SKIP_IF_INTEGRATION_TESTS_DISABLED() @@ -397,7 +389,6 @@ void tst_QXmppJingleMessageInitiationManager::testHandleNonExistingSessionHigher QXmppJingleReason reason; reason.setType(QXmppJingleReason::Expired); reason.setText("Tie-Break"); - reason.setNamespaceUri(ns_jingle); auto jmiWithLowerId { m_manager.addJmi("julietNonExistingSession@capulet.example") }; jmiWithLowerId->setId("ca3cf894-5325-482f-a412-a6e9f832298d"); @@ -417,7 +408,6 @@ void tst_QXmppJingleMessageInitiationManager::testHandleNonExistingSessionHigher QVERIFY(jmiElement->reason()); QCOMPARE(jmiElement->reason()->type(), reason.type()); QCOMPARE(jmiElement->reason()->text(), reason.text()); - QCOMPARE(jmiElement->reason()->namespaceUri(), reason.namespaceUri()); } } }); @@ -449,7 +439,6 @@ void tst_QXmppJingleMessageInitiationManager::testHandleExistingSession() QXmppJingleReason reason; reason.setType(QXmppJingleReason::Expired); reason.setText("Session migrated"); - reason.setNamespaceUri(ns_jingle); connect(&m_logger, &QXmppLogger::message, this, [jmi, reason](QXmppLogger::MessageType type, const QString &text) { if (type == QXmppLogger::SentMessage) { @@ -466,7 +455,6 @@ void tst_QXmppJingleMessageInitiationManager::testHandleExistingSession() QVERIFY(jmiElement->reason()); QCOMPARE(jmiElement->reason()->type(), reason.type()); QCOMPARE(jmiElement->reason()->text(), reason.text()); - QCOMPARE(jmiElement->reason()->namespaceUri(), reason.namespaceUri()); } } }); @@ -593,7 +581,6 @@ void tst_QXmppJingleMessageInitiationManager::testHandleExistingJmi() QXmppJingleReason reason; reason.setType(QXmppJingleReason::Expired); reason.setText("Rejected because expired."); - reason.setNamespaceUri(ns_jingle); jmiElement.setType(JmiType::Reject); jmiElement.setReason(reason); @@ -607,7 +594,6 @@ void tst_QXmppJingleMessageInitiationManager::testHandleExistingJmi() QVERIFY(rejectedJmiElement.reason); QCOMPARE(rejectedJmiElement.reason->type(), jmiElement.reason()->type()); QCOMPARE(rejectedJmiElement.reason->text(), jmiElement.reason()->text()); - QCOMPARE(rejectedJmiElement.reason->namespaceUri(), jmiElement.reason()->namespaceUri()); QCOMPARE(rejectedJmiElement.containsTieBreak, jmiElement.containsTieBreak()); }); @@ -621,7 +607,6 @@ void tst_QXmppJingleMessageInitiationManager::testHandleExistingJmi() reason.setType(QXmppJingleReason::ConnectivityError); reason.setText("Retracted due to connectivity error."); - reason.setNamespaceUri(ns_jingle); jmiElement.setType(JmiType::Retract); jmiElement.setReason(reason); @@ -635,7 +620,6 @@ void tst_QXmppJingleMessageInitiationManager::testHandleExistingJmi() QVERIFY(rejectedJmiElement.reason); QCOMPARE(rejectedJmiElement.reason->type(), jmiElement.reason()->type()); QCOMPARE(rejectedJmiElement.reason->text(), jmiElement.reason()->text()); - QCOMPARE(rejectedJmiElement.reason->namespaceUri(), jmiElement.reason()->namespaceUri()); QCOMPARE(rejectedJmiElement.containsTieBreak, jmiElement.containsTieBreak()); }); @@ -649,7 +633,6 @@ void tst_QXmppJingleMessageInitiationManager::testHandleExistingJmi() reason.setType(QXmppJingleReason::Success); reason.setText("Finished."); - reason.setNamespaceUri(ns_jingle); jmiElement.setType(JmiType::Finish); jmiElement.setReason(reason); @@ -664,7 +647,6 @@ void tst_QXmppJingleMessageInitiationManager::testHandleExistingJmi() QVERIFY(rejectedJmiElement.reason); QCOMPARE(rejectedJmiElement.reason->type(), jmiElement.reason()->type()); QCOMPARE(rejectedJmiElement.reason->text(), jmiElement.reason()->text()); - QCOMPARE(rejectedJmiElement.reason->namespaceUri(), jmiElement.reason()->namespaceUri()); QCOMPARE(rejectedJmiElement.migratedTo, jmiElement.migratedTo()); }); @@ -839,7 +821,6 @@ void tst_QXmppJingleMessageInitiationManager::testHandleMessageClosedRejected() QCOMPARE(rejectedJmiElement.reason->type(), QXmppJingleReason::Busy); QCOMPARE(rejectedJmiElement.reason->text(), "Busy"); - QCOMPARE(rejectedJmiElement.reason->namespaceUri(), ns_jingle); }); message.parse(xmlToDom(xmlReject)); @@ -874,7 +855,6 @@ void tst_QXmppJingleMessageInitiationManager::testHandleMessageClosedRetracted() QCOMPARE(retractedJmiElement.reason->type(), QXmppJingleReason::Cancel); QCOMPARE(retractedJmiElement.reason->text(), "Retracted"); - QCOMPARE(retractedJmiElement.reason->namespaceUri(), ns_jingle); }); message.parse(xmlToDom(xmlRetract)); @@ -910,7 +890,6 @@ void tst_QXmppJingleMessageInitiationManager::testHandleMessageClosedFinished() QCOMPARE(finishedJmiElement.reason->type(), QXmppJingleReason::Success); QCOMPARE(finishedJmiElement.reason->text(), "Success"); - QCOMPARE(finishedJmiElement.reason->namespaceUri(), ns_jingle); QCOMPARE(finishedJmiElement.migratedTo, "989a46a6-f202-4910-a7c3-83c6ba3f3947"); }); -- cgit v1.2.3 From 85006abce021819de6af389d04e88756fac0745a Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Sat, 13 May 2023 17:27:45 +0200 Subject: JingleData: Fix doxygen warnings --- src/base/QXmppJingleData.cpp | 8 -------- src/base/QXmppJingleData.h | 3 +++ 2 files changed, 3 insertions(+), 8 deletions(-) (limited to 'src/base/QXmppJingleData.h') diff --git a/src/base/QXmppJingleData.cpp b/src/base/QXmppJingleData.cpp index ec926556..ceb31b32 100644 --- a/src/base/QXmppJingleData.cpp +++ b/src/base/QXmppJingleData.cpp @@ -1031,14 +1031,6 @@ QXmppJingleIqReasonPrivate::QXmppJingleIqReasonPrivate() { } -/// -/// \enum QXmppJingleIqReason::RtpErrorCondition -/// -/// Condition of an RTP-specific error -/// -/// \since QXmpp 1.5 -/// - /// /// \class QXmppJingleReason /// diff --git a/src/base/QXmppJingleData.h b/src/base/QXmppJingleData.h index 997eb3c3..e36577be 100644 --- a/src/base/QXmppJingleData.h +++ b/src/base/QXmppJingleData.h @@ -364,6 +364,8 @@ public: UnsupportedTransports }; + /// Condition of an RTP-specific error + /// \since QXmpp 1.5 enum RtpErrorCondition { /// There is no error condition. NoErrorCondition, @@ -460,6 +462,7 @@ public: using RtpSessionState = std::variant; + /// Alias to QXmppJingleReason for compatibility. using Reason = QXmppJingleReason; /// \internal -- cgit v1.2.3