diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2015-08-20 08:49:44 +0200 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2015-08-20 08:49:44 +0200 |
| commit | 3a51c38d120a30f717e8584a4502d3848a0e1ac5 (patch) | |
| tree | 79b7c84c7fe370e95e99ef922257a7789e1e35ef | |
| parent | 2b538aecb57dec32aacc27c8f23fd377b03991d4 (diff) | |
| download | qxmpp-3a51c38d120a30f717e8584a4502d3848a0e1ac5.tar.gz | |
add QXmppRtcpPacket class
| -rw-r--r-- | src/base/QXmppRtcpPacket.cpp | 144 | ||||
| -rw-r--r-- | src/base/QXmppRtcpPacket.h | 58 | ||||
| -rw-r--r-- | src/base/base.pri | 2 | ||||
| -rw-r--r-- | tests/qxmpprtcppacket/qxmpprtcppacket.pro | 3 | ||||
| -rw-r--r-- | tests/qxmpprtcppacket/tst_qxmpprtcppacket.cpp | 69 | ||||
| -rw-r--r-- | tests/tests.pro | 1 |
6 files changed, 277 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; +} diff --git a/src/base/QXmppRtcpPacket.h b/src/base/QXmppRtcpPacket.h new file mode 100644 index 00000000..6ceee0fc --- /dev/null +++ b/src/base/QXmppRtcpPacket.h @@ -0,0 +1,58 @@ +/* + * 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. + * + */ + +#ifndef QXMPPRTCPPACKET_H +#define QXMPPRTCPPACKET_H + +#include <QSharedDataPointer> + +#include "QXmppGlobal.h" + +class QXmppRtcpPacketPrivate; + +/// \brief The QXmppRtpPacket class represents an RTCP packet. +/// + +class QXMPP_EXPORT QXmppRtcpPacket +{ +public: + QXmppRtcpPacket(); + QXmppRtcpPacket(const QXmppRtcpPacket &other); + virtual ~QXmppRtcpPacket(); + + QXmppRtcpPacket& operator=(const QXmppRtcpPacket &other); + + bool decode(const QByteArray &ba); + QByteArray encode() const; + + quint8 count() const; + void setCount(quint8 count); + + quint8 type() const; + void setType(quint8 type); + +private: + QSharedDataPointer<QXmppRtcpPacketPrivate> d; +}; + +#endif diff --git a/src/base/base.pri b/src/base/base.pri index 8a712662..537fe75c 100644 --- a/src/base/base.pri +++ b/src/base/base.pri @@ -24,6 +24,7 @@ INSTALL_HEADERS += \ base/QXmppResultSet.h \ base/QXmppRosterIq.h \ base/QXmppRpcIq.h \ + base/QXmppRtcpPacket.h \ base/QXmppRtpChannel.h \ base/QXmppSessionIq.h \ base/QXmppSocks.h \ @@ -67,6 +68,7 @@ SOURCES += \ base/QXmppResultSet.cpp \ base/QXmppRosterIq.cpp \ base/QXmppRpcIq.cpp \ + base/QXmppRtcpPacket.cpp \ base/QXmppRtpChannel.cpp \ base/QXmppSasl.cpp \ base/QXmppSessionIq.cpp \ diff --git a/tests/qxmpprtcppacket/qxmpprtcppacket.pro b/tests/qxmpprtcppacket/qxmpprtcppacket.pro new file mode 100644 index 00000000..a20db449 --- /dev/null +++ b/tests/qxmpprtcppacket/qxmpprtcppacket.pro @@ -0,0 +1,3 @@ +include(../tests.pri) +TARGET = tst_qxmpprtcppacket +SOURCES += tst_qxmpprtcppacket.cpp diff --git a/tests/qxmpprtcppacket/tst_qxmpprtcppacket.cpp b/tests/qxmpprtcppacket/tst_qxmpprtcppacket.cpp new file mode 100644 index 00000000..94096c6a --- /dev/null +++ b/tests/qxmpprtcppacket/tst_qxmpprtcppacket.cpp @@ -0,0 +1,69 @@ +/* + * 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 <QObject> +#include <QtTest> +#include "QXmppRtcpPacket.h" + +class tst_QXmppRtcpPacket : public QObject +{ + Q_OBJECT + +private slots: + void testBad(); + void testSenderReport(); + void testSourceDescription(); +}; + +void tst_QXmppRtcpPacket::testBad() +{ + QXmppRtcpPacket packet; + + // too short + QCOMPARE(packet.decode(QByteArray()), false); +} + +void tst_QXmppRtcpPacket::testSenderReport() +{ + QByteArray data("\x80\xc8\x00\x06\x27\xa6\xe4\xc1\xd9\x7f\xec\x7d\x92\xac\xd9\xe8\xdd\x9e\x32\x57\x00\x00\x00\x74\x00\x00\x48\x80", 28); + + QXmppRtcpPacket packet; + QVERIFY(packet.decode(data)); + QCOMPARE(packet.count(), quint8(0)); + QCOMPARE(packet.type(), quint8(200)); + QCOMPARE(packet.encode(), data); +} + +void tst_QXmppRtcpPacket::testSourceDescription() +{ + QByteArray data("\x81\xca\x00\x0c\x27\xa6\xe4\xc1\x01\x26\x7b\x64\x30\x33\x61\x37\x63\x34\x38\x2d\x64\x39\x30\x36\x2d\x34\x62\x39\x61\x2d\x39\x38\x32\x30\x2d\x31\x31\x31\x38\x30\x32\x64\x63\x64\x35\x37\x38\x7d\x00\x00\x00\x00", 52); + + QXmppRtcpPacket packet; + QVERIFY(packet.decode(data)); + QCOMPARE(packet.count(), quint8(1)); + QCOMPARE(packet.type(), quint8(202)); + QCOMPARE(packet.encode(), data); +} + +QTEST_MAIN(tst_QXmppRtcpPacket) +#include "tst_qxmpprtcppacket.moc" diff --git a/tests/tests.pro b/tests/tests.pro index 50a2ac93..552d4811 100644 --- a/tests/tests.pro +++ b/tests/tests.pro @@ -16,6 +16,7 @@ SUBDIRS = \ qxmppresultset \ qxmpprosteriq \ qxmpprpciq \ + qxmpprtcppacket \ qxmpprtppacket \ qxmppserver \ qxmppsessioniq \ |
