certi-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[certi-cvs] certi libRTI/RTI1516ambPrivateRefs.cpp libRTI/R...


From: CERTI CVS commits
Subject: [certi-cvs] certi libRTI/RTI1516ambPrivateRefs.cpp libRTI/R...
Date: Wed, 13 Jul 2011 15:43:18 +0000

CVSROOT:        /sources/certi
Module name:    certi
Changes by:     Eric NOULARD <erk>      11/07/13 15:43:18

Modified files:
        libRTI         : RTI1516ambPrivateRefs.cpp RTItypesImp.cc 
                         RTIambPrivateRefs.cc RTI1516ambassador.cpp 
        scripts        : CERTI_Message.msg CERTI_NetworkMessage.msg 
                         GenMsgCXX.py GenerateMessages.py GenMsgAST.py 
        libCERTI       : NM_Classes.hh M_Classes.cc NM_Classes.cc 
                         M_Classes.hh 
        include        : certi.hh 
        RTIG           : Federation.cc 
Added files:
        scripts        : GenMsgC.py 

Log message:
        Merge a modified version of Christoph Laesche patch #7567
        Some improvement of the CERTI Message generator are bundled with it.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/certi/libRTI/RTI1516ambPrivateRefs.cpp?cvsroot=certi&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/certi/libRTI/RTItypesImp.cc?cvsroot=certi&r1=3.9&r2=3.10
http://cvs.savannah.gnu.org/viewcvs/certi/libRTI/RTIambPrivateRefs.cc?cvsroot=certi&r1=3.28&r2=3.29
http://cvs.savannah.gnu.org/viewcvs/certi/libRTI/RTI1516ambassador.cpp?cvsroot=certi&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/CERTI_Message.msg?cvsroot=certi&r1=1.17&r2=1.18
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/CERTI_NetworkMessage.msg?cvsroot=certi&r1=1.22&r2=1.23
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenMsgCXX.py?cvsroot=certi&r1=1.20&r2=1.21
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenerateMessages.py?cvsroot=certi&r1=1.42&r2=1.43
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenMsgAST.py?cvsroot=certi&r1=1.18&r2=1.19
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenMsgC.py?cvsroot=certi&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/certi/libCERTI/NM_Classes.hh?cvsroot=certi&r1=3.23&r2=3.24
http://cvs.savannah.gnu.org/viewcvs/certi/libCERTI/M_Classes.cc?cvsroot=certi&r1=3.14&r2=3.15
http://cvs.savannah.gnu.org/viewcvs/certi/libCERTI/NM_Classes.cc?cvsroot=certi&r1=3.29&r2=3.30
http://cvs.savannah.gnu.org/viewcvs/certi/libCERTI/M_Classes.hh?cvsroot=certi&r1=3.14&r2=3.15
http://cvs.savannah.gnu.org/viewcvs/certi/include/certi.hh?cvsroot=certi&r1=3.51&r2=3.52
http://cvs.savannah.gnu.org/viewcvs/certi/RTIG/Federation.cc?cvsroot=certi&r1=3.139&r2=3.140

Patches:
Index: libRTI/RTI1516ambPrivateRefs.cpp
===================================================================
RCS file: /sources/certi/certi/libRTI/RTI1516ambPrivateRefs.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- libRTI/RTI1516ambPrivateRefs.cpp    11 Jul 2011 11:17:24 -0000      1.4
+++ libRTI/RTI1516ambPrivateRefs.cpp    13 Jul 2011 15:43:16 -0000      1.5
@@ -19,7 +19,7 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 // USA
 //
-// $Id: RTI1516ambPrivateRefs.cpp,v 1.4 2011/07/11 11:17:24 erk Exp $
+// $Id: RTI1516ambPrivateRefs.cpp,v 1.5 2011/07/13 15:43:16 erk Exp $
 // ----------------------------------------------------------------------------
 
 #include <config.h>
@@ -85,7 +85,7 @@
        
        for (uint32_t i = 0 ; i < size ; ++i) {
                rti1516::AttributeHandle attribute = 
rti1516::AttributeHandleFriend::createRTI1516Handle(request->getAttributes(i)); 
           
-               rti1516::VariableLengthData 
varData(request->getValues(i).data(), request->getValues(i).length()); 
+               rti1516::VariableLengthData 
varData(&(request->getValues(i)[0]), request->getValues(i).size()); 
                
result->insert(std::pair<rti1516::AttributeHandle,rti1516::VariableLengthData>(attribute,
 varData)); 
        }
 
@@ -101,7 +101,7 @@
 
        for (uint32_t i = 0 ; i < size ; ++i) {
                rti1516::ParameterHandle parameter = 
rti1516::ParameterHandleFriend::createRTI1516Handle(request->getParameters(i));
-               rti1516::VariableLengthData 
varData(request->getValues(i).data(), request->getValues(i).length()); 
+               rti1516::VariableLengthData 
varData(&(request->getValues(i)[0]), request->getValues(i).size()); 
                
result->insert(std::pair<rti1516::ParameterHandle,rti1516::VariableLengthData>(parameter,
 varData)); 
        }
 
@@ -1205,4 +1205,4 @@
        }
 }
 
-// $Id: RTI1516ambPrivateRefs.cpp,v 1.4 2011/07/11 11:17:24 erk Exp $
+// $Id: RTI1516ambPrivateRefs.cpp,v 1.5 2011/07/13 15:43:16 erk Exp $

Index: libRTI/RTItypesImp.cc
===================================================================
RCS file: /sources/certi/certi/libRTI/RTItypesImp.cc,v
retrieving revision 3.9
retrieving revision 3.10
diff -u -b -r3.9 -r3.10
--- libRTI/RTItypesImp.cc       11 Jul 2011 11:00:09 -0000      3.9
+++ libRTI/RTItypesImp.cc       13 Jul 2011 15:43:16 -0000      3.10
@@ -16,7 +16,7 @@
 // License along with this program ; if not, write to the Free Software
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 //
-// $Id: RTItypesImp.cc,v 3.9 2011/07/11 11:00:09 erk Exp $
+// $Id: RTItypesImp.cc,v 3.10 2011/07/13 15:43:16 erk Exp $
 // ----------------------------------------------------------------------------
 
 #include "RTItypesImp.hh"
@@ -80,7 +80,7 @@
     if (i < size()) {
         const AttributeHandleValuePair_t& item = _set[i];
         len = item.second.size();
-        memcpy(buff, item.second.data(), len);
+        memcpy(buff, &(item.second[0]), len);
     }
     else
         throw RTI::ArrayIndexOutOfBounds("");
@@ -92,7 +92,7 @@
     if (i < size()) {
         const AttributeHandleValuePair_t& item = _set[i];
         len = item.second.size();
-        return (char *)item.second.data();
+        return (char *)&(item.second[0]);
     }
     else
         throw RTI::ArrayIndexOutOfBounds("");
@@ -119,7 +119,9 @@
 void AttributeHandleValuePairSetImp::add(RTI::Handle h, const char *str, 
RTI::ULong len)
     throw (RTI::ValueLengthExceeded, RTI::ValueCountExceeded)
 {
-    _set.push_back(AttributeHandleValuePair_t(h, std::string(str, len)));
+    std::vector<char> v;
+    v.assign(str,str+len);
+    _set.push_back(AttributeHandleValuePair_t(h, v));
 }
 
 void AttributeHandleValuePairSetImp::remove(RTI::Handle h)
@@ -342,7 +344,7 @@
     if (i < size()) {
         const ParameterHandleValuePair_t& item = _set[i];
         len = item.second.size();
-        memcpy(buff, item.second.data(), len);
+        memcpy(buff, &(item.second[0]), len);
     }
     else
         throw RTI::ArrayIndexOutOfBounds("");
@@ -354,7 +356,7 @@
     if (i < size()) {
         const ParameterHandleValuePair_t& item = _set[i];
         len = item.second.size();
-        return (char *)item.second.data();
+        return (char *)&(item.second[0]);
     }
     else
         throw RTI::ArrayIndexOutOfBounds("");
@@ -381,7 +383,9 @@
 void ParameterHandleValuePairSetImp::add(RTI::Handle h, const char *str, 
RTI::ULong len)
     throw (RTI::ValueLengthExceeded, RTI::ValueCountExceeded)
 {
-    _set.push_back(ParameterHandleValuePair_t(h, std::string(str, len)));
+    std::vector<char> v;
+    v.assign(str,str+len);
+    _set.push_back(ParameterHandleValuePair_t(h, v));
 }
 
 void ParameterHandleValuePairSetImp::remove(RTI::Handle h)
@@ -565,4 +569,4 @@
     effectiveExtents = extents;
 }
 
-// $Id: RTItypesImp.cc,v 3.9 2011/07/11 11:00:09 erk Exp $
+// $Id: RTItypesImp.cc,v 3.10 2011/07/13 15:43:16 erk Exp $

Index: libRTI/RTIambPrivateRefs.cc
===================================================================
RCS file: /sources/certi/certi/libRTI/RTIambPrivateRefs.cc,v
retrieving revision 3.28
retrieving revision 3.29
diff -u -b -r3.28 -r3.29
--- libRTI/RTIambPrivateRefs.cc 9 Nov 2010 22:25:38 -0000       3.28
+++ libRTI/RTIambPrivateRefs.cc 13 Jul 2011 15:43:16 -0000      3.29
@@ -19,7 +19,7 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 // USA
 //
-// $Id: RTIambPrivateRefs.cc,v 3.28 2010/11/09 22:25:38 erk Exp $
+// $Id: RTIambPrivateRefs.cc,v 3.29 2011/07/13 15:43:16 erk Exp $
 // ----------------------------------------------------------------------------
 
 #include <config.h>
@@ -45,7 +45,7 @@
 
        for (uint32_t i = 0 ; i < size ; ++i) {
                result[i].first = request->getAttributes(i);
-               result[i].second.assign(request->getValues(i).data(), 
request->getValues(i).length());
+           result[i].second.assign(request->getValues(i).begin(), 
request->getValues(i).end());
        }
 
        return result;
@@ -62,7 +62,7 @@
 
        for (uint32_t i = 0 ; i < size ; ++i) {
                result[i].first = request->getParameters(i);
-               result[i].second.assign(request->getValues(i).data(), 
request->getValues(i).length());
+               result[i].second.assign(request->getValues(i).begin(), 
request->getValues(i).end());
        }
 
        return result;
@@ -983,4 +983,4 @@
        }
 }
 
-// $Id: RTIambPrivateRefs.cc,v 3.28 2010/11/09 22:25:38 erk Exp $
+// $Id: RTIambPrivateRefs.cc,v 3.29 2011/07/13 15:43:16 erk Exp $

Index: libRTI/RTI1516ambassador.cpp
===================================================================
RCS file: /sources/certi/certi/libRTI/RTI1516ambassador.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- libRTI/RTI1516ambassador.cpp        11 Jul 2011 11:17:24 -0000      1.7
+++ libRTI/RTI1516ambassador.cpp        13 Jul 2011 15:43:17 -0000      1.8
@@ -41,7 +41,10 @@
                for ( rti1516::ParameterHandleValueMap::const_iterator it = 
PHVM.begin(); it != PHVM.end(); it++, ++i)
                {
                        
req.setParameters(ParameterHandleFriend::toCertiHandle(it->first),i);
-                       req.setValues(certi::ParameterValue_t( 
(char*)it->second.data(), it->second.size() ), i);
+                   certi::ParameterValue_t paramValue;
+                   paramValue.resize(it->second.size());
+                   memcpy(&(paramValue[0]), it->second.data(), 
it->second.size());
+                   req.setValues(paramValue, i);
                }
                privateRefs->executeService(&req, &rep);
        }
@@ -56,7 +59,10 @@
                for ( rti1516::AttributeHandleValueMap::const_iterator it = 
AHVM.begin(); it != AHVM.end(); it++, ++i)
                {
                        
req.setAttributes(AttributeHandleFriend::toCertiHandle(it->first),i);
-                       req.setValues(certi::AttributeValue_t( 
(char*)it->second.data(),it->second.size() ), i);
+                       certi::AttributeValue_t attrValue;
+                       attrValue.resize(it->second.size());
+                       memcpy(&(attrValue[0]), it->second.data(), 
it->second.size());
+                       req.setValues(attrValue, i);  
                }
                privateRefs->executeService(&req, &rep);
        }

Index: scripts/CERTI_Message.msg
===================================================================
RCS file: /sources/certi/certi/scripts/CERTI_Message.msg,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -b -r1.17 -r1.18
--- scripts/CERTI_Message.msg   28 Apr 2010 18:48:31 -0000      1.17
+++ scripts/CERTI_Message.msg   13 Jul 2011 15:43:17 -0000      1.18
@@ -133,12 +133,12 @@
 }
 
 native AttributeValue_t {
-       representation string
+       representation repeated byte
        language CXX [#include "certi.hh"]
 }
 
 native ParameterValue_t {
-       representation string
+       representation repeated byte
        language CXX [#include "certi.hh"]
 }
 

Index: scripts/CERTI_NetworkMessage.msg
===================================================================
RCS file: /sources/certi/certi/scripts/CERTI_NetworkMessage.msg,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- scripts/CERTI_NetworkMessage.msg    9 Aug 2010 18:24:07 -0000       1.22
+++ scripts/CERTI_NetworkMessage.msg    13 Jul 2011 15:43:17 -0000      1.23
@@ -95,12 +95,12 @@
 }
 
 native AttributeValue_t {
-       representation string
+       representation repeated byte
        language CXX [#include "certi.hh"]
 }
 
 native ParameterValue_t {
-       representation string
+       representation repeated byte
        language CXX [#include "certi.hh"]
 }
 

Index: scripts/GenMsgCXX.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenMsgCXX.py,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -b -r1.20 -r1.21
--- scripts/GenMsgCXX.py        18 Jun 2010 13:34:28 -0000      1.20
+++ scripts/GenMsgCXX.py        13 Jul 2011 15:43:17 -0000      1.21
@@ -20,7 +20,7 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 ## USA
 ##
-## $Id: GenMsgCXX.py,v 1.20 2010/06/18 13:34:28 erk Exp $
+## $Id: GenMsgCXX.py,v 1.21 2011/07/13 15:43:17 erk Exp $
 ## ----------------------------------------------------------------------------
 
 """
@@ -120,9 +120,7 @@
     def getRepresentationFor(self, name):
         for native in self.AST.natives:
             if name == native.name:
-                representation = native.getRepresentation()
-                if representation:
-                    return representation
+                return native.getRepresentation()
         return None
 
     def getSerializeMethodName(self, name):
@@ -130,8 +128,8 @@
             return self.serializeTypeMap[name]
         else:
             representation = self.getRepresentationFor(name)
-            if representation:
-                return self.getSerializeMethodName(representation)
+            if representation and not representation.hasQualifier():
+                return 
self.getSerializeMethodName(representation.representation)
         return None
 
     def getDeSerializeMethodName(self, name):
@@ -139,8 +137,8 @@
             return self.deserializeTypeMap[name]
         else:
             representation = self.getRepresentationFor(name)
-            if representation:
-                return self.getDeSerializeMethodName(representation)
+            if representation and not representation.hasQualifier():
+                return 
self.getDeSerializeMethodName(representation.representation)
         return None
 
     def openNamespaces(self, stream):
@@ -639,7 +637,6 @@
             stream.write(field.name
                          + '= <no default value in message spec using 
builtin>\n'
                          )
-
             # FIXME find a default value for every type beside natives
 
     def writeSerializeFieldStatement(self, stream, field):
@@ -667,34 +664,45 @@
 
         stream.write(self.getIndent())
         methodName = self.getSerializeMethodName(field.typeid.name)
-        if None == methodName:  # field has no Serialize Method Name found in 
the map
-
+        # field has no Serialize Method Name found in the map
+        if None == methodName:
             # non native field case
-
             if field.typeid.name in [m.name for m in self.AST.messages]:
                 stream.write(field.name + indexField
                              + '.serialize(msgBuffer);\n')
-            elif field.typeid.name in [m.name for m in self.AST.enums]:
-
             # enum type field case (enum are serialized as uint32)
-
+            elif field.typeid.name in [m.name for m in self.AST.enums]:
                 methodName = self.getSerializeMethodName('uint32')
                 stream.write('msgBuffer.' + methodName)
                 stream.write('(' + field.name + indexField + ');\n')
-            else:
-
             # native field case
-
-                stream.write(self.commentLineBeginWith
-                             + ' FIXME FIXME FIXME\n')
+            else:
+                repLine = self.getRepresentationFor(field.typeid.name)
+                # some native may not have any representation at all
+                if repLine:
+                    methodName = 
self.getSerializeMethodName(repLine.representation)
+                    # The representation line may have a qualifier
+                    # like 'repeated'
+                    if methodName != None and repLine.hasQualifier():
+                        if repLine.qualifier == 'repeated':
+                            stream.write(self.commentLineBeginWith + 
"serialize native whose representation is 'repeated' %s \n" % 
repLine.representation)
+                            stream.write(self.getIndent() + 'msgBuffer.'+ 
self.getSerializeMethodName('uint32'))
+                            stream.write('('+field.name + indexField + 
'.size()' +');\n')
+                            stream.write(self.getIndent() + 'msgBuffer.'+ 
self.getSerializeMethodName(repLine.representation)+'s')
+                            stream.write('('+field.name + indexField 
+'.data(),')
+                            stream.write(field.name + indexField + '.size()' 
+');\n')
+                # we can not handle this native case: no representation given
+                else:
+                    stream.write(self.commentLineBeginWith + ' FIXME FIXME 
FIXME\n')
                 stream.write(self.getIndent()
                              + self.commentLineBeginWith
-                             + " don't know how to serialize native field <%s> 
of type <%s>\n"
+                                 + "don't know how to serialize native field 
<%s> of type <%s>\n"
                               % (field.name, field.typeid.name))
+                    stream.write(self.getIndent()
+                                 + self.commentLineBeginWith
+                                 + "probably no 'representation' given\n")
         else:
-
               # field has one Serialize Method Name found in the map
-
             stream.write('msgBuffer.' + methodName)
             stream.write('(' + field.name + indexField + ');\n')
 
@@ -729,7 +737,6 @@
         if None == methodName:  # field has no Serialize Method Name found in 
the map
 
             # non native field case
-
             if field.typeid.name in [m.name for m in self.AST.messages]:
                 stream.write('<< ' + field.name + indexField
                              + '.show(out)')
@@ -791,47 +798,58 @@
 
         stream.write(self.getIndent())
         methodName = self.getDeSerializeMethodName(field.typeid.name)
-        if None == methodName:  # field has no Deserialize Method Name found 
in the map
-
+        # field has no Deserialize Method Name found in the map
+        if None == methodName:
          # non native field case
-
             if field.typeid.name in [m.name for m in self.AST.messages]:
                 stream.write(field.name + indexField
                              + '.deserialize(msgBuffer);\n')
-            elif field.typeid.name in [m.name for m in self.AST.enums]:
-
             # enum type field case (enum are deserialized as uint32)
-
+            elif field.typeid.name in [m.name for m in self.AST.enums]:
                 targetTypeName = \
                     self.getTargetTypeName(field.typeid.name)
                 methodName = self.getDeSerializeMethodName('uint32')
-
                 # We should check if the uint32 value is in enum range before 
casting it into enumtype
-
                 stream.write(field.name + indexField + ' = static_cast<'
                               + targetTypeName + '>(msgBuffer.'
                              + methodName + ' ());\n')
-            else:
-
             # native field case
-
+            else:
+                repLine = self.getRepresentationFor(field.typeid.name)
+                # some native may not have any representation at all
+                if repLine:
+                    methodName = 
self.getDeSerializeMethodName(repLine.representation)
+                    # The representation line may have a qualifier
+                    # like 'repeated'
+                    if methodName != None and repLine.hasQualifier():
+                        if repLine.qualifier == 'repeated':
+                            stream.write(self.commentLineBeginWith + 
"deserialize native whose representation is 'repeated' %s \n" % 
repLine.representation)
+                            stream.write(self.getIndent()
+                                         + field.name + indexField + '.resize('
+                                         + 'msgBuffer.'
+                                         + 
self.getDeSerializeMethodName('uint32')+'()'
+                                         + ');\n')
+                            stream.write(self.getIndent() + 'msgBuffer.' + 
self.getDeSerializeMethodName(repLine.representation)+'s')
+                            stream.write('(&('+field.name + indexField 
+'[0]),')
+                            stream.write(field.name + indexField + '.size()' 
+');\n')
+                # we can not handle this native case: no representation given
+                else:
                 stream.write(self.commentLineBeginWith
                              + ' FIXME FIXME FIXME\n')
                 stream.write(self.getIndent()
                              + self.commentLineBeginWith
-                             + " don't know how to deserialize native field 
<%s> of type <%s>\n"
+                                 + "don't know how to deserialize native field 
<%s> of type <%s>\n"
                               % (field.name, field.typeid.name))
-        else:
-
+                    stream.write(self.getIndent()
+                                 + self.commentLineBeginWith
+                                 + "probably no 'representation' given\n")
               # field has one Deserialize Method Name found in the map
-
+        else:
             if methodName == 'read_string':
                 stream.write('msgBuffer.' + methodName + '('
                              + field.name + indexField + ');\n')
             else:
-
-                # We may have to vast in order to enforce conversion
-
+                # We may have to cast in order to enforce conversion
                 if isinstance(field.typeid, GenMsgAST.NativeType):
                     stream.write(field.name + indexField
                                  + ' = static_cast<'

Index: scripts/GenerateMessages.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenerateMessages.py,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -b -r1.42 -r1.43
--- scripts/GenerateMessages.py 24 Jun 2010 14:07:04 -0000      1.42
+++ scripts/GenerateMessages.py 13 Jul 2011 15:43:17 -0000      1.43
@@ -20,7 +20,7 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 ## USA
 ##
-## $Id: GenerateMessages.py,v 1.42 2010/06/24 14:07:04 erk Exp $
+## $Id: GenerateMessages.py,v 1.43 2011/07/13 15:43:17 erk Exp $
 ## ----------------------------------------------------------------------------
 
 """
@@ -92,6 +92,7 @@
 import GenMsgPython
 import GenMsgJava
 import GenMsgAST
+import GenMsgC
 
 generatorBackends = dict()
 generatorBackends[GenMsgBase.MsgSpecGenerator.generatorName().lower()] = \
@@ -106,7 +107,8 @@
     GenMsgPython.PythonGenerator
 generatorBackends[GenMsgJava.JavaGenerator.generatorName().lower()] = \
     GenMsgJava.JavaGenerator
-
+generatorBackends[GenMsgC.CCERTIGenerator.generatorName().lower()] = \
+    GenMsgC.CCERTIGenerator
 
 def usage():
     print 'Usage:\n%s --input=<message> [--language=<lang>] 
[--type=header|body] [--factory-only] [--output=<filename>] [--verbose] 
[--help]' \
@@ -444,7 +446,6 @@
 
     # we should reverse the language list
     # because the parse build it the other way around (recursive way)
-
     p[4].reverse()
     p[0] = GenMsgAST.NativeType(p[2], p[4])
     p[0].linespan = (p.linespan(1)[0], p.linespan(5)[1])
@@ -455,7 +456,6 @@
                         | native_line eol_comment native_line_list'''
 
     # Create or append the list (of pair)
-
     if len(p) == 3:
         p[1].comment = p[2]
         p[0] = [p[1]]
@@ -479,10 +479,14 @@
 
 
 def p_representation_line(p):
-    '''representation_line : REPRESENTATION typeid
+    '''representation_line : REPRESENTATION qualifier typeid
+                        | REPRESENTATION typeid
                         | REPRESENTATION COMBINE'''
 
-    p[0] = GenMsgAST.NativeType.RepresentationLine(p[2])
+    if len(p)==3:
+        p[0] = GenMsgAST.NativeType.RepresentationLine(p[2],None)
+    else:
+        p[0] = GenMsgAST.NativeType.RepresentationLine(p[3],p[2])
 
 
 def p_enum(p):

Index: scripts/GenMsgAST.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenMsgAST.py,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -b -r1.18 -r1.19
--- scripts/GenMsgAST.py        10 Jun 2011 14:47:19 -0000      1.18
+++ scripts/GenMsgAST.py        13 Jul 2011 15:43:17 -0000      1.19
@@ -20,7 +20,7 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 ## USA
 ##
-## $Id: GenMsgAST.py,v 1.18 2011/06/10 14:47:19 erk Exp $
+## $Id: GenMsgAST.py,v 1.19 2011/07/13 15:43:17 erk Exp $
 ## ----------------------------------------------------------------------------
 
 """
@@ -702,7 +702,6 @@
 
         # store language line list in a dictionary
         # in order to ease retrieval
-
         self.languages = dict()
         """
         @ivar: the language line of the C{NativeType} object
@@ -710,18 +709,21 @@
         """
         self.representation = None
         """
-        @ivar: the representation of the C{NativeType} object. It can be 
either 'combine' or a basic type.
+        @ivar: the representation of the C{NativeType} object. It can be 
either 'combine' or a basic type with a qualifier.
         @type: C{string} 
         """
         for l in lines:
+            # Native line l is a language line
             if isinstance(l, NativeType.LanguageLine):
                 if l.name in self.languages.keys():
                     self.languages[l.name].append(l)
                 else:
                     self.languages[l.name] = list()
                     self.languages[l.name].append(l)
+            # Native line l is a representation line
             else:
-                self.representation = l.representation
+                self.representation = l
+        # we will keep track of the number of Heir of the native types
         self.nbHeir = 0
 
     def __repr__(self):
@@ -800,24 +802,31 @@
         Represents a Representation Line Value
         """
 
-        def __init__(self, value):
+        def __init__(self, value, qualifier):
             """
             The class constructor
             @param value: the value of the representation line, e.g. how a 
field of this native type has to be serialized 
             and deserialized. The value can be either 'combine' or a basic 
type.
+            @param qualifier: this is the usual type qualifier (required, 
repeated or optional) in fact only repeated 
+            is currently used.
             """
-            super(NativeType.RepresentationLine,
-                  self).__init__(name='representation')
+            
super(NativeType.RepresentationLine,self).__init__(name='representation')
             self.representation = value
             """
             @ivar: the representation that has to be used, e.g. how a field of 
this native type has to be serialized 
             and deserialized. The representation can be either 'combine' or a 
basic type.
             @type: C{string}
             """
+            self.qualifier      = qualifier
 
+        def hasQualifier(self):
+            """
+            Tells if the C{RepresentationLine} object has got a qualifier or 
not
+            @return: TRUE if the C{RepresentationLine} object has got a 
qualifier and FALSE if not
+            """
+            return self.qualifier != None
 
 class MessageType(ASTElement):
-
     """ 
     Represents a message type.
     

Index: libCERTI/NM_Classes.hh
===================================================================
RCS file: /sources/certi/certi/libCERTI/NM_Classes.hh,v
retrieving revision 3.23
retrieving revision 3.24
diff -u -b -r3.23 -r3.24
--- libCERTI/NM_Classes.hh      9 Aug 2010 18:24:07 -0000       3.23
+++ libCERTI/NM_Classes.hh      13 Jul 2011 15:43:17 -0000      3.24
@@ -1,4 +1,4 @@
-// Generated on 2010 August Mon, 09 at 18:13:03 by the CERTI message generator
+// Generated on 2011 July Wed, 13 at 17:02:50 by the CERTI message generator
 #ifndef NM_CLASSES_HH
 #define NM_CLASSES_HH
 // ****-**** Global System includes ****-****

Index: libCERTI/M_Classes.cc
===================================================================
RCS file: /sources/certi/certi/libCERTI/M_Classes.cc,v
retrieving revision 3.14
retrieving revision 3.15
diff -u -b -r3.14 -r3.15
--- libCERTI/M_Classes.cc       9 Aug 2010 18:24:07 -0000       3.14
+++ libCERTI/M_Classes.cc       13 Jul 2011 15:43:17 -0000      3.15
@@ -1,4 +1,4 @@
-// Generated on 2010 August Mon, 09 at 18:13:03 by the CERTI message generator
+// Generated on 2011 July Wed, 13 at 17:02:50 by the CERTI message generator
 #include <vector>
 #include <string>
 #include "M_Classes.hh"
@@ -994,7 +994,9 @@
       uint32_t valuesSize = values.size();
       msgBuffer.write_uint32(valuesSize);
       for (uint32_t i = 0; i < valuesSize; ++i) {
-         msgBuffer.write_string(values[i]);
+         //serialize native whose representation is 'repeated' byte 
+         msgBuffer.write_uint32(values[i].size());
+         msgBuffer.write_bytes(values[i].data(),values[i].size());
       }
       msgBuffer.write_bool(_hasEventRetraction);
       if (_hasEventRetraction) {
@@ -1016,7 +1018,9 @@
       uint32_t valuesSize = msgBuffer.read_uint32();
       values.resize(valuesSize);
       for (uint32_t i = 0; i < valuesSize; ++i) {
-         msgBuffer.read_string(values[i]);
+         //deserialize native whose representation is 'repeated' byte 
+         values[i].resize(msgBuffer.read_uint32());
+         msgBuffer.read_bytes(&(values[i][0]),values[i].size());
       }
       _hasEventRetraction = msgBuffer.read_bool();
       if (_hasEventRetraction) {
@@ -1037,7 +1041,7 @@
       out << std::endl;
       out << "    values [] =" << std::endl;
       for (uint32_t i = 0; i < getValuesSize(); ++i) {
-         out << values[i] << " " ;
+         out << "         //FIXME FIXME don't know how to serialize native 
field <values> of type <AttributeValue_t>";
       }
       out << std::endl;
       out << "(opt) eventRetraction =" << eventRetraction.show(out)      << 
std::endl;
@@ -1124,7 +1128,9 @@
       uint32_t valuesSize = values.size();
       msgBuffer.write_uint32(valuesSize);
       for (uint32_t i = 0; i < valuesSize; ++i) {
-         msgBuffer.write_string(values[i]);
+         //serialize native whose representation is 'repeated' byte 
+         msgBuffer.write_uint32(values[i].size());
+         msgBuffer.write_bytes(values[i].data(),values[i].size());
       }
       msgBuffer.write_bool(_hasEventRetraction);
       if (_hasEventRetraction) {
@@ -1146,7 +1152,9 @@
       uint32_t valuesSize = msgBuffer.read_uint32();
       values.resize(valuesSize);
       for (uint32_t i = 0; i < valuesSize; ++i) {
-         msgBuffer.read_string(values[i]);
+         //deserialize native whose representation is 'repeated' byte 
+         values[i].resize(msgBuffer.read_uint32());
+         msgBuffer.read_bytes(&(values[i][0]),values[i].size());
       }
       _hasEventRetraction = msgBuffer.read_bool();
       if (_hasEventRetraction) {
@@ -1167,7 +1175,7 @@
       out << std::endl;
       out << "    values [] =" << std::endl;
       for (uint32_t i = 0; i < getValuesSize(); ++i) {
-         out << values[i] << " " ;
+         out << "         //FIXME FIXME don't know how to serialize native 
field <values> of type <AttributeValue_t>";
       }
       out << std::endl;
       out << "(opt) eventRetraction =" << eventRetraction.show(out)      << 
std::endl;
@@ -1202,7 +1210,9 @@
       uint32_t valuesSize = values.size();
       msgBuffer.write_uint32(valuesSize);
       for (uint32_t i = 0; i < valuesSize; ++i) {
-         msgBuffer.write_string(values[i]);
+         //serialize native whose representation is 'repeated' byte 
+         msgBuffer.write_uint32(values[i].size());
+         msgBuffer.write_bytes(values[i].data(),values[i].size());
       }
       msgBuffer.write_uint32(region);
       msgBuffer.write_bool(_hasEventRetraction);
@@ -1224,7 +1234,9 @@
       uint32_t valuesSize = msgBuffer.read_uint32();
       values.resize(valuesSize);
       for (uint32_t i = 0; i < valuesSize; ++i) {
-         msgBuffer.read_string(values[i]);
+         //deserialize native whose representation is 'repeated' byte 
+         values[i].resize(msgBuffer.read_uint32());
+         msgBuffer.read_bytes(&(values[i][0]),values[i].size());
       }
       region = static_cast<RegionHandle>(msgBuffer.read_uint32());
       _hasEventRetraction = msgBuffer.read_bool();
@@ -1245,7 +1257,7 @@
       out << std::endl;
       out << "    values [] =" << std::endl;
       for (uint32_t i = 0; i < getValuesSize(); ++i) {
-         out << values[i] << " " ;
+         out << "         //FIXME FIXME don't know how to serialize native 
field <values> of type <ParameterValue_t>";
       }
       out << std::endl;
       out << " region = " << region << " "       << std::endl;
@@ -1281,7 +1293,9 @@
       uint32_t valuesSize = values.size();
       msgBuffer.write_uint32(valuesSize);
       for (uint32_t i = 0; i < valuesSize; ++i) {
-         msgBuffer.write_string(values[i]);
+         //serialize native whose representation is 'repeated' byte 
+         msgBuffer.write_uint32(values[i].size());
+         msgBuffer.write_bytes(values[i].data(),values[i].size());
       }
       msgBuffer.write_uint32(region);
       msgBuffer.write_bool(_hasEventRetraction);
@@ -1303,7 +1317,9 @@
       uint32_t valuesSize = msgBuffer.read_uint32();
       values.resize(valuesSize);
       for (uint32_t i = 0; i < valuesSize; ++i) {
-         msgBuffer.read_string(values[i]);
+         //deserialize native whose representation is 'repeated' byte 
+         values[i].resize(msgBuffer.read_uint32());
+         msgBuffer.read_bytes(&(values[i][0]),values[i].size());
       }
       region = static_cast<RegionHandle>(msgBuffer.read_uint32());
       _hasEventRetraction = msgBuffer.read_bool();
@@ -1324,7 +1340,7 @@
       out << std::endl;
       out << "    values [] =" << std::endl;
       for (uint32_t i = 0; i < getValuesSize(); ++i) {
-         out << values[i] << " " ;
+         out << "         //FIXME FIXME don't know how to serialize native 
field <values> of type <ParameterValue_t>";
       }
       out << std::endl;
       out << " region = " << region << " "       << std::endl;
@@ -3143,7 +3159,8 @@
       msgBuffer.write_uint32(extentSetSize);
       for (uint32_t i = 0; i < extentSetSize; ++i) {
          // FIXME FIXME FIXME
-         // don't know how to serialize native field <extentSet> of type 
<Extent>
+         //don't know how to serialize native field <extentSet> of type 
<Extent>
+         //probably no 'representation' given
       }
       msgBuffer.write_uint32(region);
    }
@@ -3157,7 +3174,8 @@
       extentSet.resize(extentSetSize);
       for (uint32_t i = 0; i < extentSetSize; ++i) {
          // FIXME FIXME FIXME
-         // don't know how to deserialize native field <extentSet> of type 
<Extent>
+         //don't know how to deserialize native field <extentSet> of type 
<Extent>
+         //probably no 'representation' given
       }
       region = static_cast<RegionHandle>(msgBuffer.read_uint32());
    }
@@ -3196,7 +3214,8 @@
       msgBuffer.write_uint32(extentSetSize);
       for (uint32_t i = 0; i < extentSetSize; ++i) {
          // FIXME FIXME FIXME
-         // don't know how to serialize native field <extentSet> of type 
<Extent>
+         //don't know how to serialize native field <extentSet> of type 
<Extent>
+         //probably no 'representation' given
       }
    }
 
@@ -3209,7 +3228,8 @@
       extentSet.resize(extentSetSize);
       for (uint32_t i = 0; i < extentSetSize; ++i) {
          // FIXME FIXME FIXME
-         // don't know how to deserialize native field <extentSet> of type 
<Extent>
+         //don't know how to deserialize native field <extentSet> of type 
<Extent>
+         //probably no 'representation' given
       }
    }
 

Index: libCERTI/NM_Classes.cc
===================================================================
RCS file: /sources/certi/certi/libCERTI/NM_Classes.cc,v
retrieving revision 3.29
retrieving revision 3.30
diff -u -b -r3.29 -r3.30
--- libCERTI/NM_Classes.cc      9 Aug 2010 18:24:07 -0000       3.29
+++ libCERTI/NM_Classes.cc      13 Jul 2011 15:43:17 -0000      3.30
@@ -1,4 +1,4 @@
-// Generated on 2010 August Mon, 09 at 18:13:03 by the CERTI message generator
+// Generated on 2011 July Wed, 13 at 17:02:50 by the CERTI message generator
 #include <vector>
 #include <string>
 #include "NM_Classes.hh"
@@ -1211,12 +1211,12 @@
       uint32_t valuesSize = values.size();
       msgBuffer.write_uint32(valuesSize);
       for (uint32_t i = 0; i < valuesSize; ++i) {
-         msgBuffer.write_string(values[i]);
+         //serialize native whose representation is 'repeated' byte 
+         msgBuffer.write_uint32(values[i].size());
+         msgBuffer.write_bytes(values[i].data(),values[i].size());
       }
       msgBuffer.write_bool(_hasEvent);
       if (_hasEvent) {
-         // FIXME FIXME FIXME
-         // don't know how to serialize native field <event> of type 
<EventRetractionHandle>
       }
    }
 
@@ -1233,12 +1233,12 @@
       uint32_t valuesSize = msgBuffer.read_uint32();
       values.resize(valuesSize);
       for (uint32_t i = 0; i < valuesSize; ++i) {
-         msgBuffer.read_string(values[i]);
+         //deserialize native whose representation is 'repeated' byte 
+         values[i].resize(msgBuffer.read_uint32());
+         msgBuffer.read_bytes(&(values[i][0]),values[i].size());
       }
       _hasEvent = msgBuffer.read_bool();
       if (_hasEvent) {
-         // FIXME FIXME FIXME
-         // don't know how to deserialize native field <event> of type 
<EventRetractionHandle>
       }
    }
 
@@ -1254,7 +1254,7 @@
       out << std::endl;
       out << "    values [] =" << std::endl;
       for (uint32_t i = 0; i < getValuesSize(); ++i) {
-         out << values[i] << " " ;
+         out << "         //FIXME FIXME don't know how to serialize native 
field <values> of type <AttributeValue_t>";
       }
       out << std::endl;
       out << "(opt) event =" << "      //FIXME FIXME don't know how to 
serialize native field <event> of type <EventRetractionHandle>"      << 
std::endl;
@@ -1288,12 +1288,12 @@
       uint32_t valuesSize = values.size();
       msgBuffer.write_uint32(valuesSize);
       for (uint32_t i = 0; i < valuesSize; ++i) {
-         msgBuffer.write_string(values[i]);
+         //serialize native whose representation is 'repeated' byte 
+         msgBuffer.write_uint32(values[i].size());
+         msgBuffer.write_bytes(values[i].data(),values[i].size());
       }
       msgBuffer.write_bool(_hasEvent);
       if (_hasEvent) {
-         // FIXME FIXME FIXME
-         // don't know how to serialize native field <event> of type 
<EventRetractionHandle>
       }
    }
 
@@ -1310,12 +1310,12 @@
       uint32_t valuesSize = msgBuffer.read_uint32();
       values.resize(valuesSize);
       for (uint32_t i = 0; i < valuesSize; ++i) {
-         msgBuffer.read_string(values[i]);
+         //deserialize native whose representation is 'repeated' byte 
+         values[i].resize(msgBuffer.read_uint32());
+         msgBuffer.read_bytes(&(values[i][0]),values[i].size());
       }
       _hasEvent = msgBuffer.read_bool();
       if (_hasEvent) {
-         // FIXME FIXME FIXME
-         // don't know how to deserialize native field <event> of type 
<EventRetractionHandle>
       }
    }
 
@@ -1331,7 +1331,7 @@
       out << std::endl;
       out << "    values [] =" << std::endl;
       for (uint32_t i = 0; i < getValuesSize(); ++i) {
-         out << values[i] << " " ;
+         out << "         //FIXME FIXME don't know how to serialize native 
field <values> of type <AttributeValue_t>";
       }
       out << std::endl;
       out << "(opt) event =" << "      //FIXME FIXME don't know how to 
serialize native field <event> of type <EventRetractionHandle>"      << 
std::endl;
@@ -1364,7 +1364,9 @@
       uint32_t valuesSize = values.size();
       msgBuffer.write_uint32(valuesSize);
       for (uint32_t i = 0; i < valuesSize; ++i) {
-         msgBuffer.write_string(values[i]);
+         //serialize native whose representation is 'repeated' byte 
+         msgBuffer.write_uint32(values[i].size());
+         msgBuffer.write_bytes(values[i].data(),values[i].size());
       }
       msgBuffer.write_uint32(region);
    }
@@ -1382,7 +1384,9 @@
       uint32_t valuesSize = msgBuffer.read_uint32();
       values.resize(valuesSize);
       for (uint32_t i = 0; i < valuesSize; ++i) {
-         msgBuffer.read_string(values[i]);
+         //deserialize native whose representation is 'repeated' byte 
+         values[i].resize(msgBuffer.read_uint32());
+         msgBuffer.read_bytes(&(values[i][0]),values[i].size());
       }
       region = static_cast<RegionHandle>(msgBuffer.read_uint32());
    }
@@ -1399,7 +1403,7 @@
       out << std::endl;
       out << "    values [] =" << std::endl;
       for (uint32_t i = 0; i < getValuesSize(); ++i) {
-         out << values[i] << " " ;
+         out << "         //FIXME FIXME don't know how to serialize native 
field <values> of type <ParameterValue_t>";
       }
       out << std::endl;
       out << " region = " << region << " "       << std::endl;
@@ -1433,12 +1437,12 @@
       uint32_t valuesSize = values.size();
       msgBuffer.write_uint32(valuesSize);
       for (uint32_t i = 0; i < valuesSize; ++i) {
-         msgBuffer.write_string(values[i]);
+         //serialize native whose representation is 'repeated' byte 
+         msgBuffer.write_uint32(values[i].size());
+         msgBuffer.write_bytes(values[i].data(),values[i].size());
       }
       msgBuffer.write_bool(_hasEvent);
       if (_hasEvent) {
-         // FIXME FIXME FIXME
-         // don't know how to serialize native field <event> of type 
<EventRetractionHandle>
       }
    }
 
@@ -1455,12 +1459,12 @@
       uint32_t valuesSize = msgBuffer.read_uint32();
       values.resize(valuesSize);
       for (uint32_t i = 0; i < valuesSize; ++i) {
-         msgBuffer.read_string(values[i]);
+         //deserialize native whose representation is 'repeated' byte 
+         values[i].resize(msgBuffer.read_uint32());
+         msgBuffer.read_bytes(&(values[i][0]),values[i].size());
       }
       _hasEvent = msgBuffer.read_bool();
       if (_hasEvent) {
-         // FIXME FIXME FIXME
-         // don't know how to deserialize native field <event> of type 
<EventRetractionHandle>
       }
    }
 
@@ -1476,7 +1480,7 @@
       out << std::endl;
       out << "    values [] =" << std::endl;
       for (uint32_t i = 0; i < getValuesSize(); ++i) {
-         out << values[i] << " " ;
+         out << "         //FIXME FIXME don't know how to serialize native 
field <values> of type <ParameterValue_t>";
       }
       out << std::endl;
       out << "(opt) event =" << "      //FIXME FIXME don't know how to 
serialize native field <event> of type <EventRetractionHandle>"      << 
std::endl;
@@ -1502,8 +1506,6 @@
       msgBuffer.write_uint32(object);
       msgBuffer.write_bool(_hasEvent);
       if (_hasEvent) {
-         // FIXME FIXME FIXME
-         // don't know how to serialize native field <event> of type 
<EventRetractionHandle>
       }
    }
 
@@ -1514,8 +1516,6 @@
       object = static_cast<ObjectHandle>(msgBuffer.read_uint32());
       _hasEvent = msgBuffer.read_bool();
       if (_hasEvent) {
-         // FIXME FIXME FIXME
-         // don't know how to deserialize native field <event> of type 
<EventRetractionHandle>
       }
    }
 
@@ -1549,8 +1549,6 @@
       msgBuffer.write_uint32(objectClass);
       msgBuffer.write_bool(_hasEvent);
       if (_hasEvent) {
-         // FIXME FIXME FIXME
-         // don't know how to serialize native field <event> of type 
<EventRetractionHandle>
       }
    }
 
@@ -1562,8 +1560,6 @@
       objectClass = static_cast<ObjectClassHandle>(msgBuffer.read_uint32());
       _hasEvent = msgBuffer.read_bool();
       if (_hasEvent) {
-         // FIXME FIXME FIXME
-         // don't know how to deserialize native field <event> of type 
<EventRetractionHandle>
       }
    }
 
@@ -2767,7 +2763,8 @@
       Super::serialize(msgBuffer);
       //Specific serialization code
       // FIXME FIXME FIXME
-      // don't know how to serialize native field <timestamp> of type 
<FederationTime>
+      //don't know how to serialize native field <timestamp> of type 
<FederationTime>
+      //probably no 'representation' given
    }
 
    void NM_Message_Null_Prime::deserialize(libhla::MessageBuffer& msgBuffer) {
@@ -2775,7 +2772,8 @@
       Super::deserialize(msgBuffer);
       //Specific deserialization code
       // FIXME FIXME FIXME
-      // don't know how to deserialize native field <timestamp> of type 
<FederationTime>
+      //don't know how to deserialize native field <timestamp> of type 
<FederationTime>
+      //probably no 'representation' given
    }
 
    std::ostream& NM_Message_Null_Prime::show(std::ostream& out) {
@@ -2806,7 +2804,8 @@
       msgBuffer.write_bool(_hasDate);
       if (_hasDate) {
          // FIXME FIXME FIXME
-         // don't know how to serialize native field <date> of type 
<FederationTime>
+         //don't know how to serialize native field <date> of type 
<FederationTime>
+         //probably no 'representation' given
       }
       msgBuffer.write_bool(_hasLabel);
       if (_hasLabel) {
@@ -2824,7 +2823,8 @@
       _hasDate = msgBuffer.read_bool();
       if (_hasDate) {
          // FIXME FIXME FIXME
-         // don't know how to deserialize native field <date> of type 
<FederationTime>
+         //don't know how to deserialize native field <date> of type 
<FederationTime>
+         //probably no 'representation' given
       }
       _hasLabel = msgBuffer.read_bool();
       if (_hasLabel) {

Index: libCERTI/M_Classes.hh
===================================================================
RCS file: /sources/certi/certi/libCERTI/M_Classes.hh,v
retrieving revision 3.14
retrieving revision 3.15
diff -u -b -r3.14 -r3.15
--- libCERTI/M_Classes.hh       9 Aug 2010 18:24:07 -0000       3.14
+++ libCERTI/M_Classes.hh       13 Jul 2011 15:43:17 -0000      3.15
@@ -1,4 +1,4 @@
-// Generated on 2010 August Mon, 09 at 18:13:03 by the CERTI message generator
+// Generated on 2011 July Wed, 13 at 17:02:50 by the CERTI message generator
 #ifndef M_CLASSES_HH
 #define M_CLASSES_HH
 // ****-**** Global System includes ****-****

Index: include/certi.hh
===================================================================
RCS file: /sources/certi/certi/include/certi.hh,v
retrieving revision 3.51
retrieving revision 3.52
diff -u -b -r3.51 -r3.52
--- include/certi.hh    26 Apr 2011 11:07:38 -0000      3.51
+++ include/certi.hh    13 Jul 2011 15:43:17 -0000      3.52
@@ -16,7 +16,7 @@
 // License along with this program ; if not, write to the Free Software
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 //
-// $Id: certi.hh,v 3.51 2011/04/26 11:07:38 erk Exp $
+// $Id: certi.hh,v 3.52 2011/07/13 15:43:17 erk Exp $
 // ----------------------------------------------------------------------------
 
 #ifndef CERTI_HH_INCLUDED
@@ -131,6 +131,7 @@
 #define CERTI_DECODE_DOUBLE_FROM_UINT64BE(val)  (CERTI_UINT64_FROM_BE 
(*(uint64_t*)(val)))
 
 #include <string>
+#include <vector>
 #include <sstream>
 
 /**
@@ -162,8 +163,8 @@
 typedef double TickTime;
 
 typedef std::string ObjectName_t ;
-typedef std::string AttributeValue_t;
-typedef std::string ParameterValue_t;
+typedef std::vector<char> AttributeValue_t;
+typedef std::vector<char> ParameterValue_t;
 
 enum ResignAction {
     RELEASE_ATTRIBUTES = 1,
@@ -323,4 +324,4 @@
        (uint64_t) CERTI_INT64_CONSTANT(0xff00000000000000U)) >> 56)))
 #endif // CERTI_HH_INCLUDED
 
-// $Id: certi.hh,v 3.51 2011/04/26 11:07:38 erk Exp $
+// $Id: certi.hh,v 3.52 2011/07/13 15:43:17 erk Exp $

Index: RTIG/Federation.cc
===================================================================
RCS file: /sources/certi/certi/RTIG/Federation.cc,v
retrieving revision 3.139
retrieving revision 3.140
diff -u -b -r3.139 -r3.140
--- RTIG/Federation.cc  11 Jul 2011 11:17:25 -0000      3.139
+++ RTIG/Federation.cc  13 Jul 2011 15:43:18 -0000      3.140
@@ -18,7 +18,7 @@
 // along with this program ; if not, write to the Free Software
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 //
-// $Id: Federation.cc,v 3.139 2011/07/11 11:17:25 erk Exp $
+// $Id: Federation.cc,v 3.140 2011/07/13 15:43:18 erk Exp $
 // ----------------------------------------------------------------------------
 
 #include <config.h>
@@ -934,11 +934,6 @@
                        tag);
        D.Out(pdRequest, "Federation %d: Broadcasted Interaction %d from 
Federate "
                        "%d nb params %d.", handle, interaction, 
federate_handle, list_size);
-       for (int i=0 ; i < list_size ; i++)
-               D.Out(pdRequest,
-                               " Param %d Value %s",
-                               parameter_handles[i],
-                               parameter_values[i].c_str());
 
        G.Out(pdGendoc,"exit Federation::broadcastInteraction with time");
 
@@ -985,7 +980,7 @@
                D.Out(pdRequest,
                                " Param %d Value %s",
                                parameter_handles[i],
-                               parameter_values[i].c_str());
+                               string(&(parameter_values[i][0]), 
parameter_values[i].size()).c_str());
 
        G.Out(pdGendoc,"exit Federation::broadcastInteraction without time");
 
@@ -2742,5 +2737,5 @@
 
 }} // namespace certi/rtig
 
-// $Id: Federation.cc,v 3.139 2011/07/11 11:17:25 erk Exp $
+// $Id: Federation.cc,v 3.140 2011/07/13 15:43:18 erk Exp $
 

Index: scripts/GenMsgC.py
===================================================================
RCS file: scripts/GenMsgC.py
diff -N scripts/GenMsgC.py
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ scripts/GenMsgC.py  13 Jul 2011 15:43:17 -0000      1.1
@@ -0,0 +1,1194 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+## ----------------------------------------------------------------------------
+## CERTI - HLA RunTime Infrastructure
+## Copyright (C) 2002-2005  ONERA
+##
+## This program is free software ; you can redistribute it and/or
+## modify it under the terms of the GNU Lesser General Public License
+## as published by the Free Software Foundation ; either version 2 of
+## the License, or (at your option) Any later version.
+##
+## This program is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY ; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## Lesser General Public License for more details.
+##
+## You should have received a copy of the GNU Lesser General Public
+## License along with this program ; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+## USA
+##
+## $Id: GenMsgC.py,v 1.1 2011/07/13 15:43:17 erk Exp $
+## ----------------------------------------------------------------------------
+
+"""
+The CERTI Message Generator.
+C++ Backend Generator
+"""
+
+import logging
+import GenMsgAST
+import GenMsgBase
+import sys
+import os
+
+
+class CCERTIGenerator(GenMsgBase.CodeGenerator):
+
+    """
+    This is a C generator for C{MessageAST}.
+    
+    """
+
+    def generatorName(cls):
+        return 'C'
+
+    generatorName = classmethod(generatorName)
+
+    def __init__(self, MessageAST):
+        super(CCERTIGenerator, self).__init__(MessageAST, '//')
+        self.included = dict()
+        self.typedefed = dict()
+        self.builtinTypeMap = {
+            'onoff': 'uint8_t',
+            'bool': 'uint8_t',
+            'string': 'char*',
+            'byte': 'uint8_t',
+            'int8': 'int8_t',
+            'uint8': 'uint8_t',
+            'int16': 'int16_t',
+            'uint16': 'uint16_t',
+            'int32': 'int32_t',
+            'uint32': 'uint32_t',
+            'int64': 'int64_t',
+            'uint64': 'uint64_t',
+            'float': 'float',
+            'double': 'double',
+            }
+        self.serializeTypeMap = {
+            'onoff': 'write_bool',
+            'bool': 'write_bool',
+            'string': 'write_string',
+            'byte': 'write_byte',
+            'int8': 'write_int8',
+            'uint8': 'write_uint8',
+            'int16': 'write_int16',
+            'uint16': 'write_uint16',
+            'int32': 'write_int32',
+            'uint32': 'write_uint32',
+            'int64': 'write_int64',
+            'uint64': 'write_uint64',
+            'float': 'write_float',
+            'double': 'write_double',
+            }
+        self.deserializeTypeMap = {
+            'onoff': 'read_bool',
+            'bool': 'read_bool',
+            'string': 'read_string',
+            'byte': 'read_byte',
+            'int8': 'read_int8',
+            'uint8': 'read_uint8',
+            'int16': 'read_int16',
+            'uint16': 'read_uint16',
+            'int32': 'read_int32',
+            'uint32': 'read_uint32',
+            'int64': 'read_int64',
+            'uint64': 'read_uint64',
+            'float': 'read_float',
+            'double': 'read_double',
+            }
+        self.__languageName = 'C'
+        self.replacePrefix = None
+        self.exportPrefix = ''
+        self.serializeBufferType = 'MsgBuffer_t'
+        self.messageTypeGetter = 'getType()'
+        self.exception = ['string']
+
+    def getTargetTypeName(self, name):
+        if name in self.builtinTypeMap.keys():
+            return self.builtinTypeMap[name]
+        else:
+            t = self.AST.getType(name)
+        if isinstance(t, GenMsgAST.EnumType):
+            prefix = self.AST.name.split('.')[0] + '_'
+            return prefix + name
+        else:
+            return name
+
+    def getRepresentationFor(self, name):
+        for native in self.AST.natives:
+            if name == native.name:
+                representation = native.getRepresentation()
+                if representation:
+                    return representation
+        return None
+
+    def getSerializeMethodName(self, name):
+        if name in self.serializeTypeMap.keys():
+            return self.serializeTypeMap[name]
+        else:
+            representation = self.getRepresentationFor(name)
+            if representation:
+                return self.getSerializeMethodName(representation)
+        return None
+
+    def getDeSerializeMethodName(self, name):
+        if name in self.deserializeTypeMap.keys():
+            return self.deserializeTypeMap[name]
+        else:
+            representation = self.getRepresentationFor(name)
+            if representation:
+                return self.getDeSerializeMethodName(representation)
+        return None
+
+    def openNamespaces(self, stream):
+        if self.AST.hasPackage():
+            self.writeComment(stream, self.AST.package)
+
+            # we may have nested namespace
+
+            nameSpaceList = self.AST.package.name.split('.')
+            for ns in nameSpaceList:
+                stream.write(self.getIndent() + self.commentLineBeginWith + 
'''package %s 
+
+'''
+                             % ns)
+                self.indent()
+
+    def closeNamespaces(self, stream):
+        if self.AST.hasPackage():
+
+            # we may have nested namespace
+
+            nameSpaceList = self.AST.package.name.split('.')
+            nameSpaceList.reverse()
+            for ns in nameSpaceList:
+                self.unIndent()
+                stream.write(self.getIndent() + ''
+                             + self.commentLineBeginWith
+                             + ' end of namespace %s \n' % ns)
+
+    def writeOneGetterSetter(self, stream, field,msg):
+        targetTypeName = self.getTargetTypeName(field.typeid.name)
+
+        if field.typeid.name == 'onoff':
+            if field.qualifier == 'repeated':
+                stream.write(self.getIndent())
+                stream.write('uint32_t ' + msg.name + '_get'
+                             + self.upperFirst(field.name)
+                             + 'Size(%s cthis) '
+                             % msg.name)
+                stream.write(' {return cthis.' + field.name + 'size;}\n')
+                stream.write(self.getIndent())
+                stream.write('void ' + msg.name + '_set' + 
self.upperFirst(field.name)
+                             + 'Size(%s* cthis,uint32_t num) {\n' % msg.name)
+               self.indent()
+                stream.write(self.getIndent() + field.typeid.name + '* 
temp;\n')
+                stream.write(self.getIndent() + 'temp = calloc(num,sizeof(' + 
field.typeid.name + '));\n')
+                stream.write(self.getIndent() + 'memcpy(temp,cthis->%s, 
cthis->%ssize);\n'
+                           % (field.name, field.name))
+                stream.write(self.getIndent() + 'free(cthis->' + field.name + 
');\n')
+                stream.write(self.getIndent() + 'cthis->' + field.name + ' = 
temp;\n')
+                stream.write(self.getIndent() + 'cthis->' + field.name + 'size 
= num;\n')
+               self.unIndent()
+                stream.write(self.getIndent() + '}\n')
+
+                stream.write(self.getIndent())
+                stream.write(' ' + targetTypeName + ' '
+                             + msg.name +'_get' + self.upperFirst(field.name)
+                             + '(' + msg.name + ' cthis) ')
+                stream.write(' {return cthis.' + field.name + ';}\n')
+
+                stream.write(self.getIndent())
+                stream.write('void ' + msg.name + '_' + field.name + 'On(%s* 
cthis, uint32_t rank)'
+                           % msg.name)
+                stream.write(' {\n' + self.getIndent() + 
'assert(rank<cthis->'+ field.name +'size);\n')
+                stream.write(self.getIndent() + 'cthis->' + field.name + 
'[rank] = 1;}\n')
+
+                stream.write(self.getIndent())
+                stream.write('void ' + msg.name + '_' + field.name + 'Off(%s* 
cthis, uint32_t rank)'
+                           % msg.name)
+                        
+                stream.write(' {\n' + self.getIndent() + 
'assert(rank<cthis->'+ field.name +'size);\n')
+                stream.write(self.getIndent() + 'cthis->' + field.name + 
'[rank] = 0;}\n')
+
+                stream.write(self.getIndent())
+                stream.write(targetTypeName + ' is'
+                             + self.upperFirst(field.name)
+                             + 'On(uint32_t rank) ')
+                stream.write(' {return cthis.' + field.name + '[rank];}\n')
+            else:
+                stream.write(self.getIndent())
+                stream.write('void ' + msg.name + '_' + field.name + 'On(%s* 
cthis)'
+                           % msg.name)
+                stream.write(' {cthis->' + field.name + ' = 1;}\n')
+
+                stream.write(self.getIndent())
+                stream.write('void ' + msg.name + '_' + field.name + 'Off(%s* 
cthis)'
+                           % (msg.name, msg.name,msg.name))
+                stream.write(' {cthis->' +field.name + ' = 0;}\n')
+
+                stream.write(self.getIndent())
+                stream.write(targetTypeName + ' is'
+                             + self.upperFirst(field.name)
+                             + 'On(%s* cthis) '
+                           % msg.name)
+                stream.write(' {return cthis->' + field.name + ';}\n')
+        else:
+            if field.qualifier == 'repeated':
+                stream.write(self.getIndent())
+                stream.write('uint32_t ' + msg.name + '_get'
+                             + self.upperFirst(field.name)
+                             + 'Size(%s cthis) '
+                            % msg.name)
+                stream.write('{ return cthis.' + field.name + 'size;}\n')
+
+                stream.write(self.getIndent())
+                stream.write('void ' + msg.name + '_set' + 
self.upperFirst(field.name)
+                             + 'Size(%s* cthis, uint32_t num) { \n'
+                             % msg.name)
+               self.indent()
+                stream.write(self.getIndent() + field.typeid.name + '* 
temp;\n')
+                stream.write(self.getIndent() + 'temp = calloc(num,sizeof(' + 
field.typeid.name + '));\n')
+                stream.write(self.getIndent() + 'memcpy(temp,cthis->%s, 
cthis->%ssize);\n'
+                           % (field.name, field.name))
+                stream.write(self.getIndent() + 'free(cthis->' + field.name + 
');\n')
+                stream.write(self.getIndent() + 'cthis->' + field.name + ' = 
temp;\n')
+                stream.write(self.getIndent() + 'cthis->' + field.name + 'size 
= num;\n')
+               self.unIndent()
+                stream.write(self.getIndent() + '}\n')
+
+                stream.write(self.getIndent())
+                #stream.write('const ' + targetTypeName
+                #             + '* ' + msg.name + '_get' + 
self.upperFirst(field.name)
+                #             + '(' + msg.name + ' cthis) ')
+                #stream.write(' {return cthis.' + field.name + ';}\n')
+
+
+                stream.write(self.getIndent())
+                stream.write(targetTypeName + ' ' + msg.name + '_get'
+                             + self.upperFirst(field.name)
+                             + '(%s* cthis, uint32_t rank)'
+                           % msg.name)
+                stream.write(' {return cthis->' + field.name + '[rank];}\n')
+
+                stream.write(self.getIndent())
+                stream.write('void ' + msg.name + '_set' + 
self.upperFirst(field.name)
+                             + '(%s* cthis, '
+                           % msg.name)
+                stream.write(targetTypeName + ' new'
+                             + self.upperFirst(field.name)
+                             + ', uint32_t rank)')
+                stream.write(' {cthis->' + field.name + '[rank]=new'
+                             + self.upperFirst(field.name) + ';}\n')
+            else:
+                stream.write(self.getIndent())
+                stream.write(targetTypeName + ' ' + msg.name + '_get'
+                             + self.upperFirst(field.name) + '(%s cthis) '
+                             % msg.name)
+                stream.write(' {return cthis.'  + field.name + ';}\n')
+
+                stream.write(self.getIndent())
+                stream.write('void ' + msg.name + '_set'+ 
self.upperFirst(field.name)
+                             + '(%s* cthis,  '
+                            % msg.name)
+                stream.write(targetTypeName + ' new'
+                             + self.upperFirst(field.name) + ') {')
+                if field.qualifier == 'optional':
+                    stream.write('\n')
+                    self.indent()
+                    stream.write(self.getIndent() + 'cthis->_has%s=1;\n'
+                                 % self.upperFirst(field.name))
+                    stream.write(self.getIndent() + 'cthis->' + field.name + 
'=new'
+                                 + self.upperFirst(field.name) + ';\n')
+                    self.unIndent()
+                    stream.write(self.getIndent())
+                else:
+                    stream.write('cthis->' + field.name + '=new'
+                                 + self.upperFirst(field.name) + ';')
+                stream.write('}\n')
+                if field.qualifier == 'optional':
+                    stream.write(self.getIndent())
+                    tmp = self.upperFirst(field.name)
+                    stream.write('uint8_t has%s(%s cthis) {return 
cthis._has%s;}\n'
+                                 % (tmp,  msg.name,
+                                 tmp))
+
+    def writeDeclarationFieldStatement(self, stream, field):
+        stream.write(self.getIndent())
+        if field.qualifier == 'repeated':
+            stream.write('%s* %s;\n'
+                         % (self.getTargetTypeName(field.typeid.name),
+                         field.name))
+            stream.write(self.getIndent() + 'uint32_t ' + field.name + 'size;')
+        else:
+            stream.write('%s %s;'
+                         % (self.getTargetTypeName(field.typeid.name),
+                         field.name))
+        self.writeComment(stream, field)
+
+        # optional field generate another boolean field
+        # used to detect whether if the optional field has
+        # been given or not.
+
+        if field.qualifier == 'optional':
+            stream.write(self.getIndent() + 'uint8_t _has%s;\n'
+                         % self.upperFirst(field.name))
+
+    def generateEnum(self, stream, enum):
+        self.writeComment(stream, enum)
+        stream.write(self.getIndent())
+        stream.write('typedef enum %s_%s {\n' % (self.AST.name.split('.'
+                         )[0], enum.name))
+        self.indent()
+        first = True
+        lastname = enum.values[len(enum.values) - 1].name
+        for enumval in enum.values:
+            if first:
+                stream.write(self.getIndent())
+                stream.write('%s = %d, ' % (enumval.name,
+                             enumval.value))
+                first = False
+                self.writeComment(stream, enumval)
+            else:
+                stream.write(self.getIndent())
+                if enumval.name == lastname:
+                    stream.write('%s ' % enumval.name)
+                    self.writeComment(stream, enumval)
+                    stream.write('\n')
+                else:
+                    stream.write('%s, ' % enumval.name)
+                    self.writeComment(stream, enumval)
+
+        self.unIndent()
+        stream.write(self.getIndent())
+        stream.write('} %s_%s; ' % (self.AST.name.split('.'
+                         )[0], enum.name))
+        stream.write(self.commentLineBeginWith + 'end of enum %s \n'
+                     % enum.name)
+
+    def generateHeader(self, stream, factoryOnly=False):
+
+        # write the usual header protecting MACRO
+
+        supposedHeaderName = stream.name
+        if supposedHeaderName != '<stdout>':
+            supposedHeaderName = os.path.basename(supposedHeaderName)
+            supposedHeaderName = os.path.splitext(supposedHeaderName)[0]
+            headerProtectMacroName = supposedHeaderName
+        else:
+            (headerProtectMacroName, ext) = \
+                os.path.splitext(self.AST.name)
+
+        headerProtectMacroName = '%s_H' \
+            % headerProtectMacroName.upper()
+        stream.write('#ifndef %s\n' % headerProtectMacroName)
+        stream.write('#define %s\n' % headerProtectMacroName)
+
+        # add necessary standard and global includes
+
+        stream.write(self.commentLineBeginWith
+                     + ' ****-**** Global System includes ****-****\n')
+        stream.write('#include <stdio.h>\n')
+        self.included['#include <stdio.h>'] = 1
+        stream.write('#include <stdlib.h>\n')
+        self.included['#include <stdlib.h>'] = 1
+        stream.write('#include <stdint.h>\n')
+        self.included['#include <stdint.h>'] = 1
+        stream.write('#include <assert.h>\n')
+        self.included['#include <assert.h>'] = 1
+        stream.write('#include <string.h>\n')
+        self.included['#include <string.h>'] = 1
+
+        # add include coming from native type specification
+
+        stream.write(self.commentLineBeginWith
+                     + ' ****-**** Includes coming from native types 
****-****\n'
+                     )
+        for native in self.AST.natives:
+            if native.hasLanguage('C'):
+                for line in native.getLanguageLines('C'):
+
+                    # we are only interested in native "include" statement
+
+                    stmt = line.statement
+                    if stmt.find('#include') >= 0 and not stmt \
+                        in self.included.keys():
+                        self.writeComment(stream, native)
+                        stream.write(stmt + '\n')
+                        self.included[stmt] = 1
+
+        # Generate namespace for specified package package
+        # we may have nested namespace
+
+        self.openNamespaces(stream)
+
+        if not factoryOnly:
+
+            # Native type should be defined in included header
+
+            stream.write(self.getIndent() + self.commentLineBeginWith)
+            stream.write(' Native types has been defined:\n')
+            stream.write(self.getIndent() + self.commentLineBeginWith)
+            stream.write('     - by included headers (see above)\n')
+            stream.write(self.getIndent() + self.commentLineBeginWith)
+            stream.write('     - with typedef (see below [if any])\n')
+            for native in self.AST.natives:
+                if native.hasLanguage('C'):
+                    for line in native.getLanguageLines('C'):
+                        stmt = line.statement
+
+                       # we are only interested in native statement
+                       # which are not #include
+
+                        if stmt.find('typedef') >= 0 and not stmt \
+                            in self.typedefed.keys():
+                            self.writeComment(stream, native)
+                            stream.write(self.getIndent() + stmt + '\n')
+                            self.typedefed[stmt] = 1
+
+            # Put enum in a namespace in order to avoid conflict
+           
+            stream.write(self.getIndent() + 
+                       self.commentLineBeginWith +
+                               '%s package equivalent in C\n'
+                             % (self.AST.name.split('.')[0]))
+
+            # Generate version
+
+            if self.AST.hasVersion():
+                (major, minor) = self.AST.version.number
+                stream.write(self.getIndent())
+                stream.write('static const uint32_t %s_versionMajor = %d;\n'
+                              % (self.AST.name.split('.')[0], major))
+                stream.write(self.getIndent())
+                stream.write('static const uint32_t %s_versionMinor = %d;\n'
+                              % (self.AST.name.split('.')[0], minor))
+
+            # Generate enum
+
+            lastname = ''
+            for enum in self.AST.enums:
+                self.generateEnum(stream, enum)
+            stream.write('\n')
+
+            # close enum namespace
+
+
+            # Generate message type
+
+            for msg in self.AST.messages:
+                self.writeComment(stream, msg)
+
+                if msg.hasEnum():
+                    self.generateEnum(stream, msg.enum)
+                    stream.write('\n')
+                stream.write(self.getIndent())
+
+                stream.write('typedef struct %s %s' % (self.exportPrefix,
+                             msg.name))
+                if msg.hasMerge():
+                   stream.write('{\n')
+                    virtual = ''
+                elif msg.hasHeir():
+                    stream.write(' {\n')
+                    virtual = ''
+                else:
+                    stream.write(' {\n')
+                    virtual = ''
+
+                self.indent()
+
+
+                if msg.hasMerge():
+                    stream.write(self.getIndent()
+                                 + '%s super;\n'
+                                 % msg.merge.name)
+
+
+                # write fields
+
+                for field in msg.fields:
+                    if isinstance(field,
+                                  GenMsgAST.MessageType.CombinedField):
+                        for cfield in field.fields:
+                            self.writeDeclarationFieldStatement(stream,
+                                    cfield)
+                    else:
+                        self.writeDeclarationFieldStatement(stream,
+                                field)
+
+               self.unIndent()
+               stream.write(self.getIndent() + '} %s; \n\n' % msg.name)
+
+                # now write constructor/destructor
+
+                stream.write(self.getIndent() + 'void %s_create();\n' % 
msg.name)
+                stream.write(self.getIndent() + 'void %s_destroy();\n\n' % 
msg.name)
+
+                # write virtual serialize and deserialize
+                # if we have some specific field
+
+                if len(msg.fields) > 0:
+
+                    # serialize/deserialize
+
+                    stream.write(self.getIndent() + virtual
+                                 + 'void %s_serialize(%s* cthis, %s* 
msgBuffer);\n'
+                                 % (msg.name, msg.name, 
self.serializeBufferType))
+                    stream.write(self.getIndent() + virtual
+                                 + 'void %s_deserialize(%s* cthis, %s* 
msgBuffer);\n'
+                                 % (msg.name, msg.name, 
self.serializeBufferType))
+
+                    # specific getter/setter
+
+                    stream.write(self.getIndent()
+                                 + self.commentLineBeginWith
+                                 + ' specific Getter(s)/Setter(s)\n')
+                    for field in msg.fields:
+                        if isinstance(field,
+                                GenMsgAST.MessageType.CombinedField):
+                            for cfield in field.fields:
+                                self.writeOneGetterSetter(stream,
+                                        cfield,msg)
+                        else:
+                            self.writeOneGetterSetter(stream, field,msg)
+
+                    # the show method
+
+                    stream.write(self.getIndent()
+                                 + self.commentLineBeginWith
+                                 + ' the show method\n')
+                    stream.write(self.getIndent() + virtual
+                                 + 'FILE* show(FILE* out);\n'
+                                 )
+
+                # end public:
+
+
+        # Generate Factory (if any)
+        # @todo
+
+        if self.AST.hasFactory():
+            self.writeComment(stream, self.AST.factory)
+            stream.write(self.getIndent() + '/*\n')
+            stream.write(self.getIndent() + 'typedef struct %s %s {\n'
+                         % (self.exportPrefix, self.AST.factory.name))
+            self.indent()
+
+            # begin public
+
+            stream.write(self.getIndent() + 'public:\n')
+            self.indent()
+
+            stream.write(self.getIndent()
+                         + 'static %s* %s(%s type) throw ('
+                         % self.AST.factory.creator)
+            stream.write('%s' % self.exception[0])
+            for exception in self.exception[1:]:
+                stream.write(' ,%s' % exception)
+            stream.write('); \n')
+
+            if self.AST.factory.hasFactoryReceiver():
+                stream.write(self.getIndent()
+                             + 'static %s* %s(%s stream) throw ('
+                             % self.AST.factory.receiver)
+                stream.write('%s' % self.exception[0])
+                for exception in self.exception[1:]:
+                    stream.write(' ,%s' % exception)
+                stream.write('); \n')
+
+            self.unIndent()
+
+            # end public
+            # begin protected
+
+            stream.write(self.getIndent() + 'protected:\n')
+            self.indent()
+            self.unIndent()
+
+            # end protected
+            # begin private
+
+            stream.write(self.getIndent() + 'private:\n')
+            self.indent()
+            self.unIndent()
+
+            # end private
+
+            self.unIndent()
+            stream.write(self.getIndent() + '''};
+
+''')
+           stream.write(self.getIndent() + '*/\n')
+
+        # may close any open namespaces
+
+       self.closeNamespaces(stream)
+
+        # close usual HEADER protecting MACRO
+
+        stream.write(self.commentLineBeginWith + ' %s\n'
+                     % headerProtectMacroName)
+        stream.write('#endif\n')
+
+    def writeInitFieldStatement(self, stream, field):
+        if field.qualifier == 'optional':
+            stream.write(self.getIndent())
+            stream.write('_has' + self.upperFirst(field.name)
+                         + '=0;\n')
+        if field.hasDefaultValue():
+            stream.write(self.getIndent())
+            stream.write(field.typeid.name + ' ' + field.name + '=' + 
str(field.defaultValue)
+                         + ';\n')
+        else:
+            stream.write(self.getIndent())
+            stream.write(self.commentLineBeginWith)
+            stream.write(field.name
+                         + '= <no default value in message spec using 
builtin>\n'
+                         )
+
+            # FIXME find a default value for every type beside natives
+
+    def writeSerializeFieldStatement(self, stream, field):
+        indexField = ''
+        if field.qualifier == 'optional':
+            stream.write(self.getIndent())
+            stream.write('MB_write_bool(msgBuffer,_has%s);\n'
+                         % self.upperFirst(field.name))
+            stream.write(self.getIndent())
+            stream.write('if (_has%s) {\n'
+                         % self.upperFirst(field.name))
+            self.indent()
+        elif field.qualifier == 'repeated':
+            indexField = '[i]'
+            stream.write(self.getIndent())
+            stream.write('uint32_t ' + field.name + 'Size = '
+                         + field.name + 'size;\n')
+            stream.write(self.getIndent())
+            stream.write('MB_write_uint32(msgBuffer,' + field.name
+                         + 'Size);\n')
+            stream.write(self.getIndent())
+            stream.write('for (uint32_t i = 0; i < ' + field.name
+                         + 'Size; ++i) {\n')
+            self.indent()
+
+        stream.write(self.getIndent())
+        methodName = self.getSerializeMethodName(field.typeid.name)
+        if None == methodName:  # field has no Serialize Method Name found in 
the map
+
+            # non native field case
+
+            if field.typeid.name in [m.name for m in self.AST.messages]:
+                stream.write(field.name + indexField
+                             + '_serialize(msgBuffer);\n')
+            elif field.typeid.name in [m.name for m in self.AST.enums]:
+
+            # enum type field case (enum are serialized as uint32)
+
+                methodName = self.getSerializeMethodName('uint32')
+                stream.write('MB_' + methodName)
+                stream.write('(msgBuffer' + field.name + indexField + ');\n')
+            else:
+
+            # native field case
+
+                stream.write(self.commentLineBeginWith
+                             + ' FIXME FIXME FIXME\n')
+                stream.write(self.getIndent()
+                             + self.commentLineBeginWith
+                             + " don't know how to serialize native field <%s> 
of type <%s>\n"
+                              % (field.name, field.typeid.name))
+        else:
+
+              # field has one Serialize Method Name found in the map
+
+            stream.write('MB_' + methodName)
+            stream.write('(msgBuffer,' + field.name + indexField + ');\n')
+
+        if field.qualifier == 'optional':
+            self.unIndent()
+            stream.write(self.getIndent() + '}\n')
+        elif field.qualifier == 'repeated':
+            self.unIndent()
+            stream.write(self.getIndent() + '}\n')
+
+    def writeShowFieldStatement(self, stream, field):
+        indexField = ''
+        if field.qualifier == 'optional':
+            stream.write(self.getIndent())
+            stream.write('fprintf(out,"(opt) %s =" ' % field.name)
+        elif field.qualifier == 'repeated':
+            indexField = '[i]'
+            stream.write(self.getIndent())
+            stream.write('fprintf(out,"    %s [] = \n");\n'
+                         % field.name)
+            stream.write('fflush(out);\n')
+            stream.write(self.getIndent())
+            stream.write('for (uint32_t i = 0; i < get'
+                         + self.upperFirst(field.name)
+                         + 'Size(); ++i) {\n')
+            self.indent()
+            stream.write(self.getIndent() + 'out ')
+        else:
+            stream.write(self.getIndent())
+            stream.write('fprintf(out," %s = " ' % field.name)
+
+        methodName = self.getSerializeMethodName(field.typeid.name)
+        if None == methodName:  # field has no Serialize Method Name found in 
the map
+
+            # non native field case
+
+            if field.typeid.name in [m.name for m in self.AST.messages]:
+                stream.write(field.name + indexField
+                             + '.show(out)')
+            elif field.typeid.name in [m.name for m in self.AST.enums]:
+
+            # enum type field case (enum are serialized as uint32)
+
+                stream.write('+ %s + " " ' % (field.name
+                             + indexField))
+            else:
+
+                # stream.write(self.commentLineBeginWith+" FIXME FIXME FIXME 
inherited message\n")
+            # native field case
+
+                stream.write('<< "')
+                stream.write(self.getIndent()
+                             + self.commentLineBeginWith
+                             + "FIXME FIXME don't know how to serialize native 
field <%s> of type <%s>"
+                              % (field.name, field.typeid.name))
+                stream.write('"')
+        else:
+
+              # field has one Serialize Method Name found in the map
+
+            stream.write('+ %s + " " ' % (field.name + indexField))
+
+        if field.qualifier == 'optional':
+            stream.write(self.getIndent() + '+ "\\n");\n')
+            stream.write(self.getIndent() + 'fflush(out)\n')
+        elif field.qualifier == 'repeated':
+            stream.write(';\n')
+            self.unIndent()
+            stream.write(self.getIndent() + '}\n')
+            stream.write(self.getIndent() + 'fprintf(out,"\\n");\n')
+            stream.write(self.getIndent() + 'fflush(out);\n')
+        else:
+            stream.write(self.getIndent() + ' + "\\n");\n')
+            stream.write(self.getIndent() + 'fflush(out);\n')
+
+    def writeDeSerializeFieldStatement(self, stream, field):
+        indexField = ''
+        if field.qualifier == 'optional':
+            stream.write(self.getIndent())
+            stream.write('_has%s = MB_read_bool(msgBuffer);\n'
+                         % self.upperFirst(field.name))
+            stream.write(self.getIndent())
+            stream.write('if (_has%s) {\n'
+                         % self.upperFirst(field.name))
+            self.indent()
+        elif field.qualifier == 'repeated':
+            indexField = '[i]'
+            stream.write(self.getIndent())
+            stream.write('uint32_t ' + field.name
+                         + 'Size = MB_read_uint32(msgBuffer);\n')
+            stream.write(self.getIndent())
+            stream.write(field.name + 'size =' + field.name
+                         + 'Size);\n')
+            stream.write(self.getIndent())
+            stream.write('for (uint32_t i = 0; i < ' + field.name
+                         + 'Size; ++i) {\n')
+            self.indent()
+
+        stream.write(self.getIndent())
+        methodName = self.getDeSerializeMethodName(field.typeid.name)
+        if None == methodName:  # field has no Deserialize Method Name found 
in the map
+
+         # non native field case
+
+            if field.typeid.name in [m.name for m in self.AST.messages]:
+                stream.write(field.name + indexField
+                             + '_deserialize(msgBuffer);\n')
+            elif field.typeid.name in [m.name for m in self.AST.enums]:
+
+            # enum type field case (enum are deserialized as uint32)
+
+                targetTypeName = \
+                    self.getTargetTypeName(field.typeid.name)
+                methodName = self.getDeSerializeMethodName('uint32')
+
+                # We should check if the uint32 value is in enum range before 
casting it into enumtype
+
+                stream.write(field.name + indexField + ' = static_cast<'
+                              + targetTypeName + '>(MB_'
+                             + methodName + ' ());\n')
+            else:
+
+            # native field case
+
+                stream.write(self.commentLineBeginWith
+                             + ' FIXME FIXME FIXME\n')
+                stream.write(self.getIndent()
+                             + self.commentLineBeginWith
+                             + " don't know how to deserialize native field 
<%s> of type <%s>\n"
+                              % (field.name, field.typeid.name))
+        else:
+
+              # field has one Deserialize Method Name found in the map
+
+            if methodName == 'read_string':
+                stream.write('MB_' + methodName + '(msgBuffer,'
+                             + field.name + indexField + ');\n')
+            else:
+
+                # We may have to vast in order to enforce conversion
+
+                if isinstance(field.typeid, GenMsgAST.NativeType):
+                    stream.write(field.name + indexField
+                                 + ' = static_cast<'
+                                 + field.typeid.name + '>(MB_'
+                                 + methodName + '(msgBuffer));\n')
+                else:
+                    stream.write(field.name + indexField
+                                 + ' = MB_' + methodName
+                                 + '(msgBuffer);\n')
+
+        if field.qualifier == 'optional':
+            self.unIndent()
+            stream.write(self.getIndent() + '}\n')
+        elif field.qualifier == 'repeated':
+            self.unIndent()
+            stream.write(self.getIndent() + '}\n')
+
+    def writeFactoryCreator(self, stream):
+        creator = (self.AST.factory.creator[0], self.AST.factory.name) \
+            + self.AST.factory.creator[1:]
+        stream.write(self.getIndent() + '%s* %s_%s(%s type) throw ('
+                     % creator)
+        stream.write('%s' % self.exception[0])
+        for exception in self.exception[1:]:
+            stream.write(' ,%s' % exception)
+        stream.write(') { \n')
+
+        self.indent()
+        stream.write(self.getIndent() + '''%s* msg = NULL;
+
+'''
+                     % creator[0])
+        stream.write(self.getIndent() + 'switch (type) {\n')
+        self.indent()
+        for e in self.AST.eMessageType.values:
+            if None != self.replacePrefix:
+                stream.write(self.getIndent() + 'case %s_%s:\n'
+                             % (creator[0],
+                             e.name.replace(self.replacePrefix[0], '',
+                             1)))
+            else:
+                stream.write(self.getIndent() + 'case %s_%s:\n'
+                             % (creator[0], e.name))
+
+            self.indent()
+
+            if None == e.type:
+
+        # we throw here the first exception of the list
+
+                stream.write(self.getIndent()
+                             + 'throw %s("%s message type should not be 
used!!");\n'
+                              % (self.exception[0], e.name))
+            else:
+                stream.write(self.getIndent() + 'msg = new %s();\n'
+                             % e.type)
+            stream.write(self.getIndent() + 'break;\n')
+            self.unIndent()
+        self.unIndent()
+        stream.write(self.getIndent() + '} '
+                     + self.commentLineBeginWith
+                     + ' end if switch (type)\n')
+        stream.write(self.getIndent() + 'return msg;\n')
+        self.unIndent()
+        stream.write(self.getIndent() + '''} /* end of %s_%s */
+
+'''
+                     % (creator[1], creator[2]))
+
+    def writeFactoryReceiver(self, stream):
+        receiver = (self.AST.factory.receiver[0],
+                    self.AST.factory.name) \
+            + self.AST.factory.receiver[1:]
+        stream.write(self.getIndent() + '%s* %s_%s(%s stream) throw ('
+                     % receiver)
+        stream.write('%s' % self.exception[0])
+        for exception in self.exception[1:]:
+            stream.write(' ,%s' % exception)
+        stream.write(') { \n')
+
+        self.indent()
+        stream.write(self.getIndent() + self.commentLineBeginWith
+                     + ' FIXME This is not thread safe\n')
+        stream.write(self.getIndent() + 'static %s msgBuffer;\n'
+                     % self.serializeBufferType)
+        stream.write(self.getIndent() + '%s  msgGen;\n' % receiver[0])
+        stream.write(self.getIndent() + '''%s* msg;
+
+''' % receiver[0])
+        stream.write(self.getIndent() + self.commentLineBeginWith
+                     + ' receive generic message \n')
+        stream.write(self.getIndent()
+                     + 'msgGen.receive(stream,msgBuffer);\n')
+        stream.write(self.getIndent() + self.commentLineBeginWith
+                     + ' create specific message from type \n')
+
+        stream.write(self.getIndent() + 'msg = ')
+        stream.write(self.AST.factory.name + '_'
+                     + self.AST.factory.creator[1] + '(msgGen.%s);\n'
+                     % self.messageTypeGetter)
+
+        stream.write(self.getIndent()
+                     + 'MB_assumeSizeFromReservedBytes();\n')
+        stream.write(self.getIndent() + 'msg->deserialize(msgBuffer);\n'
+                     )
+        stream.write(self.getIndent() + 'return msg;\n')
+        self.unIndent()
+        stream.write(self.getIndent() + '''} /* end of %s_constructor */ 
+
+'''
+                     % (receiver[1], receiver[2]))
+
+    def applyToFields(
+        self,
+        stream,
+        fields,
+        applyObject,
+        ):
+        for field in fields:
+            if isinstance(field, GenMsgAST.MessageType.CombinedField):
+                for cfield in field.fields:
+                    applyObject(stream, cfield)
+            else:
+                applyObject(stream, field)
+
+    def generateBody(self, stream, factoryOnly=False):
+        """
+        Generate the body.
+        """
+
+        # add necessary standard includes
+
+
+        # [Try to] add corresponding header include
+
+        supposedHeaderName = stream.name
+        if supposedHeaderName != '<stdout>':
+            supposedHeaderName = os.path.basename(supposedHeaderName)
+            supposedHeaderName = os.path.splitext(supposedHeaderName)[0]
+            stream.write('#include "' + supposedHeaderName + '.h"\n')
+
+        # Generate namespace for specified package package
+        # we may have nested namespace
+
+        self.openNamespaces(stream)
+        if not factoryOnly:
+
+            # Generate message type
+
+            for msg in self.AST.messages:
+
+                # Generate Constructor
+
+                stream.write(self.getIndent() + '%s_create(%s* cthis) {\n'
+                             % (msg.name, msg.name))
+                self.indent()
+                if msg.hasMerge():
+
+                    # Assign my name.
+
+                    stream.write(self.getIndent()
+                                 + 'char* temp;\n ' + self.getIndent() +
+                                'temp = malloc(sizeof(char)*strlen("' + 
msg.name
+                                 + '")));\n')
+                    stream.write(self.getIndent() + 'strcpy(temp,"' + msg.name 
+ '");\n')
+                    stream.write(self.getIndent()
+                                 + 'cthis->super->messageName = temp; \n')
+                                 
+                    if None != self.replacePrefix:
+                        stream.write(self.getIndent() + 'cthis->super->type = '
+                                + 
msg.name.upper().replace(self.replacePrefix[0],
+                                self.replacePrefix[1], 1) + ';\n')
+                    else:
+                        stream.write(self.getIndent() + 'cthis->super->type = '
+                                + msg.name.upper() + ';\n')
+
+                # Write init value if any was provided and alloc memory
+
+                if len(msg.fields) > 0:
+                    self.applyToFields(stream, msg.fields,
+                            self.writeInitFieldStatement)
+                self.unIndent()
+                stream.write(self.getIndent() + '}\n')
+
+                # Generate Destructor
+
+                stream.write(self.getIndent() + 'void %s_destroy(%s* cthis) 
{\n'
+                             % (msg.name, msg.name))
+                self.indent()
+                stream.write(self.getIndent() + 'free(cthis);\n')
+                self.unIndent()
+                stream.write(self.getIndent() + '}\n\n')
+
+                # write virtual serialize and deserialize
+                # if we have some specific field
+
+                if len(msg.fields) > 0:
+
+                    # begin serialize method
+
+                    stream.write(self.getIndent()
+                                 + 'void %s_serialize(%s* msgBuffer) {\n'
+                                  % (msg.name,
+                                 self.serializeBufferType))
+                    self.indent()
+                    if msg.hasMerge():
+                        stream.write(self.getIndent()
+                                + self.commentLineBeginWith)
+                        stream.write('Call mother class\n')
+                        stream.write(self.getIndent()
+                                + 'Super_serialize(msgBuffer);\n')
+                    stream.write(self.getIndent()
+                                 + self.commentLineBeginWith)
+                    stream.write('Specific serialization code\n')
+                    self.applyToFields(stream, msg.fields,
+                            self.writeSerializeFieldStatement)
+                    self.unIndent()
+                    stream.write(self.getIndent() + '''}
+
+''')
+
+                    # end serialize method
+
+                    # begin deserialize method
+
+                    stream.write(self.getIndent()
+                                 + 'void %s_deserialize(%s* msgBuffer) {\n'
+                                  % (msg.name,
+                                 self.serializeBufferType))
+                    self.indent()
+                    if msg.hasMerge():
+                        stream.write(self.getIndent()
+                                + self.commentLineBeginWith)
+                        stream.write('Call mother class\n')
+                        stream.write(self.getIndent()
+                                + 'Super_deserialize(msgBuffer);\n')
+                    stream.write(self.getIndent()
+                                 + self.commentLineBeginWith)
+                    stream.write('Specific deserialization code\n')
+                    self.applyToFields(stream, msg.fields,
+                            self.writeDeSerializeFieldStatement)
+                    self.unIndent()
+                    stream.write(self.getIndent() + '''}
+
+''')
+
+                    # end deserialize method
+                    # begin show method
+
+                    stream.write(self.getIndent()
+                                 + 'FILE* %s_show(FILE* out) {\n'
+                                  % msg.name)
+                    self.indent()
+                    stream.write(self.getIndent()
+                                 + 'fprintf(out,"[%s -Begin] \\n");\n'
+                                 % msg.name)
+                    stream.write(self.getIndent()
+                                 + 'fflush(out);')
+                    if msg.hasMerge():
+                        stream.write(self.getIndent()
+                                + self.commentLineBeginWith)
+                        stream.write('Call mother class\n')
+                        stream.write(self.getIndent()
+                                + 'Super_show(out);\n')
+                    stream.write(self.getIndent()
+                                 + self.commentLineBeginWith)
+                    stream.write('Specific show code\n')
+                    self.applyToFields(stream, msg.fields,
+                            self.writeShowFieldStatement)
+                    stream.write(self.getIndent()
+                                 + 'fprintf(out,"[%s -End] \\n");\n'
+                                 % msg.name)
+                    stream.write(self.getIndent()
+                                 + 'fflush(out);\n')
+                    stream.write(self.getIndent() + 'return out;\n')
+                    self.unIndent()
+                    stream.write(self.getIndent() + '''}
+
+''')
+
+                    # end show method
+
+        # Generate Factory (if any)
+        # @todo
+
+        if self.AST.hasFactory():
+
+            # begin creator
+
+            self.writeFactoryCreator(stream)
+
+            # begin receiver
+
+            if self.AST.factory.hasFactoryReceiver():
+                self.writeFactoryReceiver(stream)
+
+        self.closeNamespaces(stream)
+
+
+class CCERTIMessageGenerator(CCERTIGenerator):
+
+    """
+    This is a C generator for C{MessageAST}.
+    
+    """
+
+    def generatorName(cls):
+        return 'CCERTIMessage'
+
+    generatorName = classmethod(generatorName)
+
+    def __init__(self, MessageAST):
+        super(CCERTIMessageGenerator, self).__init__(MessageAST)
+        self.replacePrefix = list()
+        self.replacePrefix.append('M_')
+        self.replacePrefix.append('Message::')
+        self.exportPrefix = 'CERTI_EXPORT'
+        self.serializeBufferType = 'MsgBuffer_t'
+        self.messageTypeGetter = 'getMessageType()'
+        self.exception = ['NetworkError', 'NetworkSignal']
+
+
+class CCERTINetworkMessageGenerator(CCERTIGenerator):
+
+    """
+    This is a C generator for C{MessageAST}.
+    
+    """
+
+    def generatorName(cls):
+        return 'CCERTINetworkMessage'
+
+    generatorName = classmethod(generatorName)
+
+    def __init__(self, MessageAST):
+        super(CCERTINetworkMessageGenerator,
+              self).__init__(MessageAST)
+        self.replacePrefix = list()
+        self.replacePrefix.append('NM_')
+        self.replacePrefix.append('NetworkMessage::')
+        self.exportPrefix = 'CERTI_EXPORT'
+        self.serializeBufferType = 'MsgBuffer_t'
+        self.messageTypeGetter = 'getMessageType()'
+        self.exception = ['NetworkError', 'NetworkSignal']
+
+



reply via email to

[Prev in Thread] Current Thread [Next in Thread]