diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2015-08-26 13:27:43 +0200 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2015-08-26 13:27:43 +0200 |
| commit | 7cfe1770d153512b538c97856c06436b2c34217b (patch) | |
| tree | b88d3c109dde16903a3718fe513cb578fe1f6923 /src/base/QXmppRtcpPacket.cpp | |
| parent | 459829c2d30e64b18ab4ed3b9c82e7b5f9ccd7ac (diff) | |
| download | qxmpp-7cfe1770d153512b538c97856c06436b2c34217b.tar.gz | |
RTCP: parse goodbye packet
Diffstat (limited to 'src/base/QXmppRtcpPacket.cpp')
| -rw-r--r-- | src/base/QXmppRtcpPacket.cpp | 95 |
1 files changed, 79 insertions, 16 deletions
diff --git a/src/base/QXmppRtcpPacket.cpp b/src/base/QXmppRtcpPacket.cpp index f2befdaf..11715929 100644 --- a/src/base/QXmppRtcpPacket.cpp +++ b/src/base/QXmppRtcpPacket.cpp @@ -44,12 +44,13 @@ public: quint8 type; /// Raw payload data. QByteArray payload; - // Sender SSRC (for receiver / sender reports only). - quint32 ssrc; + QString goodbyeReason; + QList<quint32> goodbyeSsrcs; QXmppRtcpSenderInfo senderInfo; QList<QXmppRtcpReceiverReport> receiverReports; QList<QXmppRtcpSourceDescription> sourceDescriptions; + quint32 ssrc; }; class QXmppRtcpReceiverReportPrivate : public QSharedData @@ -93,6 +94,27 @@ public: QString name; }; +static bool readPadding(QDataStream &stream, int dataLength) +{ + if (dataLength % 4) { + QByteArray buffer; + buffer.resize(4 - dataLength % 4); + if (stream.readRawData(buffer.data(), buffer.size()) != buffer.size()) + return false; + if (buffer != QByteArray(buffer.size(), '\0')) + return false; + } + return true; +} + +static void writePadding(QDataStream &stream, int dataLength) +{ + if (dataLength % 4) { + const QByteArray buffer = QByteArray(4 - dataLength % 4, '\0'); + stream.writeRawData(buffer.constData(), buffer.size()); + } +} + /// Constructs an empty RTCP packet QXmppRtcpPacket::QXmppRtcpPacket() @@ -158,11 +180,32 @@ bool QXmppRtcpPacket::read(QDataStream &stream) return false; QDataStream s(d->payload); + d->goodbyeReason.clear(); + d->goodbyeSsrcs.clear(); d->receiverReports.clear(); d->senderInfo = QXmppRtcpSenderInfo(); d->sourceDescriptions.clear(); d->ssrc = 0; - if (d->type == ReceiverReport || d->type == SenderReport) { + if (d->type == Goodbye) { + quint32 ssrc; + for (int i = 0; i < d->count; ++i) { + s >> ssrc; + if (stream.status() != QDataStream::Ok) + return false; + d->goodbyeSsrcs << ssrc; + } + quint8 reasonLength; + s >> reasonLength; + if (reasonLength) { + QByteArray buffer; + buffer.resize(reasonLength); + if (s.readRawData(buffer.data(), buffer.size()) != buffer.size()) + return false; + if (!readPadding(s, 1 + buffer.size())) + return false; + d->goodbyeReason = QString::fromUtf8(buffer); + } + } else if (d->type == ReceiverReport || d->type == SenderReport) { s >> d->ssrc; if (d->type == SenderReport && !d->senderInfo.d->read(s)) return false; @@ -189,7 +232,17 @@ void QXmppRtcpPacket::write(QDataStream &stream) const quint8 count; QDataStream s(&payload, QIODevice::WriteOnly); - if (d->type == ReceiverReport || d->type == SenderReport) { + if (d->type == Goodbye) { + count = d->goodbyeSsrcs.size(); + foreach (quint32 ssrc, d->goodbyeSsrcs) + s << ssrc; + if (!d->goodbyeReason.isEmpty()) { + const QByteArray reason = d->goodbyeReason.toUtf8(); + s << quint8(reason.size()); + s.writeRawData(reason.constData(), reason.size()); + writePadding(s, 1 + reason.size()); + } + } else if (d->type == ReceiverReport || d->type == SenderReport) { count = d->receiverReports.size(); s << d->ssrc; if (d->type == SenderReport) @@ -211,6 +264,26 @@ void QXmppRtcpPacket::write(QDataStream &stream) const stream.writeRawData(payload.constData(), payload.size()); } +QString QXmppRtcpPacket::goodbyeReason() const +{ + return d->goodbyeReason; +} + +void QXmppRtcpPacket::setGoodbyeReason(const QString &goodbyeReason) +{ + d->goodbyeReason = goodbyeReason; +} + +QList<quint32> QXmppRtcpPacket::goodbyeSsrcs() const +{ + return d->goodbyeSsrcs; +} + +void QXmppRtcpPacket::setGoodbyeSsrcs(const QList<quint32> &goodbyeSsrcs) +{ + d->goodbyeSsrcs = goodbyeSsrcs; +} + QList<QXmppRtcpReceiverReport> QXmppRtcpPacket::receiverReports() const { return d->receiverReports; @@ -519,14 +592,7 @@ bool QXmppRtcpSourceDescriptionPrivate::read(QDataStream &stream) else if (itemType == NameType) name = QString::fromUtf8(buffer); } - if (chunkLength % 4) { - buffer.resize(4 - chunkLength % 4); - if (stream.readRawData(buffer.data(), buffer.size()) != buffer.size()) - return false; - if (buffer != QByteArray(buffer.size(), '\0')) - return false; - } - return true; + return readPadding(stream, chunkLength); } void QXmppRtcpSourceDescriptionPrivate::write(QDataStream &stream) const @@ -551,8 +617,5 @@ void QXmppRtcpSourceDescriptionPrivate::write(QDataStream &stream) const } stream << quint8(0); chunkLength++; - if (chunkLength % 4) { - buffer = QByteArray(4 - chunkLength % 4, '\0'); - stream.writeRawData(buffer.constData(), buffer.size()); - } + writePadding(stream, chunkLength); } |
