aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2015-08-27 15:27:02 +0200
committerJeremy Lainé <jeremy.laine@m4x.org>2015-08-27 15:35:12 +0200
commita100a8b3cf20c7dc029416e4471a11fea7c51599 (patch)
tree3e9324700c45d9f36f6f1f713214ee199bb04314 /src
parente1f1fa9ae899d74a22fd16ea14e604a4befdc3b7 (diff)
downloadqxmpp-a100a8b3cf20c7dc029416e4471a11fea7c51599.tar.gz
add method to generate SDP from QXmppJingleIq::Content
Diffstat (limited to 'src')
-rw-r--r--src/base/QXmppJingleIq.cpp77
-rw-r--r--src/base/QXmppJingleIq.h1
2 files changed, 78 insertions, 0 deletions
diff --git a/src/base/QXmppJingleIq.cpp b/src/base/QXmppJingleIq.cpp
index 43241db9..17dbfb9f 100644
--- a/src/base/QXmppJingleIq.cpp
+++ b/src/base/QXmppJingleIq.cpp
@@ -21,12 +21,16 @@
*
*/
+#include <QDate>
+#include <QDateTime>
#include <QDomElement>
#include "QXmppConstants.h"
#include "QXmppJingleIq.h"
#include "QXmppUtils.h"
+static const int RTP_COMPONENT = 1;
+
static const char* ns_jingle_rtp_info = "urn:xmpp:jingle:apps:rtp:info:1";
static const char* jingle_actions[] = {
@@ -68,6 +72,27 @@ static const char* jingle_reasons[] = {
"unsupported-transports",
};
+static QString addressToSdp(const QHostAddress &host)
+{
+ return QString("IN %1 %2").arg(
+ host.protocol() == QAbstractSocket::IPv6Protocol ? "IP6" : "IP4",
+ host.toString());
+}
+
+static QString candidateToSdp(const QXmppJingleCandidate &candidate)
+{
+ return QString("candidate:%1 %2 %3 %4 %5 %6 typ %7 generation %8").arg(
+ candidate.foundation(),
+ QString::number(candidate.component()),
+ candidate.protocol(),
+ QString::number(candidate.priority()),
+ candidate.host().toString(),
+ QString::number(candidate.port()),
+ "host",
+ QString::number(candidate.generation())
+ );
+}
+
QXmppJingleIq::Content::Content()
: m_descriptionSsrc(0)
{
@@ -208,6 +233,58 @@ void QXmppJingleIq::Content::parse(const QDomElement &element)
}
}
+QString QXmppJingleIq::Content::toSdp() const
+{
+ const quint32 ntpSeconds = QDateTime(QDate(1900, 1, 1)).secsTo(QDateTime::currentDateTime());
+
+ // get default candidate
+ QHostAddress localRtpAddress = QHostAddress::Any;
+ quint16 localRtpPort = 0;
+ foreach (const QXmppJingleCandidate &candidate, m_transportCandidates) {
+ if (candidate.component() == RTP_COMPONENT) {
+ localRtpAddress = candidate.host();
+ localRtpPort = candidate.port();
+ break;
+ }
+ }
+
+ QStringList sdp;
+ sdp << "v=0";
+ sdp << QString("o=- %1 %2 %3").arg(
+ QString::number(ntpSeconds),
+ QString::number(ntpSeconds),
+ addressToSdp(QHostAddress::Any)
+ );
+ sdp << "s=-";
+ sdp << "t=0 0";
+
+ // media
+ QString payloads;
+ QStringList attrs;
+ foreach (const QXmppJinglePayloadType &payload, m_payloadTypes) {
+ payloads += " " + QString::number(payload.id());
+ QString rtpmap = QString::number(payload.id()) + " " + payload.name() + "/" + QString::number(payload.clockrate());
+ if (payload.channels() > 1)
+ rtpmap += "/" + QString::number(payload.channels());
+ attrs << "a=rtpmap:" + rtpmap;
+ if (payload.name() == "telephone-event")
+ attrs << "a=fmtp:" + QByteArray::number(payload.id()) + " 0-15";
+ }
+ sdp << QString("m=%1 %2 RTP/AVP%3").arg(m_descriptionMedia, QString::number(localRtpPort), payloads);
+ sdp << QString("c=%1").arg(addressToSdp(localRtpAddress));
+ sdp += attrs;
+
+ // transport
+ foreach (const QXmppJingleCandidate &candidate, m_transportCandidates)
+ sdp << QString("a=%1").arg(candidateToSdp(candidate));
+ if (!m_transportUser.isEmpty())
+ sdp << QString("a=ice-ufrag:%1").arg(m_transportUser);
+ if (!m_transportPassword.isEmpty())
+ sdp << QString("a=ice-pwd:%1").arg(m_transportPassword);
+
+ return sdp.join("\r\n") + "\r\n";
+}
+
void QXmppJingleIq::Content::toXml(QXmlStreamWriter *writer) const
{
if (m_creator.isEmpty() || m_name.isEmpty())
diff --git a/src/base/QXmppJingleIq.h b/src/base/QXmppJingleIq.h
index d1a43c37..b0854495 100644
--- a/src/base/QXmppJingleIq.h
+++ b/src/base/QXmppJingleIq.h
@@ -217,6 +217,7 @@ public:
/// \cond
void parse(const QDomElement &element);
+ QString toSdp() const;
void toXml(QXmlStreamWriter *writer) const;
/// \endcond