diff options
author | Gordon Sim <gsim@apache.org> | 2007-08-28 19:38:17 +0000 |
---|---|---|
committer | Gordon Sim <gsim@apache.org> | 2007-08-28 19:38:17 +0000 |
commit | 9e10f4ea3b2f8ab6650f635cada48e4735ca20d7 (patch) | |
tree | 26ad3b8dffa17fa665fe7a033a7c8092839df011 /cpp/src/qpid/framing/AMQHeaderBody.cpp | |
parent | 6b09696b216c090b512c6af92bf7976ae3407add (diff) | |
download | qpid-python-9e10f4ea3b2f8ab6650f635cada48e4735ca20d7.tar.gz |
Updated message.transfer encoding to use header and content segments (including new structs).
Unified more between the basic and message classes messages.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@570538 13f79535-47bb-0310-9956-ffa450edef68
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 << "}"; } |