aboutsummaryrefslogtreecommitdiff
path: root/src/base/QXmppRtcpPacket.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2015-08-20 08:49:44 +0200
committerJeremy Lainé <jeremy.laine@m4x.org>2015-08-20 08:49:44 +0200
commit3a51c38d120a30f717e8584a4502d3848a0e1ac5 (patch)
tree79b7c84c7fe370e95e99ef922257a7789e1e35ef /src/base/QXmppRtcpPacket.cpp
parent2b538aecb57dec32aacc27c8f23fd377b03991d4 (diff)
downloadqxmpp-3a51c38d120a30f717e8584a4502d3848a0e1ac5.tar.gz
add QXmppRtcpPacket class
Diffstat (limited to 'src/base/QXmppRtcpPacket.cpp')
-rw-r--r--src/base/QXmppRtcpPacket.cpp144
1 files changed, 144 insertions, 0 deletions
diff --git a/src/base/QXmppRtcpPacket.cpp b/src/base/QXmppRtcpPacket.cpp
new file mode 100644
index 00000000..1b239388
--- /dev/null
+++ b/src/base/QXmppRtcpPacket.cpp
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2008-2014 The QXmpp developers
+ *
+ * Author:
+ * Jeremy Lainé
+ *
+ * Source:
+ * https://github.com/qxmpp-project/qxmpp
+ *
+ * This file is a part of QXmpp library.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ */
+
+#include <QDataStream>
+#include <QDebug>
+
+#include "QXmppRtcpPacket.h"
+
+#define RTP_VERSION 2
+
+class QXmppRtcpPacketPrivate : public QSharedData
+{
+public:
+ /// Number of report blocks.
+ quint8 count;
+ /// Payload type.
+ quint8 type;
+ /// Raw payload data.
+ QByteArray payload;
+};
+
+/// Constructs an empty RTCP packet
+
+QXmppRtcpPacket::QXmppRtcpPacket()
+ : d(new QXmppRtcpPacketPrivate())
+{
+}
+
+/// Constructs a copy of other.
+///
+/// \param other
+///
+QXmppRtcpPacket::QXmppRtcpPacket(const QXmppRtcpPacket &other)
+ : d(other.d)
+{
+}
+
+QXmppRtcpPacket::~QXmppRtcpPacket()
+{
+}
+
+/// Assigns the other packet to this one.
+///
+/// \param other
+///
+QXmppRtcpPacket& QXmppRtcpPacket::operator=(const QXmppRtcpPacket& other)
+{
+ d = other.d;
+ return *this;
+}
+
+/// Parses an RTCP packet.
+///
+/// \param ba
+bool QXmppRtcpPacket::decode(const QByteArray &ba)
+{
+ quint8 tmp, type;
+ quint16 len;
+
+ // fixed header
+ QDataStream stream(ba);
+ stream >> tmp;
+ stream >> type;
+ stream >> len;
+ if (stream.status() != QDataStream::Ok)
+ return false;
+
+ // check version
+ if ((tmp >> 6) != RTP_VERSION)
+ return false;
+
+ const int payloadLength = len << 2;
+ d->count = (tmp & 0x1f);
+ d->type = type;
+ d->payload.resize(payloadLength);
+ return stream.readRawData(d->payload.data(), payloadLength) == payloadLength;
+}
+
+/// Encodes an RTCP packet.
+
+QByteArray QXmppRtcpPacket::encode() const
+{
+ QByteArray ba;
+ ba.resize(4 + d->payload.size());
+
+ QDataStream stream(&ba, QIODevice::WriteOnly);
+ stream << quint8((RTP_VERSION << 6) | (d->count & 0x1f));
+ stream << d->type;
+ stream << quint16(d->payload.size() >> 2);
+ stream.writeRawData(d->payload.constData(), d->payload.size());
+ return ba;
+}
+
+/// Returns the number of report blocks.
+
+quint8 QXmppRtcpPacket::count() const
+{
+ return d->count;
+}
+
+/// Sets the number of report blocks.
+///
+/// \param count
+
+void QXmppRtcpPacket::setCount(quint8 count)
+{
+ d->count = count;
+}
+
+/// Returns the RTCP packet type.
+
+quint8 QXmppRtcpPacket::type() const
+{
+ return d->type;
+}
+
+/// Sets the RTCP packet type.
+///
+/// \param type
+
+void QXmppRtcpPacket::setType(quint8 type)
+{
+ d->type = type;
+}