Author: gsim
Date: Wed Apr 30 07:16:38 2008
New Revision: 652386

URL: http://svn.apache.org/viewvc?rev=652386&view=rev
Log:
QPID-988 and QPID-989: fixes to framing for final 0-10 spec

Modified:
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.cpp
    
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractDecoder.java
    
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractEncoder.java
    
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/InputHandler.java
    
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/OutputHandler.java
    incubator/qpid/trunk/qpid/python/qpid/codec010.py
    incubator/qpid/trunk/qpid/python/qpid/framer.py

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.cpp?rev=652386&r1=652385&r2=652386&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.cpp Wed Apr 30 
07:16:38 2008
@@ -37,14 +37,12 @@
 
 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 @@
     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 @@
     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 @@
 
     // 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;
 }
 

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.cpp?rev=652386&r1=652385&r2=652386&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.cpp Wed Apr 30 
07:16:38 2008
@@ -31,7 +31,7 @@
 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 @@
 //    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::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);
 

Modified: 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractDecoder.java
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractDecoder.java?rev=652386&r1=652385&r2=652386&view=diff
==============================================================================
--- 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractDecoder.java
 (original)
+++ 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractDecoder.java
 Wed Apr 30 07:16:38 2008
@@ -272,6 +272,7 @@
     {
         long size = readUint32();
         int start = count;
+        long fieldCount = readUint32();
         Map<String,Object> result = new LinkedHashMap();
         while (count < start + size)
         {

Modified: 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractEncoder.java
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractEncoder.java?rev=652386&r1=652385&r2=652386&view=diff
==============================================================================
--- 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractEncoder.java
 (original)
+++ 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractEncoder.java
 Wed Apr 30 07:16:38 2008
@@ -383,6 +383,7 @@
         sizer.writeMap(map);
         // XXX: - 4
         writeUint32(sizer.size() - 4);
+        writeUint32(map.size());
         writeMapEntries(map);
     }
 

Modified: 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/InputHandler.java
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/InputHandler.java?rev=652386&r1=652385&r2=652386&view=diff
==============================================================================
--- 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/InputHandler.java
 (original)
+++ 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/InputHandler.java
 Wed Apr 30 07:16:38 2008
@@ -218,7 +218,7 @@
                 return FRAME_END;
             }
         case FRAME_END:
-            return expect(buf, OutputHandler.FRAME_END, FRAME_HDR);
+            return FRAME_HDR;
         default:
             throw new IllegalStateException();
         }

Modified: 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/OutputHandler.java
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/OutputHandler.java?rev=652386&r1=652385&r2=652386&view=diff
==============================================================================
--- 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/OutputHandler.java
 (original)
+++ 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/OutputHandler.java
 Wed Apr 30 07:16:38 2008
@@ -86,7 +86,6 @@
         {
             hdr.put(buf);
         }
-        hdr.put((byte) FRAME_END);
         hdr.flip();
         synchronized (lock)
         {

Modified: incubator/qpid/trunk/qpid/python/qpid/codec010.py
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/python/qpid/codec010.py?rev=652386&r1=652385&r2=652386&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/python/qpid/codec010.py (original)
+++ incubator/qpid/trunk/qpid/python/qpid/codec010.py Wed Apr 30 07:16:38 2008
@@ -156,6 +156,7 @@
 
   def write_map(self, m):
     sc = StringCodec(self.spec)
+    sc.write_uint32(len(m))
     for k, v in m.items():
       type = self.spec.encoding(v.__class__)
       if type == None:
@@ -163,10 +164,10 @@
       sc.write_str8(k)
       sc.write_uint8(type.code)
       type.encode(sc, v)
-    # XXX: need to put in count when CPP supports it
     self.write_vbin32(sc.encoded)
   def read_map(self):
     sc = StringCodec(self.spec, self.read_vbin32())
+    count = sc.read_uint32()
     result = {}
     while sc.encoded:
       k = sc.read_str8()

Modified: incubator/qpid/trunk/qpid/python/qpid/framer.py
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/python/qpid/framer.py?rev=652386&r1=652385&r2=652386&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/python/qpid/framer.py (original)
+++ incubator/qpid/trunk/qpid/python/qpid/framer.py Wed Apr 30 07:16:38 2008
@@ -131,8 +131,6 @@
       track = frame.track & 0x0F
       self.pack(Frame.HEADER, frame.flags, frame.type, size, track, 
frame.channel)
       self.write(frame.payload)
-      # XXX: NOT 0-10 FINAL, TEMPORARY WORKAROUND for C++
-      self.write("\xCE")
       frm.debug("SENT %s", frame)
     finally:
       self.sock_lock.release()
@@ -141,10 +139,6 @@
     flags, type, size, track, channel = self.unpack(Frame.HEADER)
     if flags & 0xF0: raise FramingError()
     payload = self.read(size - struct.calcsize(Frame.HEADER))
-    # XXX: NOT 0-10 FINAL, TEMPORARY WORKAROUND for C++
-    end = self.read(1)
-    if end != "\xCE":
-      raise FramingError()
     frame = Frame(flags, type, track, channel, payload)
     frm.debug("RECV %s", frame)
     return frame


Reply via email to