summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/qpid/framing/AMQFrame.cpp18
-rw-r--r--cpp/src/qpid/framing/FieldTable.cpp8
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);