[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[certi-cvs] certi/scripts GenerateMessages.py CertiNetworkM...
From: |
certi-cvs |
Subject: |
[certi-cvs] certi/scripts GenerateMessages.py CertiNetworkM... |
Date: |
Wed, 15 Jul 2009 20:57:25 +0000 |
CVSROOT: /sources/certi
Module name: certi
Changes by: Eric NOULARD <erk> 09/07/15 20:57:25
Modified files:
scripts : GenerateMessages.py CertiNetworkMessage.msg
Log message:
C++ generator is now able to generate headers
next step is generator body and factory.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenerateMessages.py?cvsroot=certi&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/CertiNetworkMessage.msg?cvsroot=certi&r1=1.1&r2=1.2
Patches:
Index: GenerateMessages.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenerateMessages.py,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- GenerateMessages.py 15 Jul 2009 17:12:02 -0000 1.8
+++ GenerateMessages.py 15 Jul 2009 20:57:24 -0000 1.9
@@ -19,7 +19,7 @@
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
## USA
##
-## $Id: GenerateMessages.py,v 1.8 2009/07/15 17:12:02 erk Exp $
+## $Id: GenerateMessages.py,v 1.9 2009/07/15 20:57:24 erk Exp $
## ----------------------------------------------------------------------------
"""
@@ -28,6 +28,7 @@
import os
import getopt, sys
+import datetime
# We use PLY in order to parse CERTI message specification files
# PLY is there: http://www.dabeaz.com/ply/
import ply.yacc
@@ -36,6 +37,7 @@
# see http://docs.python.org/library/logging.html
import logging
+
# Build some logger related objects
stdoutHandler = logging.StreamHandler(sys.stdout)
# See formatting there:
@@ -50,7 +52,7 @@
print "Usage:\n %s --file=<message> [--language=C++|Java|Python|Text]
[--type=header|body|factory] [--output=<filename>] [--verbose] [--help]" %
os.path.basename(sys.argv[0])
try:
- opts, args = getopt.getopt(sys.argv[1:], "f:l:t:vho:",
["file=","language=","type=","output","verbose","help"])
+ opts, args = getopt.getopt(sys.argv[1:], "f:l:t:o:vh",
["file=","language=","type=","output=","verbose","help"])
except getopt.GetoptError, err:
mainlogger.error("opt = %s, msg = %s" % (err.opt,err.msg))
usage()
@@ -75,7 +77,7 @@
if o in ("-t", "--type"):
gentype=a
if o in ("-o", "--output"):
- output=open(a)
+ output=open(a,mode="w")
if o in ("-v", "--verbose"):
verbose=True
mainlogger.setLevel(logging.INFO)
@@ -257,9 +259,9 @@
@param package: the package which the generated message will belong
this will be used by the specific AST generator
@type package: C{Package}
- @param nativeMessages: the set of native messages described in this
+ @param natives: the set of native messages described in this
C{MessageAST}
- @type nativeMessages: C{set} of C{NativeType}
+ @type natives: C{set} of C{NativeType}
@param messages: the set of messages described in this C{MessageAST}
@type messages: C{set} of C{MessageType}
@@ -267,9 +269,9 @@
def __init__(self,name):
super(MessageAST,self).__init__(name=name)
self.__package = None
- self.__NativeTypeSet = set()
- self.__messageTypeSet = set()
- self.__enumTypeSet = set()
+ self.__nativeTypes = []
+ self.__messageTypes = []
+ self.__enumTypes = []
# The types dictionary is initialized with builtin types
self.__types = {'bool' : ASTElement("bool"),
'string' : ASTElement("string"),
@@ -298,20 +300,20 @@
# pythonic getter/setter using properties
package = property(fget=__getPackage,fset=__setPackage,fdel=None,doc=None)
- def __getNativeTypeSet(self):
- return self.__NativeTypeSet
+ def __getNativeTypes(self):
+ return self.__nativeTypes
# pythonic getter/setter using properties
- nativeMessages =
property(fget=__getNativeTypeSet,fset=None,fdel=None,doc=None)
+ natives = property(fget=__getNativeTypes,fset=None,fdel=None,doc=None)
- def __getMessageTypeSet(self):
- return self.__messageTypeSet
+ def __getMessageTypes(self):
+ return self.__messageTypes
# pythonic getter/setter using properties
- messages = property(fget=__getMessageTypeSet,fset=None,fdel=None,doc=None)
+ messages = property(fget=__getMessageTypes,fset=None,fdel=None,doc=None)
- def __getEnumTypeSet(self):
- return self.__enumTypeSet
+ def __getEnumTypes(self):
+ return self.__enumTypes
# pythonic getter/setter using properties
- enums = property(fget=__getEnumTypeSet,fset=None,fdel=None,doc=None)
+ enums = property(fget=__getEnumTypes,fset=None,fdel=None,doc=None)
def add(self,any):
@@ -362,7 +364,7 @@
@param message: The message type to be added
@type message: C{MessageType}
"""
- self.__messageTypeSet.add(message)
+ self.__messageTypes.append(message)
self.__types[message.name] = message
def addEnumType(self,enumType):
@@ -372,7 +374,7 @@
@param enumType: The enum type to be added
@type enumType: C{EnumType}
"""
- self.__enumTypeSet.add(enumType)
+ self.__enumTypes.append(enumType)
self.__types[enumType.name] = enumType
def addNativeType(self,native):
@@ -382,7 +384,7 @@
@param native: The message type to be added
@type native: C{NativeType}
"""
- self.__NativeTypeSet.add(native)
+ self.__nativeTypes.append(native)
self.__types[native.name] = native
def isDefined(self,typename):
@@ -404,7 +406,7 @@
return typename
def __repr__(self):
- res = "AST with <%d> native message, <%d> enum, <%d> message type(s)"
% (len(self.nativeMessages),len(self.enums),len(self.messages))
+ res = "AST with <%d> native message, <%d> enum, <%d> message type(s)"
% (len(self.natives),len(self.enums),len(self.messages))
res = res + " in package <%s>" % self.package
return res
@@ -416,13 +418,18 @@
@param lines: the comments lines
@type lines: C{list} of C{string}
"""
- def __init__(self,content,optComment):
+ def __init__(self,content,isAtEOL):
"""
C{CommentBlock} constructor
"""
super(CommentBlock,self).__init__(name="ANY Comment Block")
self.lines=[content]
- self.__optComment=optComment
+ self.__isAtEOL=isAtEOL
+
+ def __getisAtEOL(self):
+ return self.__isAtEOL
+ # pythonic getter/setter using properties
+ isAtEOL = property(fget=__getisAtEOL,fset=None,fdel=None,doc="True if the
comment is optional")
class Package(ASTElement):
"""
@@ -531,7 +538,7 @@
'''comment_block : COMMENT
| COMMENT comment_block'''
if len(p)==2:
- p[0]=CommentBlock(p[1].strip('/'),optComment=False)
+ p[0]=CommentBlock(p[1].strip('/'),isAtEOL=False)
else:
p[0]=p[2]
p[0].lines.append(p[1].strip('/'))
@@ -583,20 +590,20 @@
'empty :'
pass
-def p_optional_comment(p):
- '''optional_comment : COMMENT
+def p_eol_comment(p):
+ '''eol_comment : COMMENT
| empty'''
# we may store the comment text for future use
if len(p) > 1 and isinstance(p[1],type("")) :
- p[0] = CommentBlock(p[1].strip('/'),optComment=True)
+ p[0] = CommentBlock(p[1].strip('/'),isAtEOL=True)
p[0].linespan = p.linespan(1)
else:
p[0] = ""
def p_enum_value_list(p):
- '''enum_value_list : enum_val optional_comment
- | enum_val COMMA optional_comment
- | enum_val COMMA optional_comment enum_value_list'''
+ '''enum_value_list : enum_val eol_comment
+ | enum_val COMMA eol_comment
+ | enum_val COMMA eol_comment enum_value_list'''
# Create or append the list (of pair)
if len(p)==3:
p[1].comment = p[2]
@@ -622,8 +629,8 @@
p[0].linespan = p.linespan(1)
def p_field_list(p):
- '''field_list : field_spec optional_comment
- | field_spec optional_comment field_list'''
+ '''field_list : field_spec eol_comment
+ | field_spec eol_comment field_list'''
if len(p)==3:
p[0] = [p[1]]
else:
@@ -631,8 +638,8 @@
p[0].append(p[1])
def p_field_spec(p):
- '''field_spec : qualifier typeid ID optional_comment
- | qualifier typeid ID LBRACKET DEFAULT EQUAL value RBRACKET
optional_comment'''
+ '''field_spec : qualifier typeid ID eol_comment
+ | qualifier typeid ID LBRACKET DEFAULT EQUAL value RBRACKET
eol_comment'''
if len(p)==5:
p[0] = MessageType.MessageField(p[1],p[2],p[3],None)
p[0].comment = p[4]
@@ -690,7 +697,12 @@
return column
def p_error(p):
- print "Syntax error at '%s' on line %d column %d (token type is '%s')" %
(p.value,p.lineno,find_column(p.lexer.lexdata, p),p.type)
+ if lexer in dir(p):
+ msg = "Syntax error at '%s' on line %d column %d (token type is '%s')"
% (p.value,p.lineno,find_column(p.lexer.lexdata, p),p.type)
+ else:
+ msg = "Syntax error at '%s' on line %d (token type is '%s')" %
(p.value,p.lineno,p.type)
+ print msg
+
class ASTChecker(object):
"""
@@ -701,7 +713,6 @@
self.logger = logging.Logger("ASTChecker")
self.logger.setLevel(logging.ERROR)
self.logger.addHandler(stdoutHandler)
- pass
def check(self,AST):
"""
@@ -744,44 +755,142 @@
msg.merge = AST.getType(msg.merge)
AST.checked = True
-class TextGenerator(object):
+class CodeGenerator(object):
"""
- This is a text generator.
+ This is a base class generator for C{MessageAST}.
+
+ This is not a working generator it should be subclassed.
"""
- def __init__(self,MessageAST):
+ def __init__(self,MessageAST,commentLineBeginWith):
self.AST = MessageAST
+ self.commentLineBeginWith = commentLineBeginWith
+ self.logger = logging.Logger("CodeGenerator")
+ self.logger.setLevel(logging.ERROR)
+ self.logger.addHandler(stdoutHandler)
+ self.__indentString = " "
+ self.__indentLevel = 0
+
+ def setIndentString(self,indentString):
+ self.__indentString = indentString
+
+ def indent(self):
+ self.__indentLevel += 1
+
+ def unIndent(self):
+ if self.__indentLevel>0:
+ self.__indentLevel -= 1
+ else:
+ self.logger.error("Trying to unIndent lower than 0!??!")
+
+ def getIndent(self):
+ res=""
+ i = self.__indentLevel
+ while i>0:
+ res = res + self.__indentString
+ i -= 1
+ return res
+
+ def lowerFirst(self,str):
+ res = str[0].lower()+str[1:]
+ return res
+
+ def upperFirst(self,str):
+ res = str[0].upper()+str[1:]
+ return res
def writeComment(self,stream,ASTElement):
+ """
+ Write a comment block to the stream.
+
+ This function may be generic if the target
+ language has whole line comment support
+ with some beginning characters.
+ """
if ASTElement.hasComment():
for line in ASTElement.comment.lines:
- stream.write("// ")
+ # we should not indent optional comment
+ # since they come at the end of a line
+ if not ASTElement.comment.isAtEOL:
+ stream.write(self.getIndent())
+ stream.write(self.commentLineBeginWith)
stream.write(str(line))
stream.write("\n")
else:
stream.write("\n")
- def generate(self,stream):
+ def generateHeader(self,stream):
+ """
+ Generate the header.
+ """
+ self.logger.error("generateHeader not IMPLEMENTED")
+
+ def generateBody(self,stream):
+ """
+ Generate the body.
+ """
+ self.logger.error("generateHeader not IMPLEMENTED")
+
+ def generateFactory(self,stream):
+ """
+ Generate the Factory.
+ """
+ self.logger.error("generateHeader not IMPLEMENTED")
+
+ def generate(self,stream,what):
+ stream.write(self.commentLineBeginWith)
+ stream.write(" Generated on %s by the CERTI message
generator\n"%datetime.datetime.now().strftime("%Y %B %a, %d at %H:%M:%S"))
+ if what.lower() == "header":
+ self.generateHeader(stream)
+ elif what.lower() == "body":
+ self.generateBody(stream)
+ elif what.lower() == "factory":
+ self.generateFactory(stream)
+
+class TextGenerator(CodeGenerator):
+ """
+ This is a text generator for C{MessageAST}.
+
+ This generator should produce almost the same output
+ as the input message specification file.
+ """
+ def __init__(self,MessageAST):
+ super(TextGenerator,self).__init__(MessageAST,"//")
+ self.logger = logging.Logger("TextGenerator")
+ self.logger.setLevel(logging.ERROR)
+ self.logger.addHandler(stdoutHandler)
+
+ def generate(self,stream,what):
+ """
+ Redefine super.generate.
+
+ what is not important in this case.
+ """
# Generate package
if self.AST.hasPackage():
self.writeComment(stream, self.AST.package)
- stream.write("package %s\n" % self.AST.package.name)
+ stream.write("package %s\n\n" % self.AST.package.name)
+
+ # Generate native type
+ for native in self.AST.natives:
+ self.writeComment(stream, native)
+ stream.write("native %s\n\n" % native.name)
+
# Generate enum
for enum in self.AST.enums:
self.writeComment(stream, enum)
stream.write("enum %s {\n" % enum.name)
first = True
+ self.indent()
for enumval in enum.values:
if first:
- stream.write(" %s = %d, " %
(enumval.name,enumval.value))
+ stream.write(self.getIndent()+"%s = %d, " %
(enumval.name,enumval.value))
first=False
else:
- stream.write(" %s, " % enumval.name)
+ stream.write(self.getIndent()+"%s, " % enumval.name)
self.writeComment(stream, enumval)
- stream.write("}\n")
- # Generate native message
- for native in self.AST.nativeMessages:
- self.writeComment(stream, native)
- stream.write("native %s\n" % native.name)
+ self.unIndent()
+ stream.write("}\n\n")
+
# Generate message type
for msg in self.AST.messages:
self.writeComment(stream, msg)
@@ -796,58 +905,170 @@
if field.hasDefaultValue():
stream.write("[default=%s] " % field.defaultValue)
self.writeComment(stream, field)
- stream.write("}\n")
+ stream.write("}\n\n")
+
+class CXXGenerator(CodeGenerator):
+ """
+ This is a C++ generator for C{MessageAST}.
-class CXXGenerator(object):
- """This is a C++ generator"""
+ """
def __init__(self,MessageAST):
- self.AST = MessageAST
+ super(CXXGenerator,self).__init__(MessageAST,"//")
+ self.logger = logging.Logger("CXXGenerator")
+ self.logger.setLevel(logging.ERROR)
+ self.logger.addHandler(stdoutHandler)
- def writeComment(self,stream,ASTElement):
- if ASTElement.hasComment():
- for line in ASTElement.comment.lines:
- stream.write("// ")
- stream.write(str(line))
- stream.write("\n")
- else:
- stream.write("\n")
+ 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()+"namespace %s {\n" % ns)
+ self.indent()
- def generate(self,stream):
- stream.write("C++ generator is NOT Implemented\n")
+ 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):
+ if field.typeid.name == "bool":
+ stream.write(self.getIndent())
+ stream.write("void "+field.name+"On()")
+ stream.write(" {"+field.name+" = true;};\n")
+
+ stream.write(self.getIndent())
+ stream.write("void "+field.name+"Off()")
+ stream.write(" {"+field.name+" = false;};\n")
+
+ stream.write(self.getIndent())
+ stream.write("bool get"+self.upperFirst(field.name)+"()")
+ stream.write(" {return "+field.name+";};\n")
+ else:
+ stream.write(self.getIndent())
+ stream.write(field.typeid.name + "
get"+self.upperFirst(field.name)+"()")
+ stream.write(" {return "+field.name+";};\n")
+
+ stream.write(self.getIndent())
+ stream.write("void set"+self.upperFirst(field.name)+"(")
+ stream.write(field.typeid.name+"
new"+self.upperFirst(field.name)+")")
+ stream.write("
{"+field.name+"=new"+self.upperFirst(field.name)+";};\n")
+
+ def generateHeader(self,stream):
+ # Generate namespace for specified package package
+ # we may have nested namespace
+ self.openNamespaces(stream)
+
+ # Native type should be defined in included header
+ stream.write(self.getIndent()+self.commentLineBeginWith)
+ stream.write("Native types should be defined by included headers\n")
+ for native in self.AST.natives:
+ self.writeComment(stream, native)
+ stream.write(self.getIndent()+self.commentLineBeginWith)
+ stream.write("native %s\n" % native.name)
-class JavaGenerator(object):
- """This is a Java generator"""
- def __init__(self,MessageAST):
- self.AST = MessageAST
+ # Generate enum
+ for enum in self.AST.enums:
+ self.writeComment(stream, enum)
+ stream.write(self.getIndent())
+ stream.write("enum %s {\n" % enum.name)
+ self.indent()
+ first = True
+ for enumval in enum.values:
+ if first:
+ stream.write(self.getIndent())
+ stream.write("%s = %d, " % (enumval.name,enumval.value))
+ first=False
+ else:
+ stream.write(self.getIndent())
+ stream.write("%s, " % enumval.name)
+ self.writeComment(stream, enumval)
+ self.unIndent()
+ stream.write(self.getIndent())
+ stream.write("}"+ self.commentLineBeginWith + "end of enum %s \n"
% enum.name)
- def writeComment(self,stream,ASTElement):
- if ASTElement.hasComment():
- for line in ASTElement.comment.lines:
- stream.write("// ")
- stream.write(str(line))
- stream.write("\n")
+ # Generate message type
+ for msg in self.AST.messages:
+ self.writeComment(stream, msg)
+ stream.write(self.getIndent())
+ stream.write("class CERTI_EXPORT %s" % msg.name)
+ if msg.hasMerge():
+ stream.write(" : public %s {\n" % msg.merge.name)
else:
- stream.write("\n")
+ stream.write(" {\n")
- def generate(self,stream):
- stream.write("Java generator is NOT Implemented\n")
+ self.indent()
-class PythonGenerator(object):
- """This is a Python generator"""
+ # begin public
+ stream.write(self.getIndent()+"public:\n")
+ self.indent()
+ if msg.hasMerge():
+ stream.write(self.getIndent()+"typedef %s
Super;\n"%msg.merge.name)
+ # now write constructor/destructor
+ stream.write(self.getIndent()+msg.name+";\n")
+ stream.write(self.getIndent()+"virtual ~"+msg.name+";\n")
+
+ # write virtual serialize and deserialize
+ # if we have some specific field
+ if len(msg.fields)>0:
+ # serialize/deserialize
+ stream.write(self.getIndent()+"virtual void
serialize(MessageBuffer& msgBuffer);\n")
+ stream.write(self.getIndent()+"virtual void
deserialize(MessageBuffer& msgBuffer);\n")
+ # specific getter/setter
+ stream.write(self.getIndent()+self.commentLineBeginWith+"
specific Getter(s)/Setter(s)\n")
+ for field in msg.fields:
+ self.writeOneGetterSetter(stream,field)
+
+ self.unIndent()
+ # end public:
+
+ # begin protected
+ stream.write(self.getIndent()+"protected:\n")
+ self.indent()
+ for field in msg.fields:
+ stream.write(self.getIndent())
+ stream.write("%s %s;" % (field.typeid.name,field.name))
+ self.writeComment(stream, field)
+ self.unIndent()
+ # end protected
+
+ # begin private
+ stream.write(self.getIndent()+"private:\n")
+ self.indent()
+ self.unIndent()
+ # end private
+
+ self.unIndent()
+ stream.write(self.getIndent() + "}\n")
+
+ # may close any open namespaces
+ self.closeNamespaces(stream)
+
+class JavaGenerator(CodeGenerator):
+ """
+ This is a Java generator for C{MessageAST}.
+ """
def __init__(self,MessageAST):
- self.AST = MessageAST
+ super(JavaGenerator,self).__init__(MessageAST,"//")
+ self.logger = logging.Logger("JavaGenerator")
+ self.logger.setLevel(logging.ERROR)
+ self.logger.addHandler(stdoutHandler)
- def writeComment(self,stream,ASTElement):
- if ASTElement.hasComment():
- for line in ASTElement.comment.lines:
- stream.write("// ")
- stream.write(str(line))
- stream.write("\n")
- else:
- stream.write("\n")
+class PythonGenerator(CodeGenerator):
+ """
+ This is a Python generator for C{MessageAST}.
+ """
+ def __init__(self,MessageAST):
+ super(PythonGenerator,self).__init__(MessageAST,"##")
+ self.logger = logging.Logger("PythonGenerator")
+ self.logger.setLevel(logging.ERROR)
+ self.logger.addHandler(stdoutHandler)
- def generate(self,stream):
- stream.write("Python generator is NOT Implemented\n")
# Build the PLY parser
parserlogger = logging.Logger("MessageParser")
@@ -861,6 +1082,9 @@
lexer.lineno = 1
parser.AST = MessageAST(messagefile)
parser.parse(msgFile.read(),lexer=lexer)
+parser.AST.messages.reverse()
+parser.AST.enums.reverse()
+parser.AST.natives.reverse()
msgFile.close()
mainlogger.info("Parse succeeded %s" % (parser.AST))
@@ -871,41 +1095,27 @@
mainlogger.info("AST properties checked Ok.")
else:
mainlogger.error("AST has error, generation step may produce invalid
files!!!")
+ sys.exit()
mainlogger.info("Generate %s from AST,..."%language)
if language=="Text":
textGen = TextGenerator(parser.AST)
- textGen.generate(sys.stdout)
+ textGen.generate(output,gentype)
elif language=="C++":
cxxGen = CXXGenerator(parser.AST)
- cxxGen.generate(sys.stdout)
+ cxxGen.generate(output,gentype)
elif language=="Java":
cxxGen = JavaGenerator(parser.AST)
- cxxGen.generate(sys.stdout)
+ cxxGen.generate(output,gentype)
elif language=="Python":
cxxGen = PythonGenerator(parser.AST)
- cxxGen.generate(sys.stdout)
+ cxxGen.generate(output,gentype)
mainlogger.info("Generate %s from AST, Done."%language)
sys.exit()
for l in msgFile:
cname = l.strip('_ \n')
- if (gentype.lower()=="header"):
- print "/*<BEGIN>---------- %s ------------<BEGIN>*/" % cname.title()
- print "class CERTI_EXPORT NM_%s : public NetworkMessage {" %
cname.title()
- print " public:"
- print " NM_%s();" % cname.title()
- print " virtual ~NM_%s();" % cname.title()
- print " virtual void serialize();"
- print " virtual void deserialize();"
- print " /* specific Getter/Setter */"
- print " protected:"
- print " /* specific field */"
- print " private:"
- print "};\n"
- print "/*<END>---------- %s ------------<END>*/\n" % cname.title()
-
if (gentype.lower()=="body"):
print "/*<BEGIN>---------- %s ------------<BEGIN>*/" % cname.title()
Index: CertiNetworkMessage.msg
===================================================================
RCS file: /sources/certi/certi/scripts/CertiNetworkMessage.msg,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- CertiNetworkMessage.msg 14 Jul 2009 12:40:49 -0000 1.1
+++ CertiNetworkMessage.msg 15 Jul 2009 20:57:25 -0000 1.2
@@ -1,108 +1,192 @@
-// CERTI messages description
+// ----------------------------------------------------------------------------
+// CERTI - HLA RunTime Infrastructure
+// Copyright (C) 2002-2008 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
+//
+// ----------------------------------------------------------------------------
+// CERTI Network Messages description
+// ----------------------------------------------------------------------------
// The messages related classes will be placed in the certi package
package certi
+// Basic Message is the base class message for CERTI
+native BasicMessage
+
// Network message is the base class
// for message exchanged between RTIA and RTIG
// AKA CERTI Network Message
-native_message NetworkMessage
+native NetworkMessage
+
+// Message is the base class
+// for message exchanged between Federate and RTIA
+// AKA CERTI Message
+native Message
+
+enum SampleMessageType {
+ NOT_USED,
+ SMT_BASIC,
+ SMT_NETWORK_MESSAGE,
+ SMT_MESSAGE
+}
+
+native AttributeHandle
+message NM_WithHandleArray : merge NetworkMessage {
+ repeated AttributeHandle handle
+}
+
+message NM_DDM_Base : merge NM_WithHandleArray {
+ required bool DDM_bool
+}
+
+message NM_Close_Connexion : merge NetworkMessage {}
+
+message NM_Message_Null : merge NetworkMessage {}
+
+message NM_Create_Federation_Execution : merge NetworkMessage {}
+
+message NM_Destroy_Federation_Execution : merge NetworkMessage {}
+
+message NM_Join_Federation_Execution : merge NetworkMessage {}
+
+message NM_Resign_Federation_Execution : merge NetworkMessage {}
+
+message NM_Set_Time_Regulating : merge NetworkMessage {
+ required bool regulator
+}
+
+message NM_Set_Time_Constrained : merge NetworkMessage {
+ required bool regulator
+}
+
+message NM_Time_Regulation_Enabled : merge NetworkMessage {}
+
+message NM_Time_Constrained_Enabled : merge NetworkMessage {}
+
+native ObjectClassHandle
+message NM_Start_Registration_For_Object_Class : merge NetworkMessage {
+ required ObjectClassHandle objectClass
+}
+
+message NM_Stop_Registration_For_Object_Class : merge NetworkMessage {
+}
+
+message NM_Set_Class_Relevance_Advisory_Switch : merge NetworkMessage {
+ required bool classRelevanceAdvisorySwitch // value of CRA switch
+}
+
+message NM_Set_Interaction_Relevance_Advisory_Switch : merge NetworkMessage {
+ required bool interactionRelevanceAdvisorySwitch // value of IRA switch
+}
+
+message NM_Set_Attribute_Relevance_Advisory_Switch : merge NetworkMessage {
+ required bool attributeRelevanceAdvisorySwitch // value of ARA switch
+}
+
+message NM_Set_Attribute_Scope_Advisory_Switch : merge NetworkMessage {
+ required bool attributeScopeAdvisorySwitch // value of ASA switch
+}
+
+message NM_Register_Federation_Synchronization_Point : merge NetworkMessage {
+ required bool setExists // tell whether if the synchronization set is
specified or not
+}
+
+message NM_Synchronization_Point_Registration_Succeeded : merge NetworkMessage
{}
+
+message NM_Announce_Synchronization_Point : merge NetworkMessage {}
+
+message NM_Synchronization_Point_Achieved : merge NetworkMessage {}
+
+message NM_Federation_Synchronized : merge NetworkMessage {}
+
+message NM_Request_Federation_Save : merge NetworkMessage {}
+
+message NM_Federate_Save_Begun : merge NetworkMessage {}
+
+message NM_Federate_Save_Complete : merge NetworkMessage {}
+
+message NM_Federate_Save_Not_Complete : merge NetworkMessage {}
+
+message NM_Initiate_Federate_Save : merge NetworkMessage {}
+
+message NM_Federation_Saved : merge NetworkMessage {}
+
+message NM_Federation_Not_Saved : merge NetworkMessage {}
+
+message NM_Request_Federation_Restore : merge NetworkMessage {}
+
+message NM_Federate_Restore_Complete : merge NetworkMessage {}
+
+message NM_Federate_Restore_Not_Complete : merge NetworkMessage {}
+
+message NM_Request_Federation_Restore_Succeeded : merge NetworkMessage {}
+
+message NM_Request_Federation_Restore_Failed : merge NetworkMessage {}
+
+message NM_Federation_Restore_Begun : merge NetworkMessage {}
+
+message NM_Initiate_Federate_Restore : merge NetworkMessage {}
+
+message NM_Federation_Restored : merge NetworkMessage {}
+
+message NM_Federation_Not_Restored : merge NetworkMessage {}
+
+message NM_Publish_Object_Class : merge NM_WithHandleArray {}
+
+message NM_Unpublish_Object_Class : merge NetworkMessage {}
+
+native InteractionClassHandle
+message NM_Publish_Interaction_Class : merge NetworkMessage {
+ required InteractionClassHandle interactionClass // the interaction
class
+}
+
+message NM_Unpublish_Interaction_Class : merge NM_Publish_Interaction_Class {}
+
+message NM_Subscribe_Object_Class : merge NM_WithHandleArray {}
+
+message NM_Unsubscribe_Object_Class : merge NM_Unpublish_Object_Class {}
+
+message NM_Subscribe_Interaction_Class : merge NM_Publish_Interaction_Class {}
+
+message NM_Unsubscribe_Interaction_Class : merge NM_Publish_Interaction_Class
{}
+
+message NM_Turn_Interactions_On : merge NM_Publish_Interaction_Class {}
+
+message NM_Turn_Interactions_Off : merge NM_Publish_Interaction_Class {}
+
+message NM_Register_Object : merge NetworkMessage {}
+
+message NM_Discover_Object : merge NM_Register_Object {}
+
+message NM_Update_Attribute_Values : merge NM_WithHandleArray {}
+
+message NM_Reflect_Attribute_Values : merge NM_Update_Attribute_Values {}
+
+message NM_Send_Interaction : merge NM_WithHandleArray {}
+
+message NM_Receive_Interaction : merge NM_Send_Interaction {}
+
+message NM_Delete_Object : merge NM_Register_Object {}
-native_message BasicMessage
+message NM_Remove_Object : merge NM_Delete_Object {}
-native_message Message
+message NM_Change_Attribute_Transport_Type : merge NetworkMessage {}
-enum Message_T {
- NOT_USED = 0, // Not used.
- CLOSE_CONNEXION,
- MESSAGE_NULL,
- CREATE_FEDERATION_EXECUTION,
- DESTROY_FEDERATION_EXECUTION,
- JOIN_FEDERATION_EXECUTION,
- RESIGN_FEDERATION_EXECUTION,
- SET_TIME_REGULATING,
- SET_TIME_CONSTRAINED,
- TIME_REGULATION_ENABLED, // RTIG to RTIA
- TIME_CONSTRAINED_ENABLED, // RTIG to RTIA
- REGISTER_FEDERATION_SYNCHRONIZATION_POINT,
- SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED, // RTIG to RTIA
- ANNOUNCE_SYNCHRONIZATION_POINT, // RTIG to RTIA
- SYNCHRONIZATION_POINT_ACHIEVED,
- FEDERATION_SYNCHRONIZED, // RTIG to RTIA
- REQUEST_FEDERATION_SAVE,
- FEDERATE_SAVE_BEGUN,
- FEDERATE_SAVE_COMPLETE,
- FEDERATE_SAVE_NOT_COMPLETE,
- INITIATE_FEDERATE_SAVE, // RTIG to RTIA
- FEDERATION_SAVED, // RTIG to RTIA
- FEDERATION_NOT_SAVED, // RTIG to RTIA
- REQUEST_FEDERATION_RESTORE,
- FEDERATE_RESTORE_COMPLETE,
- FEDERATE_RESTORE_NOT_COMPLETE,
- REQUEST_FEDERATION_RESTORE_SUCCEEDED, // RTIG to RTIA
- REQUEST_FEDERATION_RESTORE_FAILED, // RTIG to RTIA
- FEDERATION_RESTORE_BEGUN, // RTIG to RTIA
- INITIATE_FEDERATE_RESTORE, // RTIG to RTIA
- FEDERATION_RESTORED, // RTIG to RTIA
- FEDERATION_NOT_RESTORED, // RTIG to RTIA
- PUBLISH_OBJECT_CLASS,
- UNPUBLISH_OBJECT_CLASS,
- PUBLISH_INTERACTION_CLASS,
- UNPUBLISH_INTERACTION_CLASS,
- SUBSCRIBE_OBJECT_CLASS,
- UNSUBSCRIBE_OBJECT_CLASS,
- SUBSCRIBE_INTERACTION_CLASS,
- UNSUBSCRIBE_INTERACTION_CLASS,
- TURN_INTERACTIONS_ON, // only RTIG->RTIA
- TURN_INTERACTIONS_OFF, // only RTIG->RTIA
- REGISTER_OBJECT,
- DISCOVER_OBJECT, // only RTIG->RTIA
- UPDATE_ATTRIBUTE_VALUES,
- REFLECT_ATTRIBUTE_VALUES, // only RTIG->RTIA
- SEND_INTERACTION,
- RECEIVE_INTERACTION, // only RTIG->RTIA
- DELETE_OBJECT,
- REMOVE_OBJECT, // only RTIG->RTIA
- CHANGE_ATTRIBUTE_TRANSPORT_TYPE,
- CHANGE_ATTRIBUTE_ORDER_TYPE,
- CHANGE_INTERACTION_TRANSPORT_TYPE,
- CHANGE_INTERACTION_ORDER_TYPE,
- REQUEST_CLASS_ATTRIBUTE_VALUE_UPDATE,
- REQUEST_OBJECT_ATTRIBUTE_VALUE_UPDATE,
- IS_ATTRIBUTE_OWNED_BY_FEDERATE,
- QUERY_ATTRIBUTE_OWNERSHIP,
- ATTRIBUTE_IS_NOT_OWNED,
- INFORM_ATTRIBUTE_OWNERSHIP,
- NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE,
- ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION,
- ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION,
- REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION,
- ATTRIBUTE_OWNERSHIP_UNAVAILABLE,
- ATTRIBUTE_OWNERSHIP_ACQUISITION_IF_AVAILABLE,
- UNCONDITIONAL_ATTRIBUTE_OWNERSHIP_DIVESTITURE,
- ATTRIBUTE_OWNERSHIP_ACQUISITION,
- REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE,
- CANCEL_NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE,
- ATTRIBUTE_OWNERSHIP_RELEASE_RESPONSE,
- CANCEL_ATTRIBUTE_OWNERSHIP_ACQUISITION,
- CONFIRM_ATTRIBUTE_OWNERSHIP_ACQUISITION_CANCELLATION,
- DDM_CREATE_REGION,
- DDM_MODIFY_REGION,
- DDM_DELETE_REGION,
- DDM_ASSOCIATE_REGION,
- DDM_REGISTER_OBJECT,
- DDM_UNASSOCIATE_REGION,
- DDM_SUBSCRIBE_ATTRIBUTES,
- DDM_UNSUBSCRIBE_ATTRIBUTES,
- DDM_SUBSCRIBE_INTERACTION,
- DDM_UNSUBSCRIBE_INTERACTION,
- PROVIDE_ATTRIBUTE_VALUE_UPDATE,
- GET_FED_FILE,
- SET_CLASS_RELEVANCE_ADVISORY_SWITCH,
- SET_INTERACTION_RELEVANCE_ADVISORY_SWITCH,
- SET_ATTRIBUTE_RELEVANCE_ADVISORY_SWITCH,
- SET_ATTRIBUTE_SCOPE_ADVISORY_SWITCH,
- START_REGISTRATION_FOR_OBJECT_CLASS,
- STOP_REGISTRATION_FOR_OBJECT_CLASS,
- LAST
+message NM_Get_FED_File : merge NetworkMessage {
+ required string FEDid // the FED identifier
+ required string line // one line of the FED file
}
\ No newline at end of file
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [certi-cvs] certi/scripts GenerateMessages.py CertiNetworkM...,
certi-cvs <=