diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/qpid/framing/AMQFrame.cpp | 18 | ||||
-rw-r--r-- | cpp/src/qpid/framing/FieldTable.cpp | 8 |
2 files changed, 11 insertions, 15 deletions
diff --git a/cpp/src/qpid/framing/AMQFrame.cpp b/cpp/src/qpid/framing/AMQFrame.cpp index 3ebb61feb5..d861251dba 100644 --- a/cpp/src/qpid/framing/AMQFrame.cpp +++ b/cpp/src/qpid/framing/AMQFrame.cpp @@ -37,14 +37,12 @@ void AMQFrame::setBody(const AMQBody& b) { body = new BodyHolder(b); } 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() + body->size(); } uint32_t AMQFrame::frameOverhead() { - return 12 /*frame header*/ + 1/*0xCE*/; + return 12 /*frame header*/; } void AMQFrame::encode(Buffer& buffer) const @@ -55,18 +53,17 @@ void AMQFrame::encode(Buffer& buffer) const uint8_t flags = (bof ? 0x08 : 0) | (eof ? 0x04 : 0) | (bos ? 0x02 : 0) | (eos ? 0x01 : 0); buffer.putOctet(flags); buffer.putOctet(getBody()->type()); - buffer.putShort(size() - 1); // Don't include end marker (it's not part of the frame itself) + buffer.putShort(size()); buffer.putOctet(0); buffer.putOctet(0x0f & track); buffer.putShort(channel); buffer.putLong(0); body->encode(buffer); - buffer.putOctet(0xCE); } bool AMQFrame::decode(Buffer& buffer) { - if(buffer.available() < frameOverhead() - 1) + if(buffer.available() < frameOverhead()) return false; buffer.record(); @@ -80,7 +77,7 @@ bool AMQFrame::decode(Buffer& buffer) eos = flags & 0x01; uint8_t type = buffer.getOctet(); uint16_t frame_size = buffer.getShort(); - if (frame_size < frameOverhead()-1) + if (frame_size < frameOverhead()) throw FramingErrorException(QPID_MSG("Frame size too small")); uint8_t reserved1 = buffer.getOctet(); uint8_t field1 = buffer.getOctet(); @@ -96,16 +93,13 @@ bool AMQFrame::decode(Buffer& buffer) // 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){ + uint16_t body_size = frame_size - frameOverhead(); + if (buffer.available() < body_size){ buffer.restore(); return false; } body = new BodyHolder(); body->decode(type,buffer, body_size); - uint8_t end = buffer.getOctet(); - if (end != 0xCE) - throw FramingErrorException(QPID_MSG("Frame end not found")); return true; } diff --git a/cpp/src/qpid/framing/FieldTable.cpp b/cpp/src/qpid/framing/FieldTable.cpp index 903c7ed100..1f8ffa72bc 100644 --- a/cpp/src/qpid/framing/FieldTable.cpp +++ b/cpp/src/qpid/framing/FieldTable.cpp @@ -31,7 +31,7 @@ namespace framing { FieldTable::~FieldTable() {} uint32_t FieldTable::size() const { - uint32_t len(4); + uint32_t len(4/*size field*/ + 4/*count field*/); for(ValueMap::const_iterator i = values.begin(); i != values.end(); ++i) { // shortstr_len_byte + key size + value size len += 1 + (i->first).size() + (i->second)->size(); @@ -121,8 +121,9 @@ int FieldTable::getInt(const std::string& name) const { // value = getValue<FieldTable>(name); //} -void FieldTable::encode(Buffer& buffer) const{ +void FieldTable::encode(Buffer& buffer) const{ buffer.putLong(size() - 4); + buffer.putLong(values.size()); for (ValueMap::const_iterator i = values.begin(); i!=values.end(); ++i) { buffer.putShortString(i->first); i->second->encode(buffer); @@ -132,10 +133,11 @@ void FieldTable::encode(Buffer& buffer) const{ void FieldTable::decode(Buffer& buffer){ uint32_t len = buffer.getLong(); uint32_t available = buffer.available(); + uint32_t count = buffer.getLong(); if (available < len) throw IllegalArgumentException(QPID_MSG("Not enough data for field table.")); uint32_t leftover = available - len; - while(buffer.available() > leftover){ + while(buffer.available() > leftover && count--){ std::string name; ValuePtr value(new FieldValue); |