From 343e2137c01054057ababcd611d6a5078ed455d8 Mon Sep 17 00:00:00 2001 From: Andrew Stitcher Date: Fri, 8 Mar 2013 15:55:45 +0000 Subject: QPID-4626: Amqp 0-10 Message getProperty() does not correctly return booleans - Improve amqp 0-10 message property handling to correct deal with floats/double and bools. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1454437 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/broker/HeadersExchange.cpp | 1 + cpp/src/qpid/broker/MapHandler.h | 1 + cpp/src/qpid/broker/Message.cpp | 1 + cpp/src/qpid/broker/amqp_0_10/MessageTransfer.cpp | 59 +++++++++++++++-------- cpp/src/qpid/xml/XmlExchange.cpp | 1 + 5 files changed, 44 insertions(+), 19 deletions(-) (limited to 'cpp') diff --git a/cpp/src/qpid/broker/HeadersExchange.cpp b/cpp/src/qpid/broker/HeadersExchange.cpp index ea7fce4ff6..37864a02f6 100644 --- a/cpp/src/qpid/broker/HeadersExchange.cpp +++ b/cpp/src/qpid/broker/HeadersExchange.cpp @@ -76,6 +76,7 @@ class Matcher : public MapHandler { public: Matcher(const FieldTable& b) : binding(b), matched(0) {} + void handleBool(const MapHandler::CharSequence& key, bool value) { processUint(std::string(key.data, key.size), value); } void handleUint8(const MapHandler::CharSequence& key, uint8_t value) { processUint(std::string(key.data, key.size), value); } void handleUint16(const MapHandler::CharSequence& key, uint16_t value) { processUint(std::string(key.data, key.size), value); } void handleUint32(const MapHandler::CharSequence& key, uint32_t value) { processUint(std::string(key.data, key.size), value); } diff --git a/cpp/src/qpid/broker/MapHandler.h b/cpp/src/qpid/broker/MapHandler.h index 200eba4f7a..8f1acc76e1 100644 --- a/cpp/src/qpid/broker/MapHandler.h +++ b/cpp/src/qpid/broker/MapHandler.h @@ -39,6 +39,7 @@ class MapHandler virtual ~MapHandler() {} virtual void handleVoid(const CharSequence& key) = 0; + virtual void handleBool(const CharSequence& key, bool value) = 0; virtual void handleUint8(const CharSequence& key, uint8_t value) = 0; virtual void handleUint16(const CharSequence& key, uint16_t value) = 0; virtual void handleUint32(const CharSequence& key, uint32_t value) = 0; diff --git a/cpp/src/qpid/broker/Message.cpp b/cpp/src/qpid/broker/Message.cpp index 431f4291ff..d7072133c8 100644 --- a/cpp/src/qpid/broker/Message.cpp +++ b/cpp/src/qpid/broker/Message.cpp @@ -255,6 +255,7 @@ class PropertyRetriever : public MapHandler public: PropertyRetriever(const std::string& key) : name(key) {} void handleVoid(const CharSequence&) {} + void handleBool(const CharSequence& key, bool value) { handle(key, value); } void handleUint8(const CharSequence& key, uint8_t value) { handle(key, value); } void handleUint16(const CharSequence& key, uint16_t value) { handle(key, value); } void handleUint32(const CharSequence& key, uint32_t value) { handle(key, value); } diff --git a/cpp/src/qpid/broker/amqp_0_10/MessageTransfer.cpp b/cpp/src/qpid/broker/amqp_0_10/MessageTransfer.cpp index b78b69b2d6..d120d61eb1 100644 --- a/cpp/src/qpid/broker/amqp_0_10/MessageTransfer.cpp +++ b/cpp/src/qpid/broker/amqp_0_10/MessageTransfer.cpp @@ -19,6 +19,7 @@ * */ #include "MessageTransfer.h" +#include "qpid/amqp_0_10/Codecs.h" #include "qpid/broker/MapHandler.h" #include "qpid/broker/Message.h" #include "qpid/framing/MessageTransferBody.h" @@ -307,26 +308,46 @@ void MessageTransfer::processProperties(qpid::broker::MapHandler& handler) const if (mp && mp->hasApplicationHeaders()) { const FieldTable ft = mp->getApplicationHeaders(); for (FieldTable::const_iterator i = ft.begin(); i != ft.end(); ++i) { - qpid::broker::MapHandler::CharSequence key; - key.data = i->first.data(); - key.size = i->first.size(); - FieldTable::ValuePtr v = i->second; - //TODO: something more sophisticated... - if (v->empty()) { - handler.handleVoid(key); - } else if (v->convertsTo()) { - handler.handleUint64(key, v->get()); - } else if (v->convertsTo()) { - handler.handleInt64(key, v->get()); - } else if (v->convertsTo()) { - std::string s = v->get(); - qpid::broker::MapHandler::CharSequence value; - value.data = s.data(); - value.size = s.size(); - qpid::broker::MapHandler::CharSequence encoding; encoding.size = 0; encoding.data = 0; + qpid::types::Variant v; + qpid::amqp_0_10::translate(i->second, v); + qpid::broker::MapHandler::CharSequence key = {i->first.data(), i->first.size()}; + switch (v.getType()) { + case qpid::types::VAR_VOID: + handler.handleVoid(key); break; + case qpid::types::VAR_BOOL: + handler.handleBool(key, v); break; + case qpid::types::VAR_UINT8: + handler.handleUint8(key, v); break; + case qpid::types::VAR_UINT16: + handler.handleUint8(key, v); break; + case qpid::types::VAR_UINT32: + handler.handleUint32(key, v); break; + case qpid::types::VAR_UINT64: + handler.handleUint64(key, v); break; + case qpid::types::VAR_INT8: + handler.handleInt8(key, v); break; + case qpid::types::VAR_INT16: + handler.handleInt16(key, v); break; + case qpid::types::VAR_INT32: + handler.handleInt32(key, v); break; + case qpid::types::VAR_INT64: + handler.handleInt64(key, v); break; + case qpid::types::VAR_FLOAT: + handler.handleFloat(key, v); break; + case qpid::types::VAR_DOUBLE: + handler.handleDouble(key, v); break; + case qpid::types::VAR_STRING: { + std::string s(v); + qpid::broker::MapHandler::CharSequence value = {s.data(), s.size()}; + qpid::broker::MapHandler::CharSequence encoding = {0, 0}; handler.handleString(key, value, encoding); - } else { - QPID_LOG(debug, "Unhandled key!" << *v); + break; + } + case qpid::types::VAR_MAP: + case qpid::types::VAR_LIST: + case qpid::types::VAR_UUID: + QPID_LOG(debug, "Unhandled key!" << v); + break; } } } diff --git a/cpp/src/qpid/xml/XmlExchange.cpp b/cpp/src/qpid/xml/XmlExchange.cpp index f88acb04ee..a1b0c052d3 100644 --- a/cpp/src/qpid/xml/XmlExchange.cpp +++ b/cpp/src/qpid/xml/XmlExchange.cpp @@ -204,6 +204,7 @@ class DefineExternals : public MapHandler { public: DefineExternals(DynamicContext* c) : context(c) { assert(context); } + void handleBool(const MapHandler::CharSequence& key, bool value) { process(std::string(key.data, key.size), (int) value); } void handleUint8(const MapHandler::CharSequence& key, uint8_t value) { process(std::string(key.data, key.size), (int) value); } void handleUint16(const MapHandler::CharSequence& key, uint16_t value) { process(std::string(key.data, key.size), (int) value); } void handleUint32(const MapHandler::CharSequence& key, uint32_t value) { process(std::string(key.data, key.size), (int) value); } -- cgit v1.2.1