You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gs...@apache.org on 2014/10/27 18:00:25 UTC
svn commit: r1634596 - in /qpid/trunk/qpid/cpp/src/qpid:
amqp/MessageReader.cpp amqp/MessageReader.h broker/amqp/Message.cpp
broker/amqp/Message.h messaging/amqp/EncodedMessage.cpp
messaging/amqp/EncodedMessage.h
Author: gsim
Date: Mon Oct 27 17:00:24 2014
New Revision: 1634596
URL: http://svn.apache.org/r1634596
Log:
QPID-4710: Update message decoding logic to handle nested descriptors also
Modified:
qpid/trunk/qpid/cpp/src/qpid/amqp/MessageReader.cpp
qpid/trunk/qpid/cpp/src/qpid/amqp/MessageReader.h
qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Message.cpp
qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Message.h
qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/EncodedMessage.cpp
qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/EncodedMessage.h
Modified: qpid/trunk/qpid/cpp/src/qpid/amqp/MessageReader.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/amqp/MessageReader.cpp?rev=1634596&r1=1634595&r2=1634596&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/amqp/MessageReader.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/amqp/MessageReader.cpp Mon Oct 27 17:00:24 2014
@@ -54,6 +54,12 @@ const size_t GROUP_ID(10);
const size_t GROUP_SEQUENCE(11);
const size_t REPLY_TO_GROUP_ID(12);
+
+const Descriptor* nested(const Descriptor* d)
+{
+ if (d && d->nested) return d->nested.get();
+ else return 0;
+}
}
MessageReader::HeaderReader::HeaderReader(MessageReader& p) : parent(p), index(0) {}
@@ -269,7 +275,7 @@ bool MessageReader::onStartList(uint32_t
onAmqpSequence(raw);
return false;
} else if (descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
- onAmqpValue(elements, qpid::amqp::typecodes::LIST_NAME);
+ onAmqpValue(elements, qpid::amqp::typecodes::LIST_NAME, nested(descriptor));
return false;
} else {
QPID_LOG(warning, "Unexpected described list: " << *descriptor);
@@ -310,7 +316,7 @@ bool MessageReader::onStartMap(uint32_t
onApplicationProperties(elements, raw);
return false;
} else if (descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
- onAmqpValue(elements, qpid::amqp::typecodes::MAP_NAME);
+ onAmqpValue(elements, qpid::amqp::typecodes::MAP_NAME, nested(descriptor));
return false;
} else {
QPID_LOG(warning, "Unexpected described map: " << *descriptor);
@@ -337,7 +343,7 @@ void MessageReader::onBinary(const CharS
} else if (descriptor->match(DATA_SYMBOL, DATA_CODE)) {
onData(bytes);
} else if (descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
- onAmqpValue(bytes, qpid::amqp::typecodes::BINARY_NAME);
+ onAmqpValue(bytes, qpid::amqp::typecodes::BINARY_NAME, nested(descriptor));
} else {
QPID_LOG(warning, "Unexpected binary value with descriptor: " << *descriptor);
}
@@ -353,7 +359,7 @@ void MessageReader::onNull(const Descrip
} else {
if (descriptor && descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
qpid::types::Variant v;
- onAmqpValue(v);
+ onAmqpValue(v, nested(descriptor));
} else {
if (!descriptor) {
QPID_LOG(warning, "Expected described type but got null value with no descriptor.");
@@ -369,7 +375,7 @@ void MessageReader::onString(const CharS
delegate->onString(v, descriptor);
} else {
if (descriptor && descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
- onAmqpValue(v, qpid::amqp::typecodes::STRING_NAME);
+ onAmqpValue(v, qpid::amqp::typecodes::STRING_NAME, nested(descriptor));
} else {
if (!descriptor) {
QPID_LOG(warning, "Expected described type but got string value with no descriptor.");
@@ -385,7 +391,7 @@ void MessageReader::onSymbol(const CharS
delegate->onSymbol(v, descriptor);
} else {
if (descriptor && descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
- onAmqpValue(v, qpid::amqp::typecodes::SYMBOL_NAME);
+ onAmqpValue(v, qpid::amqp::typecodes::SYMBOL_NAME, nested(descriptor));
} else {
if (!descriptor) {
QPID_LOG(warning, "Expected described type but got symbol value with no descriptor.");
@@ -403,7 +409,7 @@ void MessageReader::onBoolean(bool v, co
} else {
if (descriptor && descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
qpid::types::Variant body = v;
- onAmqpValue(body);
+ onAmqpValue(body, nested(descriptor));
} else {
if (!descriptor) {
QPID_LOG(warning, "Expected described type but got boolean value with no descriptor.");
@@ -421,7 +427,7 @@ void MessageReader::onUByte(uint8_t v, c
} else {
if (descriptor && descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
qpid::types::Variant body = v;
- onAmqpValue(body);
+ onAmqpValue(body, nested(descriptor));
} else {
if (!descriptor) {
QPID_LOG(warning, "Expected described type but got ubyte value with no descriptor.");
@@ -439,7 +445,7 @@ void MessageReader::onUShort(uint16_t v,
} else {
if (descriptor && descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
qpid::types::Variant body = v;
- onAmqpValue(body);
+ onAmqpValue(body, nested(descriptor));
} else {
if (!descriptor) {
QPID_LOG(warning, "Expected described type but got ushort value with no descriptor.");
@@ -457,7 +463,7 @@ void MessageReader::onUInt(uint32_t v, c
} else {
if (descriptor && descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
qpid::types::Variant body = v;
- onAmqpValue(body);
+ onAmqpValue(body, nested(descriptor));
} else {
if (!descriptor) {
QPID_LOG(warning, "Expected described type but got uint value with no descriptor.");
@@ -475,7 +481,7 @@ void MessageReader::onULong(uint64_t v,
} else {
if (descriptor && descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
qpid::types::Variant body = v;
- onAmqpValue(body);
+ onAmqpValue(body, nested(descriptor));
} else {
if (!descriptor) {
QPID_LOG(warning, "Expected described type but got ulong value with no descriptor.");
@@ -493,7 +499,7 @@ void MessageReader::onByte(int8_t v, con
} else {
if (descriptor && descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
qpid::types::Variant body = v;
- onAmqpValue(body);
+ onAmqpValue(body, nested(descriptor));
} else {
if (!descriptor) {
QPID_LOG(warning, "Expected described type but got byte value with no descriptor.");
@@ -511,7 +517,7 @@ void MessageReader::onShort(int16_t v, c
} else {
if (descriptor && descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
qpid::types::Variant body = v;
- onAmqpValue(body);
+ onAmqpValue(body, nested(descriptor));
} else {
if (!descriptor) {
QPID_LOG(warning, "Expected described type but got short value with no descriptor.");
@@ -529,7 +535,7 @@ void MessageReader::onInt(int32_t v, con
} else {
if (descriptor && descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
qpid::types::Variant body = v;
- onAmqpValue(body);
+ onAmqpValue(body, nested(descriptor));
} else {
if (!descriptor) {
QPID_LOG(warning, "Expected described type but got int value with no descriptor.");
@@ -547,7 +553,7 @@ void MessageReader::onLong(int64_t v, co
} else {
if (descriptor && descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
qpid::types::Variant body = v;
- onAmqpValue(body);
+ onAmqpValue(body, nested(descriptor));
} else {
if (!descriptor) {
QPID_LOG(warning, "Expected described type but got long value with no descriptor.");
@@ -565,7 +571,7 @@ void MessageReader::onFloat(float v, con
} else {
if (descriptor && descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
qpid::types::Variant body = v;
- onAmqpValue(body);
+ onAmqpValue(body, nested(descriptor));
} else {
if (!descriptor) {
QPID_LOG(warning, "Expected described type but got float value with no descriptor.");
@@ -583,7 +589,7 @@ void MessageReader::onDouble(double v, c
} else {
if (descriptor && descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
qpid::types::Variant body = v;
- onAmqpValue(body);
+ onAmqpValue(body, nested(descriptor));
} else {
if (!descriptor) {
QPID_LOG(warning, "Expected described type but got double value with no descriptor.");
@@ -600,7 +606,7 @@ void MessageReader::onUuid(const CharSeq
delegate->onUuid(v, descriptor);
} else {
if (descriptor && descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
- onAmqpValue(v, qpid::amqp::typecodes::UUID_NAME);
+ onAmqpValue(v, qpid::amqp::typecodes::UUID_NAME, nested(descriptor));
} else {
if (!descriptor) {
QPID_LOG(warning, "Expected described type but got uuid value with no descriptor.");
@@ -618,7 +624,7 @@ void MessageReader::onTimestamp(int64_t
} else {
if (descriptor && descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
qpid::types::Variant body = v;
- onAmqpValue(body);
+ onAmqpValue(body, nested(descriptor));
} else {
if (!descriptor) {
QPID_LOG(warning, "Expected described type but got timestamp value with no descriptor.");
@@ -636,7 +642,7 @@ bool MessageReader::onStartArray(uint32_
} else {
if (descriptor && descriptor->match(AMQP_VALUE_SYMBOL, AMQP_VALUE_CODE)) {
//TODO: might be better to decode this here
- onAmqpValue(raw, qpid::amqp::typecodes::ARRAY_NAME);
+ onAmqpValue(raw, qpid::amqp::typecodes::ARRAY_NAME, nested(descriptor));
} else {
if (!descriptor) {
QPID_LOG(warning, "Expected described type but got array with no descriptor.");
Modified: qpid/trunk/qpid/cpp/src/qpid/amqp/MessageReader.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/amqp/MessageReader.h?rev=1634596&r1=1634595&r2=1634596&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/amqp/MessageReader.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/amqp/MessageReader.h Mon Oct 27 17:00:24 2014
@@ -100,8 +100,8 @@ class MessageReader : public Reader
virtual void onData(const CharSequence&) = 0;
virtual void onAmqpSequence(const CharSequence&) = 0;
- virtual void onAmqpValue(const CharSequence&, const std::string& type) = 0;
- virtual void onAmqpValue(const qpid::types::Variant&) = 0;
+ virtual void onAmqpValue(const CharSequence&, const std::string& type, const Descriptor*) = 0;
+ virtual void onAmqpValue(const qpid::types::Variant&, const Descriptor*) = 0;
virtual void onFooter(const CharSequence& /*values*/, const CharSequence& /*full*/) = 0;
Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Message.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Message.cpp?rev=1634596&r1=1634595&r2=1634596&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Message.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Message.cpp Mon Oct 27 17:00:24 2014
@@ -217,7 +217,7 @@ std::string Message::getContent() const
return std::string(body.data, body.size);
}
-Message::Message(size_t size) : data(size)
+Message::Message(size_t size) : data(size), bodyDescriptor(0)
{
deliveryAnnotations.init();
messageAnnotations.init();
@@ -329,7 +329,7 @@ void Message::onMessageAnnotations(const
void Message::onData(const qpid::amqp::CharSequence& v) { body = v; }
void Message::onAmqpSequence(const qpid::amqp::CharSequence& v) { body = v; bodyType = qpid::amqp::typecodes::LIST_NAME; }
-void Message::onAmqpValue(const qpid::amqp::CharSequence& v, const std::string& t)
+void Message::onAmqpValue(const qpid::amqp::CharSequence& v, const std::string& t, const qpid::amqp::Descriptor* d)
{
body = v;
if (t == qpid::amqp::typecodes::STRING_NAME) {
@@ -341,8 +341,17 @@ void Message::onAmqpValue(const qpid::am
} else {
bodyType = t;
}
+ if (d) {
+ bodyDescriptor = *d;
+ }
+}
+void Message::onAmqpValue(const qpid::types::Variant& v, const qpid::amqp::Descriptor* d)
+{
+ typedBody = v;
+ if (d) {
+ bodyDescriptor = *d;
+ }
}
-void Message::onAmqpValue(const qpid::types::Variant& v) { typedBody = v; }
void Message::onFooter(const qpid::amqp::CharSequence&, const qpid::amqp::CharSequence& v) { footer = v; }
@@ -372,6 +381,10 @@ qpid::types::Variant Message::getTypedBo
}
}
+const qpid::amqp::Descriptor& Message::getBodyDescriptor() const
+{
+ return bodyDescriptor;
+}
//PersistableMessage interface:
void Message::encode(framing::Buffer& buffer) const
Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Message.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Message.h?rev=1634596&r1=1634595&r2=1634596&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Message.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Message.h Mon Oct 27 17:00:24 2014
@@ -23,6 +23,7 @@
*/
#include "qpid/broker/Message.h"
#include "qpid/amqp/CharSequence.h"
+#include "qpid/amqp/Descriptor.h"
#include "qpid/amqp/MessageId.h"
#include "qpid/amqp/MessageReader.h"
#include <boost/optional.hpp>
@@ -67,6 +68,7 @@ class Message : public qpid::broker::Mes
qpid::amqp::CharSequence getFooter() const;
bool isTypedBody() const;
qpid::types::Variant getTypedBody() const;
+ const qpid::amqp::Descriptor& getBodyDescriptor() const;
Message(size_t size);
char* getData();
@@ -114,6 +116,7 @@ class Message : public qpid::broker::Mes
qpid::amqp::CharSequence body;
qpid::types::Variant typedBody;
std::string bodyType;
+ qpid::amqp::Descriptor bodyDescriptor;
//footer:
qpid::amqp::CharSequence footer;
@@ -147,8 +150,8 @@ class Message : public qpid::broker::Mes
void onData(const qpid::amqp::CharSequence&);
void onAmqpSequence(const qpid::amqp::CharSequence&);
- void onAmqpValue(const qpid::amqp::CharSequence&, const std::string& type);
- void onAmqpValue(const qpid::types::Variant&);
+ void onAmqpValue(const qpid::amqp::CharSequence&, const std::string& type, const qpid::amqp::Descriptor*);
+ void onAmqpValue(const qpid::types::Variant&, const qpid::amqp::Descriptor*);
void onFooter(const qpid::amqp::CharSequence&, const qpid::amqp::CharSequence&);
};
Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/EncodedMessage.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/EncodedMessage.cpp?rev=1634596&r1=1634595&r2=1634596&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/EncodedMessage.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/EncodedMessage.cpp Mon Oct 27 17:00:24 2014
@@ -345,7 +345,7 @@ void EncodedMessage::InitialScan::onAmqp
em.body = v;
em.bodyType = qpid::amqp::typecodes::LIST_NAME;
}
-void EncodedMessage::InitialScan::onAmqpValue(const qpid::amqp::CharSequence& v, const std::string& type)
+void EncodedMessage::InitialScan::onAmqpValue(const qpid::amqp::CharSequence& v, const std::string& type, const qpid::amqp::Descriptor*)
{
em.body = v;
if (type == qpid::amqp::typecodes::STRING_NAME) {
@@ -356,7 +356,7 @@ void EncodedMessage::InitialScan::onAmqp
em.bodyType = type;
}
}
-void EncodedMessage::InitialScan::onAmqpValue(const qpid::types::Variant& v)
+void EncodedMessage::InitialScan::onAmqpValue(const qpid::types::Variant& v, const qpid::amqp::Descriptor*)
{
em.content = v;
}
Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/EncodedMessage.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/EncodedMessage.h?rev=1634596&r1=1634595&r2=1634596&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/EncodedMessage.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/EncodedMessage.h Mon Oct 27 17:00:24 2014
@@ -138,8 +138,8 @@ class EncodedMessage
void onData(const qpid::amqp::CharSequence&);
void onAmqpSequence(const qpid::amqp::CharSequence&);
- void onAmqpValue(const qpid::amqp::CharSequence&, const std::string& type);
- void onAmqpValue(const qpid::types::Variant&);
+ void onAmqpValue(const qpid::amqp::CharSequence&, const std::string& type, const qpid::amqp::Descriptor*);
+ void onAmqpValue(const qpid::types::Variant&, const qpid::amqp::Descriptor*);
void onFooter(const qpid::amqp::CharSequence&, const qpid::amqp::CharSequence&);
private:
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org