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.
Files changed (254) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +159 -0
  3. data/LICENSE +59 -0
  4. data/README +62 -0
  5. data/THANKS +52 -0
  6. data/bin/r2corba +8 -0
  7. data/bin/ridlc +11 -0
  8. data/bin/rins +7 -0
  9. data/ext/ext.mwc +6 -0
  10. data/ext/extload/extload.c +60 -0
  11. data/ext/libr2tao/any.cpp +1543 -0
  12. data/ext/libr2tao/exception.cpp +202 -0
  13. data/ext/libr2tao/exception.h +104 -0
  14. data/ext/libr2tao/longdouble.cpp +173 -0
  15. data/ext/libr2tao/longdouble.h +31 -0
  16. data/ext/libr2tao/object.cpp +1150 -0
  17. data/ext/libr2tao/object.h +38 -0
  18. data/ext/libr2tao/orb.cpp +1029 -0
  19. data/ext/libr2tao/orb.h +36 -0
  20. data/ext/libr2tao/r2tao_export.h +45 -0
  21. data/ext/libr2tao/r2tao_ext.h +38 -0
  22. data/ext/libr2tao/required.cpp +463 -0
  23. data/ext/libr2tao/required.h +187 -0
  24. data/ext/libr2tao/typecode.cpp +888 -0
  25. data/ext/libr2tao/typecode.h +45 -0
  26. data/ext/libr2tao/values.cpp +2938 -0
  27. data/ext/libr2tao/values.h +396 -0
  28. data/ext/librpoa/iortable.cpp +250 -0
  29. data/ext/librpoa/poa.cpp +1076 -0
  30. data/ext/librpoa/poa.h +24 -0
  31. data/ext/librpoa/rpoa_export.h +44 -0
  32. data/ext/librpoa/servant.cpp +1338 -0
  33. data/ext/librpoa/servant.h +116 -0
  34. data/ext/librpoa/srvreq_fix.cpp +283 -0
  35. data/ext/librpoa/srvreq_fix.h +149 -0
  36. data/ext/librpol/policies.cpp +763 -0
  37. data/ext/librpol/policies.h +15 -0
  38. data/ext/librpol/rpol_export.h +44 -0
  39. data/lib/corba/cbase/IORMap.rb +33 -0
  40. data/lib/corba/cbase/ORB.rb +231 -0
  41. data/lib/corba/cbase/Request.rb +134 -0
  42. data/lib/corba/cbase/Streams.rb +129 -0
  43. data/lib/corba/cbase/Stub.rb +19 -0
  44. data/lib/corba/cbase/Typecode.rb +441 -0
  45. data/lib/corba/cbase/Values.rb +129 -0
  46. data/lib/corba/cbase/exception.rb +66 -0
  47. data/lib/corba/cbase/poa.rb +23 -0
  48. data/lib/corba/cbase/policies.rb +78 -0
  49. data/lib/corba/cbase/post_require.rb +14 -0
  50. data/lib/corba/cbase/require.rb +28 -0
  51. data/lib/corba/cmds/base.rb +85 -0
  52. data/lib/corba/cmds/test.rb +30 -0
  53. data/lib/corba/common/Any.rb +91 -0
  54. data/lib/corba/common/IDL.rb +104 -0
  55. data/lib/corba/common/ORB.rb +368 -0
  56. data/lib/corba/common/Object.rb +208 -0
  57. data/lib/corba/common/Request.rb +20 -0
  58. data/lib/corba/common/Servant.rb +108 -0
  59. data/lib/corba/common/Struct.rb +22 -0
  60. data/lib/corba/common/Stub.rb +79 -0
  61. data/lib/corba/common/Typecode.rb +1121 -0
  62. data/lib/corba/common/Union.rb +56 -0
  63. data/lib/corba/common/Values.rb +92 -0
  64. data/lib/corba/common/const.rb +22 -0
  65. data/lib/corba/common/exception.rb +68 -0
  66. data/lib/corba/common/require.rb +27 -0
  67. data/lib/corba/common/version.rb +22 -0
  68. data/lib/corba/idl/IDL.rb +21 -0
  69. data/lib/corba/idl/IORTable.pidl +62 -0
  70. data/lib/corba/idl/TAO_Ext.pidl +46 -0
  71. data/lib/corba/idl/require.rb +20 -0
  72. data/lib/corba/jbase/Any.rb +273 -0
  73. data/lib/corba/jbase/IORMap.rb +36 -0
  74. data/lib/corba/jbase/ORB.rb +99 -0
  75. data/lib/corba/jbase/Object.rb +98 -0
  76. data/lib/corba/jbase/Request.rb +226 -0
  77. data/lib/corba/jbase/Servant.rb +247 -0
  78. data/lib/corba/jbase/ServerRequest.rb +128 -0
  79. data/lib/corba/jbase/Streams.rb +671 -0
  80. data/lib/corba/jbase/Stub.rb +38 -0
  81. data/lib/corba/jbase/Typecode.rb +520 -0
  82. data/lib/corba/jbase/Values.rb +173 -0
  83. data/lib/corba/jbase/exception.rb +106 -0
  84. data/lib/corba/jbase/poa.rb +229 -0
  85. data/lib/corba/jbase/policies.rb +300 -0
  86. data/lib/corba/jbase/post_require.rb +14 -0
  87. data/lib/corba/jbase/require.rb +86 -0
  88. data/lib/corba/naming.rb +14 -0
  89. data/lib/corba/naming_service.rb +15 -0
  90. data/lib/corba/poa.rb +15 -0
  91. data/lib/corba/policies.rb +18 -0
  92. data/lib/corba/require.rb +17 -0
  93. data/lib/corba/svcs/ins/cos_naming.rb +426 -0
  94. data/lib/corba/svcs/ins/ins.rb +526 -0
  95. data/lib/corba/svcs/ins/naming_service.rb +119 -0
  96. data/lib/corba.rb +16 -0
  97. data/lib/ridlbe/ruby/config.rb +336 -0
  98. data/lib/ridlbe/ruby/require.rb +16 -0
  99. data/lib/ridlbe/ruby/walker.rb +1582 -0
  100. data/mkrf_conf_srcgem.rb +186 -0
  101. data/rakelib/bin.rake +80 -0
  102. data/rakelib/bin.rb +146 -0
  103. data/rakelib/build.rake +87 -0
  104. data/rakelib/config.rake +52 -0
  105. data/rakelib/config.rb +450 -0
  106. data/rakelib/ext.rake +242 -0
  107. data/rakelib/ext.rb +308 -0
  108. data/rakelib/ext_r2tao.rb +232 -0
  109. data/rakelib/gem.rake +212 -0
  110. data/rakelib/gem.rb +146 -0
  111. data/rakelib/package.rake +26 -0
  112. data/rakelib/test.rake +23 -0
  113. data/test/BiDirectional/Test.idl +34 -0
  114. data/test/BiDirectional/client.rb +132 -0
  115. data/test/BiDirectional/run_test.rb +68 -0
  116. data/test/BiDirectional/server.rb +169 -0
  117. data/test/CORBA_Services/Naming/BindingIterator/Test.idl +27 -0
  118. data/test/CORBA_Services/Naming/BindingIterator/client.rb +121 -0
  119. data/test/CORBA_Services/Naming/BindingIterator/run_test.rb +82 -0
  120. data/test/CORBA_Services/Naming/BindingIterator/server.rb +109 -0
  121. data/test/CORBA_Services/Naming/Corbaname/Test.idl +27 -0
  122. data/test/CORBA_Services/Naming/Corbaname/client.rb +85 -0
  123. data/test/CORBA_Services/Naming/Corbaname/run_test.rb +88 -0
  124. data/test/CORBA_Services/Naming/Corbaname/server.rb +135 -0
  125. data/test/CORBA_Services/Naming/Simple/Test.idl +27 -0
  126. data/test/CORBA_Services/Naming/Simple/client.rb +84 -0
  127. data/test/CORBA_Services/Naming/Simple/run_test.rb +82 -0
  128. data/test/CORBA_Services/Naming/Simple/server.rb +109 -0
  129. data/test/Collocation/Diamond.idl +39 -0
  130. data/test/Collocation/run_test.rb +52 -0
  131. data/test/Collocation/test.rb +195 -0
  132. data/test/Connect_Timeout/Test.idl +27 -0
  133. data/test/Connect_Timeout/client.rb +111 -0
  134. data/test/Connect_Timeout/run_test.rb +52 -0
  135. data/test/DII/Test.idl +27 -0
  136. data/test/DII/client.rb +115 -0
  137. data/test/DII/run_test.rb +69 -0
  138. data/test/DII/server.rb +95 -0
  139. data/test/DSI/Test.idl +27 -0
  140. data/test/DSI/client.rb +66 -0
  141. data/test/DSI/run_test.rb +69 -0
  142. data/test/DSI/server.rb +106 -0
  143. data/test/Exceptions/Test.idl +48 -0
  144. data/test/Exceptions/client.rb +118 -0
  145. data/test/Exceptions/run_test.rb +69 -0
  146. data/test/Exceptions/server.rb +131 -0
  147. data/test/Hello/Test.idl +27 -0
  148. data/test/Hello/client.rb +78 -0
  149. data/test/Hello/run_test.rb +71 -0
  150. data/test/Hello/server.rb +95 -0
  151. data/test/IDL_Test/Test.idl +113 -0
  152. data/test/IDL_Test/Test_inc.idl +17 -0
  153. data/test/IDL_Test/client.rb +102 -0
  154. data/test/IDL_Test/run_test.rb +69 -0
  155. data/test/IDL_Test/server.rb +99 -0
  156. data/test/IORMap/Test.idl +27 -0
  157. data/test/IORMap/client.rb +73 -0
  158. data/test/IORMap/run_test.rb +69 -0
  159. data/test/IORMap/server.rb +114 -0
  160. data/test/IORTable/Test.idl +27 -0
  161. data/test/IORTable/client.rb +75 -0
  162. data/test/IORTable/run_test.rb +69 -0
  163. data/test/IORTable/server.rb +130 -0
  164. data/test/Implicit_Conversion/Test.idl +31 -0
  165. data/test/Implicit_Conversion/client.rb +110 -0
  166. data/test/Implicit_Conversion/run_test.rb +69 -0
  167. data/test/Implicit_Conversion/server.rb +99 -0
  168. data/test/Multi_Threading/Multiple_ORB/Test.idl +27 -0
  169. data/test/Multi_Threading/Multiple_ORB/client.rb +82 -0
  170. data/test/Multi_Threading/Multiple_ORB/run_test.rb +71 -0
  171. data/test/Multi_Threading/Multiple_ORB/server.rb +108 -0
  172. data/test/Multi_Threading/Simple/Test.idl +27 -0
  173. data/test/Multi_Threading/Simple/client.rb +88 -0
  174. data/test/Multi_Threading/Simple/run_test.rb +69 -0
  175. data/test/Multi_Threading/Simple/server.rb +118 -0
  176. data/test/Multi_Threading/Threads/Test.idl +31 -0
  177. data/test/Multi_Threading/Threads/client.rb +80 -0
  178. data/test/Multi_Threading/Threads/run_test.rb +76 -0
  179. data/test/Multi_Threading/Threads/server.rb +119 -0
  180. data/test/Multi_Threading/Threads/watchdog.rb +87 -0
  181. data/test/Multiple_Servant_Interfaces/Test.idl +34 -0
  182. data/test/Multiple_Servant_Interfaces/client.rb +70 -0
  183. data/test/Multiple_Servant_Interfaces/run_test.rb +69 -0
  184. data/test/Multiple_Servant_Interfaces/server.rb +102 -0
  185. data/test/Nil/Test.idl +27 -0
  186. data/test/Nil/run_test.rb +52 -0
  187. data/test/Nil/test.rb +78 -0
  188. data/test/OBV/AbstractInterface/client.rb +179 -0
  189. data/test/OBV/AbstractInterface/run_test.rb +69 -0
  190. data/test/OBV/AbstractInterface/server.rb +149 -0
  191. data/test/OBV/AbstractInterface/test.idl +53 -0
  192. data/test/OBV/Custom/OBV.idl +18 -0
  193. data/test/OBV/Custom/OBV_impl.rb +40 -0
  194. data/test/OBV/Custom/client.rb +86 -0
  195. data/test/OBV/Custom/run_test.rb +69 -0
  196. data/test/OBV/Custom/server.rb +100 -0
  197. data/test/OBV/Simple/OBV.idl +15 -0
  198. data/test/OBV/Simple/OBV_impl.rb +26 -0
  199. data/test/OBV/Simple/client.rb +86 -0
  200. data/test/OBV/Simple/run_test.rb +69 -0
  201. data/test/OBV/Simple/server.rb +100 -0
  202. data/test/OBV/Simple_Event/Event.idl +15 -0
  203. data/test/OBV/Simple_Event/Event_impl.rb +26 -0
  204. data/test/OBV/Simple_Event/client.rb +86 -0
  205. data/test/OBV/Simple_Event/run_test.rb +69 -0
  206. data/test/OBV/Simple_Event/server.rb +100 -0
  207. data/test/OBV/Supports/client.rb +116 -0
  208. data/test/OBV/Supports/run_test.rb +69 -0
  209. data/test/OBV/Supports/server.rb +103 -0
  210. data/test/OBV/Supports/supports.idl +33 -0
  211. data/test/OBV/Supports/supports_impl.rb +57 -0
  212. data/test/OBV/Tree/client.rb +116 -0
  213. data/test/OBV/Tree/run_test.rb +69 -0
  214. data/test/OBV/Tree/server.rb +117 -0
  215. data/test/OBV/Tree/test.idl +32 -0
  216. data/test/OBV/Truncatable/Extra.idl +27 -0
  217. data/test/OBV/Truncatable/Truncatable.idl +105 -0
  218. data/test/OBV/Truncatable/Truncatable_impl.rb +86 -0
  219. data/test/OBV/Truncatable/client.rb +279 -0
  220. data/test/OBV/Truncatable/run_test.rb +69 -0
  221. data/test/OBV/Truncatable/server.rb +89 -0
  222. data/test/OBV/ValueBox/client.rb +497 -0
  223. data/test/OBV/ValueBox/run_test.rb +69 -0
  224. data/test/OBV/ValueBox/server.rb +271 -0
  225. data/test/OBV/ValueBox/valuebox.idl +101 -0
  226. data/test/OBV/ValueBox/vb_basic.idl +75 -0
  227. data/test/OBV/ValueBox/vb_struct.idl +68 -0
  228. data/test/OBV/ValueBox/vb_union.idl +21 -0
  229. data/test/Object/Test.idl +27 -0
  230. data/test/Object/client.rb +103 -0
  231. data/test/Object/run_test.rb +69 -0
  232. data/test/Object/server.rb +126 -0
  233. data/test/POA/Test.idl +27 -0
  234. data/test/POA/run_test.rb +52 -0
  235. data/test/POA/test.rb +112 -0
  236. data/test/Param_Test/Test.idl +182 -0
  237. data/test/Param_Test/client.rb +277 -0
  238. data/test/Param_Test/run_test.rb +69 -0
  239. data/test/Param_Test/server.rb +296 -0
  240. data/test/Performance/Simple/Test.idl +27 -0
  241. data/test/Performance/Simple/client.rb +90 -0
  242. data/test/Performance/Simple/run_test.rb +69 -0
  243. data/test/Performance/Simple/server.rb +95 -0
  244. data/test/Policies/Test.idl +27 -0
  245. data/test/Policies/run_test.rb +52 -0
  246. data/test/Policies/test.rb +144 -0
  247. data/test/Timeout/client.rb +207 -0
  248. data/test/Timeout/run_test.rb +69 -0
  249. data/test/Timeout/server.rb +109 -0
  250. data/test/Timeout/test.idl +19 -0
  251. data/test/lib/assert.rb +43 -0
  252. data/test/lib/test.rb +542 -0
  253. data/test/test_runner.rb +193 -0
  254. metadata +334 -0
@@ -0,0 +1,116 @@
1
+ /*--------------------------------------------------------------------
2
+ # servant.h - 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
+ #if ((TAO_MAJOR_VERSION < 2) || (TAO_MAJOR_VERSION == 2 && TAO_MINOR_VERSION == 0 && TAO_BETA_VERSION <= 1))
15
+ # define RPOA_NEED_DSI_FIX 1
16
+
17
+ # include "srvreq_fix.h"
18
+
19
+ # define R2CORBA_ServerRequest R2CORBA::ServerRequest
20
+ # define R2CORBA_ServerRequest_ptr R2CORBA::ServerRequest_ptr
21
+ #else
22
+ # define R2CORBA_ServerRequest CORBA::ServerRequest
23
+ # define R2CORBA_ServerRequest_ptr CORBA::ServerRequest_ptr
24
+ #endif
25
+
26
+ //-------------------------------------------------------------------
27
+ // R2TAO Servant class
28
+ //
29
+ //===================================================================
30
+
31
+ class DSI_Servant : public PortableServer::DynamicImplementation
32
+ {
33
+ public:
34
+ DSI_Servant (VALUE rbServant);
35
+ // ctor
36
+ virtual ~DSI_Servant ();
37
+ // dtor
38
+
39
+ virtual void invoke (CORBA::ServerRequest_ptr request);
40
+ //ACE_THROW_SPEC ((CORBA::SystemException));
41
+ #if RPOA_NEED_DSI_FIX
42
+ void invoke_fix (R2CORBA::ServerRequest_ptr request);
43
+ #endif
44
+
45
+ virtual CORBA::RepositoryId _primary_interface (
46
+ const PortableServer::ObjectId &oid,
47
+ PortableServer::POA_ptr poa);
48
+
49
+ virtual CORBA::Boolean _is_a (const char *logical_type_id);
50
+
51
+ virtual CORBA::Boolean _non_existent (void);
52
+
53
+ //virtual CORBA::InterfaceDef_ptr _get_interface (void);
54
+
55
+ virtual CORBA::Object_ptr _get_component (void);
56
+
57
+ virtual char * _repository_id (void);
58
+
59
+ enum METHOD {
60
+ NONE,
61
+ IS_A,
62
+ NON_EXISTENT,
63
+ GET_INTERFACE,
64
+ GET_COMPONENT,
65
+ REPOSITORY_ID
66
+ };
67
+
68
+ VALUE rbServant () {
69
+ return this->rbServant_;
70
+ }
71
+
72
+ void free_servant ();
73
+
74
+ void activate_servant ();
75
+
76
+ protected:
77
+ virtual const char *_interface_repository_id (void) const;
78
+
79
+ #if RPOA_NEED_DSI_FIX
80
+ /// Turns around and calls invoke.
81
+ virtual void _dispatch (TAO_ServerRequest &request, void *context);
82
+ #endif
83
+
84
+ void register_with_servant ();
85
+
86
+ void cleanup_servant ();
87
+ void inner_cleanup_servant ();
88
+
89
+ METHOD method_id (const char* method);
90
+
91
+ virtual void inner_invoke (R2CORBA_ServerRequest_ptr request);
92
+
93
+ void invoke_SI (R2CORBA_ServerRequest_ptr request);
94
+ void invoke_DSI (R2CORBA_ServerRequest_ptr request);
95
+
96
+ static VALUE _invoke_implementation(VALUE args);
97
+
98
+ private:
99
+ VALUE rbServant_;
100
+ // The Ruby Servant
101
+
102
+ CORBA::String_var repo_id_;
103
+
104
+ struct ThreadSafeArg
105
+ {
106
+ ThreadSafeArg (DSI_Servant* srv,
107
+ R2CORBA_ServerRequest_ptr req)
108
+ : servant_(srv), request_(req) {}
109
+ DSI_Servant* servant_;
110
+ R2CORBA_ServerRequest_ptr request_;
111
+ };
112
+
113
+ static void* thread_safe_invoke (void * arg);
114
+ static void* thread_safe_cleanup (void* arg);
115
+ };
116
+
@@ -0,0 +1,283 @@
1
+ /*--------------------------------------------------------------------
2
+ # srvreq_fix.h - 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
+ #ifndef __SRVREQ_FIX_CPP__
15
+ #define __SRVREQ_FIX_CPP__
16
+
17
+ #include "tao/DynamicInterface/DII_Arguments.h"
18
+ #include "tao/DynamicInterface/Unknown_User_Exception.h"
19
+ #include "tao/PortableServer/Collocated_Arguments_Converter.h"
20
+ #include "tao/AnyTypeCode/NVList.h"
21
+ #include "tao/GIOP_Utils.h"
22
+ #include "tao/AnyTypeCode/Marshal.h"
23
+ #include "tao/AnyTypeCode/TypeCode.h"
24
+ #include "tao/AnyTypeCode/Any_Impl.h"
25
+ #include "tao/operation_details.h"
26
+ #include "tao/SystemException.h"
27
+
28
+ // Reference counting for DSI ServerRequest object.
29
+
30
+ CORBA::ULong
31
+ R2CORBA::ServerRequest::_incr_refcount (void)
32
+ {
33
+ return ++this->refcount_;
34
+ }
35
+
36
+ CORBA::ULong
37
+ R2CORBA::ServerRequest::_decr_refcount (void)
38
+ {
39
+ CORBA::ULong const new_count = --this->refcount_;
40
+
41
+ if (new_count == 0)
42
+ delete this;
43
+
44
+ return new_count;
45
+ }
46
+
47
+ R2CORBA::ServerRequest::ServerRequest (TAO_ServerRequest &orb_server_request)
48
+ : lazy_evaluation_ (0),
49
+ ctx_ (CORBA::Context::_nil ()),
50
+ params_ (CORBA::NVList::_nil ()),
51
+ retval_ (0),
52
+ exception_ (0),
53
+ refcount_ (1),
54
+ orb_server_request_ (orb_server_request),
55
+ sent_gateway_exception_ (false)
56
+ {
57
+ this->orb_server_request_.is_dsi ();
58
+ }
59
+
60
+ R2CORBA::ServerRequest::~ServerRequest (void)
61
+ {
62
+ if (this->params_ != 0)
63
+ {
64
+ ::CORBA::release (this->params_);
65
+ }
66
+
67
+ delete this->retval_;
68
+ delete this->exception_;
69
+ }
70
+
71
+ // Unmarshal in/inout params, and set up to marshal the appropriate
72
+ // inout/out/return values later on.
73
+ void
74
+ R2CORBA::ServerRequest::arguments (CORBA::NVList_ptr &list)
75
+ {
76
+ // arguments() must be called before either of these.
77
+ if (this->params_ != 0 || this->exception_ != 0)
78
+ {
79
+ throw ::CORBA::BAD_INV_ORDER (CORBA::OMGVMCID | 7, CORBA::COMPLETED_NO);
80
+ }
81
+
82
+ // In a collocated situation there will not be an incoming CDR stream
83
+ // in which case we can get the arguments from the
84
+ // operation_details using the 'collocated argument converter'.
85
+ if (this->orb_server_request_.collocated ())
86
+ {
87
+ this->params_ = list;
88
+
89
+ if (this->orb_server_request_.operation_details ()->cac () != 0)
90
+ {
91
+ TAO_OutputCDR output;
92
+ this->orb_server_request_.operation_details ()->cac (
93
+ )->dsi_convert_request (this->orb_server_request_,
94
+ output);
95
+
96
+ TAO_InputCDR input(output);
97
+ this->params_->_tao_decode (input, CORBA::ARG_IN | CORBA::ARG_INOUT);
98
+ }
99
+ }
100
+ else
101
+ {
102
+ // Save params for later use when marshaling the reply.
103
+ this->params_ = list;
104
+
105
+ // sometimes there is no incoming stream
106
+ if (this->orb_server_request_.incoming ())
107
+ {
108
+ this->params_->_tao_incoming_cdr (*this->orb_server_request_.incoming (),
109
+ CORBA::ARG_IN | CORBA::ARG_INOUT,
110
+ this->lazy_evaluation_);
111
+
112
+ // Pass this alignment back to the TAO_ServerRequest.
113
+ this->orb_server_request_.dsi_nvlist_align (
114
+ this->params_->_tao_target_alignment ());
115
+ }
116
+ }
117
+ }
118
+
119
+ // Store the result value. There's either an exception, or a result,
120
+ // but not both of them. Results can be reported (at most once)
121
+ // only after the parameter list has been provided (maybe empty).
122
+ void
123
+ R2CORBA::ServerRequest::set_result (const CORBA::Any &value
124
+ )
125
+ {
126
+ // Setting a result when another result already exists or if an exception
127
+ // exists or before the args have been processeed is an error.
128
+ if (this->retval_ != 0 || this->exception_ != 0 || this->params_ == 0)
129
+ {
130
+ throw ::CORBA::BAD_INV_ORDER (CORBA::OMGVMCID | 8, CORBA::COMPLETED_NO);
131
+ }
132
+
133
+ ACE_NEW_THROW_EX (this->retval_,
134
+ CORBA::Any (value),
135
+ CORBA::NO_MEMORY ());
136
+ }
137
+
138
+ // NOTE: if "" is set, there has been a system exception,
139
+ // and it will take precedence over exceptions reported using the
140
+ // set_exception() mechanism of the ServerRequest, which we assume
141
+ // the application writer will use to report only user exceptions.
142
+ // If both types of exception happen on the same invocation, the user
143
+ // exception will be lost.
144
+
145
+ // Store the exception value.
146
+ void
147
+ R2CORBA::ServerRequest::set_exception (const CORBA::Any &value)
148
+ {
149
+ CORBA::TypeCode_var tc = value.type ();
150
+
151
+ CORBA::TCKind const kind = tc->kind ();
152
+
153
+ // set_exception() can be called at any time, but the Any arg MUST
154
+ // contain an exception.
155
+ if (kind != CORBA::tk_except)
156
+ {
157
+ throw ::CORBA::BAD_PARAM (CORBA::OMGVMCID | 21, CORBA::COMPLETED_MAYBE);
158
+ }
159
+
160
+ ACE_NEW_THROW_EX (this->exception_,
161
+ CORBA::Any (value),
162
+ CORBA::NO_MEMORY ());
163
+
164
+ this->orb_server_request_.reply_status (GIOP::USER_EXCEPTION);
165
+ }
166
+
167
+ // This method will be utilized by the DSI servant to marshal outgoing
168
+ // parameters.
169
+ void
170
+ R2CORBA::ServerRequest::dsi_marshal (void)
171
+ {
172
+ // There was a user exception, no need to marshal any parameters.
173
+ if (this->sent_gateway_exception_)
174
+ {
175
+ return;
176
+ }
177
+
178
+ // In a collocated situation there is no outgoing CDR stream.
179
+ // So, in case of an exception we just raise the UnknownUserException
180
+ // and for a regular reply we use the 'collocated argument converter'.
181
+ if (this->orb_server_request_.collocated ())
182
+ {
183
+ if (this->orb_server_request_.reply_status () == GIOP::USER_EXCEPTION)
184
+ {
185
+ throw CORBA::UnknownUserException (*this->exception_);
186
+ }
187
+ else if (this->orb_server_request_.operation_details ()->cac () != 0)
188
+ {
189
+ TAO_OutputCDR output;
190
+ // marshal the return value if any
191
+ if (this->retval_ != 0)
192
+ {
193
+ this->retval_->impl ()->marshal_value (output);
194
+ }
195
+
196
+ // marshal the "inout" and "out" parameters.
197
+ if (this->params_ != 0)
198
+ {
199
+ this->params_->_tao_encode (
200
+ output,
201
+ CORBA::ARG_INOUT | CORBA::ARG_OUT);
202
+ }
203
+
204
+ TAO_InputCDR input (output);
205
+ // set reply parameters
206
+ this->orb_server_request_.operation_details ()->cac (
207
+ )->dsi_convert_reply (this->orb_server_request_,
208
+ input);
209
+ }
210
+ }
211
+ else
212
+ {
213
+ if (this->orb_server_request_.reply_status () == GIOP::NO_EXCEPTION)
214
+ {
215
+ // In DSI, we can't rely on the skeleton to do this.
216
+ if (this->retval_ == 0 && this->params_ == 0)
217
+ {
218
+ this->orb_server_request_.argument_flag (false);
219
+ }
220
+
221
+ this->orb_server_request_.init_reply ();
222
+
223
+ // Send the return value, if any.
224
+ if (this->retval_ != 0)
225
+ {
226
+ this->retval_->impl ()->marshal_value (
227
+ *this->orb_server_request_.outgoing ());
228
+ }
229
+
230
+ // Send the "inout" and "out" parameters.
231
+ if (this->params_ != 0)
232
+ {
233
+ this->params_->_tao_encode (
234
+ *this->orb_server_request_.outgoing (),
235
+ CORBA::ARG_INOUT | CORBA::ARG_OUT);
236
+ }
237
+ }
238
+ else
239
+ {
240
+ // This defaults to true, but just to be safe...
241
+ this->orb_server_request_.argument_flag (true);
242
+
243
+ // Write the reply header to the ORB request's outgoing CDR stream.
244
+ this->orb_server_request_.init_reply ();
245
+
246
+ this->exception_->impl ()->marshal_value (
247
+ *this->orb_server_request_.outgoing ());
248
+ }
249
+ }
250
+
251
+ // do not send in case of deferred reply
252
+ if (!this->orb_server_request_.deferred_reply ())
253
+ {
254
+ this->orb_server_request_.tao_send_reply ();
255
+ }
256
+ }
257
+
258
+ void
259
+ R2CORBA::ServerRequest::gateway_exception_reply (ACE_CString &raw_exception)
260
+ {
261
+ // This defaults to 1, but just to be safe...
262
+ this->orb_server_request_.argument_flag (true);
263
+
264
+ // This reply path handles only user exceptions.
265
+ this->orb_server_request_.reply_status (GIOP::USER_EXCEPTION);
266
+
267
+ this->orb_server_request_.init_reply ();
268
+
269
+ // We know nothing about this exception, so we marshal it as a block
270
+ // of bytes. The outgoing stream's byte order has already been matched
271
+ // to the original source of the reply.
272
+ this->orb_server_request_.outgoing ()->write_octet_array (
273
+ reinterpret_cast<const CORBA::Octet *> (raw_exception.fast_rep ()),
274
+ static_cast<CORBA::ULong> (raw_exception.length () + ACE_CDR::MAX_ALIGNMENT)
275
+ );
276
+
277
+ // This will prevent the marshaling of any parameters into this reply.
278
+ this->sent_gateway_exception_ = true;
279
+
280
+ this->orb_server_request_.tao_send_reply ();
281
+ }
282
+
283
+ #endif
@@ -0,0 +1,149 @@
1
+ /*--------------------------------------------------------------------
2
+ # srvreq_fix.h - 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
+ #ifndef __SRVREQ_FIX_H__
15
+ #define __SRVREQ_FIX_H__
16
+
17
+ #include "tao/TAO_Server_Request.h"
18
+ #include "tao/CDR.h"
19
+ #include "ace/Atomic_Op.h"
20
+
21
+ namespace R2CORBA
22
+ {
23
+ class ServerRequest;
24
+ typedef ServerRequest *ServerRequest_ptr;
25
+
26
+ typedef TAO_Pseudo_Var_T<ServerRequest> ServerRequest_var;
27
+ typedef TAO_Pseudo_Out_T<ServerRequest> ServerRequest_out;
28
+
29
+ /**
30
+ * @class ServerRequest
31
+ *
32
+ * @brief Class representing the CORBA ServerRequest pseudo-object.
33
+ *
34
+ * R2CORBA fixed version for older (< 6.0.2) TAO versions
35
+ */
36
+ class ServerRequest
37
+ {
38
+ public:
39
+ ServerRequest (TAO_ServerRequest &orb_server_request);
40
+
41
+ ~ServerRequest (void);
42
+
43
+ void arguments (CORBA::NVList_ptr &list);
44
+
45
+ void set_result (const CORBA::Any &value);
46
+
47
+ void set_exception (const CORBA::Any &value);
48
+
49
+ void dsi_marshal (void);
50
+
51
+ CORBA::Context_ptr ctx (void) const;
52
+
53
+ void ctx (CORBA::Context_ptr);
54
+
55
+ const char *operation (void) const;
56
+
57
+ static ServerRequest_ptr _duplicate (ServerRequest_ptr);
58
+ static ServerRequest_ptr _nil (void);
59
+
60
+ CORBA::ULong _incr_refcount (void);
61
+ CORBA::ULong _decr_refcount (void);
62
+
63
+ void _tao_lazy_evaluation (bool lazy_evaluation);
64
+
65
+ int _tao_incoming_byte_order (void) const;
66
+
67
+ void _tao_reply_byte_order (int byte_order);
68
+
69
+ TAO_ServerRequest & _tao_server_request (void);
70
+
71
+ void gateway_exception_reply (ACE_CString &raw_exception);
72
+
73
+ typedef R2CORBA::ServerRequest_ptr _ptr_type;
74
+ typedef R2CORBA::ServerRequest_var _var_type;
75
+ typedef R2CORBA::ServerRequest_out _out_type;
76
+
77
+ private:
78
+ bool lazy_evaluation_;
79
+ CORBA::Context_ptr ctx_;
80
+ CORBA::NVList_ptr params_;
81
+ CORBA::Any_ptr retval_;
82
+ CORBA::Any_ptr exception_;
83
+ ACE_Atomic_Op<TAO_SYNCH_MUTEX, unsigned long> refcount_;
84
+ TAO_ServerRequest &orb_server_request_;
85
+ bool sent_gateway_exception_;
86
+ };
87
+ } // End R2CORBA namespace
88
+
89
+ inline R2CORBA::ServerRequest_ptr
90
+ R2CORBA::ServerRequest::_duplicate (R2CORBA::ServerRequest_ptr x)
91
+ {
92
+ if (x != 0)
93
+ {
94
+ x->_incr_refcount ();
95
+ }
96
+
97
+ return x;
98
+ }
99
+
100
+ inline R2CORBA::ServerRequest_ptr
101
+ R2CORBA::ServerRequest::_nil (void)
102
+ {
103
+ return static_cast <R2CORBA::ServerRequest_ptr>(0);
104
+ }
105
+
106
+ inline CORBA::Context_ptr
107
+ R2CORBA::ServerRequest::ctx (void) const
108
+ {
109
+ return this->ctx_;
110
+ }
111
+
112
+ inline void
113
+ R2CORBA::ServerRequest::ctx (CORBA::Context_ptr ctx)
114
+ {
115
+ this->ctx_ = ctx;
116
+ }
117
+
118
+ inline const char *
119
+ R2CORBA::ServerRequest::operation (void) const
120
+ {
121
+ return this->orb_server_request_.operation ();
122
+ }
123
+
124
+ inline void
125
+ R2CORBA::ServerRequest::_tao_lazy_evaluation (bool lazy_evaluation)
126
+ {
127
+ this->lazy_evaluation_ = lazy_evaluation;
128
+ }
129
+
130
+ inline int
131
+ R2CORBA::ServerRequest::_tao_incoming_byte_order (void) const
132
+ {
133
+ return this->orb_server_request_.incoming ()->byte_order ();
134
+ }
135
+
136
+ inline void
137
+ R2CORBA::ServerRequest::_tao_reply_byte_order (int byte_order)
138
+ {
139
+ this->orb_server_request_.outgoing ()->reset_byte_order (byte_order);
140
+ }
141
+
142
+
143
+ inline TAO_ServerRequest &
144
+ R2CORBA::ServerRequest::_tao_server_request (void)
145
+ {
146
+ return this->orb_server_request_;
147
+ }
148
+
149
+ #endif