summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/amqp/MessageEncoder.cpp
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2013-06-04 17:05:38 +0000
committerGordon Sim <gsim@apache.org>2013-06-04 17:05:38 +0000
commit272c237345b2804c6f5fd3eafdfae6879208a1ea (patch)
tree212d3c21ba7bc9b14dfcab9bc422e5da0dfb9494 /cpp/src/qpid/amqp/MessageEncoder.cpp
parent42cdb01aadb1c17aa786edbf24f6a046a0844857 (diff)
downloadqpid-python-272c237345b2804c6f5fd3eafdfae6879208a1ea.tar.gz
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
Diffstat (limited to 'cpp/src/qpid/amqp/MessageEncoder.cpp')
-rw-r--r--cpp/src/qpid/amqp/MessageEncoder.cpp69
1 files changed, 52 insertions, 17 deletions
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 <assert.h>
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);
@@ -206,26 +220,47 @@ 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;