From 272c237345b2804c6f5fd3eafdfae6879208a1ea Mon Sep 17 00:00:00 2001 From: Gordon Sim Date: Tue, 4 Jun 2013 17:05:38 +0000 Subject: QPID-4707: Set AMQP 1.0 fields on outgoing messages based on special property keys git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1489519 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/amqp/MessageEncoder.cpp | 69 +++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 17 deletions(-) (limited to 'cpp/src/qpid/amqp/MessageEncoder.cpp') diff --git a/cpp/src/qpid/amqp/MessageEncoder.cpp b/cpp/src/qpid/amqp/MessageEncoder.cpp index 852ad29635..3b493d1de7 100644 --- a/cpp/src/qpid/amqp/MessageEncoder.cpp +++ b/cpp/src/qpid/amqp/MessageEncoder.cpp @@ -19,8 +19,11 @@ * */ #include "qpid/amqp/MessageEncoder.h" +#include "qpid/amqp/MapEncoder.h" +#include "qpid/amqp/MapSizeCalculator.h" #include "qpid/amqp/descriptors.h" #include "qpid/log/Statement.h" +#include namespace qpid { namespace amqp { @@ -132,6 +135,17 @@ void MessageEncoder::writeProperties(const Properties& msg) } } +void MessageEncoder::writeApplicationProperties(const ApplicationProperties& properties) +{ + MapSizeCalculator calc; + properties.handle(calc); + size_t required = calc.getTotalSizeRequired(&qpid::amqp::message::APPLICATION_PROPERTIES); + assert(required <= getSize() - getPosition()); + MapEncoder encoder(skip(required), required); + encoder.writeMetaData(calc.getSize(), calc.getCount()*2, &qpid::amqp::message::APPLICATION_PROPERTIES); + properties.handle(encoder); +} + void MessageEncoder::writeApplicationProperties(const qpid::types::Variant::Map& properties) { writeApplicationProperties(properties, !optimise || properties.size()*2 > 255 || getEncodedSizeForElements(properties) > 255); @@ -205,27 +219,48 @@ void MessageEncoder::writeMap(const qpid::types::Variant::Map& properties, const } size_t MessageEncoder::getEncodedSize(const Header& h, const Properties& p, const qpid::types::Variant::Map& ap, const std::string& d) +{ + return getEncodedSize(h) + getEncodedSize(p, ap, d); +} + +size_t MessageEncoder::getEncodedSize(const Header& h, const Properties& p, const ApplicationProperties& ap, const std::string& d) +{ + return getEncodedSize(h) + getEncodedSize(p) + getEncodedSize(ap) + getEncodedSizeForContent(d); +} + +size_t MessageEncoder::getEncodedSize(const Properties& p, const qpid::types::Variant::Map& ap, const std::string& d) +{ + size_t total(getEncodedSize(p)); + //application-properties: + total += 3/*descriptor*/ + getEncodedSize(ap, true); + //body: + if (d.size()) total += 3/*descriptor*/ + 1/*code*/ + encodedSize(d); + + return total; +} + +size_t MessageEncoder::getEncodedSizeForContent(const std::string& d) +{ + if (d.size()) return 3/*descriptor*/ + 1/*code*/ + encodedSize(d); + else return 0; +} + +size_t MessageEncoder::getEncodedSize(const Header& h) { //NOTE: this does not take optional optimisation into account, //i.e. it is a 'worst case' estimate for required buffer space - size_t total(0); - - //header: - total += 3/*descriptor*/ + 1/*code*/ + 1/*size*/ + 1/*count*/ + 5/*codes for each field*/; + size_t total(3/*descriptor*/ + 1/*code*/ + 1/*size*/ + 1/*count*/ + 5/*codes for each field*/); if (h.getPriority() != 4) total += 1; if (h.getDeliveryCount()) total += 4; if (h.hasTtl()) total += 4; - return total + getEncodedSize(p, ap, d); + return total; } -size_t MessageEncoder::getEncodedSize(const Properties& p, const qpid::types::Variant::Map& ap, const std::string& d) +size_t MessageEncoder::getEncodedSize(const Properties& p) { //NOTE: this does not take optional optimisation into account, //i.e. it is a 'worst case' estimate for required buffer space - size_t total(0); - - //properties: - total += 3/*descriptor*/ + 1/*code*/ + 4/*size*/ + 4/*count*/ + 13/*codes for each field*/; + size_t total(3/*descriptor*/ + 1/*code*/ + 4/*size*/ + 4/*count*/ + 13/*codes for each field*/); if (p.hasMessageId()) total += encodedSize(p.getMessageId()); if (p.hasUserId()) total += encodedSize(p.getUserId()); if (p.hasTo()) total += encodedSize(p.getTo()); @@ -239,16 +274,16 @@ size_t MessageEncoder::getEncodedSize(const Properties& p, const qpid::types::Va if (p.hasGroupId()) total += encodedSize(p.getGroupId()); if (p.hasGroupSequence()) total += 4; if (p.hasReplyToGroupId()) total += encodedSize(p.getReplyToGroupId()); - - - //application-properties: - total += 3/*descriptor*/ + getEncodedSize(ap, true); - //body: - if (d.size()) total += 3/*descriptor*/ + 1/*code*/ + encodedSize(d); - return total; } +size_t MessageEncoder::getEncodedSize(const ApplicationProperties& p) +{ + MapSizeCalculator calc; + p.handle(calc); + return calc.getTotalSizeRequired(&qpid::amqp::message::APPLICATION_PROPERTIES); +} + size_t MessageEncoder::getEncodedSizeForElements(const qpid::types::Variant::Map& map) { size_t total = 0; -- cgit v1.2.1