diff options
author | Maurice Kalinowski <maurice.kalinowski@qt.io> | 2018-08-08 14:29:09 +0200 |
---|---|---|
committer | Maurice Kalinowski <maurice.kalinowski@qt.io> | 2018-08-09 10:30:36 +0000 |
commit | e8bdfe7b4c0406622c3b74e74bc33c373667ab58 (patch) | |
tree | d2b5e74e4dfa7717eccd872212220896c5b79e3b | |
parent | b9ac8d04f2f5e3fe4b2d2dcc9fe5d6c12603898c (diff) |
Rename QMqttPublishProperties::subscriptionIdentifiers
The standard did not mention it explicitly to be a list. However,
quoting "Multiple Subscription Identifiers will be included if the
publication is the result of a match to more than one subscription, in
this case their order is not significant" clearly indicates that
multiple subscription ids can be part of a publish message.
Change-Id: I1a45564a719847020e24aec7d0385807f3be3aa4
Reviewed-by: hjk <hjk@qt.io>
-rw-r--r-- | src/mqtt/qmqttconnection.cpp | 18 | ||||
-rw-r--r-- | src/mqtt/qmqttpublishproperties.cpp | 8 | ||||
-rw-r--r-- | src/mqtt/qmqttpublishproperties.h | 4 | ||||
-rw-r--r-- | tests/auto/qmqttpublishproperties/tst_qmqttpublishproperties.cpp | 11 |
4 files changed, 24 insertions, 17 deletions
diff --git a/src/mqtt/qmqttconnection.cpp b/src/mqtt/qmqttconnection.cpp index b9c821d..7092249 100644 --- a/src/mqtt/qmqttconnection.cpp +++ b/src/mqtt/qmqttconnection.cpp @@ -900,6 +900,7 @@ void QMqttConnection::readPublishProperties(QMqttPublishProperties &properties) m_missingData -= propertyLength; QMqttUserProperties userProperties; + QList<quint32> subscriptionIds; while (propertyLength > 0) { const quint8 propertyId = readBufferTyped<quint8>(&propertyLength); @@ -942,7 +943,7 @@ void QMqttConnection::readPublishProperties(QMqttPublishProperties &properties) if (id < 0) return; // readVariableByteInteger closes connection propertyLength -= idSize; - properties.setSubscriptionIdentifier(quint32(id)); + subscriptionIds.append(quint32(id)); break; } case 0x03: { // 3.3.2.3.9 Content Type @@ -957,6 +958,9 @@ void QMqttConnection::readPublishProperties(QMqttPublishProperties &properties) } if (!userProperties.isEmpty()) properties.setUserProperties(userProperties); + + if (!subscriptionIds.isEmpty()) + properties.setSubscriptionIdentifiers(subscriptionIds); } void QMqttConnection::readSubscriptionProperties(QMqttSubscription *sub) @@ -1211,12 +1215,12 @@ QByteArray QMqttConnection::writePublishProperties(const QMqttPublishProperties } // 3.3.2.3.8 Subscription Identifier - if (properties.availableProperties() & QMqttPublishProperties::SubscriptionIdentifier && - properties.subscriptionIdentifier() > 0) { - qCDebug(lcMqttConnectionVerbose) << "Publish Properties: Subscription ID:" - << properties.subscriptionIdentifier(); - packet.append(char(0x0b)); - packet.appendRawVariableInteger(properties.subscriptionIdentifier()); + if (properties.availableProperties() & QMqttPublishProperties::SubscriptionIdentifier) { + for (auto id : properties.subscriptionIdentifiers()) { + qCDebug(lcMqttConnectionVerbose) << "Publish Properties: Subscription ID:" << id; + packet.append(char(0x0b)); + packet.appendRawVariableInteger(id); + } } // 3.3.2.3.9 Content Type diff --git a/src/mqtt/qmqttpublishproperties.cpp b/src/mqtt/qmqttpublishproperties.cpp index d54fd35..66cc9e8 100644 --- a/src/mqtt/qmqttpublishproperties.cpp +++ b/src/mqtt/qmqttpublishproperties.cpp @@ -43,7 +43,7 @@ public: QString contentType; QByteArray correlationData; quint32 messageExpiry{0}; - quint32 subscriptionIdentifier{0}; // Variable Integer + QList<quint32> subscriptionIdentifier; QMqttPublishProperties::PublishPropertyDetails details{QMqttPublishProperties::None}; quint16 topicAlias{0}; QMqtt::PayloadFormatIndicator payloadIndicator{QMqtt::PayloadFormatIndicator::Unspecified}; @@ -141,14 +141,14 @@ void QMqttPublishProperties::setUserProperties(const QMqttUserProperties &proper data->userProperties = properties; } -quint32 QMqttPublishProperties::subscriptionIdentifier() const +QList<quint32> QMqttPublishProperties::subscriptionIdentifiers() const { return data->subscriptionIdentifier; } -void QMqttPublishProperties::setSubscriptionIdentifier(quint32 id) +void QMqttPublishProperties::setSubscriptionIdentifiers(const QList<quint32> &id) { - if (id == 0) { + if (id.indexOf(0) != -1) { qCDebug(lcMqttClient) << "A subscription identifier with value 0 is not allowed."; return; } diff --git a/src/mqtt/qmqttpublishproperties.h b/src/mqtt/qmqttpublishproperties.h index 665311b..93ec6f9 100644 --- a/src/mqtt/qmqttpublishproperties.h +++ b/src/mqtt/qmqttpublishproperties.h @@ -82,8 +82,8 @@ public: QMqttUserProperties userProperties() const; void setUserProperties(const QMqttUserProperties &properties); - quint32 subscriptionIdentifier() const; - void setSubscriptionIdentifier(quint32 id); + QList<quint32> subscriptionIdentifiers() const; + void setSubscriptionIdentifiers(const QList<quint32> &id); QString contentType() const; void setContentType(const QString &type); diff --git a/tests/auto/qmqttpublishproperties/tst_qmqttpublishproperties.cpp b/tests/auto/qmqttpublishproperties/tst_qmqttpublishproperties.cpp index 7989b23..669fe5d 100644 --- a/tests/auto/qmqttpublishproperties/tst_qmqttpublishproperties.cpp +++ b/tests/auto/qmqttpublishproperties/tst_qmqttpublishproperties.cpp @@ -118,11 +118,14 @@ void tst_QMqttPublishProperties::getSet() QCOMPARE(p.userProperties(), userProperty); QVERIFY(!(p.availableProperties() & QMqttPublishProperties::SubscriptionIdentifier)); - p.setSubscriptionIdentifier(1); - QCOMPARE(p.subscriptionIdentifier(), 1u); - p.setSubscriptionIdentifier(0); + const QList<quint32> one{1}; + p.setSubscriptionIdentifiers(one); + QCOMPARE(p.subscriptionIdentifiers(), one); + + const QList<quint32> invalidZero{1, 0}; + p.setSubscriptionIdentifiers(invalidZero); QVERIFY(p.availableProperties() & QMqttPublishProperties::SubscriptionIdentifier); - QCOMPARE(p.subscriptionIdentifier(), 1u); + QCOMPARE(p.subscriptionIdentifiers(), one); const QString contentType = QLatin1String("MultimediaContent123"); QVERIFY(!(p.availableProperties() & QMqttPublishProperties::ContentType)); |