[omniORB] [PATCH] add support for setraises and getraises
Wei Jiang
sdjiangwei at gmail.com
Thu Jul 23 18:05:36 BST 2009
Hi,
Since most ORBs already support setraises and getraises, so I made a
patch for omniORB and omniORBpy.
And full tested.
y.tab.* and lex.yy.cc are excluded from the patch, please recompile
idl.ll and idl.yy.
********************** IDL Compiler Test ************************
[jw at lt ~]$ cat test.idl
typedef string X,Y,Z;
interface TestAttr {
exception WrongTime { };
exception WrongPlace { };
struct Point { float x,y,z; };
readonly attribute double value raises(WrongTime, WrongPlace);
attribute Point xyz getraises(WrongTime) setraises(WrongPlace);
};
[jw at lt ~]$ omniidl -bdump test.idl
typedef string X, Y, Z;
interface TestAttr {
exception WrongTime {
};
exception WrongPlace {
};
struct Point {
float x, y, z;
};
readonly attribute double value raises (TestAttr::WrongTime,
TestAttr::WrongPlace);
attribute ::TestAttr::Point xyz getraises (TestAttr::WrongTime)
setraises (TestAttr::WrongPlace);
};
[jw at lt ~]$ omniidl -d test.idl
typedef string X, Y, Z;
interface TestAttr { // RepoId = IDL:TestAttr:1.0
exception WrongTime {
};
exception WrongPlace {
};
struct Point { // RepoId = IDL:TestAttr/Point:1.0
float x, y, z;
};
readonly attribute double value raises (TestAttr::WrongTime,
TestAttr::WrongPlace);
attribute TestAttr::Point xyz getraises (TestAttr::WrongTime)
setraises (TestAttr::WrongPlace);
};
[jw at lt ~]$ omniidl -bpython -Wbstdout test.idl
... ...
# TestAttr operations and attributes
TestAttr._d__get_value =
((),(omniORB.tcInternal.tv_double,),{_0__GlobalIDL.TestAttr.WrongTime._NP_RepositoryId:
_0__GlobalIDL.TestAttr._d_WrongTime,
_0__GlobalIDL.TestAttr.WrongPlace._NP_RepositoryId:
_0__GlobalIDL.TestAttr._d_WrongPlace})
TestAttr._d__get_xyz =
((),(omniORB.typeMapping["IDL:TestAttr/Point:1.0"],),{_0__GlobalIDL.TestAttr.WrongTime._NP_RepositoryId:
_0__GlobalIDL.TestAttr._d_WrongTime})
TestAttr._d__set_xyz =
((omniORB.typeMapping["IDL:TestAttr/Point:1.0"],),(),{_0__GlobalIDL.TestAttr.WrongPlace._NP_RepositoryId:
_0__GlobalIDL.TestAttr._d_WrongPlace})
... ...
[jw at lt ~]$ omniidl -bcxx test.idl && cat testSK.cc
... ...
const char* const _0RL_cd_c3e75e47f9aa5034_00000000::_user_exns[] = {
TestAttr::WrongPlace::_PD_repoId,
TestAttr::WrongTime::_PD_repoId
};
void _0RL_cd_c3e75e47f9aa5034_00000000::userException(cdrStream& s,
_OMNI_NS(IOP_C)* iop_client, const char* repoId)
{
if ( omni::strMatch(repoId, TestAttr::WrongPlace::_PD_repoId) ) {
TestAttr::WrongPlace _ex;
_ex <<= s;
if (iop_client) iop_client->RequestCompleted();
throw _ex;
}
if ( omni::strMatch(repoId, TestAttr::WrongTime::_PD_repoId) ) {
TestAttr::WrongTime _ex;
_ex <<= s;
if (iop_client) iop_client->RequestCompleted();
throw _ex;
}
... ...
****************************Python Server & Client
Test*****************************************
*Python Server*
class TestAttr_i (_GlobalIDL__POA.TestAttr):
def __init__(self):
pass
# readonly attribute double value
def _get_value(self):
raise _GlobalIDL.TestAttr.WrongTime()
# attribute TestAttr::Point xyz
def _set_xyz(self, value):
raise _GlobalIDL.TestAttr.WrongPlace()
# attribute TestAttr::Point xyz
def _get_xyz(self):
raise _GlobalIDL.TestAttr.WrongTime()
*Python Client*
try:
o._get_value()
except Exception,e:
print e
try:
o._set_xyz(TestAttr.Point(1,2,3))
except Exception,e:
print e
try:
o._get_xyz()
except Exception,e:
print e
* run *
[jw at lt t]$ python test_idl_example.py
IOR:010000001100000049444c3a5465...
[jw at lt t]$ python client.py IOR:010000001100000049444...
_GlobalIDL.TestAttr.WrongTime()
_GlobalIDL.TestAttr.WrongPlace()
_GlobalIDL.TestAttr.WrongTime()
****************************C++ Server & Client
Test*****************************************
* C++ Server Code*
... ...
::CORBA::Double TestAttr_i::value(){
throw TestAttr::WrongTime();
}
void TestAttr_i::xyz(const TestAttr::Point&){
throw TestAttr::WrongPlace();
}
TestAttr::Point TestAttr_i::xyz(){
throw TestAttr::WrongTime();
}
... ...
* C++ Client Code*
... ...
try {
t->value();
} catch (TestAttr::WrongTime &) {
std::cout << "TestAttr::WrongTime" << std::endl;
} catch (TestAttr::WrongPlace &) {
std::cout << "TestAttr::WrongPlace" << std::endl;
}
try {
t->xyz(TestAttr::Point());
} catch (TestAttr::WrongTime &) {
std::cout << "TestAttr::WrongTime" << std::endl;
} catch (TestAttr::WrongPlace &) {
std::cout << "TestAttr::WrongPlace" << std::endl;
}
try {
t->xyz();
} catch (TestAttr::WrongTime &) {
std::cout << "TestAttr::WrongTime" << std::endl;
} catch (TestAttr::WrongPlace &) {
std::cout << "TestAttr::WrongPlace" << std::endl;
}
... ...
*run*
[jw at lt ~]$ ./server
IDL object TestAttr IOR = 'IOR:010000001100000049444c3a5465737441747...'
[jw at lt ~]$ ./client
IOR:010000001100000049444c3a54657374417474723a312e300000000...
TestAttr::WrongTime
TestAttr::WrongPlace
TestAttr::WrongTime
-------------- next part --------------
A non-text attachment was scrubbed...
Name: attr_raises.patch
Type: application/octet-stream
Size: 17552 bytes
Desc: not available
Url : http://www.omniorb-support.com/pipermail/omniorb-list/attachments/20090723/e5db5e2d/attr_raises-0001.obj
-------------- next part --------------
A non-text attachment was scrubbed...
Name: attr_raises_py.patch
Type: application/octet-stream
Size: 3267 bytes
Desc: not available
Url : http://www.omniorb-support.com/pipermail/omniorb-list/attachments/20090723/e5db5e2d/attr_raises_py-0001.obj
More information about the omniORB-list
mailing list