diff options
Diffstat (limited to 'cpp/src/qpid/framing/AMQHeaderBody.cpp')
-rw-r--r-- | cpp/src/qpid/framing/AMQHeaderBody.cpp | 68 |
1 files changed, 48 insertions, 20 deletions
diff --git a/cpp/src/qpid/framing/AMQHeaderBody.cpp b/cpp/src/qpid/framing/AMQHeaderBody.cpp index 6a3c8f27d1..7083709fde 100644 --- a/cpp/src/qpid/framing/AMQHeaderBody.cpp +++ b/cpp/src/qpid/framing/AMQHeaderBody.cpp @@ -19,37 +19,65 @@ * */ #include "AMQHeaderBody.h" -#include "qpid/QpidError.h" -#include "BasicHeaderProperties.h" +#include "qpid/Exception.h" +#include "qpid/log/Statement.h" -qpid::framing::AMQHeaderBody::AMQHeaderBody(int) : weight(0), contentSize(0) {} +qpid::framing::AMQHeaderBody::AMQHeaderBody() {} -qpid::framing::AMQHeaderBody::AMQHeaderBody() : weight(0), contentSize(0){} - -qpid::framing::AMQHeaderBody::~AMQHeaderBody(){} +qpid::framing::AMQHeaderBody::~AMQHeaderBody() {} uint32_t qpid::framing::AMQHeaderBody::size() const{ - return 12 + properties.size(); + CalculateSize visitor; + for_each(properties.begin(), properties.end(), boost::apply_visitor(visitor)); + return visitor.totalSize() + (properties.size() * (2/*type codes*/ + 4/*size*/)); } void qpid::framing::AMQHeaderBody::encode(Buffer& buffer) const { - buffer.putShort(properties.classId()); - buffer.putShort(weight); - buffer.putLongLong(contentSize); - properties.encode(buffer); + Encode visitor(buffer); + for_each(properties.begin(), properties.end(), boost::apply_visitor(visitor)); +} + +void qpid::framing::AMQHeaderBody::decode(Buffer& buffer, uint32_t size){ + uint32_t limit = buffer.available() - size; + while (buffer.available() > limit + 2) { + uint32_t len = buffer.getLong(); + uint16_t type = buffer.getShort(); + //The following switch could be generated as the number of options increases: + switch(type) { + case BasicHeaderProperties::TYPE: + decode(BasicHeaderProperties(), buffer, len - 2); + break; + case MessageProperties::TYPE: + decode(MessageProperties(), buffer, len - 2); + break; + case DeliveryProperties::TYPE: + decode(DeliveryProperties(), buffer, len - 2); + break; + default: + //TODO: should just skip over them keeping them for later dispatch as is + throw Exception(QPID_MSG("Unexpected property type: " << type)); + } + } } -void qpid::framing::AMQHeaderBody::decode(Buffer& buffer, uint32_t bufSize){ - buffer.getShort(); // Ignore classId - weight = buffer.getShort(); - contentSize = buffer.getLongLong(); - properties.decode(buffer, bufSize - 12); +uint64_t qpid::framing::AMQHeaderBody::getContentLength() const +{ + const MessageProperties* mProps = get<MessageProperties>(); + if (mProps) { + return mProps->getContentLength(); + } + const BasicHeaderProperties* bProps = get<BasicHeaderProperties>(); + if (bProps) { + return bProps->getContentLength(); + } + return 0; } void qpid::framing::AMQHeaderBody::print(std::ostream& out) const { - out << "header (" << size() << " bytes)" << " content_size=" << getContentSize(); - out << ", message_id=" << properties.getMessageId(); - out << ", delivery_mode=" << (int) properties.getDeliveryMode(); - out << ", headers=" << properties.getHeaders(); + out << "header (" << size() << " bytes)"; + out << "; properties={"; + Print visitor(out); + for_each(properties.begin(), properties.end(), boost::apply_visitor(visitor)); + out << "}"; } |