diff options
author | Gordon Sim <gsim@apache.org> | 2006-11-09 10:40:56 +0000 |
---|---|---|
committer | Gordon Sim <gsim@apache.org> | 2006-11-09 10:40:56 +0000 |
commit | 72a71413f25916caea6345b956d859d16eb0d3e3 (patch) | |
tree | eb6b07b802f64f9cd8f815270f7596e01cfd9244 /cpp/src/qpid/broker/Message.cpp | |
parent | 3183bdd1eeec30d40229bc7394e49cb2bccb9526 (diff) | |
download | qpid-python-72a71413f25916caea6345b956d859d16eb0d3e3.tar.gz |
Added some encode/decode routines to Message (plus test).
Altered Buffer to allow memory for data to be specified on construction.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@472850 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/broker/Message.cpp')
-rw-r--r-- | cpp/src/qpid/broker/Message.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/cpp/src/qpid/broker/Message.cpp b/cpp/src/qpid/broker/Message.cpp index e3a98ae8f5..112e8dd77d 100644 --- a/cpp/src/qpid/broker/Message.cpp +++ b/cpp/src/qpid/broker/Message.cpp @@ -33,6 +33,24 @@ Message::Message(const ConnectionToken* const _publisher, size(0), persistenceId(0) {} +Message::Message(Buffer& buffer) : publisher(0), mandatory(false), immediate(false), redelivered(false), size(0), persistenceId(0){ + buffer.getShortString(exchange); + buffer.getShortString(routingKey); + + AMQFrame headerFrame; + headerFrame.decode(buffer); + AMQHeaderBody::shared_ptr headerBody = dynamic_pointer_cast<AMQHeaderBody, AMQBody>(headerFrame.getBody()); + setHeader(headerBody); + + AMQContentBody::shared_ptr contentBody; + while (buffer.available()) { + AMQFrame contentFrame; + contentFrame.decode(buffer); + contentBody = dynamic_pointer_cast<AMQContentBody, AMQBody>(contentFrame.getBody()); + addContent(contentBody); + } +} + Message::~Message(){} void Message::setHeader(AMQHeaderBody::shared_ptr _header){ @@ -97,3 +115,35 @@ bool Message::isPersistent() BasicHeaderProperties* props = getHeaderProperties(); return props && props->getDeliveryMode() == PERSISTENT; } + +void Message::encode(Buffer& buffer) +{ + buffer.putShortString(exchange); + buffer.putShortString(routingKey); + + AMQBody::shared_ptr body; + + body = static_pointer_cast<AMQBody, AMQHeaderBody>(header); + + AMQFrame headerFrame(0, body); + headerFrame.encode(buffer); + + for (content_iterator i = content.begin(); i != content.end(); i++) { + body = static_pointer_cast<AMQBody, AMQContentBody>(*i); + AMQFrame contentFrame(0, body); + contentFrame.encode(buffer); + } +} + +u_int32_t Message::encodedSize() +{ + int encodedContentSize(0); + for (content_iterator i = content.begin(); i != content.end(); i++) { + encodedContentSize += (*i)->size() + 8;//8 extra bytes for the frame (TODO, could replace frame by simple size) + } + + return exchange.size() + 1 + + routingKey.size() + 1 + + header->size() + 8 //8 extra bytes for frame (TODO, could actually remove the frame) + + encodedContentSize; +} |