Salome HOME
PR: merge from branch BR_3_1_0deb tag mergeto_trunk_22dec05
[modules/kernel.git] / src / KERNEL_PY / omnipatch.py
1 """
2   This patch of omniORB is made to make it work with multiple interpreters
3   and to correct the problem of incomplete import of CORBA packages
4   in some situations common in SALOME
5
6   This patch add or modify functions in omniORB module.
7
8   In multiple interpreters context, omniORB module is meant to be shared among
9   all interpreters
10 """
11 import sys,string,imp
12 import omniORB
13 # Map of partially-opened modules
14 _partialModules = {}
15 # Map of modules to share
16 shared_imported={}
17
18 # Function to return a Python module for the required IDL module name
19 def openModule(mname, fname=None):
20     # Salome modification start
21     # Be sure to use the right module dictionnary
22     import sys
23     # Salome modification end
24
25     if mname == "CORBA":
26         mod = sys.modules["omniORB.CORBA"]
27
28     elif sys.modules.has_key(mname):
29         mod = sys.modules[mname]
30
31         if _partialModules.has_key(mname):
32             pmod = _partialModules[mname]
33             mod.__dict__.update(pmod.__dict__)
34             del _partialModules[mname]
35
36     elif _partialModules.has_key(mname):
37         mod = _partialModules[mname]
38
39     else:
40         mod = newModule(mname)
41
42     # Salome modification start
43     shared_imported[mname]=mod
44     # Salome modification end
45
46     if not hasattr(mod, "__doc__") or mod.__doc__ is None:
47         mod.__doc__ = "omniORB IDL module " + mname + "\n\n" + \
48                       "Generated from:\n\n"
49
50     if fname is not None:
51         mod.__doc__ = mod.__doc__ + "  " + fname + "\n"
52
53     return mod
54
55 # Function to create a new module, and any parent modules which do not
56 # already exist
57 def newModule(mname):
58     # Salome modification start
59     # Be sure to use the right module dictionnary
60     import sys
61     # Salome modification end
62
63     mlist   = string.split(mname, ".")
64     current = ""
65     mod     = None
66
67     for name in mlist:
68         current = current + name
69
70         if sys.modules.has_key(current):
71             mod = sys.modules[current]
72
73         elif _partialModules.has_key(current):
74             mod = _partialModules[current]
75
76         else:
77             newmod = imp.new_module(current)
78             if mod: setattr(mod, name, newmod)
79             _partialModules[current] = mod = newmod
80
81         current = current + "."
82
83     return mod
84
85 # Function to update a module with the partial module store in the
86 # partial module map
87 def updateModule(mname):
88     if _partialModules.has_key(mname):
89         pmod = _partialModules[mname]
90         mod  = sys.modules[mname]
91         mod.__dict__.update(pmod.__dict__)
92         del _partialModules[mname]
93
94 omniORB.updateModule=updateModule
95 omniORB.newModule=newModule
96 omniORB.openModule=openModule
97