summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorAndrew Stitcher <astitcher@apache.org>2013-03-08 15:55:45 +0000
committerAndrew Stitcher <astitcher@apache.org>2013-03-08 15:55:45 +0000
commit343e2137c01054057ababcd611d6a5078ed455d8 (patch)
treebe766085bdaeb3c22211021510a279e2def3d0e8 /cpp
parent5f3a2ed1d6d92b3f4f85472c8b88a462b6cc649b (diff)
downloadqpid-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.cpp1
-rw-r--r--cpp/src/qpid/broker/MapHandler.h1
-rw-r--r--cpp/src/qpid/broker/Message.cpp1
-rw-r--r--cpp/src/qpid/broker/amqp_0_10/MessageTransfer.cpp59
-rw-r--r--cpp/src/qpid/xml/XmlExchange.cpp1
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); }