Salome HOME
Revert "Synchronize adm files"
[modules/kernel.git] / src / ModuleGenerator / IDLparser.py
index 1743563c6d3b9773ce1666a2d6b5159d95d2023c..73820f1b00e75ed6d9fb2c4b6984310b9ffec1d4 100644 (file)
@@ -1,24 +1,26 @@
-#  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
-# 
-#  This library 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.1 of the License. 
-# 
-#  This library 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 library; if not, write to the Free Software 
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
-# 
-#  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+#  -*- coding: iso-8859-1 -*-
+# Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
 #
+# Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
 #
+# This library 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.1 of the License, or (at your option) any later version.
 #
+# This library 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 library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+
 #  File   : IDLparser.py
 #  Module : SALOME
 
@@ -36,7 +38,8 @@ common_data={"AUTHOR"     : "",
              "COMP_TYPE"  : "",
              "COMP_NAME"  : "",
              "COMP_UNAME" : "",
-             "COMP_MULT"  : ""
+             "COMP_MULT"  : "",
+             "COMP_IMPL"  : ""
              }
 
 nb_components = 0
@@ -48,7 +51,7 @@ nb_components = 0
 # catalog=/tmp/myxml.xml
 #--------------------------------------------------
 def getParamValue( param_name, default_value, args ):
-    pattern=param_name+"="
+    pattern="^"+param_name+"="
 
     res = default_value        #initial value
     for opt in args:
@@ -57,7 +60,7 @@ def getParamValue( param_name, default_value, args ):
             res = opt[s.end():]
             break     #found
 
-    return res    
+    return res
 
 
 #--------------------------------------------------
@@ -71,15 +74,18 @@ def error (message):
 # base class implementing tree
 #--------------------------------------------------
 class Tree:
-    
-    def __init__(self, name = '', content = ''):
+
+    def __init__(self, name = '', content = '', key = None):
         self.name = name
         self.content = content
+        self.key = key
         self.parent = None
         self.childs = []
-        
+        self.comments = []
+        self.attrs={}
+
     def addChild(self, tree):
-        if tree is not None: 
+        if tree is not None:
             self.childs.append(tree)
             tree.parent = self
         return tree
@@ -91,19 +97,19 @@ class Tree:
          if tree is not None:
             pos = 0
             for i in self.childs:
-                if i.name == tree.name:
+                if (i.name == tree.name) & ((i.key is None) | (i.key == tree.key)):
                     self.childs.pop(pos)
                     self.childs.insert(pos, tree)
                     return tree
                 pos += 1
 
          return self.addChild(tree)
-       
+
     def insertFirstChild(self, tree):
         if tree is not None:
             self.childs.insert(0, tree)
         return tree
-    
+
     def insertFirstNamedChild(self, name, content = ''):
         return self.insertFirstChild(Tree(name, content))
 
@@ -111,7 +117,10 @@ class Tree:
         d = depth
         if self.name != '':
             s = string.ljust('', 4*depth)
-            s += '<' + self.name + '>'
+            s += '<' + self.name
+            for k,v in self.attrs.items():
+              s += ' ' + k + '="' + v + '"'
+            s += '>'
             if self.content != '':
                 s +=  self.content
             else:
@@ -119,10 +128,10 @@ class Tree:
                     s += '\n'
             f.write(s)
             d +=  1
-            
+
         for i in self.childs:
             i.output_xml(f, d)
-            
+
         if self.name != '':
             s = '</' + self.name + '>\n'
             if len(self.childs) > 0 :
@@ -131,9 +140,9 @@ class Tree:
 
     def Dump(self, levels=-1, depth=0):
         #Dumps the tree contents
-        
+
         if levels == 0: return
-        
+
         s = string.ljust('', 4*depth)
         print s, self, self.content
         for i in self.childs:
@@ -148,10 +157,10 @@ class Tree:
             l.append(p.name)
             p = p.parent
         return l
-        
-    def getChild(self, name, content=None):
 
-        # content == None, don't compare content
+    def getChild(self, name, content=None):
+        # return child node with a given name
+        # if content == None, don't compare contents
         for i in self.childs:
             if (i.name == name):
                 if (content is None) | (i.content == content):
@@ -159,18 +168,17 @@ class Tree:
         return None
 
     def getNode(self, name, content='', depth=-1):
-
-        # recursive search
+        # recursive search of a node with a given name
         # content == None, don't compare content
         if (self.name == name):
             if (content is None) | (self.content == content):
                 return self
-            
+
         if (depth != 0):
             for i in self.childs:
                 n = i.getNode(name, content, depth-1)
-                if n:  return n #return a value 
-            
+                if n:  return n
+
         return None
 
     def __repr__(self):
@@ -184,54 +192,126 @@ class Tree:
 
     def merge(self, t):
         pass
-    
+
+    def mergeChilds(self, t, list):
+        L_ext = t.getChild(list)
+        L_int = self.getChild(list)
+
+        L_merge = Tree(list)
+
+        for i_ext in L_ext.childs:
+            k_ext = i_ext.key
+            if k_ext is None:  continue
+            present = 0
+
+            for i_int in L_int.childs:
+                k_int = i_int.key
+                if k_int is None:  continue
+
+                if (k_int == k_ext):
+                    present = 1
+                    break;
+
+            if present :
+                i_int.merge(i_ext)
+                L_merge.addChild(i_int)
+            else:
+                L_merge.addChild(i_ext)
+
+        self.replaceChild(L_merge)
+
+    def setAttrib(self, name,value):
+      self.attrs[name]=value
+
+
 #--------------------------------------------------
-# implements inParameter tree
+# implements parameter tree
 #--------------------------------------------------
-class inParameter(Tree):
-    
-    def __init__(self, name=None, type='', comment='unknown'):
-        Tree.__init__(self, 'inParameter')
+class parameter(Tree):
+
+    def __init__(self, name=None, mode = 'in', type='', comment='unknown'):
+        Tree.__init__(self, mode + 'Parameter', key=name)
+        self.mode = mode
         if name is None:  return
-        
-        self.addNamedChild('inParameter-type', type)
-        self.addNamedChild('inParameter-name', name)
-        self.addNamedChild('inParameter-comment', comment)
-            
+
+        self.addNamedChild(mode + 'Parameter-name', name)
+        self.addNamedChild(mode + 'Parameter-type', type)
+        self.addNamedChild(mode + 'Parameter-comment', comment)
+
     def merge(self, P):
 
-        T = P.getChild('inParameter-type')
-        self.replaceChild(T)
-    
+        self.mode = P.mode
+        self.replaceChild(P.getChild(P.mode + 'Parameter-name'))
+        self.replaceChild(P.getChild(P.mode + 'Parameter-type'))
+        C = P.getChild(P.mode + 'Parameter-comment')
+        if C.content != 'unkonwn':
+            self.replaceChild(C)
+
 #--------------------------------------------------
-# implements outParameter tree
+# implements dataStreamParameter tree
 #--------------------------------------------------
-class outParameter(Tree):
-    
-    def __init__(self, name=None, type='', comment = 'unknown'):
-        
-        Tree.__init__(self, 'outParameter')
+class dataStreamParameter(parameter):
+
+    def __init__(self, name=None, mode='in', type='', dependency='', comment='unknown'):
+        parameter.__init__(self, name, mode, type, comment)
         if name is None:  return
-        
-        self.addNamedChild('outParameter-type', type)
-        self.addNamedChild('outParameter-name', name)
-        self.addNamedChild('outParameter-comment', comment)
-            
+
+        self.addNamedChild(mode + 'Parameter-dependency', dependency)
+        self.mode = mode
+
     def merge(self, P):
 
-        T = P.getChild('outParameter-type')
-        self.replaceChild(T)
-    
+        parameter.merge(self, P)
+        self.replaceChild(P.getChild(mode + 'Parameter-dependency'))
+
+
+def parseComment(comment):
+
+    spaces = '[\t\n ]*'
+    word = spaces + '([a-zA-Z][a-zA-Z0-9_]*)' + spaces
+
+    result = []
+    type = None
+    key = None
+
+    ## match :  // followed by a 'DataStreamPorts' string,
+    ## the service name, and a list of ports
+    pattern = '// *DataStreamPorts{,1}' + word
+    m = re.match(pattern, comment)
+
+    ## if there is a match, parse remaining part of comment
+    if m:
+        ## service
+        type = 'DataStreamPorts'
+        key = m.group(1)
+
+        sPorts = comment[m.end():]
+        pattern = word + '\('+word+','+word +','+word+'\)' \
+                  + spaces + ',{,1}' + spaces
+        while len(sPorts) > 0:
+            ## process next DataStreamPort
+            ## match a definition like xx(a,b,c) with a possible trailing ,
+            ## returns a tuple (xx, a, b, c) and
+            ## the remaining part of input string
+            m = re.match(pattern, sPorts)
+            if m is None:
+                raise LookupError, \
+                      'format error in DataStreamPort definition : '+sPorts
+            sPorts = sPorts[m.end():]
+            result.append(m.groups())
+
+    return type, key, result;
+
 #--------------------------------------------------
 # implements service tree
 #--------------------------------------------------
 class Service(Tree):
-    
+
     def __init__(self, name=None, comment = 'unknown'):
-        
-        Tree.__init__(self, 'component-service')
+
+        Tree.__init__(self, 'component-service', key=name)
         if name is None:  return
-        
+
         self.addNamedChild('service-name', name)
         self.addNamedChild('service-author',common_data["AUTHOR"])
         self.addNamedChild('service-version',common_data["VERSION"])
@@ -239,103 +319,54 @@ class Service(Tree):
         self.addNamedChild('service-by-default', "0")
         self.addNamedChild('inParameter-list')
         self.addNamedChild('outParameter-list')
-            
+        self.addNamedChild('DataStream-list')
+
     def createInParameter(self, name, type):
         L = self.getChild('inParameter-list')
-        if L is None:
-            error ("Service.createInParameter() : 'inParameter-list' is not found"); return None;
-        p = inParameter(name, type)
-        L.addChild(p)
+        p = parameter(name, 'in', type)
+        L.replaceChild(p)
         return p
-    
+
     def createOutParameter(self, name, type):
         L = self.getChild('outParameter-list')
-        if L is None:
-            error ("Service.createOutParameter() : 'outParameter-list' is not found"); return None;
-        p = outParameter(name, type)
-        L.addChild(p)
+        p = parameter(name, 'out', type)
+        L.replaceChild(p)
         return p
 
+    def createDataStreamParameter(self, p):
+        L = self.getChild('DataStream-list')
+        p = dataStreamParameter(p[0], p[2], p[1], p[3])
+        L.replaceChild(p)
+        return p
 
     def merge(self, S):
-        
-        L_ext = S.getChild('inParameter-list')
-        L_int = self.getChild('inParameter-list')
-
-        if L_ext is not None and L_int is not None:
-
-            L_merge = Tree('inParameter-list')
-        
-            for i_ext in L_ext.childs:
-                # i_ext = <inParameter>
-                n_ext = i_ext.getChild('inParameter-name')
-                if n_ext is None:  continue
-                present = 0
-            
-                for i_int in L_int.childs:
-                    # i_int = <inParameter>
-                    n_int = i_int.getChild('inParameter-name')
-                    
-                    if n_int is None:  continue
-                    
-                    if (n_int.content == n_ext.content):
-                        present = 1
-                        break;
-                
-                if present :
-                        i_int.merge(i_ext)
-                        L_merge.addChild(i_int)
-                else:
-                        L_merge.addChild(i_ext)
-                        
-            self.replaceChild(L_merge)
-            
-        else : error("Service.merge(): 'inParameter-list' is not found") #either L_ext or  L_int is None
-            
-        L_ext = S.getChild('outParameter-list')
-        L_int = self.getChild('outParameter-list')
-
-        if L_ext is None or L_int is None:
-            error ("Service.merge() : 'outParameter-list' is not found")
-            
-        L_merge = Tree('outParameter-list')
-        
-        for i_ext in L_ext.childs:
-            #i_ext = <outParameter>
-            present = 0
-            n_ext = i_ext.getChild('outParameter-name')
-            if n_ext is None:   continue
-            for i_int in L_int.childs:
-                n_int = i_int.getChild('outParameter-name')
-                if n_int is None:  continue
-                if (n_int.content == n_ext.content):
-                    present = 1
-                    break;
-                
-            if present :
-                i_int.merge(i_ext)
-                L_merge.addChild(i_int)
-            else:
-                L_merge.addChild(i_ext)
-                
-        self.replaceChild(L_merge)
+
+        self.replaceChild(S.getChild('service-author'))
+        self.replaceChild(S.getChild('service-version'))
+        self.replaceChild(S.getChild('service-by-default'))
+        C = S.getChild('service-comment')
+        if C.content != 'unkonwn':
+            self.replaceChild(C)
+
+        for L in ['inParameter-list', 'outParameter-list', 'DataStream-list']:
+           self.mergeChilds(S, L)
 
 
 #--------------------------------------------------
 # implements interface tree
 #--------------------------------------------------
 class Interface(Tree):
-    
+
     def __init__(self, name=None, comment='unknown'):
-               
-        Tree.__init__(self)
+
+        Tree.__init__(self, key=name)
 
         if name is None:  return
-        
+
         self.addNamedChild('component-interface-name', name)
         self.addNamedChild('component-interface-comment', comment);
         self.addNamedChild('component-service-list')
-            
+
     def createService(self, name):
         L = self.getChild('component-service-list')
 
@@ -347,57 +378,70 @@ class Interface(Tree):
         L.addChild(s)
         return s
 
+    def findService(self, key):
+        L = self.getChild('component-service-list')
+        for S in L.childs:
+            if S.key == key:
+                return S
+        return None
+
     def merge(self, I):
 
-        L_ext = I.getChild('component-service-list')
-        L_int = self.getChild('component-service-list')
-      
-        if L_ext is None or L_int is None:
-           error("Interface.merge() : 'component-service-list' is not found!")
-           return
-       
-        L_merge = Tree('component-service-list')
-        
-        for i_ext in L_ext.childs:
-            
-            present = 0
-            n_ext = i_ext.getChild('service-name')
-            if n_ext is None: continue
-            
-            for i_int in L_int.childs:
-                n_int = i_int.getChild('service-name')
-                if n_int is None:  continue
-                if (n_int.content == n_ext.content):
-                    present = 1
-                    break;
-                
-            if present == 0:
-                i_int.merge(i_ext)
-                L_merge.addChild(i_int)
-            else:
-                L_merge.addChild(i_ext)
-                
-        self.replaceChild(L_merge)
+        C = S.getChild('component-interface-comment')
+        if C.content != 'unkonwn':
+            self.replaceChild(C)
+
+        self.mergeChilds(I, 'component-service-list')
+
+    def processDataStreams(self):
+        for sComment in self.comments:
+
+            type, key, result = parseComment(sComment)
+
+            if type == 'DataStreamPorts':
+                Service = self.findService(key)
+                if Service is None:
+                    raise LookupError, \
+                          'service ' + key + \
+                          ' not found in interface : ' + self.key
+                for p in result:
+                ## process next DataStreamPort
+                    Service.createDataStreamParameter(p)
 
 
 #--------------------------------------------------
 # implements Component tree
 #--------------------------------------------------
 class Component(Tree):
-    def __init__(self):
-        Tree.__init__(self, 'component')
-                 
-        self.addNamedChild('component-name',       common_data["COMP_NAME"]) 
-        self.addNamedChild('component-username',   common_data["COMP_UNAME"])
+    def __init__(self, name=None):
+        Tree.__init__(self, 'component', key=name)
+        if name is None:  return
+
+# ASV : fix for bug PAL8922 (Component name indicated by user in GUI is not taken into account
+        if common_data["COMP_NAME"] != '':
+            self.addNamedChild('component-name', common_data["COMP_NAME"])
+        else:
+            self.addNamedChild('component-name', name)
+
+# ASV : if user name is NOT set, then use component-name instead.  Else - default.
+        if common_data["COMP_UNAME"] != '':
+            self.addNamedChild('component-username',   common_data["COMP_UNAME"])
+        else:
+            if common_data["COMP_NAME"] != '':
+                self.addNamedChild('component-username', common_data["COMP_NAME"] )
+            else:
+                self.addNamedChild('component-username',   name)
+
         self.addNamedChild('component-type',       common_data["COMP_TYPE"])
         self.addNamedChild('component-author',     common_data["AUTHOR"])
         self.addNamedChild('component-version',    common_data["VERSION"])
         self.addNamedChild('component-comment',    'unknown')
         self.addNamedChild('component-multistudy', common_data["COMP_MULT"])
+        self.addNamedChild('component-impltype',   common_data["COMP_IMPL"])
         self.addNamedChild('component-icone',      common_data["ICON"])
         self.addNamedChild('constraint')
         self.addNamedChild('component-interface-list')
-            
+
     def createInterface(self, name):
         L = self.getChild('component-interface-list')
         if L is None:
@@ -411,42 +455,20 @@ class Component(Tree):
 
         for i in ['component-username', 'component-author',
                   'component-type', 'component-icone', 'component-version',
-                  'component-comment', 'component-multistudy', 'constraint']:
+                  'component-multistudy', 'component-impltype', 'constraint']:
             ext = C.getChild(i)
             int = self.getChild(i)
             if int is None:
                 int = ext
             elif ext is not None and len(ext.content):
                 int.content = ext.content
-                
-        L_ext = C.getChild('component-interface-list')
-        L_int = self.getChild('component-interface-list')
-        if L_ext is None or L_int is None:
-            error("Component.merge : No component-interface-list is found")
-            return
-        L_merge = Tree('component-interface-list')
-        
-        for i_ext in L_ext.childs:
-            present = 0
-            n_ext = i_ext.getChild('component-interface-name')
 
-            if n_ext is None:  continue
-            
-            for i_int in L_int.childs:
-                n_int = i_int.getChild('component-interface-name')
-                if n_int is None:  continue
-                if (n_int.content == n_ext.content):
-                    present = 1
-                    break;
-                
-            if present :
-                i_int.merge(i_ext)
-                L_merge.addChild(i_int)
-            else:
-                L_merge.addChild(i_ext)
-                
-        self.replaceChild(L_merge)
-    
+        Cc = C.getChild('component-comment')
+        if Cc.content != 'unkonwn':
+            self.replaceChild(Cc)
+
+        self.mergeChilds(C, 'component-interface-list')
+
 #--------------------------------------------------
 # implements document tree
 #--------------------------------------------------
@@ -461,6 +483,7 @@ class Catalog(ContentHandler, Tree):
             parser.parse(filename)
         else:
             t = self.addNamedChild('begin-catalog')
+            t.addNamedChild('type-list')
             t.addNamedChild('component-list')
 
         n = self.getChild('begin-catalog')
@@ -469,9 +492,12 @@ class Catalog(ContentHandler, Tree):
             return
         if n.getChild('path-prefix-list') is None:
             n.insertFirstNamedChild('path-prefix-list')
+        if n.getChild('type-list') is None:
+            p=n.childs.index(n.getChild('path-prefix-list'))
+            n.childs.insert(p+1,Tree('type-list'))
         if n.getChild('component-list') is None:
             n.addNamedChild('component-list')
-            
+
     def removeComponent(self, name):
         complist = self.getNode('component-list')
         idx = 0
@@ -484,14 +510,13 @@ class Catalog(ContentHandler, Tree):
                 if cname.content == name:
                     complist.childs.pop(idx)
                     print "Component " + name + " is removed"
-            idx += 1       
+            idx += 1
+
     def startDocument(self):
         self.list.append(self)
-    
+
     def startElement(self, name, attrs):
         p = self.list[len(self.list)-1]
-
         if name == 'component':
             e = p.addChild(Component())
         elif name == 'component-interface-name':
@@ -499,55 +524,118 @@ class Catalog(ContentHandler, Tree):
         elif name == 'component-service':
             e = p.addChild(Service())
         elif name == 'inParameter':
-            e = p.addChild(inParameter())
+            e = p.addChild(parameter(mode='in'))
         elif name == 'outParameter':
-            e = p.addChild(outParameter())
+            e = p.addChild(parameter(mode='out'))
+        elif name == 'sequence':
+            e = p.addChild(SeqType(attrs["name"],attrs["content"]))
+        elif name == 'objref':
+            e = p.addChild(ObjType(attrs["name"]))
+        elif name == 'struct':
+            e = p.addChild(StructType(attrs["name"]))
+        elif name == 'type':
+            e = p.addChild(Type(attrs["name"],attrs["kind"]))
+        elif name == 'member':
+            e = p.addChild(Member(attrs["name"],attrs["type"]))
         else:
             e = p.addNamedChild(name)
         self.list.append(e)
         self.buffer = ''
-        
+
     def endElement(self, name):
         self.buffer = string.join(string.split(self.buffer), ' ')
         p = self.list[len(self.list)-1]
         p.content = self.buffer
+        if name == 'component':
+            p.key = p.getChild('component-name').content
         self.buffer = ''
         e = self.list.pop()
 
-        
     def characters(self, ch):
         self.buffer += ch
 
     def mergeComponent(self, comp):
-        
+
         L_int = self.getNode('component-list')
         if   L_int is None:
             error("Catalog.mergeComponent : 'component-list' is not found")
             return
-        
+
         i_ext = comp
         present = 0
-        n_ext = i_ext.getChild('component-name')
-        if n_ext is None:
-            error("Catalog.mergeComponent : 'component-name' is not found")
-            return
+        n_ext = i_ext.key
         for i_int in L_int.childs:
-            n_int = i_int.getChild('component-name')
-            if n_int is None:  continue
-            
-            if (n_int.content == n_ext.content):
+            if (i_int.key == n_ext):
                 present = 1
                 break;
-                
+
         if present == 0:
-            print '   add component', n_ext.content
+            print '   add component', i_ext.getChild('component-name').content
             L_int.addChild(i_ext)
         else:
-            print '   replace component', n_ext.content
+            print '   replace component', i_ext.getChild('component-name').content
             i_int.merge(i_ext)
-            
 
-            
+    def mergeType(self, type):
+      L_int = self.getNode('type-list')
+      if L_int is None:
+        error("Catalog.mergeType : 'type-list' is not found")
+        return
+      for t in L_int.childs:
+        if t.attrs["name"] == type.attrs["name"]:
+          t.merge(type)
+          return
+
+      L_int.addChild(type)
+
+class Member(Tree):
+  def __init__(self, name,type):
+    Tree.__init__(self, 'member')
+    self.setAttrib("name",name)
+    self.setAttrib("type",type)
+
+class Type(Tree):
+  def __init__(self, name,kind):
+    Tree.__init__(self, 'type')
+    self.setAttrib("name",name)
+    self.setAttrib("kind",kind)
+
+  def merge(self,t):
+    self.setAttrib("kind",t.attrs["kind"])
+
+class SeqType(Tree):
+  def __init__(self, name,content):
+    Tree.__init__(self, 'sequence')
+    self.setAttrib("name",name)
+    self.setAttrib("content",content)
+
+  def merge(self,t):
+    self.setAttrib("content",t.attrs["content"])
+
+class StructType(Tree):
+  def __init__(self, name):
+    Tree.__init__(self, 'struct')
+    self.setAttrib("name",name)
+
+  def merge(self,t):
+    #remove childs and replace by t childs
+    self.childs=[]
+    for c in t.childs:
+      self.childs.append(c)
+
+class ObjType(Tree):
+  def __init__(self, name):
+    Tree.__init__(self, 'objref')
+    self.setAttrib("name",name)
+
+  def merge(self,t):
+    RepoId=t.attrs.get("id")
+    if RepoId:
+      self.setAttrib("id",RepoId)
+    #remove childs and replace by t childs
+    self.childs=[]
+    for c in t.childs:
+      self.childs.append(c)
 
 # IDL file reader
 
@@ -576,67 +664,97 @@ ttsMap = {
 # class ModuleCatalogVisitor
 #--------------------------------------------------
 class ModuleCatalogVisitor (idlvisitor.AstVisitor):
-    
+
     def __init__(self, catalog):
         self.catalog = catalog
         self.EngineType = 0
-        
+        self.currentScope=None
+
     def visitAST(self, node):
         for n in node.declarations():
-            n.accept(self)
-            
+            if n.mainFile():
+              n.accept(self)
+
     def visitModule(self, node):
+        self.currentScope=node
         for n in node.definitions():
             n.accept(self)
-                
+
     def visitInterface(self, node):
         if node.mainFile():
 
             self.EngineType = 0
-            
+
             for i in node.inherits():
                 s = i.scopedName();
-                if ((s[0] == "Engines") & (s[1] == "Component")):
+                if s[0] == "Engines":
+                  if s[1] == "EngineComponent":
                     self.EngineType = 1; break
-                
-            Comp = Component()
-            
-            self.currentInterface = Comp.createInterface(node.identifier())
-        
-            for c in node.callables():
+                  if s[1] == "Superv_Component":
+                    self.EngineType = 2; break
+
+            if self.EngineType:
+              #This interface is a SALOME component
+              Comp = Component(node.identifier())
+
+              self.currentInterface = Comp.createInterface(node.identifier())
+
+              for c in node.callables():
                 if isinstance(c, idlast.Operation):
                     c.accept(self)
 
-            if (self.EngineType):
-                global nb_components
-                nb_components = nb_components + 1
-                self.catalog.mergeComponent(Comp)
+              for c in node.declarations():
+                if isinstance(c, idlast.Struct):
+                    c.accept(self)
+
+              for i in node.comments():
+                self.currentInterface.comments.append(str(i))
+
+              if self.EngineType == 2:
+                self.currentInterface.processDataStreams()
+
+              global nb_components
+              nb_components = nb_components + 1
+              self.catalog.mergeComponent(Comp)
+
+            else:
+              #This interface is not a component : use it as a DataType
+              t=ObjType("/".join(node.scopedName()))
+              for i in node.inherits():
+                t.addNamedChild("base","/".join(i.scopedName()))
+              self.catalog.mergeType(t)
 
             self.EngineType = 0
-            
+
+
     def visitOperation(self, node):
 
         self.currentService = self.currentInterface.createService \
                                        (node.identifier())
-        
-        for c in node.parameters():
-            c.accept(self)
-            
+
         node.returnType().accept(self)
         if (self.currentType != "void"):
             self.currentService.createOutParameter \
                 ("return", self.currentType)
-        
+
+        for c in node.parameters():
+            c.accept(self)
+
+        for i in node.comments():
+            self.currentInterface.comments.append(str(i))
+
 
     def visitDeclaredType(self, type):
-        self.currentType = type.name()
-            
+        name=type.name()
+        scoped_name="/".join(type.scopedName())
+        self.currentType = scoped_name
+
     def visitBaseType(self, type):
         self.currentType = ttsMap[type.kind()]
-    
+
     def visitStringType(self, type):
         self.currentType = "string"
-        
+
     def visitParameter(self, node):
         node.paramType().accept(self)
         if node.is_in():
@@ -645,19 +763,69 @@ class ModuleCatalogVisitor (idlvisitor.AstVisitor):
         if node.is_out():
             self.currentService.createOutParameter \
                      (node.identifier(), self.currentType)
-        
+
+    def visitSequenceType(self,type):
+      type.seqType().accept(self)
+      if type.bound() == 0:
+          self.contentType=self.currentType
+          self.currentType = "sequence"
+      else:
+          self.currentType = None
+
+    def visitTypedef(self, node):
+      if node.constrType():
+            node.aliasType().decl().accept(self)
+
+      node.aliasType().accept(self)
+      type  = self.currentType
+      if not type:
+        return
+      decll = []
+      for d in node.declarators():
+            d.accept(self)
+            if self.__result_declarator:
+              decll.append(self.__result_declarator)
+      if type == "sequence":
+        #it's a sequence type
+        for name in decll:
+          scoped_name="/".join(self.currentScope.scopedName()+[name])
+          self.catalog.mergeType(SeqType(scoped_name,self.contentType))
+      #else:
+        #it's an alias
+      #  for name in decll:
+      #    scoped_name="/".join(self.currentScope.scopedName()+[name])
+      #    self.catalog.mergeType(Type(scoped_name,type))
+
+    def visitStruct(self, node):
+      t=StructType("/".join(node.scopedName()))
+      for m in node.members():
+            if m.constrType():
+                m.memberType().decl().accept(self)
+
+            m.memberType().accept(self)
+            type = self.currentType
+            for d in m.declarators():
+                d.accept(self)
+                t.addChild(Member(self.__result_declarator,type))
+
+      self.catalog.mergeType(t)
+
+    def visitDeclarator(self, node):
+        if node.sizes():
+          self.__result_declarator =None
+        else:
+          self.__result_declarator =node.identifier()
+
 #--------------------------------------------------
 # parse idl and store xml file
 #--------------------------------------------------
 def run(tree, args):
-    print args
-    
+
     CatalogFileName=getParamValue("catalog", "CatalogModulePersonnel.xml", args)
-    print CatalogFileName
     if re.compile(".*?.xml$").match(CatalogFileName, 1) is None:
         CatalogFileName = CatalogFileName + '.xml'
 
-    #=========  Read parameters  ======================    
+    #=========  Read parameters  ======================
     common_data["ICON"]       = getParamValue("icon",       "",                args)
     common_data["AUTHOR"]     = getParamValue("author",     os.getenv("USER"), args)
     common_data["VERSION"]    = getParamValue("version",    "1",               args)
@@ -665,28 +833,31 @@ def run(tree, args):
     common_data["COMP_UNAME"] = getParamValue("username",   "",                args)
     common_data["COMP_TYPE"]  = getParamValue("type",       "OTHER",           args)
     common_data["COMP_MULT"]  = getParamValue("multistudy", "1",               args)
+    common_data["COMP_IMPL"]  = getParamValue("impltype",   "1",               args)
 
     print common_data
-    
+
     remove_comp = getParamValue("remove", "", args)
-    
-    #==================================================    
-    
+
+    #==================================================
+
     if (os.path.exists(CatalogFileName)):
         print "Importing", CatalogFileName
         C = Catalog(CatalogFileName)
     else:
         print "Creating ",CatalogFileName
         C = Catalog()
-    
+
     print "Reading idl file"
-    
+
     visitor = ModuleCatalogVisitor(C)
     tree.accept(visitor)
 
+##    C.Dump()
+
     if remove_comp :
         C.removeComponent(remove_comp)
-    
+
     if (os.path.exists(CatalogFileName)):
         print "Updating", CatalogFileName
         CatalogFileName_old = CatalogFileName + '_old'
@@ -694,7 +865,7 @@ def run(tree, args):
     else:
         CatalogFileName_old = ""
         print "Writing", CatalogFileName
-        
+
     CatalogFileName_new = CatalogFileName + '_new'
     f=open(CatalogFileName_new, 'w')
     f.write("<?xml version='1.0' encoding='us-ascii' ?>\n\n")
@@ -704,11 +875,11 @@ def run(tree, args):
     os.rename(CatalogFileName_new, CatalogFileName)
     if ((CatalogFileName_old != "") & os.path.exists(CatalogFileName_old)):
         os.unlink(CatalogFileName_old)
-        
+
     print
 
 
 if __name__ == "__main__":
     print
-    print "Usage : omniidl -bIDLparser [-I<catalog files directory>]* -Wbcatalog=<my_catalog.xml>[,icon=<pngfile>][,version=<num>][,author=<name>][,name=<component_name>][,username=<component_username>][,multistudy=<component_multistudy>] <file.idl>"
+    print "Usage : omniidl -bIDLparser [-I<catalog files directory>]* -Wbcatalog=<my_catalog.xml>[,icon=<pngfile>][,version=<num>][,author=<name>][,name=<component_name>][,username=<component_username>][,multistudy=<component_multistudy>][,impltype=<implementation type : 0 (python), 1 (C++)>] <file.idl>"
     print