certi-cvs
[Top][All Lists]
Advanced

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

[certi-cvs] certi/scripts GenerateMessages.py CERTI_Network...


From: certi-cvs
Subject: [certi-cvs] certi/scripts GenerateMessages.py CERTI_Network...
Date: Wed, 25 Nov 2009 21:07:52 +0000

CVSROOT:        /sources/certi
Module name:    certi
Changes by:     Eric NOULARD <erk>      09/11/25 21:07:52

Modified files:
        scripts        : GenerateMessages.py CERTI_NetworkMessage.msg 

Log message:
        Check-in improvement patch from Mathias
        patch #6999: Improving the network messages scripts

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenerateMessages.py?cvsroot=certi&r1=1.23&r2=1.24
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/CERTI_NetworkMessage.msg?cvsroot=certi&r1=1.12&r2=1.13

Patches:
Index: GenerateMessages.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenerateMessages.py,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -b -r1.23 -r1.24
--- GenerateMessages.py 18 Nov 2009 18:50:48 -0000      1.23
+++ GenerateMessages.py 25 Nov 2009 21:07:51 -0000      1.24
@@ -19,7 +19,7 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 ## USA
 ##
-## $Id: GenerateMessages.py,v 1.23 2009/11/18 18:50:48 erk Exp $
+## $Id: GenerateMessages.py,v 1.24 2009/11/25 21:07:51 erk Exp $
 ## ----------------------------------------------------------------------------
 
 """
@@ -107,6 +107,7 @@
    'merge'    : 'MERGE',
    'enum'     : 'ENUM',
    'default'  : 'DEFAULT',
+   'representation' : 'REPRESENTATION',            
    'required' : 'REQUIRED',
    'optional' : 'OPTIONAL',
    'repeated' : 'REPEATED',
@@ -512,13 +513,17 @@
     A C{NaptiveType} is a simple C{ASTElement} whose
     name is the name the native type.
     """
-    def __init__(self,name,languages):
+    def __init__(self,name,lines):
         super(NativeType,self).__init__(name=name)
         # store language line list in a dictionnary
         # in order to ease retrieval
         self.languages = dict()
-        for l in languages:
+        self.representation = None
+        for l in lines:
+            if isinstance(l,NativeType.LanguageLine):
             self.languages[l.name] = l        
+            else:
+                self.representation = l.representation
         
     def __repr__(self):
         return "native %s" % self.name
@@ -527,6 +532,9 @@
         if language in self.languages.keys():
             return self.languages[language]
      
+    def getRepresentation(self):
+        return self.representation
+     
     class LanguageLine(ASTElement):
         """ Represents a Language Line Value
         """
@@ -534,6 +542,13 @@
             super(NativeType.LanguageLine,self).__init__(name=name)    
             self.statement = value.strip("[]")                
                     
+    class RepresentationLine(ASTElement):
+        """ Represents a Representation Line Value
+        """
+        def __init__(self,value):
+            
super(NativeType.RepresentationLine,self).__init__(name='representation')
+            self.representation = value
+                    
 class MessageType(ASTElement):
     """ 
     Represents a message type.
@@ -664,16 +679,16 @@
     p[0].linespan = (p.linespan(1)[0],p.linespan(len(p)-1)[1]) 
     
 def p_native(p): 
-    'native : NATIVE ID LBRACE language_list RBRACE'
+    'native : NATIVE ID LBRACE native_line_list RBRACE'
     # we should reverse the language list
     # because the parse build it the other way around (recursive way)
     p[4].reverse()
     p[0]=NativeType(p[2],p[4])    
     p[0].linespan = (p.linespan(1)[0],p.linespan(5)[1])
     
-def p_language_list(p):
-    '''language_list : language_line eol_comment
-                     | language_line eol_comment language_list'''
+def p_native_line_list(p):
+    '''native_line_list : native_line eol_comment
+                        | native_line eol_comment native_line_list'''
     # Create or append the list (of pair)
     if len(p)==3:
         p[1].comment = p[2]
@@ -683,10 +698,18 @@
         p[3].append(p[1])
         p[0]=p[3]
 
+def p_native_line(p):
+    '''native_line : language_line
+                   | representation_line'''
+    p[0]=p[1]
+
 def p_language_line(p):
     '''language_line : LANGUAGE ID LANGLINE'''
     p[0]=NativeType.LanguageLine(p[2],p[3])
     
+def p_representation_line(p):
+    '''representation_line : REPRESENTATION typeid'''
+    p[0]=NativeType.RepresentationLine(p[2])
         
 def p_enum(p):
     'enum : ENUM ID LBRACE enum_value_list RBRACE'
@@ -1144,16 +1167,31 @@
                                'float'    : 'read_float',
                                'double'   : 'read_double',}
 
+    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):
@@ -1426,47 +1464,81 @@
             
             
     def writeSerializeFieldStatement(self,stream,field):
+        indexField = ''
         if field.qualifier == "optional":
             stream.write(self.getIndent())
             stream.write("msgBuffer.write_bool(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("msgBuffer.write_uint32("+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:
+            if field.typeid.name in [m.name for m in self.AST.messages]:
+                stream.write(field.name+indexField+".serialize(msgBuffer);\n")
+            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"%(field.name,field.typeid.name))            
         else:
             stream.write("msgBuffer."+methodName)
-            stream.write("(%s);\n"%field.name)
+            stream.write("("+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 writeDeSerializeFieldStatement(self,stream,field):
+        indexField = ''
         if field.qualifier == "optional":
             stream.write(self.getIndent())
             stream.write("has%s = msgBuffer.read_bool();\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 = 
msgBuffer.read_uint32();\n")
+            stream.write(self.getIndent())
+            stream.write(field.name+".resize("+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:
+            if field.typeid.name in [m.name for m in self.AST.messages]:
+                
stream.write(field.name+indexField+".deserialize(msgBuffer);\n")
+            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"%(field.name,field.typeid.name))            
         else:
-            stream.write("%s = "%field.name)
-            stream.write("msgBuffer."+methodName+"();\n")
+            if methodName == 'read_string':
+                
stream.write("msgBuffer."+methodName+"("+field.name+indexField+");\n")
+            else:
+                stream.write(field.name+indexField+" = 
msgBuffer."+methodName+"();\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:]
            
@@ -1548,6 +1620,7 @@
                     # begin serialize method 
                     stream.write(self.getIndent()+"void 
%s::serialize(MessageBuffer& msgBuffer) {\n" % msg.name)
                     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")
@@ -1562,6 +1635,7 @@
                     # begin deserialize method
                     stream.write(self.getIndent()+"void 
%s::deserialize(MessageBuffer& msgBuffer) {\n" % msg.name)
                     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")

Index: CERTI_NetworkMessage.msg
===================================================================
RCS file: /sources/certi/certi/scripts/CERTI_NetworkMessage.msg,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- CERTI_NetworkMessage.msg    18 Nov 2009 18:50:48 -0000      1.12
+++ CERTI_NetworkMessage.msg    25 Nov 2009 21:07:52 -0000      1.13
@@ -40,34 +40,47 @@
 }
 
 native AttributeHandle {
+    representation uint16
     language CXX [#include "certi.hh"]
 }
 
 native DimensionHandle {
+    representation uint16
     language CXX [#include "certi.hh"]
 }
 
 native InteractionClassHandle {
+    representation uint16
     language CXX [#include "certi.hh"]
 }
 
 native ObjectClassHandle {
+    representation uint16
+    language CXX [#include "certi.hh"]
+}
+
+native ObjectHandle {
+    representation uint32
     language CXX [#include "certi.hh"]
 }
 
 native ParameterHandle {
+    representation uint16
     language CXX [#include "certi.hh"]
 }
 
 native SpaceHandle {
+    representation uint16
     language CXX [#include "certi.hh"]
 }
 
 native TransportType {
+    representation uint8
     language CXX [#include "certi.hh"]
 }
 
 native OrderType {
+    representation uint8
     language CXX [#include "certi.hh"]
 }
 
@@ -261,10 +274,6 @@
 
 message NM_Request_Class_Attribute_Value_Update : merge NetworkMessage {}
 
-native ObjectHandle {
-       language CXX [#include "certi.hh"]
-}
-
 message NM_Request_Object_Attribute_Value_Update : merge NM_WithHandleArray {
        required ObjectHandle object
 }




reply via email to

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