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 2013/09/23 15:25:32 UTC

svn commit: r1525584 - in /qpid/trunk/qpid/cpp/src/qpid: broker/amqp/Message.cpp messaging/amqp/AddressHelper.cpp

Author: gsim
Date: Mon Sep 23 13:25:32 2013
New Revision: 1525584

URL: http://svn.apache.org/r1525584
Log:
QPID-5153: Implement Encoding::getPropertyAsString() for 1.0 format message

Modified:
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Message.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp

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=1525584&r1=1525583&r2=1525584&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Message.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Message.cpp Mon Sep 23 13:25:32 2013
@@ -31,6 +31,7 @@
 #include "qpid/log/Statement.h"
 #include "qpid/framing/Buffer.h"
 #include <string.h>
+#include <boost/lexical_cast.hpp>
 
 namespace qpid {
 namespace broker {
@@ -79,8 +80,51 @@ uint8_t Message::getPriority() const
     else return priority.get();
 }
 
-std::string Message::getPropertyAsString(const std::string& /*key*/) const { return empty; }
-std::string Message::getAnnotationAsString(const std::string& /*key*/) const { return empty; }
+namespace {
+class StringRetriever : public MapHandler
+{
+  public:
+    StringRetriever(const std::string& k) : key(k) {}
+    void handleBool(const qpid::amqp::CharSequence& actualKey, bool actualValue) { process(actualKey, actualValue); }
+    void handleUint8(const qpid::amqp::CharSequence& actualKey, uint8_t actualValue) { process(actualKey, actualValue); }
+    void handleUint16(const qpid::amqp::CharSequence& actualKey, uint16_t actualValue) { process(actualKey, actualValue); }
+    void handleUint32(const qpid::amqp::CharSequence& actualKey, uint32_t actualValue) { process(actualKey, actualValue); }
+    void handleUint64(const qpid::amqp::CharSequence& actualKey, uint64_t actualValue) { process(actualKey, actualValue); }
+    void handleInt8(const qpid::amqp::CharSequence& actualKey, int8_t actualValue) { process(actualKey, actualValue); }
+    void handleInt16(const qpid::amqp::CharSequence& actualKey, int16_t actualValue) { process(actualKey, actualValue); }
+    void handleInt32(const qpid::amqp::CharSequence& actualKey, int32_t actualValue) { process(actualKey, actualValue); }
+    void handleInt64(const qpid::amqp::CharSequence& actualKey, int64_t actualValue) { process(actualKey, actualValue); }
+    void handleFloat(const qpid::amqp::CharSequence& actualKey, float actualValue) { process(actualKey, actualValue); }
+    void handleDouble(const qpid::amqp::CharSequence& actualKey, double actualValue) { process(actualKey, actualValue); }
+    void handleVoid(const qpid::amqp::CharSequence&) { /*nothing to do*/ }
+    void handleString(const qpid::amqp::CharSequence& actualKey, const qpid::amqp::CharSequence& actualValue, const qpid::amqp::CharSequence& /*encoding*/)
+    {
+        if (isRequestedKey(actualKey)) value = std::string(actualValue.data, actualValue.size);
+    }
+    std::string getValue() const { return value; }
+  private:
+    const std::string key;
+    std::string value;
+
+    template <typename T> void process(const qpid::amqp::CharSequence& actualKey, T actualValue)
+    {
+        if (isRequestedKey(actualKey)) value = boost::lexical_cast<std::string>(actualValue);
+    }
+
+    bool isRequestedKey(const qpid::amqp::CharSequence& actualKey)
+    {
+        //TODO: avoid allocating new string by just iterating over chars
+        return key == std::string(actualKey.data, actualKey.size);
+    }
+};
+}
+
+std::string Message::getPropertyAsString(const std::string& key) const
+{
+    StringRetriever sr(key);
+    processProperties(sr);
+    return sr.getValue();
+}
 
 namespace {
     class PropertyAdapter : public Reader {
@@ -135,12 +179,27 @@ namespace {
             state(KEY)
          {}
     };
+
+void processMapData(const CharSequence& source, MapHandler& handler)
+{
+    qpid::amqp::Decoder d(source.data, source.size);
+    PropertyAdapter adapter(handler);
+    d.read(adapter);
+
+}
 }
 
 void Message::processProperties(MapHandler& mh) const {
-    qpid::amqp::Decoder d(applicationProperties.data, applicationProperties.size);
-    PropertyAdapter mha(mh);
-    d.read(mha);
+    processMapData(applicationProperties, mh);
+}
+
+std::string Message::getAnnotationAsString(const std::string& key) const
+{
+    StringRetriever sr(key);
+    processMapData(messageAnnotations, sr);
+    if (sr.getValue().empty()) processMapData(deliveryAnnotations, sr);
+    return sr.getValue();
+
 }
 
 //getContentSize() is primarily used in stats about the number of

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp?rev=1525584&r1=1525583&r2=1525584&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp Mon Sep 23 13:25:32 2013
@@ -688,7 +688,7 @@ void AddressHelper::setNodeProperties(pn
                 putLifetimePolicy(data, toLifetimePolicy(i->second.asString()));
             } else {
                 pn_data_put_symbol(data, convert(i->first));
-                pn_data_put_string(data, convert(i->second.asString()));
+                write(data, i->second);
             }
         }
         pn_data_exit(data);



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