r2corba 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGES +159 -0
- data/LICENSE +59 -0
- data/README +62 -0
- data/THANKS +52 -0
- data/bin/r2corba +8 -0
- data/bin/ridlc +11 -0
- data/bin/rins +7 -0
- data/ext/ext.mwc +6 -0
- data/ext/extload/extload.c +60 -0
- data/ext/libr2tao/any.cpp +1543 -0
- data/ext/libr2tao/exception.cpp +202 -0
- data/ext/libr2tao/exception.h +104 -0
- data/ext/libr2tao/longdouble.cpp +173 -0
- data/ext/libr2tao/longdouble.h +31 -0
- data/ext/libr2tao/object.cpp +1150 -0
- data/ext/libr2tao/object.h +38 -0
- data/ext/libr2tao/orb.cpp +1029 -0
- data/ext/libr2tao/orb.h +36 -0
- data/ext/libr2tao/r2tao_export.h +45 -0
- data/ext/libr2tao/r2tao_ext.h +38 -0
- data/ext/libr2tao/required.cpp +463 -0
- data/ext/libr2tao/required.h +187 -0
- data/ext/libr2tao/typecode.cpp +888 -0
- data/ext/libr2tao/typecode.h +45 -0
- data/ext/libr2tao/values.cpp +2938 -0
- data/ext/libr2tao/values.h +396 -0
- data/ext/librpoa/iortable.cpp +250 -0
- data/ext/librpoa/poa.cpp +1076 -0
- data/ext/librpoa/poa.h +24 -0
- data/ext/librpoa/rpoa_export.h +44 -0
- data/ext/librpoa/servant.cpp +1338 -0
- data/ext/librpoa/servant.h +116 -0
- data/ext/librpoa/srvreq_fix.cpp +283 -0
- data/ext/librpoa/srvreq_fix.h +149 -0
- data/ext/librpol/policies.cpp +763 -0
- data/ext/librpol/policies.h +15 -0
- data/ext/librpol/rpol_export.h +44 -0
- data/lib/corba/cbase/IORMap.rb +33 -0
- data/lib/corba/cbase/ORB.rb +231 -0
- data/lib/corba/cbase/Request.rb +134 -0
- data/lib/corba/cbase/Streams.rb +129 -0
- data/lib/corba/cbase/Stub.rb +19 -0
- data/lib/corba/cbase/Typecode.rb +441 -0
- data/lib/corba/cbase/Values.rb +129 -0
- data/lib/corba/cbase/exception.rb +66 -0
- data/lib/corba/cbase/poa.rb +23 -0
- data/lib/corba/cbase/policies.rb +78 -0
- data/lib/corba/cbase/post_require.rb +14 -0
- data/lib/corba/cbase/require.rb +28 -0
- data/lib/corba/cmds/base.rb +85 -0
- data/lib/corba/cmds/test.rb +30 -0
- data/lib/corba/common/Any.rb +91 -0
- data/lib/corba/common/IDL.rb +104 -0
- data/lib/corba/common/ORB.rb +368 -0
- data/lib/corba/common/Object.rb +208 -0
- data/lib/corba/common/Request.rb +20 -0
- data/lib/corba/common/Servant.rb +108 -0
- data/lib/corba/common/Struct.rb +22 -0
- data/lib/corba/common/Stub.rb +79 -0
- data/lib/corba/common/Typecode.rb +1121 -0
- data/lib/corba/common/Union.rb +56 -0
- data/lib/corba/common/Values.rb +92 -0
- data/lib/corba/common/const.rb +22 -0
- data/lib/corba/common/exception.rb +68 -0
- data/lib/corba/common/require.rb +27 -0
- data/lib/corba/common/version.rb +22 -0
- data/lib/corba/idl/IDL.rb +21 -0
- data/lib/corba/idl/IORTable.pidl +62 -0
- data/lib/corba/idl/TAO_Ext.pidl +46 -0
- data/lib/corba/idl/require.rb +20 -0
- data/lib/corba/jbase/Any.rb +273 -0
- data/lib/corba/jbase/IORMap.rb +36 -0
- data/lib/corba/jbase/ORB.rb +99 -0
- data/lib/corba/jbase/Object.rb +98 -0
- data/lib/corba/jbase/Request.rb +226 -0
- data/lib/corba/jbase/Servant.rb +247 -0
- data/lib/corba/jbase/ServerRequest.rb +128 -0
- data/lib/corba/jbase/Streams.rb +671 -0
- data/lib/corba/jbase/Stub.rb +38 -0
- data/lib/corba/jbase/Typecode.rb +520 -0
- data/lib/corba/jbase/Values.rb +173 -0
- data/lib/corba/jbase/exception.rb +106 -0
- data/lib/corba/jbase/poa.rb +229 -0
- data/lib/corba/jbase/policies.rb +300 -0
- data/lib/corba/jbase/post_require.rb +14 -0
- data/lib/corba/jbase/require.rb +86 -0
- data/lib/corba/naming.rb +14 -0
- data/lib/corba/naming_service.rb +15 -0
- data/lib/corba/poa.rb +15 -0
- data/lib/corba/policies.rb +18 -0
- data/lib/corba/require.rb +17 -0
- data/lib/corba/svcs/ins/cos_naming.rb +426 -0
- data/lib/corba/svcs/ins/ins.rb +526 -0
- data/lib/corba/svcs/ins/naming_service.rb +119 -0
- data/lib/corba.rb +16 -0
- data/lib/ridlbe/ruby/config.rb +336 -0
- data/lib/ridlbe/ruby/require.rb +16 -0
- data/lib/ridlbe/ruby/walker.rb +1582 -0
- data/mkrf_conf_srcgem.rb +186 -0
- data/rakelib/bin.rake +80 -0
- data/rakelib/bin.rb +146 -0
- data/rakelib/build.rake +87 -0
- data/rakelib/config.rake +52 -0
- data/rakelib/config.rb +450 -0
- data/rakelib/ext.rake +242 -0
- data/rakelib/ext.rb +308 -0
- data/rakelib/ext_r2tao.rb +232 -0
- data/rakelib/gem.rake +212 -0
- data/rakelib/gem.rb +146 -0
- data/rakelib/package.rake +26 -0
- data/rakelib/test.rake +23 -0
- data/test/BiDirectional/Test.idl +34 -0
- data/test/BiDirectional/client.rb +132 -0
- data/test/BiDirectional/run_test.rb +68 -0
- data/test/BiDirectional/server.rb +169 -0
- data/test/CORBA_Services/Naming/BindingIterator/Test.idl +27 -0
- data/test/CORBA_Services/Naming/BindingIterator/client.rb +121 -0
- data/test/CORBA_Services/Naming/BindingIterator/run_test.rb +82 -0
- data/test/CORBA_Services/Naming/BindingIterator/server.rb +109 -0
- data/test/CORBA_Services/Naming/Corbaname/Test.idl +27 -0
- data/test/CORBA_Services/Naming/Corbaname/client.rb +85 -0
- data/test/CORBA_Services/Naming/Corbaname/run_test.rb +88 -0
- data/test/CORBA_Services/Naming/Corbaname/server.rb +135 -0
- data/test/CORBA_Services/Naming/Simple/Test.idl +27 -0
- data/test/CORBA_Services/Naming/Simple/client.rb +84 -0
- data/test/CORBA_Services/Naming/Simple/run_test.rb +82 -0
- data/test/CORBA_Services/Naming/Simple/server.rb +109 -0
- data/test/Collocation/Diamond.idl +39 -0
- data/test/Collocation/run_test.rb +52 -0
- data/test/Collocation/test.rb +195 -0
- data/test/Connect_Timeout/Test.idl +27 -0
- data/test/Connect_Timeout/client.rb +111 -0
- data/test/Connect_Timeout/run_test.rb +52 -0
- data/test/DII/Test.idl +27 -0
- data/test/DII/client.rb +115 -0
- data/test/DII/run_test.rb +69 -0
- data/test/DII/server.rb +95 -0
- data/test/DSI/Test.idl +27 -0
- data/test/DSI/client.rb +66 -0
- data/test/DSI/run_test.rb +69 -0
- data/test/DSI/server.rb +106 -0
- data/test/Exceptions/Test.idl +48 -0
- data/test/Exceptions/client.rb +118 -0
- data/test/Exceptions/run_test.rb +69 -0
- data/test/Exceptions/server.rb +131 -0
- data/test/Hello/Test.idl +27 -0
- data/test/Hello/client.rb +78 -0
- data/test/Hello/run_test.rb +71 -0
- data/test/Hello/server.rb +95 -0
- data/test/IDL_Test/Test.idl +113 -0
- data/test/IDL_Test/Test_inc.idl +17 -0
- data/test/IDL_Test/client.rb +102 -0
- data/test/IDL_Test/run_test.rb +69 -0
- data/test/IDL_Test/server.rb +99 -0
- data/test/IORMap/Test.idl +27 -0
- data/test/IORMap/client.rb +73 -0
- data/test/IORMap/run_test.rb +69 -0
- data/test/IORMap/server.rb +114 -0
- data/test/IORTable/Test.idl +27 -0
- data/test/IORTable/client.rb +75 -0
- data/test/IORTable/run_test.rb +69 -0
- data/test/IORTable/server.rb +130 -0
- data/test/Implicit_Conversion/Test.idl +31 -0
- data/test/Implicit_Conversion/client.rb +110 -0
- data/test/Implicit_Conversion/run_test.rb +69 -0
- data/test/Implicit_Conversion/server.rb +99 -0
- data/test/Multi_Threading/Multiple_ORB/Test.idl +27 -0
- data/test/Multi_Threading/Multiple_ORB/client.rb +82 -0
- data/test/Multi_Threading/Multiple_ORB/run_test.rb +71 -0
- data/test/Multi_Threading/Multiple_ORB/server.rb +108 -0
- data/test/Multi_Threading/Simple/Test.idl +27 -0
- data/test/Multi_Threading/Simple/client.rb +88 -0
- data/test/Multi_Threading/Simple/run_test.rb +69 -0
- data/test/Multi_Threading/Simple/server.rb +118 -0
- data/test/Multi_Threading/Threads/Test.idl +31 -0
- data/test/Multi_Threading/Threads/client.rb +80 -0
- data/test/Multi_Threading/Threads/run_test.rb +76 -0
- data/test/Multi_Threading/Threads/server.rb +119 -0
- data/test/Multi_Threading/Threads/watchdog.rb +87 -0
- data/test/Multiple_Servant_Interfaces/Test.idl +34 -0
- data/test/Multiple_Servant_Interfaces/client.rb +70 -0
- data/test/Multiple_Servant_Interfaces/run_test.rb +69 -0
- data/test/Multiple_Servant_Interfaces/server.rb +102 -0
- data/test/Nil/Test.idl +27 -0
- data/test/Nil/run_test.rb +52 -0
- data/test/Nil/test.rb +78 -0
- data/test/OBV/AbstractInterface/client.rb +179 -0
- data/test/OBV/AbstractInterface/run_test.rb +69 -0
- data/test/OBV/AbstractInterface/server.rb +149 -0
- data/test/OBV/AbstractInterface/test.idl +53 -0
- data/test/OBV/Custom/OBV.idl +18 -0
- data/test/OBV/Custom/OBV_impl.rb +40 -0
- data/test/OBV/Custom/client.rb +86 -0
- data/test/OBV/Custom/run_test.rb +69 -0
- data/test/OBV/Custom/server.rb +100 -0
- data/test/OBV/Simple/OBV.idl +15 -0
- data/test/OBV/Simple/OBV_impl.rb +26 -0
- data/test/OBV/Simple/client.rb +86 -0
- data/test/OBV/Simple/run_test.rb +69 -0
- data/test/OBV/Simple/server.rb +100 -0
- data/test/OBV/Simple_Event/Event.idl +15 -0
- data/test/OBV/Simple_Event/Event_impl.rb +26 -0
- data/test/OBV/Simple_Event/client.rb +86 -0
- data/test/OBV/Simple_Event/run_test.rb +69 -0
- data/test/OBV/Simple_Event/server.rb +100 -0
- data/test/OBV/Supports/client.rb +116 -0
- data/test/OBV/Supports/run_test.rb +69 -0
- data/test/OBV/Supports/server.rb +103 -0
- data/test/OBV/Supports/supports.idl +33 -0
- data/test/OBV/Supports/supports_impl.rb +57 -0
- data/test/OBV/Tree/client.rb +116 -0
- data/test/OBV/Tree/run_test.rb +69 -0
- data/test/OBV/Tree/server.rb +117 -0
- data/test/OBV/Tree/test.idl +32 -0
- data/test/OBV/Truncatable/Extra.idl +27 -0
- data/test/OBV/Truncatable/Truncatable.idl +105 -0
- data/test/OBV/Truncatable/Truncatable_impl.rb +86 -0
- data/test/OBV/Truncatable/client.rb +279 -0
- data/test/OBV/Truncatable/run_test.rb +69 -0
- data/test/OBV/Truncatable/server.rb +89 -0
- data/test/OBV/ValueBox/client.rb +497 -0
- data/test/OBV/ValueBox/run_test.rb +69 -0
- data/test/OBV/ValueBox/server.rb +271 -0
- data/test/OBV/ValueBox/valuebox.idl +101 -0
- data/test/OBV/ValueBox/vb_basic.idl +75 -0
- data/test/OBV/ValueBox/vb_struct.idl +68 -0
- data/test/OBV/ValueBox/vb_union.idl +21 -0
- data/test/Object/Test.idl +27 -0
- data/test/Object/client.rb +103 -0
- data/test/Object/run_test.rb +69 -0
- data/test/Object/server.rb +126 -0
- data/test/POA/Test.idl +27 -0
- data/test/POA/run_test.rb +52 -0
- data/test/POA/test.rb +112 -0
- data/test/Param_Test/Test.idl +182 -0
- data/test/Param_Test/client.rb +277 -0
- data/test/Param_Test/run_test.rb +69 -0
- data/test/Param_Test/server.rb +296 -0
- data/test/Performance/Simple/Test.idl +27 -0
- data/test/Performance/Simple/client.rb +90 -0
- data/test/Performance/Simple/run_test.rb +69 -0
- data/test/Performance/Simple/server.rb +95 -0
- data/test/Policies/Test.idl +27 -0
- data/test/Policies/run_test.rb +52 -0
- data/test/Policies/test.rb +144 -0
- data/test/Timeout/client.rb +207 -0
- data/test/Timeout/run_test.rb +69 -0
- data/test/Timeout/server.rb +109 -0
- data/test/Timeout/test.idl +19 -0
- data/test/lib/assert.rb +43 -0
- data/test/lib/test.rb +542 -0
- data/test/test_runner.rb +193 -0
- metadata +334 -0
|
@@ -0,0 +1,1338 @@
|
|
|
1
|
+
/*--------------------------------------------------------------------
|
|
2
|
+
# servant.cpp - R2TAO CORBA Servant support
|
|
3
|
+
#
|
|
4
|
+
# Author: Martin Corino
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can redistribute it and/or
|
|
7
|
+
# modify it under the terms of the R2CORBA LICENSE which is
|
|
8
|
+
# included with this program.
|
|
9
|
+
#
|
|
10
|
+
# Copyright (c) Remedy IT Expertise BV
|
|
11
|
+
# Chamber of commerce Rotterdam nr.276339, The Netherlands
|
|
12
|
+
#------------------------------------------------------------------*/
|
|
13
|
+
|
|
14
|
+
#include "poa.h"
|
|
15
|
+
#include "tao/DynamicInterface/Server_Request.h"
|
|
16
|
+
#include "tao/DynamicInterface/Dynamic_Implementation.h"
|
|
17
|
+
#include "tao/AnyTypeCode/Any.h"
|
|
18
|
+
#include "tao/AnyTypeCode/NVList.h"
|
|
19
|
+
#include "tao/ORB.h"
|
|
20
|
+
#include "tao/Exception.h"
|
|
21
|
+
#include "tao/TSS_Resources.h"
|
|
22
|
+
#include "tao/PortableServer/POA_Current_Impl.h"
|
|
23
|
+
#include "typecode.h"
|
|
24
|
+
#include "object.h"
|
|
25
|
+
#include "exception.h"
|
|
26
|
+
#include "orb.h"
|
|
27
|
+
#include "servant.h"
|
|
28
|
+
|
|
29
|
+
#if RPOA_NEED_DSI_FIX
|
|
30
|
+
# include "srvreq_fix.cpp"
|
|
31
|
+
#endif
|
|
32
|
+
|
|
33
|
+
#define RUBY_INVOKE_FUNC RUBY_ALLOC_FUNC
|
|
34
|
+
|
|
35
|
+
VALUE r2tao_cServant;
|
|
36
|
+
static VALUE r2tao_cDynamicImp;
|
|
37
|
+
static VALUE r2tao_cServerRequest;
|
|
38
|
+
|
|
39
|
+
static int r2tao_IN_ARG;
|
|
40
|
+
static int r2tao_INOUT_ARG;
|
|
41
|
+
static int r2tao_OUT_ARG;
|
|
42
|
+
|
|
43
|
+
static ID invoke_ID;
|
|
44
|
+
static ID primary_interface_ID;
|
|
45
|
+
|
|
46
|
+
static ID repo_Id;
|
|
47
|
+
static ID repo_Ids;
|
|
48
|
+
static ID get_operation_sig_ID;
|
|
49
|
+
static ID include_ID;
|
|
50
|
+
|
|
51
|
+
static ID interface_repository_id_ID;
|
|
52
|
+
|
|
53
|
+
static R2TAO_RBFuncall FN_narrow ("_narrow");
|
|
54
|
+
|
|
55
|
+
static VALUE ID_arg_list;
|
|
56
|
+
static VALUE ID_result_type;
|
|
57
|
+
static VALUE ID_exc_list;
|
|
58
|
+
static VALUE ID_op_sym;
|
|
59
|
+
|
|
60
|
+
static VALUE r2tao_Servant_default_POA(VALUE self);
|
|
61
|
+
static VALUE r2tao_Servant_this(VALUE self);
|
|
62
|
+
|
|
63
|
+
static VALUE r2tao_ServerRequest_operation(VALUE self);
|
|
64
|
+
static VALUE r2tao_ServerRequest_describe(VALUE self, VALUE desc);
|
|
65
|
+
static VALUE r2tao_ServerRequest_arguments(VALUE self);
|
|
66
|
+
static VALUE r2tao_ServerRequest_get(VALUE self, VALUE key);
|
|
67
|
+
static VALUE r2tao_ServerRequest_set(VALUE self, VALUE key, VALUE val);
|
|
68
|
+
|
|
69
|
+
static VALUE srv_alloc(VALUE klass);
|
|
70
|
+
static void srv_free(void* ptr);
|
|
71
|
+
|
|
72
|
+
void r2tao_init_Servant()
|
|
73
|
+
{
|
|
74
|
+
VALUE klass;
|
|
75
|
+
|
|
76
|
+
r2tao_cServant = klass = rb_eval_string("::R2CORBA::PortableServer::Servant");
|
|
77
|
+
rb_define_alloc_func (r2tao_cServant, RUBY_ALLOC_FUNC (srv_alloc));
|
|
78
|
+
rb_define_method(klass, "_default_POA", RUBY_METHOD_FUNC(r2tao_Servant_default_POA), 0);
|
|
79
|
+
rb_define_method(klass, "_this", RUBY_METHOD_FUNC(r2tao_Servant_this), 0);
|
|
80
|
+
|
|
81
|
+
r2tao_cServerRequest = klass = rb_define_class_under (r2tao_nsCORBA, "ServerRequest", rb_cObject);
|
|
82
|
+
rb_define_method(klass, "operation", RUBY_METHOD_FUNC(r2tao_ServerRequest_operation), 0);
|
|
83
|
+
rb_define_method(klass, "describe", RUBY_METHOD_FUNC(r2tao_ServerRequest_describe), 1);
|
|
84
|
+
rb_define_method(klass, "arguments", RUBY_METHOD_FUNC(r2tao_ServerRequest_arguments), 0);
|
|
85
|
+
rb_define_method(klass, "[]", RUBY_METHOD_FUNC(r2tao_ServerRequest_get), 1);
|
|
86
|
+
rb_define_method(klass, "[]=", RUBY_METHOD_FUNC(r2tao_ServerRequest_set), 2);
|
|
87
|
+
|
|
88
|
+
ID_arg_list = rb_eval_string (":arg_list");
|
|
89
|
+
ID_result_type = rb_eval_string (":result_type");
|
|
90
|
+
ID_exc_list = rb_eval_string (":exc_list");
|
|
91
|
+
ID_op_sym = rb_eval_string (":op_sym");
|
|
92
|
+
|
|
93
|
+
repo_Id = rb_intern ("Id");
|
|
94
|
+
repo_Ids = rb_intern ("Ids");
|
|
95
|
+
get_operation_sig_ID = rb_intern("get_operation_signature");
|
|
96
|
+
include_ID = rb_intern ("include?");
|
|
97
|
+
|
|
98
|
+
interface_repository_id_ID = rb_intern ("_interface_repository_id");
|
|
99
|
+
|
|
100
|
+
r2tao_cDynamicImp = klass = rb_eval_string("::R2CORBA::PortableServer::DynamicImplementation");
|
|
101
|
+
|
|
102
|
+
invoke_ID = rb_intern ("invoke");
|
|
103
|
+
primary_interface_ID = rb_intern ("_primary_interface");
|
|
104
|
+
|
|
105
|
+
r2tao_IN_ARG = NUM2INT (rb_eval_string ("R2CORBA::CORBA::ARG_IN"));
|
|
106
|
+
r2tao_INOUT_ARG = NUM2INT (rb_eval_string ("R2CORBA::CORBA::ARG_INOUT"));
|
|
107
|
+
r2tao_OUT_ARG = NUM2INT (rb_eval_string ("R2CORBA::CORBA::ARG_OUT"));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
//-------------------------------------------------------------------
|
|
111
|
+
// R2TAO CORBA ServerRequest native data structure
|
|
112
|
+
//
|
|
113
|
+
//===================================================================
|
|
114
|
+
|
|
115
|
+
struct DSI_Data {
|
|
116
|
+
R2CORBA_ServerRequest_ptr _request;
|
|
117
|
+
CORBA::NVList_ptr _nvlist;
|
|
118
|
+
CORBA::TypeCode_var _result_type;
|
|
119
|
+
VALUE _rData;
|
|
120
|
+
|
|
121
|
+
DSI_Data(R2CORBA_ServerRequest_ptr _req)
|
|
122
|
+
: _request(_req), _nvlist(0), _rData(Qnil) {}
|
|
123
|
+
~DSI_Data() {
|
|
124
|
+
if (this->_rData!=Qnil) { DATA_PTR(this->_rData) = 0; }
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
//-------------------------------------------------------------------
|
|
129
|
+
// R2TAO CORBA ServerRequest methods
|
|
130
|
+
//
|
|
131
|
+
//===================================================================
|
|
132
|
+
|
|
133
|
+
VALUE r2tao_ServerRequest_operation(VALUE self)
|
|
134
|
+
{
|
|
135
|
+
if (DATA_PTR (self) != 0)
|
|
136
|
+
{
|
|
137
|
+
R2CORBA_ServerRequest_ptr request = static_cast<DSI_Data*> (DATA_PTR (self))->_request;
|
|
138
|
+
return rb_str_new2 (request->operation ());
|
|
139
|
+
}
|
|
140
|
+
return Qnil;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
VALUE r2tao_ServerRequest_describe(VALUE self, VALUE desc)
|
|
144
|
+
{
|
|
145
|
+
if (DATA_PTR (self) != 0)
|
|
146
|
+
{
|
|
147
|
+
DSI_Data* dsi_data = static_cast<DSI_Data*> (DATA_PTR (self));
|
|
148
|
+
|
|
149
|
+
// only allowed once
|
|
150
|
+
if (CORBA::NVList::_nil () != dsi_data->_nvlist)
|
|
151
|
+
{
|
|
152
|
+
X_CORBA (BAD_INV_ORDER);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
R2CORBA_ServerRequest_ptr request = dsi_data->_request;
|
|
156
|
+
|
|
157
|
+
if (desc != Qnil && rb_type (desc) == T_HASH)
|
|
158
|
+
{
|
|
159
|
+
// check desc and create argument list for ORB
|
|
160
|
+
VALUE arg_list = rb_hash_aref (desc, ID_arg_list);
|
|
161
|
+
if (arg_list != Qnil && rb_type (arg_list) != T_ARRAY)
|
|
162
|
+
{
|
|
163
|
+
X_CORBA(BAD_PARAM);
|
|
164
|
+
}
|
|
165
|
+
VALUE result_type = rb_hash_aref (desc, ID_result_type);
|
|
166
|
+
if (result_type != Qnil && rb_obj_is_kind_of(result_type, r2corba_cTypeCode) != Qtrue)
|
|
167
|
+
{
|
|
168
|
+
X_CORBA(BAD_PARAM);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
CORBA::ORB_ptr _orb = request->_tao_server_request ().orb ();
|
|
172
|
+
|
|
173
|
+
R2TAO_TRY
|
|
174
|
+
{
|
|
175
|
+
_orb->create_list (0, dsi_data->_nvlist);
|
|
176
|
+
}
|
|
177
|
+
R2TAO_CATCH;
|
|
178
|
+
|
|
179
|
+
long arg_len =
|
|
180
|
+
arg_list == Qnil ? 0 : RARRAY_LEN (arg_list);
|
|
181
|
+
for (long arg=0; arg<arg_len ;++arg)
|
|
182
|
+
{
|
|
183
|
+
VALUE argspec = rb_ary_entry (arg_list, arg);
|
|
184
|
+
if (argspec != Qnil && rb_type (argspec) != T_ARRAY)
|
|
185
|
+
{
|
|
186
|
+
X_CORBA(BAD_PARAM);
|
|
187
|
+
}
|
|
188
|
+
VALUE argname = rb_ary_entry (argspec, 0);
|
|
189
|
+
if (argname != Qnil && rb_obj_is_kind_of(argname, rb_cString)==Qfalse)
|
|
190
|
+
{
|
|
191
|
+
X_CORBA(BAD_PARAM);
|
|
192
|
+
}
|
|
193
|
+
char *_arg_name = argname != Qnil ? RSTRING_PTR (argname) : 0;
|
|
194
|
+
int _arg_type = NUM2INT (rb_ary_entry (argspec, 1));
|
|
195
|
+
VALUE arg_rtc = rb_ary_entry (argspec, 2);
|
|
196
|
+
if (rb_obj_is_kind_of(arg_rtc, r2corba_cTypeCode)==Qfalse)
|
|
197
|
+
{
|
|
198
|
+
X_CORBA(BAD_PARAM);
|
|
199
|
+
}
|
|
200
|
+
R2TAO_TRY
|
|
201
|
+
{
|
|
202
|
+
CORBA::TypeCode_ptr _arg_tc = r2corba_TypeCode_r2t (arg_rtc);
|
|
203
|
+
|
|
204
|
+
CORBA::NamedValue_ptr _nv = _arg_name ?
|
|
205
|
+
dsi_data->_nvlist->add_item (_arg_name, _arg_type == r2tao_IN_ARG ?
|
|
206
|
+
CORBA::ARG_IN :
|
|
207
|
+
(_arg_type == r2tao_INOUT_ARG ?
|
|
208
|
+
CORBA::ARG_INOUT : CORBA::ARG_OUT))
|
|
209
|
+
:
|
|
210
|
+
dsi_data->_nvlist->add (_arg_type == r2tao_IN_ARG ?
|
|
211
|
+
CORBA::ARG_IN :
|
|
212
|
+
(_arg_type == r2tao_INOUT_ARG ?
|
|
213
|
+
CORBA::ARG_INOUT : CORBA::ARG_OUT));
|
|
214
|
+
// assign type info to Any
|
|
215
|
+
_nv->value ()->_tao_set_typecode (_arg_tc);
|
|
216
|
+
}
|
|
217
|
+
R2TAO_CATCH;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
R2TAO_TRY
|
|
221
|
+
{
|
|
222
|
+
// set ORB arguments (retrieves data for IN/INOUT args)
|
|
223
|
+
request->arguments (dsi_data->_nvlist);
|
|
224
|
+
|
|
225
|
+
// register result type (if any)
|
|
226
|
+
if (result_type != Qnil)
|
|
227
|
+
{
|
|
228
|
+
dsi_data->_result_type =
|
|
229
|
+
CORBA::TypeCode::_duplicate(r2corba_TypeCode_r2t (result_type));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
R2TAO_CATCH;
|
|
233
|
+
}
|
|
234
|
+
else
|
|
235
|
+
{
|
|
236
|
+
X_CORBA(BAD_PARAM);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return Qnil;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
VALUE r2tao_ServerRequest_arguments(VALUE self)
|
|
243
|
+
{
|
|
244
|
+
if (DATA_PTR (self) != 0)
|
|
245
|
+
{
|
|
246
|
+
DSI_Data* dsi_data = static_cast<DSI_Data*> (DATA_PTR (self));
|
|
247
|
+
if (CORBA::NVList::_nil () == dsi_data->_nvlist)
|
|
248
|
+
{
|
|
249
|
+
X_CORBA (BAD_INV_ORDER);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
R2TAO_TRY
|
|
253
|
+
{
|
|
254
|
+
// build argument list for servant implementation
|
|
255
|
+
CORBA::ULong arg_len = dsi_data->_nvlist->count ();
|
|
256
|
+
VALUE rargs = rb_ary_new ();
|
|
257
|
+
for (CORBA::ULong arg=0; arg<arg_len ;++arg)
|
|
258
|
+
{
|
|
259
|
+
CORBA::NamedValue_ptr _nv = dsi_data->_nvlist->item (arg);
|
|
260
|
+
if (ACE_BIT_DISABLED (_nv->flags (), CORBA::ARG_OUT))
|
|
261
|
+
{
|
|
262
|
+
CORBA::TypeCode_var _arg_tc = _nv->value ()->type ();
|
|
263
|
+
VALUE rval = r2tao_Any2Ruby(*_nv->value (), _arg_tc.in (), Qnil, Qnil);
|
|
264
|
+
rb_ary_push (rargs, rval);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return rargs;
|
|
268
|
+
}
|
|
269
|
+
R2TAO_CATCH;
|
|
270
|
+
}
|
|
271
|
+
return Qnil;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
VALUE r2tao_ServerRequest_get(VALUE self, VALUE key)
|
|
275
|
+
{
|
|
276
|
+
if (DATA_PTR (self) != 0)
|
|
277
|
+
{
|
|
278
|
+
DSI_Data* dsi_data = static_cast<DSI_Data*> (DATA_PTR (self));
|
|
279
|
+
if (CORBA::NVList::_nil () == dsi_data->_nvlist)
|
|
280
|
+
{
|
|
281
|
+
X_CORBA (BAD_INV_ORDER);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
if (key == Qnil)
|
|
285
|
+
{
|
|
286
|
+
X_CORBA (BAD_PARAM);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if (rb_obj_is_kind_of (key, rb_cString) == Qtrue)
|
|
290
|
+
{
|
|
291
|
+
char* arg_name = RSTRING_PTR (key);
|
|
292
|
+
CORBA::ULong arg_num = dsi_data->_nvlist->count ();
|
|
293
|
+
for (CORBA::ULong ix=0; ix<arg_num ;++ix)
|
|
294
|
+
{
|
|
295
|
+
CORBA::NamedValue_ptr _nv = dsi_data->_nvlist->item (ix);
|
|
296
|
+
if (_nv->name () && ACE_OS::strcmp (arg_name, _nv->name ()) == 0)
|
|
297
|
+
{
|
|
298
|
+
R2TAO_TRY
|
|
299
|
+
{
|
|
300
|
+
CORBA::TypeCode_var _arg_tc = _nv->value ()->type ();
|
|
301
|
+
return r2tao_Any2Ruby(*_nv->value (), _arg_tc.in (), Qnil, Qnil);
|
|
302
|
+
}
|
|
303
|
+
R2TAO_CATCH;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
X_CORBA (BAD_PARAM);
|
|
308
|
+
}
|
|
309
|
+
else
|
|
310
|
+
{
|
|
311
|
+
CORBA::ULong ix = NUM2ULONG (key);
|
|
312
|
+
if (dsi_data->_nvlist->count () <= ix)
|
|
313
|
+
{
|
|
314
|
+
X_CORBA (BAD_PARAM);
|
|
315
|
+
}
|
|
316
|
+
R2TAO_TRY
|
|
317
|
+
{
|
|
318
|
+
CORBA::NamedValue_ptr _nv = dsi_data->_nvlist->item (ix);
|
|
319
|
+
CORBA::TypeCode_var _arg_tc = _nv->value ()->type ();
|
|
320
|
+
return r2tao_Any2Ruby(*_nv->value (), _arg_tc.in (), Qnil, Qnil);
|
|
321
|
+
}
|
|
322
|
+
R2TAO_CATCH;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return Qnil;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
VALUE r2tao_ServerRequest_set(VALUE self, VALUE key, VALUE val)
|
|
329
|
+
{
|
|
330
|
+
if (DATA_PTR (self) != 0)
|
|
331
|
+
{
|
|
332
|
+
DSI_Data* dsi_data = static_cast<DSI_Data*> (DATA_PTR (self));
|
|
333
|
+
if (CORBA::NVList::_nil () == dsi_data->_nvlist)
|
|
334
|
+
{
|
|
335
|
+
X_CORBA (BAD_INV_ORDER);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
if (key == Qnil)
|
|
339
|
+
{
|
|
340
|
+
X_CORBA (BAD_PARAM);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
if (rb_obj_is_kind_of (key, rb_cString) == Qtrue)
|
|
344
|
+
{
|
|
345
|
+
char* arg_name = RSTRING_PTR (key);
|
|
346
|
+
CORBA::ULong arg_num = dsi_data->_nvlist->count ();
|
|
347
|
+
for (CORBA::ULong ix=0; ix<arg_num ;++ix)
|
|
348
|
+
{
|
|
349
|
+
CORBA::NamedValue_ptr _nv = dsi_data->_nvlist->item (ix);
|
|
350
|
+
if (_nv->name () && ACE_OS::strcmp (arg_name, _nv->name ()) == 0)
|
|
351
|
+
{
|
|
352
|
+
R2TAO_TRY
|
|
353
|
+
{
|
|
354
|
+
CORBA::TypeCode_var _arg_tc = _nv->value ()->type ();
|
|
355
|
+
r2tao_Ruby2Any(*_nv->value (), _arg_tc.in (), val);
|
|
356
|
+
return Qtrue;
|
|
357
|
+
}
|
|
358
|
+
R2TAO_CATCH;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
X_CORBA (BAD_PARAM);
|
|
363
|
+
}
|
|
364
|
+
else
|
|
365
|
+
{
|
|
366
|
+
CORBA::ULong ix = NUM2ULONG (key);
|
|
367
|
+
if (dsi_data->_nvlist->count () <= ix)
|
|
368
|
+
{
|
|
369
|
+
X_CORBA (BAD_PARAM);
|
|
370
|
+
}
|
|
371
|
+
R2TAO_TRY
|
|
372
|
+
{
|
|
373
|
+
CORBA::NamedValue_ptr _nv = dsi_data->_nvlist->item (ix);
|
|
374
|
+
CORBA::TypeCode_var _arg_tc = _nv->value ()->type ();
|
|
375
|
+
r2tao_Ruby2Any(*_nv->value (), _arg_tc.in (), val);
|
|
376
|
+
return Qtrue;
|
|
377
|
+
}
|
|
378
|
+
R2TAO_CATCH;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return Qnil;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
//-------------------------------------------------------------------
|
|
385
|
+
// R2TAO Servant class
|
|
386
|
+
//
|
|
387
|
+
//===================================================================
|
|
388
|
+
|
|
389
|
+
DSI_Servant::DSI_Servant(VALUE rbServant)
|
|
390
|
+
: rbServant_ (rbServant)
|
|
391
|
+
{
|
|
392
|
+
if (TAO_debug_level > 9)
|
|
393
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Servant::ctor(%@) - rbsrv=%@\n", this, this->rbServant_));
|
|
394
|
+
|
|
395
|
+
this->register_with_servant();
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
DSI_Servant::~DSI_Servant()
|
|
399
|
+
{
|
|
400
|
+
if (TAO_debug_level > 9)
|
|
401
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Servant::dtor(%@) - rbsrv=%@\n", this, this->rbServant_));
|
|
402
|
+
|
|
403
|
+
this->cleanup_servant ();
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
void DSI_Servant::register_with_servant ()
|
|
407
|
+
{
|
|
408
|
+
// register with Ruby servant (refcount == 1)
|
|
409
|
+
DATA_PTR(this->rbServant_) = this;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
void DSI_Servant::cleanup_servant ()
|
|
413
|
+
{
|
|
414
|
+
r2tao_call_thread_safe (DSI_Servant::thread_safe_cleanup, this);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
void DSI_Servant::inner_cleanup_servant ()
|
|
418
|
+
{
|
|
419
|
+
// we're being destroyed so unlink us from the Ruby servant (if any)
|
|
420
|
+
if (!NIL_P (this->rbServant_))
|
|
421
|
+
{
|
|
422
|
+
// clear our registration with the Ruby servant
|
|
423
|
+
DATA_PTR(this->rbServant_) = 0;
|
|
424
|
+
|
|
425
|
+
// unregister the Ruby servant so it can be GC-ed
|
|
426
|
+
r2tao_unregister_object (this->rbServant_);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// invocation helper for threadsafe calling of Ruby code
|
|
431
|
+
void* DSI_Servant::thread_safe_cleanup (void * arg)
|
|
432
|
+
{
|
|
433
|
+
DSI_Servant* svt = reinterpret_cast<DSI_Servant*> (arg);
|
|
434
|
+
|
|
435
|
+
try {
|
|
436
|
+
svt->inner_cleanup_servant ();
|
|
437
|
+
}
|
|
438
|
+
catch (...) {
|
|
439
|
+
return ::CORBA::UNKNOWN (0, CORBA::COMPLETED_MAYBE)._tao_duplicate ();
|
|
440
|
+
}
|
|
441
|
+
return 0;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
void DSI_Servant::free_servant ()
|
|
445
|
+
{
|
|
446
|
+
if (TAO_debug_level > 9)
|
|
447
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Servant::free_servant(%@) - rbsrv=%@\n", this, this->rbServant_));
|
|
448
|
+
|
|
449
|
+
// the Ruby servant is freed (GC-ed) so unlink and decrease refcount
|
|
450
|
+
// NOTE: only called if we were still registered with the Ruby servant
|
|
451
|
+
// at the time of GC
|
|
452
|
+
this->rbServant_ = Qnil;
|
|
453
|
+
this->_remove_ref (); // might trigger destructor
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
void DSI_Servant::activate_servant ()
|
|
457
|
+
{
|
|
458
|
+
// we've been activated
|
|
459
|
+
if (TAO_debug_level > 9)
|
|
460
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Servant::activate_servant(%@) - rbsrv=%@\n", this, this->rbServant_));
|
|
461
|
+
|
|
462
|
+
// register the Ruby servant so it can't be GC-ed while we're alive
|
|
463
|
+
r2tao_register_object (this->rbServant_);
|
|
464
|
+
|
|
465
|
+
// ownership is transferred to a poa (raises refcount) so we can release
|
|
466
|
+
// the refcount the Ruby servant is holding on us
|
|
467
|
+
this->_remove_ref ();
|
|
468
|
+
|
|
469
|
+
// since the Ruby servant is protected against GC the only way the
|
|
470
|
+
// Ruby servant will be released is after we get deactivated
|
|
471
|
+
// (& subsequently destructed) at which time we detach from the
|
|
472
|
+
// Ruby servant before it can get GC-ed
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
// invocation helper for rb_protect()
|
|
476
|
+
VALUE DSI_Servant::_invoke_implementation(VALUE args)
|
|
477
|
+
{
|
|
478
|
+
VALUE servant = rb_ary_entry (args, 0);
|
|
479
|
+
VALUE operation = rb_ary_entry (args, 1);
|
|
480
|
+
VALUE opargs = rb_ary_entry (args, 2);
|
|
481
|
+
return rb_apply (servant, SYM2ID (operation), opargs);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
DSI_Servant::METHOD DSI_Servant::method_id (const char* method)
|
|
485
|
+
{
|
|
486
|
+
if (ACE_OS::strcmp (method, "_is_a") == 0)
|
|
487
|
+
return IS_A;
|
|
488
|
+
else if (ACE_OS::strcmp (method, "_repository_id") == 0)
|
|
489
|
+
return REPOSITORY_ID;
|
|
490
|
+
else if (ACE_OS::strcmp (method, "_non_existent") == 0)
|
|
491
|
+
return NON_EXISTENT;
|
|
492
|
+
else if (ACE_OS::strcmp (method, "_component") == 0)
|
|
493
|
+
return GET_COMPONENT;
|
|
494
|
+
else if (ACE_OS::strcmp (method, "_interface") == 0)
|
|
495
|
+
return GET_INTERFACE;
|
|
496
|
+
|
|
497
|
+
return NONE;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
#if RPOA_NEED_DSI_FIX
|
|
501
|
+
void DSI_Servant::invoke (CORBA::ServerRequest_ptr /*request*/)
|
|
502
|
+
{}
|
|
503
|
+
|
|
504
|
+
void DSI_Servant::_dispatch (TAO_ServerRequest &request,
|
|
505
|
+
void * /*context*/)
|
|
506
|
+
{
|
|
507
|
+
// No need to do any of this if the client isn't waiting.
|
|
508
|
+
if (request.response_expected ())
|
|
509
|
+
{
|
|
510
|
+
if (request.is_forwarded ())
|
|
511
|
+
{
|
|
512
|
+
request.init_reply ();
|
|
513
|
+
request.tao_send_reply ();
|
|
514
|
+
|
|
515
|
+
// No need to invoke in this case.
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
else if (request.sync_with_server ())
|
|
519
|
+
{
|
|
520
|
+
// The last line before the call to this function
|
|
521
|
+
// was an ACE_CHECK_RETURN, so if we're here, we
|
|
522
|
+
// know there is no exception so far, and that's all
|
|
523
|
+
// a SYNC_WITH_SERVER client request cares about.
|
|
524
|
+
request.send_no_exception_reply ();
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
// Create DSI request object.
|
|
529
|
+
R2CORBA::ServerRequest *dsi_request = 0;
|
|
530
|
+
ACE_NEW (dsi_request,
|
|
531
|
+
R2CORBA::ServerRequest (request));
|
|
532
|
+
|
|
533
|
+
try
|
|
534
|
+
{
|
|
535
|
+
// Delegate to user.
|
|
536
|
+
this->invoke_fix (dsi_request);
|
|
537
|
+
|
|
538
|
+
// Only if the client is waiting.
|
|
539
|
+
if (request.response_expected () && !request.sync_with_server ())
|
|
540
|
+
{
|
|
541
|
+
dsi_request->dsi_marshal ();
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
catch (::CORBA::Exception& ex)
|
|
545
|
+
{
|
|
546
|
+
// Only if the client is waiting.
|
|
547
|
+
if (request.response_expected () && !request.sync_with_server ())
|
|
548
|
+
{
|
|
549
|
+
if (request.collocated ()
|
|
550
|
+
&& request.operation_details ()->cac () != 0)
|
|
551
|
+
{
|
|
552
|
+
// If we have a cac it will handle the exception and no
|
|
553
|
+
// need to do any further processing
|
|
554
|
+
request.operation_details ()->cac ()->handle_corba_exception (
|
|
555
|
+
request, &ex);
|
|
556
|
+
return;
|
|
557
|
+
}
|
|
558
|
+
else
|
|
559
|
+
request.tao_send_reply_exception (ex);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
::CORBA::release (dsi_request);
|
|
564
|
+
}
|
|
565
|
+
#endif
|
|
566
|
+
|
|
567
|
+
// invocation helper for threadsafe calling of Ruby code
|
|
568
|
+
void* DSI_Servant::thread_safe_invoke (void * arg)
|
|
569
|
+
{
|
|
570
|
+
ThreadSafeArg* tca = reinterpret_cast<ThreadSafeArg*> (arg);
|
|
571
|
+
|
|
572
|
+
try {
|
|
573
|
+
tca->servant_->inner_invoke (tca->request_);
|
|
574
|
+
}
|
|
575
|
+
catch (const CORBA::SystemException& ex) {
|
|
576
|
+
return ex._tao_duplicate ();
|
|
577
|
+
}
|
|
578
|
+
catch (...) {
|
|
579
|
+
return ::CORBA::UNKNOWN (0, CORBA::COMPLETED_MAYBE)._tao_duplicate ();
|
|
580
|
+
}
|
|
581
|
+
return 0;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
# if RPOA_NEED_DSI_FIX
|
|
585
|
+
void DSI_Servant::invoke_fix (R2CORBA::ServerRequest_ptr request)
|
|
586
|
+
# else
|
|
587
|
+
void DSI_Servant::invoke (CORBA::ServerRequest_ptr request)
|
|
588
|
+
# endif
|
|
589
|
+
{
|
|
590
|
+
ThreadSafeArg tca_(this, request);
|
|
591
|
+
|
|
592
|
+
void* rc = r2tao_call_thread_safe (DSI_Servant::thread_safe_invoke, &tca_);
|
|
593
|
+
if (rc != 0)
|
|
594
|
+
{
|
|
595
|
+
CORBA::SystemException* exc = reinterpret_cast<CORBA::SystemException*> (rc);
|
|
596
|
+
ACE_Auto_Basic_Ptr<CORBA::SystemException> e_ptr(exc);
|
|
597
|
+
exc->_raise ();
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
void DSI_Servant::inner_invoke (R2CORBA_ServerRequest_ptr request)
|
|
602
|
+
{
|
|
603
|
+
if (TAO_debug_level > 7)
|
|
604
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Servant::invoke(%C)\n", request->operation ()));
|
|
605
|
+
|
|
606
|
+
// check if Ruby servant still attached
|
|
607
|
+
if (this->rbServant_ == Qnil)
|
|
608
|
+
{
|
|
609
|
+
// we're detached so nothing is implemented anymore
|
|
610
|
+
throw ::CORBA::NO_IMPLEMENT (0, CORBA::COMPLETED_NO);
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
METHOD mt = this->method_id(request->operation ());
|
|
614
|
+
|
|
615
|
+
CORBA::Boolean f;
|
|
616
|
+
if (mt == IS_A || mt == NON_EXISTENT)
|
|
617
|
+
{
|
|
618
|
+
CORBA::ORB_ptr _orb = request->_tao_server_request ().orb ();
|
|
619
|
+
|
|
620
|
+
CORBA::NVList_ptr nvlist;
|
|
621
|
+
_orb->create_list (0, nvlist);
|
|
622
|
+
|
|
623
|
+
if (mt == IS_A)
|
|
624
|
+
{
|
|
625
|
+
CORBA::NamedValue_ptr _nv = nvlist->add (CORBA::ARG_IN);
|
|
626
|
+
_nv->value ()->_tao_set_typecode (CORBA::_tc_string);
|
|
627
|
+
|
|
628
|
+
// set ORB arguments (retrieves data for IN/INOUT args)
|
|
629
|
+
request->arguments (nvlist);
|
|
630
|
+
|
|
631
|
+
const char *tmp = 0;
|
|
632
|
+
(*_nv->value ()) >>= tmp;
|
|
633
|
+
|
|
634
|
+
f = this->_is_a (tmp);
|
|
635
|
+
|
|
636
|
+
if (TAO_debug_level > 5)
|
|
637
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) _is_a (%s) -> %d\n", tmp, f));
|
|
638
|
+
}
|
|
639
|
+
else
|
|
640
|
+
{
|
|
641
|
+
// set ORB arguments (retrieves data for IN/INOUT args)
|
|
642
|
+
request->arguments (nvlist);
|
|
643
|
+
|
|
644
|
+
f = this->_non_existent ();
|
|
645
|
+
|
|
646
|
+
if (TAO_debug_level > 5)
|
|
647
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) _non_existent () -> %d\n", f));
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
CORBA::Any _any;
|
|
651
|
+
_any <<= CORBA::Any::from_boolean (f);
|
|
652
|
+
request->set_result(_any);
|
|
653
|
+
}
|
|
654
|
+
else if (mt == REPOSITORY_ID)
|
|
655
|
+
{
|
|
656
|
+
CORBA::ORB_ptr _orb = request->_tao_server_request ().orb ();
|
|
657
|
+
|
|
658
|
+
CORBA::NVList_ptr nvlist;
|
|
659
|
+
_orb->create_list (0, nvlist);
|
|
660
|
+
// set ORB arguments (retrieves data for IN/INOUT args)
|
|
661
|
+
request->arguments (nvlist);
|
|
662
|
+
|
|
663
|
+
CORBA::String_var repo_id = this->_repository_id ();
|
|
664
|
+
|
|
665
|
+
if (TAO_debug_level > 5)
|
|
666
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) _repository_id () -> %s\n", repo_id.in ()));
|
|
667
|
+
|
|
668
|
+
CORBA::Any _any;
|
|
669
|
+
_any <<= repo_id.in ();
|
|
670
|
+
request->set_result(_any);
|
|
671
|
+
}
|
|
672
|
+
else if (mt == GET_COMPONENT)
|
|
673
|
+
{
|
|
674
|
+
CORBA::ORB_ptr _orb = request->_tao_server_request ().orb ();
|
|
675
|
+
|
|
676
|
+
CORBA::NVList_ptr nvlist;
|
|
677
|
+
_orb->create_list (0, nvlist);
|
|
678
|
+
// set ORB arguments (retrieves data for IN/INOUT args)
|
|
679
|
+
request->arguments (nvlist);
|
|
680
|
+
|
|
681
|
+
CORBA::Object_var obj = this->_get_component ();
|
|
682
|
+
|
|
683
|
+
if (TAO_debug_level > 5)
|
|
684
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) _get_component () -> %@\n", obj.in ()));
|
|
685
|
+
|
|
686
|
+
CORBA::Any _any;
|
|
687
|
+
_any <<= obj.in ();
|
|
688
|
+
request->set_result(_any);
|
|
689
|
+
}
|
|
690
|
+
else if (mt == GET_INTERFACE)
|
|
691
|
+
{
|
|
692
|
+
throw ::CORBA::NO_IMPLEMENT (0, CORBA::COMPLETED_NO);
|
|
693
|
+
}
|
|
694
|
+
else
|
|
695
|
+
{
|
|
696
|
+
if (rb_obj_is_kind_of (this->rbServant_, r2tao_cDynamicImp))
|
|
697
|
+
this->invoke_DSI(request);
|
|
698
|
+
else
|
|
699
|
+
this->invoke_SI(request);
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
void DSI_Servant::invoke_DSI (R2CORBA_ServerRequest_ptr request)
|
|
704
|
+
{
|
|
705
|
+
if (TAO_debug_level > 5)
|
|
706
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Servant::invoke_DSI(%C) entry\n", request->operation ()));
|
|
707
|
+
|
|
708
|
+
// wrap request for Ruby; cleanup automatically
|
|
709
|
+
ACE_Auto_Basic_Ptr<DSI_Data> dsi_data(new DSI_Data(request));
|
|
710
|
+
|
|
711
|
+
VALUE srvreq = Data_Wrap_Struct(r2tao_cServerRequest, 0, 0, dsi_data.get ());
|
|
712
|
+
|
|
713
|
+
dsi_data.get()->_rData = srvreq; // have DSI_Data clean up Ruby object at destruction time
|
|
714
|
+
|
|
715
|
+
// invoke servant implementation
|
|
716
|
+
VALUE rargs = rb_ary_new2 (1);
|
|
717
|
+
rb_ary_push (rargs, srvreq);
|
|
718
|
+
VALUE invoke_holder = rb_ary_new2 (3);
|
|
719
|
+
rb_ary_push (invoke_holder, this->rbServant_);
|
|
720
|
+
rb_ary_push (invoke_holder, ID2SYM (invoke_ID));
|
|
721
|
+
rb_ary_push (invoke_holder, rargs);
|
|
722
|
+
int invoke_state = 0;
|
|
723
|
+
VALUE ret = rb_protect (RUBY_INVOKE_FUNC (DSI_Servant::_invoke_implementation),
|
|
724
|
+
invoke_holder,
|
|
725
|
+
&invoke_state);
|
|
726
|
+
|
|
727
|
+
if (invoke_state)
|
|
728
|
+
{
|
|
729
|
+
// handle exception
|
|
730
|
+
VALUE rexc = rb_gv_get ("$!");
|
|
731
|
+
if (rb_obj_is_kind_of(rexc, r2tao_cUserException) == Qtrue)
|
|
732
|
+
{
|
|
733
|
+
VALUE rextc = rb_eval_string ("R2CORBA::CORBA::Any.typecode_for_any ($!)");
|
|
734
|
+
if (rextc != Qnil)
|
|
735
|
+
{
|
|
736
|
+
CORBA::Any _xval;
|
|
737
|
+
CORBA::TypeCode_ptr _xtc = r2corba_TypeCode_r2t (rextc);
|
|
738
|
+
r2tao_Ruby2Any(_xval, _xtc, rexc);
|
|
739
|
+
request->set_exception (_xval);
|
|
740
|
+
|
|
741
|
+
return;
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
if (rb_obj_is_kind_of(rexc, r2tao_cSystemException) == Qtrue)
|
|
746
|
+
{
|
|
747
|
+
VALUE rid = rb_funcall (rexc, interface_repository_id_ID, 0);
|
|
748
|
+
CORBA::SystemException* _exc = TAO::create_system_exception (RSTRING_PTR (rid));
|
|
749
|
+
|
|
750
|
+
_exc->minor (
|
|
751
|
+
static_cast<CORBA::ULong> (NUM2ULONG (rb_iv_get (rexc, "@minor"))));
|
|
752
|
+
_exc->completed (
|
|
753
|
+
static_cast<CORBA::CompletionStatus> (NUM2ULONG (rb_iv_get (rexc, "@completed"))));
|
|
754
|
+
|
|
755
|
+
ACE_Auto_Basic_Ptr<CORBA::SystemException> e_ptr(_exc);
|
|
756
|
+
_exc->_raise ();
|
|
757
|
+
}
|
|
758
|
+
else
|
|
759
|
+
{
|
|
760
|
+
rb_eval_string ("STDERR.puts $!.to_s+\"\\n\"+$!.backtrace.join(\"\\n\")");
|
|
761
|
+
throw ::CORBA::UNKNOWN (0, CORBA::COMPLETED_MAYBE);
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
else
|
|
765
|
+
{
|
|
766
|
+
// check for oneway (no results at all) or twoway
|
|
767
|
+
if (!CORBA::is_nil (dsi_data.get()->_result_type.in ()))
|
|
768
|
+
{
|
|
769
|
+
// twoway
|
|
770
|
+
if (TAO_debug_level > 5)
|
|
771
|
+
ACE_DEBUG ((LM_INFO, "(%P|%t) checking return values of twoway invocation\n"));
|
|
772
|
+
|
|
773
|
+
// handle OUT values
|
|
774
|
+
long arg_out = 0;
|
|
775
|
+
long ret_off =
|
|
776
|
+
(dsi_data.get()->_result_type->kind () != CORBA::tk_void) ? 1 : 0;
|
|
777
|
+
CORBA::ULong arg_len = dsi_data.get()->_nvlist->count ();
|
|
778
|
+
for (CORBA::ULong arg=0; arg<arg_len ;++arg)
|
|
779
|
+
{
|
|
780
|
+
if (TAO_debug_level > 7)
|
|
781
|
+
ACE_DEBUG ((LM_INFO, "(%P|%t) handling (IN)OUT arg %d\n", arg));
|
|
782
|
+
|
|
783
|
+
CORBA::NamedValue_ptr _nv = dsi_data.get()->_nvlist->item (arg);
|
|
784
|
+
if (ACE_BIT_DISABLED (_nv->flags (), CORBA::ARG_IN))
|
|
785
|
+
{
|
|
786
|
+
++arg_out; // count number of (IN)OUT arguments
|
|
787
|
+
|
|
788
|
+
VALUE retval = Qnil;
|
|
789
|
+
if (rb_type (ret) == T_ARRAY && ret_off<RARRAY_LEN (ret))
|
|
790
|
+
{
|
|
791
|
+
retval = rb_ary_entry (ret, ret_off++);
|
|
792
|
+
}
|
|
793
|
+
CORBA::TypeCode_var _arg_tc = _nv->value ()->type ();
|
|
794
|
+
r2tao_Ruby2Any(*_nv->value (), _arg_tc.in (), retval);
|
|
795
|
+
|
|
796
|
+
if (TAO_debug_level > 7)
|
|
797
|
+
ACE_DEBUG ((LM_INFO, "(%P|%t) converted (IN)OUT arg %d\n", arg));
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
// handle return value
|
|
802
|
+
if (dsi_data.get()->_result_type->kind () != CORBA::tk_void)
|
|
803
|
+
{
|
|
804
|
+
if (TAO_debug_level > 7)
|
|
805
|
+
ACE_DEBUG ((LM_INFO, "(%P|%t) handling result value\n"));
|
|
806
|
+
|
|
807
|
+
CORBA::Any _retval;
|
|
808
|
+
VALUE retval = Qnil;
|
|
809
|
+
if (arg_out == 0)
|
|
810
|
+
{
|
|
811
|
+
retval = ret;
|
|
812
|
+
}
|
|
813
|
+
else if (rb_type (ret) == T_ARRAY && 0<RARRAY_LEN (ret))
|
|
814
|
+
{
|
|
815
|
+
retval = rb_ary_entry (ret, 0);
|
|
816
|
+
}
|
|
817
|
+
r2tao_Ruby2Any(_retval, dsi_data.get()->_result_type.in (), retval);
|
|
818
|
+
|
|
819
|
+
if (TAO_debug_level > 7)
|
|
820
|
+
ACE_DEBUG ((LM_INFO, "(%P|%t) converted result value\n"));
|
|
821
|
+
|
|
822
|
+
request->set_result (_retval);
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
void DSI_Servant::invoke_SI (R2CORBA_ServerRequest_ptr request)
|
|
829
|
+
{
|
|
830
|
+
if (TAO_debug_level > 5)
|
|
831
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Servant::invoke_SI(%C) entry\n", request->operation ()));
|
|
832
|
+
|
|
833
|
+
// retrieve targeted operation
|
|
834
|
+
VALUE ropsym = ID2SYM (rb_intern (request->operation ()));
|
|
835
|
+
// retrieve operation signature
|
|
836
|
+
VALUE ropsig = rb_funcall (this->rbServant_, get_operation_sig_ID, 1, ropsym);
|
|
837
|
+
|
|
838
|
+
if (ropsig != Qnil && rb_type (ropsig) == T_HASH)
|
|
839
|
+
{
|
|
840
|
+
// check signature and create argument list for ORB
|
|
841
|
+
VALUE arg_list = rb_hash_aref (ropsig, ID_arg_list);
|
|
842
|
+
if (arg_list != Qnil && rb_type (arg_list) != T_ARRAY)
|
|
843
|
+
{
|
|
844
|
+
throw ::CORBA::BAD_PARAM (0, CORBA::COMPLETED_NO);
|
|
845
|
+
}
|
|
846
|
+
VALUE result_type = rb_hash_aref (ropsig, ID_result_type);
|
|
847
|
+
if (result_type != Qnil && rb_obj_is_kind_of(result_type, r2corba_cTypeCode) != Qtrue)
|
|
848
|
+
{
|
|
849
|
+
throw ::CORBA::BAD_PARAM (0, CORBA::COMPLETED_NO);
|
|
850
|
+
}
|
|
851
|
+
VALUE exc_list = rb_hash_aref (ropsig, ID_exc_list);
|
|
852
|
+
if (exc_list != Qnil && rb_type (exc_list) != T_ARRAY)
|
|
853
|
+
{
|
|
854
|
+
throw ::CORBA::BAD_PARAM (0, CORBA::COMPLETED_NO);
|
|
855
|
+
}
|
|
856
|
+
VALUE alt_op_sym = rb_hash_aref (ropsig, ID_op_sym);
|
|
857
|
+
if (alt_op_sym != Qnil && rb_type (alt_op_sym) == T_SYMBOL)
|
|
858
|
+
{
|
|
859
|
+
ropsym = alt_op_sym;
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
CORBA::ORB_ptr _orb = request->_tao_server_request ().orb ();
|
|
863
|
+
|
|
864
|
+
CORBA::NVList_ptr nvlist;
|
|
865
|
+
_orb->create_list (0, nvlist);
|
|
866
|
+
|
|
867
|
+
long arg_len =
|
|
868
|
+
arg_list == Qnil ? 0 : RARRAY_LEN (arg_list);
|
|
869
|
+
for (long arg=0; arg<arg_len ;++arg)
|
|
870
|
+
{
|
|
871
|
+
VALUE argspec = rb_ary_entry (arg_list, arg);
|
|
872
|
+
if (argspec != Qnil && rb_type (argspec) != T_ARRAY)
|
|
873
|
+
{
|
|
874
|
+
throw ::CORBA::BAD_PARAM (0, CORBA::COMPLETED_NO);
|
|
875
|
+
}
|
|
876
|
+
char *_arg_name = RSTRING_PTR (rb_ary_entry (argspec, 0));
|
|
877
|
+
int _arg_type = NUM2INT (rb_ary_entry (argspec, 1));
|
|
878
|
+
VALUE argtc = rb_ary_entry (argspec, 2);
|
|
879
|
+
if (argtc != Qnil && rb_obj_is_kind_of(argtc, r2corba_cTypeCode) != Qtrue)
|
|
880
|
+
{
|
|
881
|
+
throw ::CORBA::BAD_PARAM (0, CORBA::COMPLETED_NO);
|
|
882
|
+
}
|
|
883
|
+
CORBA::TypeCode_ptr _arg_tc = r2corba_TypeCode_r2t (argtc);
|
|
884
|
+
|
|
885
|
+
if (TAO_debug_level > 6)
|
|
886
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Servant::invoke_SI(%C) arg #%d : kind=%d, type=%d\n",
|
|
887
|
+
request->operation (),
|
|
888
|
+
arg,
|
|
889
|
+
_arg_tc->kind(),
|
|
890
|
+
_arg_type));
|
|
891
|
+
|
|
892
|
+
CORBA::NamedValue_ptr _nv = nvlist->add_item (_arg_name, _arg_type == r2tao_IN_ARG ?
|
|
893
|
+
CORBA::ARG_IN :
|
|
894
|
+
(_arg_type == r2tao_INOUT_ARG ?
|
|
895
|
+
CORBA::ARG_INOUT : CORBA::ARG_OUT));
|
|
896
|
+
// assign type info to Any
|
|
897
|
+
r2tao_Ruby2Any (*_nv->value (), _arg_tc, Qnil);
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
if (TAO_debug_level > 6)
|
|
901
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Servant::invoke_SI(%C) retrieve request args\n", request->operation ()));
|
|
902
|
+
|
|
903
|
+
// set ORB arguments (retrieves data for IN/INOUT args)
|
|
904
|
+
request->arguments (nvlist);
|
|
905
|
+
|
|
906
|
+
if (TAO_debug_level > 6)
|
|
907
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Servant::invoke_SI(%C) convert request args\n", request->operation ()));
|
|
908
|
+
|
|
909
|
+
// build argument list for servant implementation
|
|
910
|
+
VALUE rargs = rb_ary_new ();
|
|
911
|
+
for (long arg=0; arg<arg_len ;++arg)
|
|
912
|
+
{
|
|
913
|
+
CORBA::NamedValue_ptr _nv = nvlist->item (static_cast<CORBA::ULong> (arg));
|
|
914
|
+
if (ACE_BIT_DISABLED (_nv->flags (), CORBA::ARG_OUT))
|
|
915
|
+
{
|
|
916
|
+
VALUE argspec = rb_ary_entry (arg_list, arg);
|
|
917
|
+
VALUE argtc = rb_ary_entry (argspec, 2);
|
|
918
|
+
CORBA::TypeCode_ptr _arg_tc = r2corba_TypeCode_r2t (argtc);
|
|
919
|
+
VALUE rval = r2tao_Any2Ruby(*_nv->value (), _arg_tc, Qnil, Qnil);
|
|
920
|
+
rb_ary_push (rargs, rval);
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
if (TAO_debug_level > 6)
|
|
925
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Servant::invoke_SI(%C) invoke implementation\n", request->operation ()));
|
|
926
|
+
|
|
927
|
+
// invoke servant implementation
|
|
928
|
+
VALUE invoke_holder = rb_ary_new2 (4);
|
|
929
|
+
rb_ary_push (invoke_holder, this->rbServant_);
|
|
930
|
+
rb_ary_push (invoke_holder, ropsym);
|
|
931
|
+
rb_ary_push (invoke_holder, rargs);
|
|
932
|
+
int invoke_state = 0;
|
|
933
|
+
VALUE ret = rb_protect (RUBY_INVOKE_FUNC (DSI_Servant::_invoke_implementation),
|
|
934
|
+
invoke_holder,
|
|
935
|
+
&invoke_state);
|
|
936
|
+
if (invoke_state)
|
|
937
|
+
{
|
|
938
|
+
if (TAO_debug_level > 5)
|
|
939
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Servant::invoke_SI(%C) exception from invocation\n", request->operation ()));
|
|
940
|
+
|
|
941
|
+
// handle exception
|
|
942
|
+
VALUE rexc = rb_gv_get ("$!");
|
|
943
|
+
if (rb_obj_is_kind_of(rexc, r2tao_cUserException) == Qtrue)
|
|
944
|
+
{
|
|
945
|
+
if (TAO_debug_level > 6)
|
|
946
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Servant::invoke_SI(%C) detected user exception\n",
|
|
947
|
+
request->operation ()));
|
|
948
|
+
|
|
949
|
+
if (exc_list != Qnil)
|
|
950
|
+
{
|
|
951
|
+
long exc_len = RARRAY_LEN (exc_list);
|
|
952
|
+
for (long x=0; x<exc_len ;++x)
|
|
953
|
+
{
|
|
954
|
+
VALUE exctc = rb_ary_entry (exc_list, x);
|
|
955
|
+
VALUE exklass = rb_funcall (exctc, rb_intern ("get_type"), 0);
|
|
956
|
+
if (rb_obj_is_kind_of(rexc, exklass) == Qtrue)
|
|
957
|
+
{
|
|
958
|
+
CORBA::Any _xval;
|
|
959
|
+
CORBA::TypeCode_ptr _xtc = r2corba_TypeCode_r2t (exctc);
|
|
960
|
+
|
|
961
|
+
if (TAO_debug_level > 9)
|
|
962
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Servant::invoke_SI(%C) returning user exception %C\n",
|
|
963
|
+
request->operation (), _xtc->id ()));
|
|
964
|
+
|
|
965
|
+
r2tao_Ruby2Any(_xval, _xtc, rexc);
|
|
966
|
+
request->set_exception (_xval);
|
|
967
|
+
|
|
968
|
+
return;
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
if (rb_obj_is_kind_of(rexc, r2tao_cSystemException) == Qtrue)
|
|
975
|
+
{
|
|
976
|
+
VALUE rid = rb_funcall (rexc, interface_repository_id_ID, 0);
|
|
977
|
+
CORBA::SystemException* _exc = TAO::create_system_exception (RSTRING_PTR (rid));
|
|
978
|
+
|
|
979
|
+
if (TAO_debug_level > 9)
|
|
980
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Servant::invoke_SI(%C) returning system exception %C\n",
|
|
981
|
+
request->operation (), RSTRING_PTR (rid)));
|
|
982
|
+
|
|
983
|
+
_exc->minor (
|
|
984
|
+
static_cast<CORBA::ULong> (NUM2ULONG (rb_iv_get (rexc, "@minor"))));
|
|
985
|
+
_exc->completed (
|
|
986
|
+
static_cast<CORBA::CompletionStatus> (NUM2ULONG (rb_iv_get (rexc, "@completed"))));
|
|
987
|
+
|
|
988
|
+
ACE_Auto_Basic_Ptr<CORBA::SystemException> e_ptr(_exc);
|
|
989
|
+
_exc->_raise ();
|
|
990
|
+
}
|
|
991
|
+
else
|
|
992
|
+
{
|
|
993
|
+
rb_eval_string ("STDERR.puts $!.to_s+\"\\n\"+$!.backtrace.join(\"\\n\")");
|
|
994
|
+
throw ::CORBA::UNKNOWN (0, CORBA::COMPLETED_MAYBE);
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
else
|
|
998
|
+
{
|
|
999
|
+
if (TAO_debug_level > 5)
|
|
1000
|
+
ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Servant::invoke_SI(%C) handle invocation result\n", request->operation ()));
|
|
1001
|
+
|
|
1002
|
+
// check for oneway (no results at all) or twoway
|
|
1003
|
+
if (result_type != Qnil)
|
|
1004
|
+
{
|
|
1005
|
+
if (TAO_debug_level > 6)
|
|
1006
|
+
ACE_DEBUG ((LM_INFO, "(%P|%t) Servant::invoke_SI(%C) checking return values of twoway invocation\n",
|
|
1007
|
+
request->operation ()));
|
|
1008
|
+
|
|
1009
|
+
// twoway
|
|
1010
|
+
CORBA::TypeCode_ptr _result_tc = r2corba_TypeCode_r2t (result_type);
|
|
1011
|
+
|
|
1012
|
+
// handle OUT values
|
|
1013
|
+
long ret_off =
|
|
1014
|
+
(_result_tc->kind () != CORBA::tk_void) ? 1 : 0;
|
|
1015
|
+
long arg_out = 0;
|
|
1016
|
+
for (long arg=0; arg<arg_len ;++arg)
|
|
1017
|
+
{
|
|
1018
|
+
if (TAO_debug_level > 9)
|
|
1019
|
+
ACE_DEBUG ((LM_INFO, "(%P|%t) Servant::invoke_SI(%C) handling (IN)OUT arg %d\n", request->operation (), arg));
|
|
1020
|
+
|
|
1021
|
+
CORBA::NamedValue_ptr _nv = nvlist->item (static_cast<CORBA::ULong> (arg));
|
|
1022
|
+
if (ACE_BIT_DISABLED (_nv->flags (), CORBA::ARG_IN))
|
|
1023
|
+
{
|
|
1024
|
+
++arg_out; // count number of (IN)OUT arguments
|
|
1025
|
+
|
|
1026
|
+
VALUE retval = Qnil;
|
|
1027
|
+
if (rb_type (ret) == T_ARRAY && ret_off<RARRAY_LEN (ret))
|
|
1028
|
+
{
|
|
1029
|
+
retval = rb_ary_entry (ret, ret_off++);
|
|
1030
|
+
}
|
|
1031
|
+
VALUE argspec = rb_ary_entry (arg_list, arg);
|
|
1032
|
+
VALUE rtc = rb_ary_entry (argspec, 2);
|
|
1033
|
+
CORBA::TypeCode_ptr _arg_tc = r2corba_TypeCode_r2t (rtc);
|
|
1034
|
+
|
|
1035
|
+
//rb_funcall (rb_eval_string ("STDERR"), rb_intern ("puts"),
|
|
1036
|
+
// 1, rb_funcall (retval, rb_intern ("inspect"), 0));
|
|
1037
|
+
|
|
1038
|
+
r2tao_Ruby2Any(*_nv->value (), _arg_tc, retval);
|
|
1039
|
+
|
|
1040
|
+
if (TAO_debug_level > 9)
|
|
1041
|
+
ACE_DEBUG ((LM_INFO, "(%P|%t) Servant::invoke_SI(%C) converted (IN)OUT arg %d\n", request->operation (), arg));
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
// handle return value
|
|
1046
|
+
if (_result_tc->kind () != CORBA::tk_void)
|
|
1047
|
+
{
|
|
1048
|
+
if (TAO_debug_level > 9)
|
|
1049
|
+
ACE_DEBUG ((LM_INFO, "(%P|%t) Servant::invoke_SI(%C) handling result value\n", request->operation ()));
|
|
1050
|
+
|
|
1051
|
+
CORBA::Any _retval;
|
|
1052
|
+
VALUE retval = Qnil;
|
|
1053
|
+
if (arg_out == 0)
|
|
1054
|
+
{
|
|
1055
|
+
retval = ret;
|
|
1056
|
+
}
|
|
1057
|
+
else if (rb_type (ret) == T_ARRAY && 0<RARRAY_LEN (ret))
|
|
1058
|
+
{
|
|
1059
|
+
retval = rb_ary_entry (ret, 0);
|
|
1060
|
+
}
|
|
1061
|
+
r2tao_Ruby2Any(_retval, _result_tc, retval);
|
|
1062
|
+
|
|
1063
|
+
if (TAO_debug_level > 9)
|
|
1064
|
+
ACE_DEBUG ((LM_INFO, "(%P|%t) Servant::invoke_SI(%C) converted result value\n", request->operation ()));
|
|
1065
|
+
|
|
1066
|
+
request->set_result (_retval);
|
|
1067
|
+
}
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
}
|
|
1071
|
+
else
|
|
1072
|
+
{
|
|
1073
|
+
throw ::CORBA::NO_IMPLEMENT (0, CORBA::COMPLETED_NO);
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
CORBA::Boolean DSI_Servant::_is_a (const char *logical_type_id)
|
|
1078
|
+
{
|
|
1079
|
+
static R2TAO_RBFuncall FN_is_a ("_is_a?");
|
|
1080
|
+
|
|
1081
|
+
// provide support for multiple interfaces
|
|
1082
|
+
if (rb_respond_to (this->rbServant_, FN_is_a.id ()) != 0)
|
|
1083
|
+
{
|
|
1084
|
+
// call overloaded #_is_a? method in servant implementation
|
|
1085
|
+
VALUE repo_id = rb_str_new2 (logical_type_id ? logical_type_id : "");
|
|
1086
|
+
return (Qtrue == FN_is_a.invoke (this->rbServant_, 1 , &repo_id));
|
|
1087
|
+
}
|
|
1088
|
+
else if (rb_const_defined (rb_class_of (this->rbServant_), repo_Ids) == Qtrue)
|
|
1089
|
+
{
|
|
1090
|
+
// check if requested interface included in servants Ids array
|
|
1091
|
+
return (Qtrue == rb_funcall (rb_const_get (rb_class_of (this->rbServant_), repo_Ids),
|
|
1092
|
+
include_ID, 1, rb_str_new2 (logical_type_id ? logical_type_id : "")));
|
|
1093
|
+
}
|
|
1094
|
+
else
|
|
1095
|
+
{
|
|
1096
|
+
return PortableServer::DynamicImplementation::_is_a (logical_type_id);
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
CORBA::Boolean DSI_Servant::_non_existent (void)
|
|
1101
|
+
{
|
|
1102
|
+
static R2TAO_RBFuncall FN_non_existent ("_non_existent?");
|
|
1103
|
+
|
|
1104
|
+
// provide support for multiple interfaces
|
|
1105
|
+
if (rb_respond_to (this->rbServant_, FN_non_existent.id ()) != 0)
|
|
1106
|
+
{
|
|
1107
|
+
// call overloaded #_non_existent? method in servant implementation
|
|
1108
|
+
return (Qtrue == FN_non_existent.invoke (this->rbServant_));
|
|
1109
|
+
}
|
|
1110
|
+
else
|
|
1111
|
+
{
|
|
1112
|
+
return PortableServer::DynamicImplementation::_non_existent ();
|
|
1113
|
+
}
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
CORBA::Object_ptr DSI_Servant::_get_component (void)
|
|
1117
|
+
{
|
|
1118
|
+
static R2TAO_RBFuncall FN_get_component ("_get_component");
|
|
1119
|
+
|
|
1120
|
+
// provide support for multiple interfaces
|
|
1121
|
+
if (rb_respond_to (this->rbServant_, FN_get_component.id ()) != 0)
|
|
1122
|
+
{
|
|
1123
|
+
// call overloaded #_get_component method in servant implementation
|
|
1124
|
+
VALUE robj = FN_get_component.invoke (this->rbServant_);
|
|
1125
|
+
CORBA::Object_ptr obj = NIL_P(robj) ? CORBA::Object::_nil () : r2corba_Object_r2t (robj);
|
|
1126
|
+
return CORBA::Object::_duplicate (obj);
|
|
1127
|
+
}
|
|
1128
|
+
else
|
|
1129
|
+
{
|
|
1130
|
+
return PortableServer::DynamicImplementation::_get_component ();
|
|
1131
|
+
}
|
|
1132
|
+
}
|
|
1133
|
+
|
|
1134
|
+
const char *DSI_Servant::_interface_repository_id (void) const
|
|
1135
|
+
{
|
|
1136
|
+
static R2TAO_RBFuncall FN_repository_id ("_repository_id");
|
|
1137
|
+
|
|
1138
|
+
// check if Ruby servant still attached
|
|
1139
|
+
if (this->rbServant_ == Qnil)
|
|
1140
|
+
{
|
|
1141
|
+
return "";
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1144
|
+
DSI_Servant* servant_ = const_cast<DSI_Servant*> (this);
|
|
1145
|
+
|
|
1146
|
+
// provide support for multiple interfaces
|
|
1147
|
+
if (rb_respond_to (servant_->rbServant_, FN_repository_id.id ()) != 0)
|
|
1148
|
+
{
|
|
1149
|
+
// call overloaded #_repository_id method in servant implementation
|
|
1150
|
+
VALUE repo_id = FN_repository_id.invoke (servant_->rbServant_);
|
|
1151
|
+
if (repo_id==Qnil || rb_obj_is_kind_of(repo_id, rb_cString)==Qfalse)
|
|
1152
|
+
{
|
|
1153
|
+
if (TAO_debug_level > 3)
|
|
1154
|
+
ACE_DEBUG ((LM_WARNING, "(%P|%t) Servant::_interface_repository_id - cannot retrieve repo-id\n"));
|
|
1155
|
+
return "";
|
|
1156
|
+
}
|
|
1157
|
+
else
|
|
1158
|
+
{
|
|
1159
|
+
return RSTRING_PTR (repo_id);
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1162
|
+
else
|
|
1163
|
+
{
|
|
1164
|
+
if (servant_->repo_id_.in () == 0)
|
|
1165
|
+
{
|
|
1166
|
+
if (rb_const_defined (rb_class_of (servant_->rbServant_), repo_Id) == Qtrue)
|
|
1167
|
+
{
|
|
1168
|
+
VALUE rb_repo_id = rb_const_get (rb_class_of (servant_->rbServant_), repo_Id);
|
|
1169
|
+
servant_->repo_id_ = CORBA::string_dup (RSTRING_PTR (rb_repo_id));
|
|
1170
|
+
}
|
|
1171
|
+
else
|
|
1172
|
+
{
|
|
1173
|
+
if (TAO_debug_level > 3)
|
|
1174
|
+
ACE_DEBUG ((LM_WARNING, "(%P|%t) Servant::_interface_repository_id - cannot retrieve repo-id\n"));
|
|
1175
|
+
servant_->repo_id_ = CORBA::string_dup ("");
|
|
1176
|
+
}
|
|
1177
|
+
}
|
|
1178
|
+
return servant_->repo_id_.in ();
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
char * DSI_Servant::_repository_id (void)
|
|
1183
|
+
{
|
|
1184
|
+
return CORBA::string_dup (this->_interface_repository_id ());
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
CORBA::RepositoryId DSI_Servant::_primary_interface (
|
|
1188
|
+
const PortableServer::ObjectId & oid,
|
|
1189
|
+
PortableServer::POA_ptr poa)
|
|
1190
|
+
{
|
|
1191
|
+
// check if Ruby servant still attached
|
|
1192
|
+
if (this->rbServant_ == Qnil)
|
|
1193
|
+
{
|
|
1194
|
+
return CORBA::string_dup ("");
|
|
1195
|
+
}
|
|
1196
|
+
|
|
1197
|
+
if (rb_obj_is_kind_of (this->rbServant_, r2tao_cDynamicImp))
|
|
1198
|
+
{
|
|
1199
|
+
// invoke servant implementation
|
|
1200
|
+
VALUE rargs = rb_ary_new2 (1);
|
|
1201
|
+
rb_ary_push (rargs, r2tao_ObjectId_t2r (oid));
|
|
1202
|
+
VALUE rpoa = r2corba_Object_t2r(dynamic_cast<CORBA::Object_ptr> (poa));
|
|
1203
|
+
rpoa = FN_narrow.invoke (r2tao_nsPOA, 1, &rpoa);
|
|
1204
|
+
rb_ary_push (rargs, rpoa);
|
|
1205
|
+
VALUE invoke_holder = rb_ary_new2 (3);
|
|
1206
|
+
rb_ary_push (invoke_holder, this->rbServant_);
|
|
1207
|
+
rb_ary_push (invoke_holder, ID2SYM (primary_interface_ID));
|
|
1208
|
+
rb_ary_push (invoke_holder, rargs);
|
|
1209
|
+
int invoke_state = 0;
|
|
1210
|
+
VALUE ret = rb_protect (RUBY_INVOKE_FUNC (DSI_Servant::_invoke_implementation),
|
|
1211
|
+
invoke_holder,
|
|
1212
|
+
&invoke_state);
|
|
1213
|
+
if (invoke_state || ret==Qnil || rb_obj_is_kind_of(ret, rb_cString)==Qfalse)
|
|
1214
|
+
{
|
|
1215
|
+
ACE_ERROR ((LM_ERROR, "(%P|%t) FAILED TO RETRIEVE REPO-ID FOR SERVANT!\n"));
|
|
1216
|
+
return CORBA::string_dup ("");
|
|
1217
|
+
}
|
|
1218
|
+
else
|
|
1219
|
+
{
|
|
1220
|
+
return CORBA::string_dup (RSTRING_PTR (ret));
|
|
1221
|
+
}
|
|
1222
|
+
}
|
|
1223
|
+
else
|
|
1224
|
+
{
|
|
1225
|
+
if (this->repo_id_.in () == 0)
|
|
1226
|
+
{
|
|
1227
|
+
if (rb_const_defined (rb_class_of (rbServant_), repo_Id) == Qtrue)
|
|
1228
|
+
{
|
|
1229
|
+
VALUE rb_repo_id = rb_const_get (rb_class_of (rbServant_), repo_Id);
|
|
1230
|
+
this->repo_id_ = CORBA::string_dup (RSTRING_PTR (rb_repo_id));
|
|
1231
|
+
}
|
|
1232
|
+
else
|
|
1233
|
+
{
|
|
1234
|
+
ACE_ERROR ((LM_ERROR, "(%P|%t) FAILED TO RETRIEVE REPO-ID FOR SERVANT!\n"));
|
|
1235
|
+
this->repo_id_ = CORBA::string_dup ("");
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
return CORBA::string_dup (this->repo_id_.in ());
|
|
1239
|
+
}
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1242
|
+
VALUE r2tao_Servant_default_POA(VALUE self)
|
|
1243
|
+
{
|
|
1244
|
+
R2TAO_TRY
|
|
1245
|
+
{
|
|
1246
|
+
DSI_Servant* _servant;
|
|
1247
|
+
if (DATA_PTR (self) == 0)
|
|
1248
|
+
{
|
|
1249
|
+
// create new C++ servant object
|
|
1250
|
+
_servant = new DSI_Servant (self);
|
|
1251
|
+
}
|
|
1252
|
+
else
|
|
1253
|
+
{
|
|
1254
|
+
// get existing C++ servant object
|
|
1255
|
+
_servant = static_cast<DSI_Servant*> (DATA_PTR (self));
|
|
1256
|
+
}
|
|
1257
|
+
|
|
1258
|
+
// get default POA
|
|
1259
|
+
PortableServer::POA_var _poa = _servant->_default_POA ();
|
|
1260
|
+
VALUE rpoa = r2corba_Object_t2r(dynamic_cast<CORBA::Object_ptr> (_poa.in ()));
|
|
1261
|
+
return FN_narrow.invoke (r2tao_nsPOA, 1, &rpoa);
|
|
1262
|
+
}
|
|
1263
|
+
R2TAO_CATCH;
|
|
1264
|
+
return Qnil;
|
|
1265
|
+
}
|
|
1266
|
+
|
|
1267
|
+
VALUE r2tao_Servant_this(VALUE self)
|
|
1268
|
+
{
|
|
1269
|
+
R2TAO_TRY
|
|
1270
|
+
{
|
|
1271
|
+
bool _new_srv = false;
|
|
1272
|
+
DSI_Servant* _servant;
|
|
1273
|
+
if (DATA_PTR (self) == 0)
|
|
1274
|
+
{
|
|
1275
|
+
// create new C++ servant object
|
|
1276
|
+
_servant = new DSI_Servant (self);
|
|
1277
|
+
_new_srv = true;
|
|
1278
|
+
}
|
|
1279
|
+
else
|
|
1280
|
+
{
|
|
1281
|
+
// get existing C++ servant object
|
|
1282
|
+
_servant = static_cast<DSI_Servant*> (DATA_PTR (self));
|
|
1283
|
+
}
|
|
1284
|
+
|
|
1285
|
+
// Check if we're called from the context of an invocation of this
|
|
1286
|
+
// servant or not. We check the POA_Current_Impl in TSS for this.
|
|
1287
|
+
if (!_new_srv)
|
|
1288
|
+
{
|
|
1289
|
+
TAO::Portable_Server::POA_Current_Impl *poa_current_impl =
|
|
1290
|
+
static_cast <TAO::Portable_Server::POA_Current_Impl *>
|
|
1291
|
+
(TAO_TSS_Resources::instance ()->poa_current_impl_);
|
|
1292
|
+
|
|
1293
|
+
if (poa_current_impl != 0
|
|
1294
|
+
&& poa_current_impl->servant () == _servant)
|
|
1295
|
+
{
|
|
1296
|
+
// in an invocation we can safely use _this()
|
|
1297
|
+
CORBA::Object_var _obj = _servant->_this ();
|
|
1298
|
+
return r2corba_Object_t2r(_obj.in ());
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
|
|
1302
|
+
// register with default POA and return object ref
|
|
1303
|
+
VALUE rpoa = rb_funcall (self, rb_intern ("_default_POA"), 0);
|
|
1304
|
+
PortableServer::POA_var _poa = r2tao_POA_r2t (rpoa);
|
|
1305
|
+
PortableServer::ObjectId_var _oid = _poa->activate_object (_servant);
|
|
1306
|
+
|
|
1307
|
+
_servant->activate_servant (); // activate Ruby servant
|
|
1308
|
+
|
|
1309
|
+
CORBA::Object_var _obj = _poa->id_to_reference (_oid.in ());
|
|
1310
|
+
return r2corba_Object_t2r(_obj.in ());
|
|
1311
|
+
}
|
|
1312
|
+
R2TAO_CATCH;
|
|
1313
|
+
return Qnil;
|
|
1314
|
+
}
|
|
1315
|
+
|
|
1316
|
+
//-------------------------------------------------------------------
|
|
1317
|
+
// Ruby <-> TAO servant conversions
|
|
1318
|
+
//
|
|
1319
|
+
//===================================================================
|
|
1320
|
+
|
|
1321
|
+
static VALUE
|
|
1322
|
+
srv_alloc(VALUE klass)
|
|
1323
|
+
{
|
|
1324
|
+
VALUE obj;
|
|
1325
|
+
// we start off without the C++ representation
|
|
1326
|
+
obj = Data_Wrap_Struct(klass, 0, srv_free, 0);
|
|
1327
|
+
return obj;
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1330
|
+
static void
|
|
1331
|
+
srv_free(void* ptr)
|
|
1332
|
+
{
|
|
1333
|
+
if (ptr)
|
|
1334
|
+
{
|
|
1335
|
+
// detach from Ruby servant object
|
|
1336
|
+
static_cast<DSI_Servant*> (ptr)->free_servant ();
|
|
1337
|
+
}
|
|
1338
|
+
}
|