[Top][All Lists]
[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, 16 Sep 2009 09:57:29 +0000 |
CVSROOT: /sources/certi
Module name: certi
Changes by: Eric NOULARD <erk> 09/09/16 09:57:29
Modified files:
scripts : GenerateMessages.py CERTI_NetworkMessage.msg
Log message:
Generate receiver method.
Handle string default values.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenerateMessages.py?cvsroot=certi&r1=1.21&r2=1.22
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/CERTI_NetworkMessage.msg?cvsroot=certi&r1=1.10&r2=1.11
Patches:
Index: GenerateMessages.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenerateMessages.py,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- GenerateMessages.py 11 Sep 2009 18:02:23 -0000 1.21
+++ GenerateMessages.py 16 Sep 2009 09:57:29 -0000 1.22
@@ -19,7 +19,7 @@
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
## USA
##
-## $Id: GenerateMessages.py,v 1.21 2009/09/11 18:02:23 erk Exp $
+## $Id: GenerateMessages.py,v 1.22 2009/09/16 09:57:29 erk Exp $
## ----------------------------------------------------------------------------
"""
@@ -132,6 +132,7 @@
'INTEGER_VALUE',
'FLOAT_VALUE',
'BOOL_VALUE',
+ 'STRING_VALUE',
'RBRACE','LBRACE',
'RPAREN','LPAREN',
# 'RBRACKET','LBRACKET',
@@ -186,6 +187,10 @@
t.value = False
return t
+def t_STRING_VALUE(t):
+ r'\".*\"'
+ return t
+
t_LBRACE = r'{'
t_RBRACE = r'}'
#t_LBRACKET = r'\['
@@ -790,7 +795,8 @@
def p_value(p):
'''value : INTEGER_VALUE
| FLOAT_VALUE
- | BOOL_VALUE'''
+ | BOOL_VALUE
+ | STRING_VALUE'''
p[0]=p[1]
# Compute column.
@@ -841,9 +847,13 @@
# check if all field used in message have known types
# At the same time build the enum values for MessageTypes
- msgTypeEnumVals = [EnumType.EnumValue("NOT_USED",None)]
+ enumval = EnumType.EnumValue("NOT_USED",None)
+ enumval.type = None
+ msgTypeEnumVals = [enumval]
for msg in AST.messages:
- msgTypeEnumVals.append(EnumType.EnumValue(msg.name.upper(),None))
+ enumval = EnumType.EnumValue(msg.name.upper(),None)
+ enumval.type = msg.name
+ msgTypeEnumVals.append(enumval)
for f in msg.fields:
if not AST.isDefined(f.typeid):
self.logger.fatal("The type <%s> used for field <%s.%s> is
unknown (not a builtin, nor native, nor message)" % (f.typeid,msg.name,f.name))
@@ -852,8 +862,12 @@
return
else:
f.typeid = AST.getType(f.typeid)
- msgTypeEnumVals.append(EnumType.EnumValue("LAST",None))
-
AST.add(EnumType(AST.name.split(".")[0]+"_MessageType",msgTypeEnumVals))
+ enumval = EnumType.EnumValue("LAST",None)
+ enumval.type = None
+ msgTypeEnumVals.append(enumval)
+ AST.eMessageType =
EnumType(AST.name.split(".")[0]+"_MessageType",msgTypeEnumVals)
+ AST.add(AST.eMessageType)
+
# @todo
# Should check if the default value of a field
@@ -1101,7 +1115,46 @@
'uint64' : 'uint64_t',
'float' : 'float_t',
'double' : 'double_t',}
+ 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',}
+
+ def getSerializeMethodName(self,name):
+ if name in self.serializeTypeMap.keys():
+ return self.serializeTypeMap[name]
+ else:
+ return None
+ def getDeSerializeMethodName(self,name):
+ if name in self.deserializeTypeMap.keys():
+ return self.deserializeTypeMap[name]
+ else:
+ return None
def openNamespaces(self,stream):
if self.AST.hasPackage():
@@ -1167,8 +1220,17 @@
stream.write(self.getIndent())
stream.write("void set"+self.upperFirst(field.name)+"(")
- stream.write(targetTypeName+"
new"+self.upperFirst(field.name)+")")
- stream.write("
{"+field.name+"=new"+self.upperFirst(field.name)+";};\n")
+ stream.write(targetTypeName+"
new"+self.upperFirst(field.name)+") {")
+ if field.qualifier == "optional":
+ stream.write("\n")
+ self.indent();
+
stream.write(self.getIndent()+"has%s=true;\n"%self.upperFirst(field.name))
+
stream.write(self.getIndent()+field.name+"=new"+self.upperFirst(field.name)+";\n")
+ self.unIndent()
+ stream.write(self.getIndent())
+ else:
+
stream.write(field.name+"=new"+self.upperFirst(field.name)+";")
+ stream.write("};\n")
def writeDeclarationFieldStatement(self,stream,field):
stream.write(self.getIndent())
@@ -1177,6 +1239,11 @@
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()+"bool has%s;\n" %
self.upperFirst(field.name))
def generateHeader(self,stream,factoryOnly=False):
# write the usual header protecting MACRO
@@ -1337,11 +1404,90 @@
def writeSerializeFieldStatement(self,stream,field):
+ 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()
- pass
+ stream.write(self.getIndent())
+ methodName = self.getSerializeMethodName(field.typeid.name)
+ if None == methodName:
+ 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)
+
+ if field.qualifier == "optional":
+ self.unIndent()
+ stream.write(self.getIndent()+"}\n")
def writeDeSerializeFieldStatement(self,stream,field):
- pass
+ 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()
+
+ stream.write(self.getIndent())
+ methodName = self.getDeSerializeMethodName(field.typeid.name)
+ if None == methodName:
+ 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 field.qualifier == "optional":
+ 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
(RTIinternalError) {\n"% creator)
+ self.indent()
+ stream.write(self.getIndent()+"%s* msg;\n\n" % creator[0])
+ stream.write(self.getIndent() + "switch (type) {\n")
+ self.indent()
+ for e in self.AST.eMessageType.values:
+ stream.write(self.getIndent()+"case NetworkMessage::%s:\n" %
e.name)
+ self.indent()
+ if None==e.type:
+ stream.write(self.getIndent()+"throw RTIinternalError(\"%s
message type should not be used!!\");\n"%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")
+ self.unIndent()
+ stream.write(self.getIndent()+"}\n\n")
+
+ 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
(RTIinternalError) {\n"% receiver)
+ self.indent()
+ stream.write(self.getIndent()+self.commentLineBeginWith+" FIXME This
is not thread safe\n")
+ stream.write(self.getIndent()+"static MessageBuffer msgBuffer;\n")
+ stream.write(self.getIndent()+"NetworkMessage msgGen;\n")
+ stream.write(self.getIndent()+"NetworkMessage* msg;\n\n")
+ stream.write(self.getIndent()+self.commentLineBeginWith+" receive
generic message \n")
+ stream.write(self.getIndent()+"msgGen.receive(socket,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.getType());\n")
+
+
stream.write(self.getIndent()+"msgBuffer.assumeSizeFromReservedBytes();\n")
+ stream.write(self.getIndent()+"msg->deserialize(msgBuffer);\n")
+ stream.write(self.getIndent()+"return msg;\n")
+ self.unIndent()
+ stream.write(self.getIndent()+"}\n\n")
+
def generateBody(self,stream,factoryOnly=False):
"""
@@ -1409,32 +1555,9 @@
# @todo
if self.AST.hasFactory():
# begin creator
- 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
(RTIinternalError) {\n"% creator)
- self.indent()
- # FIXME put creator code here
- self.unIndent()
- stream.write(self.getIndent()+"}\n\n")
+ self.writeFactoryCreator(stream)
# begin receiver
- 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
(RTIinternalError) {\n"% receiver)
- self.indent()
- stream.write(self.getIndent()+self.commentLineBeginWith+" FIXME
This is not thread safe\n")
- stream.write(self.getIndent()+"static MessageBuffer msgBuffer;\n")
- stream.write(self.getIndent()+"NetworkMessage msgGen;\n")
- stream.write(self.getIndent()+"NetworkMessage* msg;\n\n")
- stream.write(self.getIndent()+self.commentLineBeginWith+" receive
generic message \n")
-
stream.write(self.getIndent()+"msgGen.receive(socket,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.getType());")
-
-
stream.write(self.getIndent()+"msgBuffer.assumeSizeFromReservedBytes();\n")
- stream.write(self.getIndent()+"msg->deserialize(msgBuffer);\n")
- stream.write(self.getIndent()+"return msg;\n")
- self.unIndent()
- stream.write(self.getIndent()+"}\n\n")
+ self.writeFactoryReceiver(stream)
self.closeNamespaces(stream)
Index: CERTI_NetworkMessage.msg
===================================================================
RCS file: /sources/certi/certi/scripts/CERTI_NetworkMessage.msg,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- CERTI_NetworkMessage.msg 14 Sep 2009 21:19:50 -0000 1.10
+++ CERTI_NetworkMessage.msg 16 Sep 2009 09:57:29 -0000 1.11
@@ -39,14 +39,6 @@
language Java [import certi.FedTimeD]
}
-message NewNetworkMessage {
- required uint32 type
- required string name
- optional FederationTime date
- optional string label
- optional string tag
-}
-
native AttributeHandle {
language CXX [#include "certi.hh"]
}
@@ -308,6 +300,15 @@
required bool DDM_bool { default=false }
}
+message New_NetworkMessage {
+ required uint32 type {default=0}
+ //required string name {default="MessageBaseClass"}
+ optional FederationTime date
+ optional string label
+ optional string tag
+}
+
+
native StreamType {
language CXX [typedef Socket* StreamType;]