3
// pyORBFunc.cc Created on: 2000/02/04
4
// Author : Duncan Grisby (dpg1)
6
// Copyright (C) 1999 AT&T Laboratories Cambridge
8
// This file is part of the omniORBpy library
10
// The omniORBpy library is free software; you can redistribute it
11
// and/or modify it under the terms of the GNU Lesser General
12
// Public License as published by the Free Software Foundation;
13
// either version 2.1 of the License, or (at your option) any later
16
// This library is distributed in the hope that it will be useful,
17
// but WITHOUT ANY WARRANTY; without even the implied warranty of
18
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
// GNU Lesser General Public License for more details.
21
// You should have received a copy of the GNU Lesser General Public
22
// License along with this library; if not, write to the Free
23
// Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
30
// $Id: pyORBFunc.cc,v 1.1.4.3 2006/07/05 10:46:43 dgrisby Exp $
32
// $Log: pyORBFunc.cc,v $
33
// Revision 1.1.4.3 2006/07/05 10:46:43 dgrisby
34
// list_initial_services did not catch exceptions.
36
// Revision 1.1.4.2 2005/06/24 17:36:01 dgrisby
37
// Support for receiving valuetypes inside Anys; relax requirement for
38
// old style classes in a lot of places.
40
// Revision 1.1.4.1 2003/03/23 21:51:57 dgrisby
41
// New omnipy3_develop branch.
43
// Revision 1.1.2.9 2001/12/04 12:17:43 dpg1
44
// Cope with null ORB.
46
// Revision 1.1.2.8 2001/09/24 10:48:27 dpg1
47
// Meaningful minor codes.
49
// Revision 1.1.2.7 2001/09/20 14:51:25 dpg1
50
// Allow ORB reinitialisation after destroy(). Clean up use of omni namespace.
52
// Revision 1.1.2.6 2001/08/01 10:12:36 dpg1
53
// Main thread policy.
55
// Revision 1.1.2.5 2001/05/10 15:16:02 dpg1
56
// Big update to support new omniORB 4 internals.
58
// Revision 1.1.2.4 2001/03/13 10:38:07 dpg1
59
// Fixes from omnipy1_develop
61
// Revision 1.1.2.3 2000/12/04 18:57:23 dpg1
62
// Fix deadlock when trying to lock omniORB internal lock while holding
63
// the Python interpreter lock.
65
// Revision 1.1.2.2 2000/11/22 14:42:56 dpg1
66
// Fix segfault in string_to_object and resolve_initial_references with
69
// Revision 1.1.2.1 2000/10/13 13:55:25 dpg1
70
// Initial support for omniORB 4.
74
#include <pyThreadCache.h>
81
pyORB_string_to_object(PyObject* self, PyObject* args)
86
if (!PyArg_ParseTuple(args, (char*)"Os", &pyorb, &s))
89
CORBA::ORB_ptr orb = (CORBA::ORB_ptr)omniPy::getTwin(pyorb, ORB_TWIN);
93
if (!s || strlen(s) == 0) {
95
return omniPy::handleSystemException(ex);
97
CORBA::Object_ptr objref;
100
objref = omniPy::stringToObject(s);
102
OMNIPY_CATCH_AND_HANDLE_SYSTEM_EXCEPTIONS
103
return omniPy::createPyCorbaObjRef(0, objref);
107
pyORB_object_to_string(PyObject* self, PyObject* args)
112
if (!PyArg_ParseTuple(args, (char*)"OO", &pyorb, &pyobjref))
115
CORBA::ORB_ptr orb = (CORBA::ORB_ptr)omniPy::getTwin(pyorb, ORB_TWIN);
119
CORBA::Object_ptr objref;
121
if (pyobjref == Py_None) {
122
objref = CORBA::Object::_nil();
125
objref = (CORBA::Object_ptr)omniPy::getTwin(pyobjref, OBJREF_TWIN);
127
RAISE_PY_BAD_PARAM_IF(!objref, BAD_PARAM_WrongPythonType);
129
CORBA::String_var str;
131
omniPy::InterpreterUnlocker _u;
132
str = orb->object_to_string(objref);
134
OMNIPY_CATCH_AND_HANDLE_SYSTEM_EXCEPTIONS
135
return PyString_FromString((char*)str);
139
pyORB_list_initial_services(PyObject* self, PyObject* args)
143
if (!PyArg_ParseTuple(args, (char*)"O", &pyorb))
146
CORBA::ORB_ptr orb = (CORBA::ORB_ptr)omniPy::getTwin(pyorb, ORB_TWIN);
149
CORBA::ORB::ObjectIdList_var ids;
151
omniPy::InterpreterUnlocker _u;
152
ids = orb->list_initial_services();
154
OMNIPY_CATCH_AND_HANDLE_SYSTEM_EXCEPTIONS
156
PyObject* pyids = PyList_New(ids->length());
158
for (CORBA::ULong i=0; i<ids->length(); i++) {
159
PyList_SetItem(pyids, i, PyString_FromString(ids[i]));
165
pyORB_resolve_initial_references(PyObject* self, PyObject* args)
170
if (!PyArg_ParseTuple(args, (char*)"Os", &pyorb, &id))
173
CORBA::ORB_ptr orb = (CORBA::ORB_ptr)omniPy::getTwin(pyorb, ORB_TWIN);
176
CORBA::Object_ptr objref;
179
omniPy::InterpreterUnlocker _u;
180
objref = orb->resolve_initial_references(id);
182
if (!(CORBA::is_nil(objref) || objref->_NP_is_pseudo())) {
183
omniObjRef* cxxref = objref->_PR_getobj();
184
omniObjRef* pyref = omniPy::createObjRef(CORBA::Object::_PD_repoId,
185
cxxref->_getIOR(), 0, 0);
186
CORBA::release(objref);
188
(CORBA::Object_ptr)pyref->_ptrToObjRef(CORBA::Object::_PD_repoId);
191
catch (CORBA::ORB::InvalidName& ex) {
192
PyObject* excc = PyObject_GetAttrString(pyorb, (char*)"InvalidName");
193
OMNIORB_ASSERT(excc);
194
PyObject* exci = PyEval_CallObject(excc, omniPy::pyEmptyTuple);
195
PyErr_SetObject(excc, exci);
198
OMNIPY_CATCH_AND_HANDLE_SYSTEM_EXCEPTIONS
200
return omniPy::createPyCorbaObjRef(0, objref);
204
pyORB_work_pending(PyObject* self, PyObject* args)
208
if (!PyArg_ParseTuple(args, (char*)"O", &pyorb)) return NULL;
210
CORBA::ORB_ptr orb = (CORBA::ORB_ptr)omniPy::getTwin(pyorb, ORB_TWIN);
213
CORBA::Boolean pending;
216
omniPy::InterpreterUnlocker _u;
217
pending = orb->work_pending();
219
OMNIPY_CATCH_AND_HANDLE_SYSTEM_EXCEPTIONS
221
return PyInt_FromLong(pending);
225
pyORB_perform_work(PyObject* self, PyObject* args)
229
if (!PyArg_ParseTuple(args, (char*)"O", &pyorb)) return NULL;
231
CORBA::ORB_ptr orb = (CORBA::ORB_ptr)omniPy::getTwin(pyorb, ORB_TWIN);
235
omniPy::InterpreterUnlocker _u;
238
OMNIPY_CATCH_AND_HANDLE_SYSTEM_EXCEPTIONS
245
pyORB_run_timeout(PyObject* self, PyObject* args)
250
if (!PyArg_ParseTuple(args, (char*)"Od", &pyorb, &timeout)) return NULL;
252
CORBA::ORB_ptr orb = (CORBA::ORB_ptr)omniPy::getTwin(pyorb, ORB_TWIN);
255
CORBA::Boolean shutdown;
258
omniPy::InterpreterUnlocker _u;
260
s = (unsigned long)floor(timeout);
261
ns = (unsigned long)((timeout - (double)s) * 1000000000.0);
262
omni_thread::get_time(&s, &ns, s, ns);
263
shutdown = ((omniOrbORB*)orb)->run_timeout(s, ns);
265
OMNIPY_CATCH_AND_HANDLE_SYSTEM_EXCEPTIONS
267
return PyInt_FromLong(shutdown);
271
pyORB_shutdown(PyObject* self, PyObject* args)
276
if (!PyArg_ParseTuple(args, (char*)"Oi", &pyorb, &wait)) return NULL;
278
CORBA::ORB_ptr orb = (CORBA::ORB_ptr)omniPy::getTwin(pyorb, ORB_TWIN);
282
omniPy::InterpreterUnlocker _u;
285
OMNIPY_CATCH_AND_HANDLE_SYSTEM_EXCEPTIONS
292
pyORB_destroy(PyObject* self, PyObject* args)
296
if (!PyArg_ParseTuple(args, (char*)"O", &pyorb)) return NULL;
298
CORBA::ORB_ptr orb = (CORBA::ORB_ptr)omniPy::getTwin(pyorb, ORB_TWIN);
302
omniPy::InterpreterUnlocker _u;
305
OMNIPY_CATCH_AND_HANDLE_SYSTEM_EXCEPTIONS
312
pyORB_releaseRef(PyObject* self, PyObject* args)
316
if (!PyArg_ParseTuple(args, (char*)"O", &pyorb)) return NULL;
318
CORBA::ORB_ptr orb = (CORBA::ORB_ptr)omniPy::getTwin(pyorb, ORB_TWIN);
322
omniPy::InterpreterUnlocker _u;
325
OMNIPY_CATCH_AND_HANDLE_SYSTEM_EXCEPTIONS
332
////////////////////////////////////////////////////////////////////////////
333
// Python method table //
334
////////////////////////////////////////////////////////////////////////////
336
static PyMethodDef pyORB_methods[] = {
337
{(char*)"string_to_object", pyORB_string_to_object, METH_VARARGS},
338
{(char*)"object_to_string", pyORB_object_to_string, METH_VARARGS},
339
{(char*)"list_initial_services",
340
pyORB_list_initial_services, METH_VARARGS},
341
{(char*)"resolve_initial_references",
342
pyORB_resolve_initial_references,METH_VARARGS},
343
{(char*)"work_pending", pyORB_work_pending, METH_VARARGS},
344
{(char*)"perform_work", pyORB_perform_work, METH_VARARGS},
345
{(char*)"run_timeout", pyORB_run_timeout, METH_VARARGS},
346
{(char*)"shutdown", pyORB_shutdown, METH_VARARGS},
347
{(char*)"destroy", pyORB_destroy, METH_VARARGS},
348
{(char*)"releaseRef", pyORB_releaseRef, METH_VARARGS},
355
omniPy::initORBFunc(PyObject* d)
357
PyObject* m = Py_InitModule((char*)"_omnipy.orb_func", pyORB_methods);
358
PyDict_SetItemString(d, (char*)"orb_func", m);