Index: third_party/logilab/common/corbautils.py |
diff --git a/third_party/logilab/common/corbautils.py b/third_party/logilab/common/corbautils.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8dfb2ba3bb43883aa17e896362dd97feb0f12c42 |
--- /dev/null |
+++ b/third_party/logilab/common/corbautils.py |
@@ -0,0 +1,117 @@ |
+# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr |
+# |
+# This file is part of logilab-common. |
+# |
+# logilab-common 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. |
+# |
+# logilab-common 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 logilab-common. If not, see <http://www.gnu.org/licenses/>. |
+"""A set of utility function to ease the use of OmniORBpy. |
+ |
+ |
+ |
+ |
+""" |
+__docformat__ = "restructuredtext en" |
+ |
+from omniORB import CORBA, PortableServer |
+import CosNaming |
+ |
+orb = None |
+ |
+def get_orb(): |
+ """ |
+ returns a reference to the ORB. |
+ The first call to the method initialized the ORB |
+ This method is mainly used internally in the module. |
+ """ |
+ |
+ global orb |
+ if orb is None: |
+ import sys |
+ orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID) |
+ return orb |
+ |
+def get_root_context(): |
+ """ |
+ returns a reference to the NameService object. |
+ This method is mainly used internally in the module. |
+ """ |
+ |
+ orb = get_orb() |
+ nss = orb.resolve_initial_references("NameService") |
+ rootContext = nss._narrow(CosNaming.NamingContext) |
+ assert rootContext is not None, "Failed to narrow root naming context" |
+ return rootContext |
+ |
+def register_object_name(object, namepath): |
+ """ |
+ Registers a object in the NamingService. |
+ The name path is a list of 2-uples (id,kind) giving the path. |
+ |
+ For instance if the path of an object is [('foo',''),('bar','')], |
+ it is possible to get a reference to the object using the URL |
+ 'corbaname::hostname#foo/bar'. |
+ [('logilab','rootmodule'),('chatbot','application'),('chatter','server')] |
+ is mapped to |
+ 'corbaname::hostname#logilab.rootmodule/chatbot.application/chatter.server' |
+ |
+ The get_object_reference() function can be used to resolve such a URL. |
+ """ |
+ context = get_root_context() |
+ for id, kind in namepath[:-1]: |
+ name = [CosNaming.NameComponent(id, kind)] |
+ try: |
+ context = context.bind_new_context(name) |
+ except CosNaming.NamingContext.AlreadyBound, ex: |
+ context = context.resolve(name)._narrow(CosNaming.NamingContext) |
+ assert context is not None, \ |
+ 'test context exists but is not a NamingContext' |
+ |
+ id, kind = namepath[-1] |
+ name = [CosNaming.NameComponent(id, kind)] |
+ try: |
+ context.bind(name, object._this()) |
+ except CosNaming.NamingContext.AlreadyBound, ex: |
+ context.rebind(name, object._this()) |
+ |
+def activate_POA(): |
+ """ |
+ This methods activates the Portable Object Adapter. |
+ You need to call it to enable the reception of messages in your code, |
+ on both the client and the server. |
+ """ |
+ orb = get_orb() |
+ poa = orb.resolve_initial_references('RootPOA') |
+ poaManager = poa._get_the_POAManager() |
+ poaManager.activate() |
+ |
+def run_orb(): |
+ """ |
+ Enters the ORB mainloop on the server. |
+ You should not call this method on the client. |
+ """ |
+ get_orb().run() |
+ |
+def get_object_reference(url): |
+ """ |
+ Resolves a corbaname URL to an object proxy. |
+ See register_object_name() for examples URLs |
+ """ |
+ return get_orb().string_to_object(url) |
+ |
+def get_object_string(host, namepath): |
+ """given an host name and a name path as described in register_object_name, |
+ return a corba string identifier |
+ """ |
+ strname = '/'.join(['.'.join(path_elt) for path_elt in namepath]) |
+ return 'corbaname::%s#%s' % (host, strname) |