summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/messaging/Message.cpp
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2010-03-31 16:17:17 +0000
committerGordon Sim <gsim@apache.org>2010-03-31 16:17:17 +0000
commitf6f1900eb98cc1773a88a3ec309afa646438a384 (patch)
tree68e50e7aa1819afd283d73700965b539355a779d /cpp/src/qpid/messaging/Message.cpp
parent887281838e4bf7825189ce3b0a8d7509789e6a08 (diff)
downloadqpid-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.cpp71
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