certi-cvs
[Top][All Lists]
Advanced

[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




reply via email to

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