diff options
| author | Andrew Stitcher <astitcher@apache.org> | 2013-03-08 15:55:45 +0000 |
|---|---|---|
| committer | Andrew Stitcher <astitcher@apache.org> | 2013-03-08 15:55:45 +0000 |
| commit | 343e2137c01054057ababcd611d6a5078ed455d8 (patch) | |
| tree | be766085bdaeb3c22211021510a279e2def3d0e8 /cpp | |
| parent | 5f3a2ed1d6d92b3f4f85472c8b88a462b6cc649b (diff) | |
| download | qpid-python-343e2137c01054057ababcd611d6a5078ed455d8.tar.gz | |
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
Diffstat (limited to 'cpp')
| -rw-r--r-- | cpp/src/qpid/broker/HeadersExchange.cpp | 1 | ||||
| -rw-r--r-- | cpp/src/qpid/broker/MapHandler.h | 1 | ||||
| -rw-r--r-- | cpp/src/qpid/broker/Message.cpp | 1 | ||||
| -rw-r--r-- | cpp/src/qpid/broker/amqp_0_10/MessageTransfer.cpp | 59 | ||||
| -rw-r--r-- | cpp/src/qpid/xml/XmlExchange.cpp | 1 |
5 files changed, 44 insertions, 19 deletions
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<uint64_t>()) { - handler.handleUint64(key, v->get<uint64_t>()); - } else if (v->convertsTo<int64_t>()) { - handler.handleInt64(key, v->get<int64_t>()); - } else if (v->convertsTo<std::string>()) { - std::string s = v->get<std::string>(); - 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); } |
