diff options
author | Gordon Sim <gsim@apache.org> | 2010-03-31 16:17:17 +0000 |
---|---|---|
committer | Gordon Sim <gsim@apache.org> | 2010-03-31 16:17:17 +0000 |
commit | f6f1900eb98cc1773a88a3ec309afa646438a384 (patch) | |
tree | 68e50e7aa1819afd283d73700965b539355a779d /cpp/src/qpid/messaging/Message.cpp | |
parent | 887281838e4bf7825189ce3b0a8d7509789e6a08 (diff) | |
download | qpid-python-f6f1900eb98cc1773a88a3ec309afa646438a384.tar.gz |
QPID-664: made changes suggested by Alan Conway, also moved 0-10 map/list codecs to common lib
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@929606 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/messaging/Message.cpp')
-rw-r--r-- | cpp/src/qpid/messaging/Message.cpp | 71 |
1 files changed, 64 insertions, 7 deletions
diff --git a/cpp/src/qpid/messaging/Message.cpp b/cpp/src/qpid/messaging/Message.cpp index 84245b7296..bbbb257b18 100644 --- a/cpp/src/qpid/messaging/Message.cpp +++ b/cpp/src/qpid/messaging/Message.cpp @@ -20,6 +20,8 @@ */ #include "qpid/messaging/Message.h" #include "qpid/messaging/MessageImpl.h" +#include "qpid/amqp_0_10/Codecs.h" +#include <boost/format.hpp> namespace qpid { namespace messaging { @@ -64,18 +66,73 @@ bool Message::getDurable() const { return impl->durable; } bool Message::getRedelivered() const { return impl->redelivered; } void Message::setRedelivered(bool redelivered) { impl->redelivered = redelivered; } -const VariantMap& Message::getProperties() const { return impl->getHeaders(); } -VariantMap& Message::getProperties() { return impl->getHeaders(); } +const Variant::Map& Message::getProperties() const { return impl->getHeaders(); } +Variant::Map& Message::getProperties() { return impl->getHeaders(); } void Message::setContent(const std::string& c) { impl->setBytes(c); } void Message::setContent(const char* chars, size_t count) { impl->setBytes(chars, count); } -const std::string& Message::getContent() const { return impl->getBytes(); } -std::string& Message::getContent() { return impl->getBytes(); } +std::string Message::getContent() const { return impl->getBytes(); } -void Message::getContent(std::pair<const char*, size_t>& content) const +const char* Message::getContentPtr() const { - content.first = impl->getBytes().data(); - content.second = impl->getBytes().size(); + return impl->getBytes().data(); +} + +size_t Message::getContentSize() const +{ + return impl->getBytes().size(); +} + + +EncodingException::EncodingException(const std::string& msg) : qpid::Exception(msg) {} + +const std::string BAD_ENCODING("Unsupported encoding: %1% (only %2% is supported at present)."); + +bool checkEncoding(const std::string& requested, const std::string& supported) +{ + if (requested.size()) { + if (requested == supported) return true; + else throw EncodingException((boost::format(BAD_ENCODING) % requested % supported).str()); + } else { + return false; + } +} + +/* + * Currently only support a single encoding type for both list and + * map, based on AMQP 0-10, though wider support is anticipated in the + * future. This method simply checks that the desired encoding (if one + * is specified, either through the message-content or through an + * override) is indeed supported. + */ +void checkEncoding(const Message& message, const std::string& requested, const std::string& supported) +{ + checkEncoding(requested, supported) || checkEncoding(message.getContentType(), supported); +} + +void decode(const Message& message, Variant::Map& map, const std::string& encoding) +{ + checkEncoding(message, encoding, qpid::amqp_0_10::MapCodec::contentType); + qpid::amqp_0_10::MapCodec::decode(message.getContent(), map); +} +void decode(const Message& message, Variant::List& list, const std::string& encoding) +{ + checkEncoding(message, encoding, qpid::amqp_0_10::ListCodec::contentType); + qpid::amqp_0_10::ListCodec::decode(message.getContent(), list); +} +void encode(const Variant::Map& map, Message& message, const std::string& encoding) +{ + checkEncoding(message, encoding, qpid::amqp_0_10::MapCodec::contentType); + std::string content; + qpid::amqp_0_10::MapCodec::encode(map, content); + message.setContent(content); +} +void encode(const Variant::List& list, Message& message, const std::string& encoding) +{ + checkEncoding(message, encoding, qpid::amqp_0_10::ListCodec::contentType); + std::string content; + qpid::amqp_0_10::ListCodec::encode(list, content); + message.setContent(content); } }} // namespace qpid::messaging |