You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2013/03/12 16:16:43 UTC

svn commit: r1455579 - in /qpid/trunk/qpid/cpp/src/qpid: broker/HeadersExchange.cpp broker/MapHandler.h broker/Message.cpp broker/amqp/Message.cpp broker/amqp_0_10/MessageTransfer.cpp xml/XmlExchange.cpp

Author: astitcher
Date: Tue Mar 12 15:16:43 2013
New Revision: 1455579

URL: http://svn.apache.org/r1455579
Log:
QPID-4625: Extract amqp 1.0 application-properties from messages
- A working implementaion to qpid::amqp::Message::processProperties()
  so that qpid::broker::Message::getProperty() will work.
* This is used by the selector implementation.

Modified:
    qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/MapHandler.h
    qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Message.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp_0_10/MessageTransfer.cpp
    qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.cpp

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp?rev=1455579&r1=1455578&r2=1455579&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp Tue Mar 12 15:16:43 2013
@@ -19,6 +19,8 @@
  *
  */
 #include "qpid/broker/HeadersExchange.h"
+
+#include "qpid/amqp/CharSequence.h"
 #include "qpid/broker/MapHandler.h"
 #include "qpid/framing/FieldValue.h"
 #include "qpid/framing/reply_exceptions.h"

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/MapHandler.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/MapHandler.h?rev=1455579&r1=1455578&r2=1455579&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/MapHandler.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/MapHandler.h Tue Mar 12 15:16:43 2013
@@ -24,6 +24,11 @@
 #include "qpid/sys/IntegerTypes.h"
 
 namespace qpid {
+
+namespace amqp {
+struct CharSequence;
+}
+
 namespace broker {
 
 /**
@@ -32,10 +37,7 @@ namespace broker {
 class MapHandler
 {
   public:
-    typedef struct {
-        const char* data;
-        size_t size;
-    } CharSequence;
+    typedef qpid::amqp::CharSequence CharSequence;
 
     virtual ~MapHandler() {}
     virtual void handleVoid(const CharSequence& key) = 0;

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp?rev=1455579&r1=1455578&r2=1455579&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp Tue Mar 12 15:16:43 2013
@@ -20,6 +20,8 @@
  */
 
 #include "qpid/broker/Message.h"
+
+#include "qpid/amqp/CharSequence.h"
 #include "qpid/broker/MapHandler.h"
 #include "qpid/StringUtils.h"
 #include "qpid/log/Statement.h"

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=1455579&r1=1455578&r2=1455579&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Message.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Message.cpp Tue Mar 12 15:16:43 2013
@@ -21,7 +21,9 @@
 #include "Message.h"
 #include "qpid/amqp/Decoder.h"
 #include "qpid/amqp/descriptors.h"
+#include "qpid/amqp/Reader.h"
 #include "qpid/amqp/MessageEncoder.h"
+#include "qpid/broker/MapHandler.h"
 #include "qpid/log/Statement.h"
 #include "qpid/framing/Buffer.h"
 #include <string.h>
@@ -30,6 +32,11 @@ namespace qpid {
 namespace broker {
 namespace amqp {
 
+using qpid::amqp::CharSequence;
+using qpid::amqp::Constructor;
+using qpid::amqp::Descriptor;
+using qpid::amqp::Reader;
+
 namespace {
 std::string empty;
 }
@@ -69,7 +76,67 @@ uint8_t Message::getPriority() const
 
 std::string Message::getPropertyAsString(const std::string& /*key*/) const { return empty; }
 std::string Message::getAnnotationAsString(const std::string& /*key*/) const { return empty; }
-void Message::processProperties(MapHandler&) const {}
+
+namespace {
+    class PropertyAdapter : public Reader {
+        MapHandler& handler;
+        CharSequence key;
+        enum {
+            KEY,
+            VALUE
+        } state;
+
+        void checkValue() {
+            if ( state==VALUE ) state = KEY;
+            else {
+                // TODO: Would throwing an exception make more sense here?
+                QPID_LOG(error, "Received non string property key");
+                key = CharSequence();
+                state = KEY;
+            }
+        }
+
+        void onNull(const Descriptor*) {checkValue(); handler.handleVoid(key);}
+        void onBoolean(bool b, const Descriptor*) {checkValue(); handler.handleBool(key, b);}
+        void onUByte(uint8_t i, const Descriptor*) {checkValue(); handler.handleUint8(key, i);}
+        void onUShort(uint16_t i, const Descriptor*) {checkValue(); handler.handleUint16(key, i);}
+        void onUInt(uint32_t i, const Descriptor*) {checkValue(); handler.handleUint32(key, i);}
+        void onULong(uint64_t i, const Descriptor*) {checkValue(); handler.handleUint64(key, i);}
+        void onByte(int8_t i, const Descriptor*) {checkValue(); handler.handleInt8(key, i);}
+        void onShort(int16_t i, const Descriptor*) {checkValue(); handler.handleInt16(key, i);}
+        void onInt(int32_t i, const Descriptor*) {checkValue(); handler.handleInt32(key, i);}
+        void onLong(int64_t i, const Descriptor*) {checkValue(); handler.handleInt64(key, i);}
+        void onFloat(float x, const Descriptor*) {checkValue(); handler.handleFloat(key, x);}
+        void onDouble(double x, const Descriptor*) {checkValue(); handler.handleDouble(key, x);}
+        void onTimestamp(int64_t i, const Descriptor*) {checkValue(); handler.handleInt64(key, i);}
+
+        void onString(const CharSequence& s, const Descriptor*) {
+            if ( state==KEY ) {
+                state = VALUE;
+                key = s;
+            } else {
+                state = KEY;
+                handler.handleString(key, s, CharSequence());
+            }
+        }
+
+        bool onStartList(uint32_t, const CharSequence&, const Descriptor*) { return false; }
+        bool onStartMap(uint32_t, const CharSequence&, const Descriptor*) { return false; }
+        bool onStartArray(uint32_t, const CharSequence&, const Constructor&, const Descriptor*) { return false; }
+
+    public:
+        PropertyAdapter(MapHandler& mh) :
+            handler(mh),
+            state(KEY)
+         {}
+    };
+}
+
+void Message::processProperties(MapHandler& mh) const {
+    qpid::amqp::Decoder d(applicationProperties.data, applicationProperties.size);
+    PropertyAdapter mha(mh);
+    d.read(mha);
+}
 
 //getContentSize() is primarily used in stats about the number of
 //bytes enqueued/dequeued etc, not sure whether this is the right name

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp_0_10/MessageTransfer.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp_0_10/MessageTransfer.cpp?rev=1455579&r1=1455578&r2=1455579&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp_0_10/MessageTransfer.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp_0_10/MessageTransfer.cpp Tue Mar 12 15:16:43 2013
@@ -19,6 +19,8 @@
  *
  */
 #include "MessageTransfer.h"
+
+#include "qpid/amqp/CharSequence.h"
 #include "qpid/amqp_0_10/Codecs.h"
 #include "qpid/broker/MapHandler.h"
 #include "qpid/broker/Message.h"

Modified: qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.cpp?rev=1455579&r1=1455578&r2=1455579&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.cpp Tue Mar 12 15:16:43 2013
@@ -23,6 +23,7 @@
 
 #include "qpid/xml/XmlExchange.h"
 
+#include "qpid/amqp/CharSequence.h"
 #include "qpid/broker/DeliverableMessage.h"
 
 #include "qpid/log/Statement.h"



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org