Author: aconway
Date: Tue Apr 15 11:23:55 2008
New Revision: 648362

URL: http://svn.apache.org/viewvc?rev=648362&view=rev
Log:

Correct Struct32 encoding: size/code/data.
Proper re-encoding for unknown struct codes.

Added:
    incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/Struct32.h   (with props)
Modified:
    incubator/qpid/trunk/qpid/cpp/rubygen/0-10/specification.rb
    incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/UnknownStruct.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/UnknownStruct.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/built_in_types.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/complex_types.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/complex_types.h
    incubator/qpid/trunk/qpid/cpp/src/tests/amqp_0_10/serialize.cpp

Modified: incubator/qpid/trunk/qpid/cpp/rubygen/0-10/specification.rb
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/rubygen/0-10/specification.rb?rev=648362&r1=648361&r2=648362&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/rubygen/0-10/specification.rb (original)
+++ incubator/qpid/trunk/qpid/cpp/rubygen/0-10/specification.rb Tue Apr 15 
11:23:55 2008
@@ -159,7 +159,7 @@
   end
 
   # Generate struct definitions into a separate header file so the
-  # can be included by Struct32.h without circularity.
+  # can be included by StructHolder.h without circularity.
   def gen_structs()
     h_file("[EMAIL PROTECTED]/structs") { 
       include "[EMAIL PROTECTED]/specification_fwd"
@@ -177,7 +177,7 @@
     
     cpp_file("[EMAIL PROTECTED]/structs") { 
       include "[EMAIL PROTECTED]/structs"
-      include "[EMAIL PROTECTED]/Struct32"
+      include "[EMAIL PROTECTED]/StructHolder"
       namespace(@ns) {
         each_class_ns { |c|
           c.collect_all(AmqpStruct).each {  |s| struct_cpp(s) }
@@ -283,7 +283,7 @@
   end
 
   def gen_holder(base, subs)
-    name= (base=="Struct") ? "Struct32" : base+"Holder"
+    name=base+"Holder"
     h_file("[EMAIL PROTECTED]/#{name}") {
       include "[EMAIL PROTECTED]/Apply#{base}"
       include "[EMAIL PROTECTED]/Holder"

Added: incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/Struct32.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/Struct32.h?rev=648362&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/Struct32.h (added)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/Struct32.h Tue Apr 15 
11:23:55 2008
@@ -0,0 +1,60 @@
+#ifndef QPID_AMQP_0_10_STRUCT32_H
+#define QPID_AMQP_0_10_STRUCT32_H
+
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+#include "qpid/amqp_0_10/StructHolder.h"
+
+namespace qpid {
+namespace amqp_0_10 {
+
+class Struct32 : public StructHolder
+{
+  public:
+    Struct32() {}
+
+    template <class T> explicit Struct32(const T& t) : StructHolder(t) {}
+    
+    template <class S> void serialize(S& s) {
+        s.split(*this);
+        StructHolder::serialize(s);
+    }
+
+    template <class S> void encode(S& s) const {
+        s(contentSize());
+    }
+    
+    template <class S> void decode(S& s) {
+        uint32_t contentSz;
+        s(contentSz);
+        s.setLimit(contentSz);
+    }
+    
+  private:
+    uint32_t contentSize() const {
+        return Codec::size(static_cast<const StructHolder&>(*this));
+    }
+        
+};
+}} // namespace qpid::amqp_0_10
+
+#endif  /*!QPID_AMQP_0_10_STRUCT32_H*/

Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/Struct32.h
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/Struct32.h
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/UnknownStruct.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/UnknownStruct.cpp?rev=648362&r1=648361&r2=648362&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/UnknownStruct.cpp 
(original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/UnknownStruct.cpp Tue Apr 
15 11:23:55 2008
@@ -28,7 +28,7 @@
 void UnknownStruct::accept(Visitor& v) {  v.visit(*this); }
 void UnknownStruct::accept(ConstVisitor& v) const { v.visit(*this); }
 std::ostream& operator<<(std::ostream& o, const UnknownStruct& u) {
-    return o << "UnknownStruct[class=" << u.classCode << " code=" << u.code << 
"]";
+    return o << "UnknownStruct[class=" << u.getClassCode() << " code=" << 
u.getCode() << "]";
 }
 
 }} // namespace qpid::amqp_0_10

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/UnknownStruct.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/UnknownStruct.h?rev=648362&r1=648361&r2=648362&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/UnknownStruct.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/UnknownStruct.h Tue Apr 15 
11:23:55 2008
@@ -22,18 +22,30 @@
  *
  */
 #include "qpid/amqp_0_10/complex_types.h"
+#include <string>
 
 namespace qpid {
 namespace amqp_0_10 {
 
-struct UnknownStruct : public Struct, public Vbin32 {
+class UnknownStruct : public Struct {
+  public:
     static const uint8_t SIZE=4;
     static const uint8_t PACK=2;
-    
+
+    template <class S> void serialize(S& s) { s.split(*this); s(data.begin(), 
data.end()); }
+    template <class S> void encode(S&) const { }
+    template <class S> void decode(S& s) { data.resize(s.bytesRemaining()); }
+
     UnknownStruct(uint8_t cc=0, uint8_t c=0) : classCode(cc), code(c) {}
     void accept(Visitor&);
     void accept(ConstVisitor&) const;
+
+    uint8_t getClassCode() const { return classCode; }
+    uint8_t getCode() const { return code; }
+    
+  private:
     uint8_t classCode, code;
+    std::string data;
 };
 
 std::ostream& operator<<(std::ostream&, const UnknownStruct&);

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/built_in_types.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/built_in_types.h?rev=648362&r1=648361&r2=648362&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/built_in_types.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/built_in_types.h Tue Apr 
15 11:23:55 2008
@@ -138,6 +138,7 @@
 // Forward declare class types.
 class Map;
 class Struct32;
+class List;
 class UnknownType;
 template <class T> struct  ArrayDomain;
 typedef ArrayDomain<UnknownType> Array;

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/complex_types.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/complex_types.cpp?rev=648362&r1=648361&r2=648362&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/complex_types.cpp 
(original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/complex_types.cpp Tue Apr 
15 11:23:55 2008
@@ -56,12 +56,12 @@
 // Special cases for UnknownStruct
 struct GetStructCode : public GetCode {
     using GetCode::operator();
-    uint8_t operator()(const UnknownStruct& u) const { return u.code; }
+    uint8_t operator()(const UnknownStruct& u) const { return u.getCode(); }
 };
 
 struct GetStructClassCode : public GetClassCode {
     using GetClassCode::operator();
-    uint8_t operator()(const UnknownStruct& u) const { return u.classCode; }
+    uint8_t operator()(const UnknownStruct& u) const { return 
u.getClassCode(); }
 };
 
 uint8_t Struct::getCode() const { return apply(GetStructCode(), *this); }

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/complex_types.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/complex_types.h?rev=648362&r1=648361&r2=648362&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/complex_types.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/amqp_0_10/complex_types.h Tue Apr 15 
11:23:55 2008
@@ -93,9 +93,9 @@
 // Note: only coded structs inherit from Struct.
 struct StructVisitor;
 struct ConstStructVisitor;
-struct Struct32;
+struct StructHolder;
 struct Struct
-    : public Visitable<StructVisitor, ConstStructVisitor, Struct32>
+    : public Visitable<StructVisitor, ConstStructVisitor, StructHolder>
 {
     uint8_t getCode() const;
     uint8_t getPack() const;

Modified: incubator/qpid/trunk/qpid/cpp/src/tests/amqp_0_10/serialize.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/amqp_0_10/serialize.cpp?rev=648362&r1=648361&r2=648362&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/amqp_0_10/serialize.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/amqp_0_10/serialize.cpp Tue Apr 15 
11:23:55 2008
@@ -221,10 +221,10 @@
     string data;
     Codec::encode(back_inserter(data))(s);
 
-//     uint32_t structSize;        // Starts with size
-//     Codec::decode(data.begin())(structSize);
-//     BOOST_CHECK_EQUAL(structSize, Codec::size(dp) + 4); // code+pack
-//     BOOST_CHECK_EQUAL(structSize, data.size()-4); 
+    uint32_t structSize;        // Starts with size
+    Codec::decode(data.begin())(structSize);
+    BOOST_CHECK_EQUAL(structSize, Codec::size(dp) + 2);  // +2 for code
+    BOOST_CHECK_EQUAL(structSize, data.size()-4);        // encoded body
     
     BOOST_CHECK_EQUAL(data.size(), Codec::size(s));
     Struct32 s2;
@@ -233,15 +233,19 @@
     BOOST_REQUIRE(dp2);
     BOOST_CHECK_EQUAL(dp2->priority, message::MEDIUM);
     BOOST_CHECK_EQUAL(dp2->routingKey, "foo");
+}
 
+BOOST_AUTO_TEST_CASE(testStruct32Unknown) {
     // Verify we can recode an unknown struct unchanged.
-//     data.clear();
-//     Codec::encode(back_inserter(data))(uint32_t(10));
-//     data.append(10, 'X');
-//     Codec::decode(data.begin())(s2);
-//     string data2;
-//     Codec::decode(back_inserter(data2));
-    // BOOST_CHECK_EQUAL(data, data2);
+    Struct32 s;
+    string data;
+    Codec::encode(back_inserter(data))(uint32_t(10));
+    data.append(10, 'X');
+    Codec::decode(data.begin())(s);
+    string data2;
+    Codec::encode(back_inserter(data2))(s);
+    BOOST_CHECK_EQUAL(data.size(), data2.size());
+    BOOST_CHECK_EQUAL(data, data2);
 }
 
 struct DummyPacked {


Reply via email to