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