summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/broker/Message.cpp
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2006-11-09 10:40:56 +0000
committerGordon Sim <gsim@apache.org>2006-11-09 10:40:56 +0000
commit72a71413f25916caea6345b956d859d16eb0d3e3 (patch)
treeeb6b07b802f64f9cd8f815270f7596e01cfd9244 /cpp/src/qpid/broker/Message.cpp
parent3183bdd1eeec30d40229bc7394e49cb2bccb9526 (diff)
downloadqpid-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.cpp50
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;
+}