[omniORB] Implementing a python version of Txn::Current

Duncan Grisby duncan@grisby.org
Fri Mar 7 17:47:01 2003


------- =_aaaaaaaaaa0
Content-Type: text/plain; charset="us-ascii"
Content-ID: <2617.1047059007.1@grisby.org>

On Monday 24 February, Duncan Grisby wrote:

> What I would suggest is to add a function to the omniORBpy C++ api
> (see include/omniORBpy.h in the omniORBpy tree) that allows you to
> register additional functions / objects that try to narrow pseudo
> objects. That way, createPyPseudoObjRef can consult a list of
> registered converters if its built in ones don't work.

I have implemented a way to register pseudo object creation functions,
using a list of PyCObjects. I've attached a patch. Does it work for
you?

Cheers,

Duncan.


------- =_aaaaaaaaaa0
Content-Type: text/plain; name="pseudolist.patch"; charset="us-ascii"
Content-ID: <2617.1047059007.2@grisby.org>

Index: include/omniORBpy.h
===================================================================
RCS file: /cvsroot/omniorb/omniORBpy/include/Attic/omniORBpy.h,v
retrieving revision 1.1.2.1
diff -u -r1.1.2.1 omniORBpy.h
--- include/omniORBpy.h	26 May 2002 21:04:17 -0000	1.1.2.1
+++ include/omniORBpy.h	7 Mar 2003 17:32:55 -0000
@@ -45,7 +45,7 @@
 //      omniORBpyAPI* api    = (omniORBpyAPI*)PyCObject_AsVoidPtr(pyapi);
 //      Py_DECREF(pyapi);
 //
-// Obviously, you MUST NOT modify the functions pointers!
+// Obviously, you MUST NOT modify the function pointers!
 //
 // This arrangement of things means you do not have to link to the
 // _omnipymodule library to be able to use the API.
@@ -68,5 +68,17 @@
   omniORBpyAPI();
   // Constructor for the singleton. Sets up the function pointers.
 };
+
+
+// Extensions to omniORB / omniORBpy may create their own pseudo
+// object reference types. To provide a Python mapping for these, a
+// function must be provided that takes a CORBA::Object_ptr and
+// returns a suitable PyObject. Functions are registered by appending
+// PyCObjects to the list _omnipy.pseudoFns. The CObjects must contain
+// pointers to functions with this signature:
+
+typedef PyObject* (*omniORBpyPseudoFn)(const CORBA::Object_ptr);
+
+
 
 #endif // _omniORBpy_h_
Index: modules/omnipy.cc
===================================================================
RCS file: /cvsroot/omniorb/omniORBpy/modules/Attic/omnipy.cc,v
retrieving revision 1.1.2.19
diff -u -r1.1.2.19 omnipy.cc
--- modules/omnipy.cc	26 May 2002 00:55:36 -0000	1.1.2.19
+++ modules/omnipy.cc	7 Mar 2003 17:32:55 -0000
@@ -107,6 +107,7 @@
 
 PyInterpreterState* omniPy::pyInterpreter;
 
+PyObject* omniPy::py_omnipymodule;	// The _omnipy extension
 PyObject* omniPy::pyCORBAmodule;	// The CORBA module
 PyObject* omniPy::pyCORBAsysExcMap;	//  The system exception map
 PyObject* omniPy::pyCORBAAnyClass;	//  Any class
@@ -845,6 +846,7 @@
     PyDict_SetItemString(d, (char*)"system_exceptions", excs);
     Py_DECREF(excs);
 
+    omniPy::py_omnipymodule = m;
     omniPy::initORBFunc(d);
     omniPy::initPOAFunc(d);
     omniPy::initPOAManagerFunc(d);
@@ -854,6 +856,11 @@
     // Set up the C++ API singleton
     PyObject* api = PyCObject_FromVoidPtr((void*)&omniPy::cxxAPI, 0);
     PyDict_SetItemString(d, (char*)"API", api);
+
+    // Create an empty list for extrernal modules to register
+    // additional pseudo object creation functions.
+    PyObject* pseudolist = PyList_New(0);
+    PyDict_SetItemString(d, (char*)"pseudoFns", pseudolist);
 
     omniInitialiser::install(&the_omni_python_initialiser);
   }
Index: modules/omnipy.h
===================================================================
RCS file: /cvsroot/omniorb/omniORBpy/modules/Attic/omnipy.h,v
retrieving revision 1.2.4.19
diff -u -r1.2.4.19 omnipy.h
--- modules/omnipy.h	27 Nov 2002 00:18:25 -0000	1.2.4.19
+++ modules/omnipy.h	7 Mar 2003 17:32:56 -0000
@@ -139,7 +139,8 @@
   // Global pointers to Python objects                                      //
   ////////////////////////////////////////////////////////////////////////////
 
-  static PyObject* pyCORBAmodule;      // The CORBA module
+  static PyObject* py_omnipymodule;    // _omnipy module
+  static PyObject* pyCORBAmodule;      // CORBA module
   static PyObject* pyCORBAsysExcMap;   //  The system exception map
   static PyObject* pyCORBAAnyClass;    //  Any class
   static PyObject* pyCORBAContextClass;//  Context class
Index: modules/pyObjectRef.cc
===================================================================
RCS file: /cvsroot/omniorb/omniORBpy/modules/Attic/pyObjectRef.cc,v
retrieving revision 1.1.2.16
diff -u -r1.1.2.16 pyObjectRef.cc
--- modules/pyObjectRef.cc	2 Aug 2002 13:33:49 -0000	1.1.2.16
+++ modules/pyObjectRef.cc	7 Mar 2003 17:32:56 -0000
@@ -85,6 +85,7 @@
 //
 
 #include <omnipy.h>
+#include <omniORBpy.h>
 
 // Internal omniORB interfaces
 #include <objectTable.h>
@@ -248,6 +249,35 @@
     PortableServer::Current_var pc = PortableServer::Current::_narrow(objref);
     if (!CORBA::is_nil(pc)) return createPyPOACurrentObject(pc);
   }
+  do {
+    // No built in converter. Try the list of registered external functions
+    PyObject* fnlist = PyObject_GetAttrString(omniPy::py_omnipymodule,
+					      (char*)"pseudoFns");
+    if (!fnlist || !PySequence_Check(fnlist)) {
+      PyErr_Clear();
+      omniORB::logs(1, "WARNING: _omnipy.pseudoFns is not a sequence.");
+      Py_XDECREF(fnlist);
+      break;
+    }
+    int len = PySequence_Size(fnlist);
+    for (int i=0; i < len; i++) {
+      PyObject* pyf = PySequence_GetItem(fnlist, i);
+      if (!PyCObject_Check(pyf)) {
+	omniORB::logs(1, "WARNING: Entry in _omnipy.pseudoFns "
+		      "is not a PyCObject.");
+	continue;
+      }
+      omniORBpyPseudoFn f = (omniORBpyPseudoFn)PyCObject_AsVoidPtr(pyf);
+      PyObject* ret = f(objref);
+      if (ret) {
+	Py_DECREF(fnlist);
+	return ret;
+      }
+    }
+    Py_DECREF(fnlist);
+
+  } while (0);
+
   try {
     // Use OMNIORB_THROW to get a nice trace message
     OMNIORB_THROW(INV_OBJREF, INV_OBJREF_NoPythonTypeForPseudoObj,

------- =_aaaaaaaaaa0
Content-Type: text/plain; charset="us-ascii"
Content-ID: <2617.1047059007.3@grisby.org>

-- 
 -- Duncan Grisby         --
  -- duncan@grisby.org     --
   -- http://www.grisby.org --

------- =_aaaaaaaaaa0--