diff options
author | Alan Conway <aconway@apache.org> | 2007-11-22 23:55:39 +0000 |
---|---|---|
committer | Alan Conway <aconway@apache.org> | 2007-11-22 23:55:39 +0000 |
commit | cb070d9813e4232b4ec8409ca555b529ee5cee4b (patch) | |
tree | 7f8ed15de2c4f933db59b79b52222c70f2a2a240 /cpp/src/qpid/framing/AMQFrame.cpp | |
parent | 4d16c847bd0868ac8ff3039ce22fcdae28606aeb (diff) | |
download | qpid-python-cb070d9813e4232b4ec8409ca555b529ee5cee4b.tar.gz |
Added framing::BodyHolder:
- Uniform holder for all body types, replaces MethodHolder.
- Uses in_place constructors to avoid avoid body copy.
framing::AMQFrame:
- Holds body in heap-allocated intrusive_ptr<BodyHolder>
- Uses in_place constructors to avoid avoid body copy.
Removed/downgraded to TODO many redundant FIXME comments.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@597513 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/framing/AMQFrame.cpp')
-rw-r--r-- | cpp/src/qpid/framing/AMQFrame.cpp | 84 |
1 files changed, 20 insertions, 64 deletions
diff --git a/cpp/src/qpid/framing/AMQFrame.cpp b/cpp/src/qpid/framing/AMQFrame.cpp index 423af06173..3750f4a9a8 100644 --- a/cpp/src/qpid/framing/AMQFrame.cpp +++ b/cpp/src/qpid/framing/AMQFrame.cpp @@ -31,49 +31,16 @@ namespace qpid { namespace framing { -namespace { -struct GetBodyVisitor : public NoBlankVisitor<AMQBody*> { - QPID_USING_NOBLANK(AMQBody*); - AMQBody* operator()(MethodHolder& t) const { return t.get(); } - template <class T> AMQBody* operator()(T& t) const { return &t; } -}; - -struct EncodeVisitor : public NoBlankVisitor<void> { - Buffer& buffer; - EncodeVisitor(Buffer& b) : buffer(b) {} - - QPID_USING_NOBLANK(void); - template <class T> void operator()(const T& t) const { return t.encode(buffer); } -}; - -struct SizeVisitor : public NoBlankVisitor<uint32_t> { - QPID_USING_NOBLANK(uint32_t); - template <class T> uint32_t operator()(const T& t) const { return t.size(); } -}; - -struct DecodeVisitor : public NoBlankVisitor<void> { - Buffer& buffer; - uint32_t size; - DecodeVisitor(Buffer& b, uint32_t s) : buffer(b), size(s) {} - QPID_USING_NOBLANK(void); - void operator()(MethodHolder& t) const { return t.decode(buffer); } - template <class T> void operator()(T& t) const { return t.decode(buffer, size); } -}; +AMQFrame::~AMQFrame() {} -} +void AMQFrame::setBody(const AMQBody& b) { body = new BodyHolder(b); } -AMQBody* AMQFrame::getBody() { - return boost::apply_visitor(GetBodyVisitor(), body); -} - -const AMQBody* AMQFrame::getBody() const { - return boost::apply_visitor(GetBodyVisitor(), const_cast<Variant&>(body)); -} +void AMQFrame::setMethod(ClassId c, MethodId m) { body = new BodyHolder(c,m); } -// This is now misleadingly named as it is not the frame size as defined in the spec -// (as it also includes the end marker) -uint32_t AMQFrame::size() const{ - return frameOverhead() + boost::apply_visitor(SizeVisitor(), body); +// This is now misleadingly named as it is not the frame size as +// defined in the spec (as it also includes the end marker) +uint32_t AMQFrame::size() const { + return frameOverhead() + body->size(); } uint32_t AMQFrame::frameOverhead() { @@ -90,7 +57,7 @@ void AMQFrame::encode(Buffer& buffer) const buffer.putOctet(0x0f & subchannel); buffer.putShort(channel); buffer.putLong(0); - boost::apply_visitor(EncodeVisitor(buffer), body); + body->encode(buffer); buffer.putOctet(0xCE); } @@ -119,45 +86,34 @@ bool AMQFrame::decode(Buffer& buffer) (void) buffer.getLong(); // reserved2 // Verify that the protocol header meets current spec - // TODO: should we check reserved2 against zero as well? - the spec isn't clear + // TODO: should we check reserved2 against zero as well? - the + // spec isn't clear if ((flags & 0x30) != 0 || reserved1 != 0 || (field1 & 0xf0) != 0) throw SyntaxErrorException(QPID_MSG("Reserved bits not zero")); - // TODO: should no longer care about body size and only pass up B,E,b,e flags + // TODO: should no longer care about body size and only pass up + // B,E,b,e flags uint16_t body_size = frame_size + 1 - frameOverhead(); if (buffer.available() < body_size+1u){ buffer.restore(); return false; } - decodeBody(buffer, body_size, type); - + body = new BodyHolder(); + body->decode(type,buffer, body_size); uint8_t end = buffer.getOctet(); if (end != 0xCE) throw SyntaxErrorException(QPID_MSG("Frame end not found")); return true; } -void AMQFrame::decodeBody(Buffer& buffer, uint32_t size, uint8_t type) -{ - switch(type) - { - case METHOD_BODY: body = MethodHolder(); break; - case HEADER_BODY: body = AMQHeaderBody(); break; - case CONTENT_BODY: body = AMQContentBody(); break; - case HEARTBEAT_BODY: body = AMQHeartbeatBody(); break; - - default: - throw SyntaxErrorException(QPID_MSG("Invalid frame type " << type)); - } - boost::apply_visitor(DecodeVisitor(buffer,size), body); -} - std::ostream& operator<<(std::ostream& out, const AMQFrame& f) { - return out << "Frame[" - << (f.getBof() ? "B" : "") << (f.getEof() ? "E" : "") << (f.getBos() ? "b" : "") << (f.getEos() ? "e" : "") << "; " - << "channel=" << f.getChannel() << "; " << *f.getBody() - << "]"; + return + out << "Frame[" + << (f.getBof() ? "B" : "") << (f.getEof() ? "E" : "") + << (f.getBos() ? "b" : "") << (f.getEos() ? "e" : "") << "; " + << "channel=" << f.getChannel() << "; " << *f.getBody() + << "]"; } |