[Top][All Lists]
[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']
+
+