diff options
author | Michael Meeks <michael.meeks@novell.com> | 2011-05-19 14:46:28 +0100 |
---|---|---|
committer | Michael Meeks <michael.meeks@novell.com> | 2011-05-19 14:50:35 +0100 |
commit | f85638485cdc1ddd25f322ea4c30a386351f4bd5 (patch) | |
tree | dc7e0618ce18734d6e617e956a31dc2efc46b2be /pyuno/source/module | |
parent | 31c1e6f573498364497480615eb072944c0d9d17 (diff) |
don't crash when interacting with a class that implements XInvocation
VclStringResourceLoader eg.
test = smgr.createInstance("com.sun.star.resource.VclStringResourceLoader")
invocation = test.setValue("FileName", "test")
It seems we can't cope with XInvocation implementors, so give a nice
exception instead
Diffstat (limited to 'pyuno/source/module')
-rw-r--r-- | pyuno/source/module/pyuno.cxx | 19 | ||||
-rw-r--r-- | pyuno/source/module/pyuno_callable.cxx | 2 |
2 files changed, 18 insertions, 3 deletions
diff --git a/pyuno/source/module/pyuno.cxx b/pyuno/source/module/pyuno.cxx index dbdddac470b3..2df863dabe5b 100644 --- a/pyuno/source/module/pyuno.cxx +++ b/pyuno/source/module/pyuno.cxx @@ -708,14 +708,14 @@ PyObject* PyUNO_new ( Reference<XInterface> tmp_interface; targetInterface >>= tmp_interface; + if (!tmp_interface.is ()) { // empty reference ! Py_INCREF( Py_None ); return Py_None; } - - return PyUNO_new_UNCHECKED (targetInterface, ssf); + return PyUNO_new_UNCHECKED (targetInterface, ssf); } @@ -729,14 +729,27 @@ PyObject* PyUNO_new_UNCHECKED ( self = PyObject_New (PyUNO, &PyUNOType); if (self == NULL) - return NULL; //NULL == error + return NULL; // == error self->members = new PyUNOInternals(); arguments[0] <<= targetInterface; { PyThreadDetach antiguard; tmp_interface = ssf->createInstanceWithArguments (arguments); + + if (!tmp_interface.is ()) + { + Py_INCREF( Py_None ); + return Py_None; + } + Reference<XInvocation2> tmp_invocation (tmp_interface, UNO_QUERY); + if (!tmp_invocation.is()) { + throw RuntimeException (rtl::OUString::createFromAscii ( + "XInvocation2 not implemented, cannot interact with object"), + Reference< XInterface > ()); + } + self->members->xInvocation = tmp_invocation; self->members->wrappedObject = targetInterface; } diff --git a/pyuno/source/module/pyuno_callable.cxx b/pyuno/source/module/pyuno_callable.cxx index c1451683f17f..2bd2a7da2fa8 100644 --- a/pyuno/source/module/pyuno_callable.cxx +++ b/pyuno/source/module/pyuno_callable.cxx @@ -256,6 +256,8 @@ PyRef PyUNO_callable_new ( { PyUNO_callable* self; + OSL_ENSURE (my_inv.is(), "XInvocation must be valid"); + self = PyObject_New (PyUNO_callable, &PyUNO_callable_Type); if (self == NULL) return NULL; //NULL == Error! |