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,1543 @@
1
+ /*--------------------------------------------------------------------
2
+ # any.cpp - R2TAO CORBA Any 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 "required.h"
15
+ #include "exception.h"
16
+ #include "object.h"
17
+ #include "typecode.h"
18
+ #include "longdouble.h"
19
+ #include "values.h"
20
+ #include "tao/AnyTypeCode/True_RefCount_Policy.h"
21
+ #include "tao/AnyTypeCode/Sequence_TypeCode.h"
22
+ #include "tao/AnyTypeCode/Any.h"
23
+ #include "tao/AnyTypeCode/BooleanSeqA.h"
24
+ #include "tao/AnyTypeCode/CharSeqA.h"
25
+ #include "tao/AnyTypeCode/DoubleSeqA.h"
26
+ #include "tao/AnyTypeCode/FloatSeqA.h"
27
+ #include "tao/AnyTypeCode/LongDoubleSeqA.h"
28
+ #include "tao/AnyTypeCode/LongSeqA.h"
29
+ #include "tao/AnyTypeCode/OctetSeqA.h"
30
+ #include "tao/AnyTypeCode/ShortSeqA.h"
31
+ #include "tao/AnyTypeCode/StringSeqA.h"
32
+ #include "tao/AnyTypeCode/ULongSeqA.h"
33
+ #include "tao/AnyTypeCode/UShortSeqA.h"
34
+ #include "tao/AnyTypeCode/WCharSeqA.h"
35
+ #include "tao/AnyTypeCode/WStringSeqA.h"
36
+ #include "tao/AnyTypeCode/LongLongSeqA.h"
37
+ #include "tao/AnyTypeCode/ULongLongSeqA.h"
38
+ #include "tao/AnyTypeCode/Any_Dual_Impl_T.h"
39
+ #include "tao/BooleanSeqC.h"
40
+ #include "tao/CharSeqC.h"
41
+ #include "tao/DoubleSeqC.h"
42
+ #include "tao/FloatSeqC.h"
43
+ #include "tao/LongDoubleSeqC.h"
44
+ #include "tao/LongSeqC.h"
45
+ #include "tao/OctetSeqC.h"
46
+ #include "tao/ShortSeqC.h"
47
+ #include "tao/StringSeqC.h"
48
+ #include "tao/ULongSeqC.h"
49
+ #include "tao/UShortSeqC.h"
50
+ #include "tao/WCharSeqC.h"
51
+ #include "tao/WStringSeqC.h"
52
+ #include "tao/LongLongSeqC.h"
53
+ #include "tao/ULongLongSeqC.h"
54
+ #include "tao/DynamicAny/DynamicAny.h"
55
+ #include "tao/Object_Loader.h"
56
+ #include "tao/ORB_Core.h"
57
+ #include "ace/Dynamic_Service.h"
58
+
59
+ #define RUBY_INVOKE_FUNC RUBY_ALLOC_FUNC
60
+
61
+ static VALUE r2tao_cAny;
62
+
63
+ static ID get_type_ID;
64
+ static ID typecode_for_value_ID;
65
+ static ID value_for_any_ID;
66
+ //static ID from_native_ID;
67
+ static ID member_type_ID;
68
+ static ID content_type_ID;
69
+ static ID _narrow_ID;
70
+ static ID value_ID;
71
+
72
+
73
+ void r2tao_init_Any()
74
+ {
75
+ r2tao_cAny = rb_eval_string ("R2CORBA::CORBA::Any");
76
+
77
+ get_type_ID = rb_intern ("get_type");
78
+ typecode_for_value_ID = rb_intern ("typecode_for_value");
79
+ value_for_any_ID = rb_intern ("value_for_any");
80
+ //from_native_ID = rb_intern ("from_native");
81
+ member_type_ID = rb_intern ("member_type");
82
+ content_type_ID = rb_intern ("content_type");
83
+ _narrow_ID = rb_intern ("_narrow");
84
+ value_ID = rb_intern ("value");
85
+ }
86
+
87
+ /*===================================================================
88
+ * Dynamic Any factory
89
+ *
90
+ */
91
+ static DynamicAny::DynAnyFactory_var g_dynany_factory;
92
+
93
+ static DynamicAny::DynAnyFactory_ptr get_dynany_factory()
94
+ {
95
+ if (CORBA::is_nil (g_dynany_factory.in ()))
96
+ {
97
+ TAO_Object_Loader *loader =
98
+ ACE_Dynamic_Service<TAO_Object_Loader>::instance
99
+ (ACE_TEXT ("DynamicAny_Loader"));
100
+
101
+ if (loader != 0)
102
+ {
103
+ g_dynany_factory = DynamicAny::DynAnyFactory::_narrow (
104
+ loader->create_object (CORBA::ORB::_nil(), 0, 0));
105
+ }
106
+
107
+ if (CORBA::is_nil (g_dynany_factory.in ()))
108
+ {
109
+ ACE_ERROR ((LM_ERROR, "R2TAO::Unable to resolve DynAnyFactory\n"));
110
+
111
+ throw ::CORBA::INTERNAL ();
112
+ }
113
+ }
114
+ return g_dynany_factory.in ();
115
+ }
116
+
117
+ #define DYNANY_FACTORY get_dynany_factory ()
118
+
119
+ static DynamicAny::DynAny_ptr r2tao_CreateDynAny (const CORBA::Any& _any)
120
+ {
121
+ DynamicAny::DynAny_ptr da =
122
+ DYNANY_FACTORY->create_dyn_any (_any);
123
+
124
+ return da;
125
+ }
126
+
127
+ static DynamicAny::DynAny_ptr r2tao_CreateDynAny4tc (CORBA::TypeCode_ptr _tc)
128
+ {
129
+ DynamicAny::DynAny_ptr da =
130
+ DYNANY_FACTORY->create_dyn_any_from_type_code (_tc);
131
+
132
+ return da;
133
+ }
134
+
135
+ /*===================================================================
136
+ * Data conversion Ruby VALUE --> CORBA Any
137
+ *
138
+ */
139
+ static void r2tao_Ruby2Struct (CORBA::Any& _any, CORBA::TypeCode_ptr _tc, VALUE rs)
140
+ {
141
+ if (TAO_debug_level > 9)
142
+ ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Ruby2Struct:: kind=%d, rval=%@\n", _tc->kind (), rs));
143
+
144
+ DynamicAny::DynAny_var da = r2tao_CreateDynAny4tc (_tc);
145
+ DynamicAny::DynStruct_var das = DynamicAny::DynStruct::_narrow (da.in ());
146
+
147
+ if (!NIL_P (rs))
148
+ {
149
+ CORBA::ULong mcount = _tc->member_count ();
150
+
151
+ DynamicAny::NameValuePairSeq_var nvps = das->get_members ();
152
+
153
+ for (CORBA::ULong m=0; m<mcount ;++m)
154
+ {
155
+ CORBA::TypeCode_var mtc = _tc->member_type (m);
156
+ VALUE mval = rb_funcall (rs, rb_intern (_tc->member_name (m)), 0);
157
+ r2tao_Ruby2Any (nvps[m].value, mtc.in (), mval);
158
+ }
159
+
160
+ das->set_members (nvps);
161
+ }
162
+
163
+ CORBA::Any_var av = das->to_any ();
164
+ _any = av.in ();
165
+
166
+ das->destroy ();
167
+ }
168
+
169
+ void r2tao_Ruby2Union (CORBA::Any& _any, CORBA::TypeCode_ptr _tc, VALUE ru)
170
+ {
171
+ if (TAO_debug_level > 9)
172
+ ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Ruby2Union:: kind=%d, rval=%@\n", _tc->kind (), ru));
173
+
174
+ DynamicAny::DynAny_var da = r2tao_CreateDynAny4tc (_tc);
175
+ DynamicAny::DynUnion_var dau = DynamicAny::DynUnion::_narrow (da.in ());
176
+
177
+ if (!NIL_P (ru))
178
+ {
179
+ static ID _is_at_default_ID = rb_intern ("_is_at_default?");
180
+
181
+ VALUE at_default = rb_funcall (ru, _is_at_default_ID, 0);
182
+ VALUE value = rb_iv_get (ru, "@value");
183
+ VALUE disc = rb_iv_get (ru, "@discriminator");
184
+ if (at_default == Qfalse)
185
+ {
186
+ if (NIL_P (disc))
187
+ {
188
+ dau->set_to_no_active_member ();
189
+ }
190
+ else
191
+ {
192
+ CORBA::Any_var _any = new CORBA::Any;
193
+ CORBA::TypeCode_var dtc = _tc->discriminator_type ();
194
+ r2tao_Ruby2Any(*_any, dtc.in (), disc);
195
+ DynamicAny::DynAny_var _dyna = r2tao_CreateDynAny (*_any);
196
+ dau->set_discriminator (_dyna.in ());
197
+ }
198
+ }
199
+ else
200
+ {
201
+ dau->set_to_default_member ();
202
+ }
203
+
204
+ if (!NIL_P (disc) && !NIL_P (value))
205
+ {
206
+ static ID _value_tc_ID = rb_intern("_value_tc");
207
+
208
+ VALUE rvaltc = rb_funcall (ru, _value_tc_ID, 0);
209
+ CORBA::TypeCode_ptr valtc = r2corba_TypeCode_r2t (rvaltc);
210
+ CORBA::Any_var _any = new CORBA::Any;
211
+ r2tao_Ruby2Any(*_any, valtc, value);
212
+ DynamicAny::DynAny_var dynval = dau->member ();
213
+ dynval->from_any (*_any);
214
+ }
215
+ }
216
+
217
+ CORBA::Any_var av = dau->to_any ();
218
+ _any = av.in ();
219
+
220
+ dau->destroy ();
221
+ }
222
+
223
+ void r2tao_Ruby2Sequence(CORBA::Any& _any, CORBA::TypeCode_ptr _tc, VALUE rarr)
224
+ {
225
+ CORBA::TypeCode_var _ctc = _tc->content_type ();
226
+ if (TAO_debug_level > 9)
227
+ ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Ruby2Sequence:: content kind=%d, rval type=%d\n", _ctc->kind (), rb_type (rarr)));
228
+
229
+ CORBA::ULong alen = 0;
230
+ if (!NIL_P (rarr))
231
+ {
232
+ switch (_ctc->kind ())
233
+ {
234
+ case CORBA::tk_char:
235
+ case CORBA::tk_octet:
236
+ CHECK_RTYPE(rarr, T_STRING);
237
+ alen = static_cast<unsigned long> (RSTRING_LEN (rarr));
238
+ break;
239
+ default:
240
+ CHECK_RTYPE(rarr, T_ARRAY);
241
+ alen = static_cast<unsigned long> (RARRAY_LEN (rarr));
242
+ break;
243
+ }
244
+ }
245
+
246
+ switch (_ctc->kind ())
247
+ {
248
+ case CORBA::tk_short:
249
+ {
250
+ CORBA::ShortSeq_var tmp = new CORBA::ShortSeq();
251
+ tmp->length (alen);
252
+ for (CORBA::ULong l=0; l<alen ;++l)
253
+ {
254
+ VALUE el = rb_ary_entry (rarr, l);
255
+ tmp[l] = (CORBA::Short)NUM2INT (el);
256
+ }
257
+ _any <<= tmp;
258
+ return;
259
+ }
260
+ case CORBA::tk_long:
261
+ {
262
+ CORBA::LongSeq_var tmp = new CORBA::LongSeq();
263
+ tmp->length (alen);
264
+ for (CORBA::ULong l=0; l<alen ;++l)
265
+ {
266
+ VALUE el = rb_ary_entry (rarr, l);
267
+ tmp[l] = (CORBA::Long)NUM2LONG (el);
268
+ }
269
+ _any <<= tmp;
270
+ return;
271
+ }
272
+ case CORBA::tk_ushort:
273
+ {
274
+ CORBA::UShortSeq_var tmp = new CORBA::UShortSeq();
275
+ tmp->length (alen);
276
+ for (CORBA::ULong l=0; l<alen ;++l)
277
+ {
278
+ VALUE el = rb_ary_entry (rarr, l);
279
+ tmp[l] = (CORBA::UShort)NUM2UINT (el);
280
+ }
281
+ _any <<= tmp;
282
+ return;
283
+ }
284
+ case CORBA::tk_ulong:
285
+ {
286
+ CORBA::ULongSeq_var tmp = new CORBA::ULongSeq();
287
+ tmp->length (alen);
288
+ for (CORBA::ULong l=0; l<alen ;++l)
289
+ {
290
+ VALUE el = rb_ary_entry (rarr, l);
291
+ tmp[l] = (CORBA::ULong)NUM2ULONG (el);
292
+ }
293
+ _any <<= tmp;
294
+ return;
295
+ }
296
+ case CORBA::tk_longlong:
297
+ {
298
+ CORBA::LongLongSeq_var tmp = new CORBA::LongLongSeq();
299
+ tmp->length (alen);
300
+ for (CORBA::ULong l=0; l<alen ;++l)
301
+ {
302
+ VALUE el = rb_ary_entry (rarr, l);
303
+ tmp[l] = (CORBA::LongLong)NUM2LL (el);
304
+ }
305
+ _any <<= tmp;
306
+ return;
307
+ }
308
+ case CORBA::tk_ulonglong:
309
+ {
310
+ CORBA::ULongLongSeq_var tmp = new CORBA::ULongLongSeq();
311
+ tmp->length (alen);
312
+ for (CORBA::ULong l=0; l<alen ;++l)
313
+ {
314
+ VALUE el = rb_ary_entry (rarr, l);
315
+ tmp[l] = (CORBA::ULongLong)NUM2ULL (el);
316
+ }
317
+ _any <<= tmp;
318
+ return;
319
+ }
320
+ case CORBA::tk_float:
321
+ {
322
+ CORBA::FloatSeq_var tmp = new CORBA::FloatSeq();
323
+ tmp->length (alen);
324
+ for (CORBA::ULong l=0; l<alen ;++l)
325
+ {
326
+ VALUE el = rb_ary_entry (rarr, l);
327
+ tmp[l] = (CORBA::Float)NUM2DBL (el);
328
+ }
329
+ _any <<= tmp;
330
+ return;
331
+ }
332
+ case CORBA::tk_double:
333
+ {
334
+ CORBA::DoubleSeq_var tmp = new CORBA::DoubleSeq();
335
+ tmp->length (alen);
336
+ for (CORBA::ULong l=0; l<alen ;++l)
337
+ {
338
+ VALUE el = rb_ary_entry (rarr, l);
339
+ tmp[l] = (CORBA::Double)NUM2DBL (el);
340
+ }
341
+ _any <<= tmp;
342
+ return;
343
+ }
344
+ case CORBA::tk_longdouble:
345
+ {
346
+ CORBA::LongDoubleSeq_var tmp = new CORBA::LongDoubleSeq();
347
+ tmp->length (alen);
348
+ for (CORBA::ULong l=0; l<alen ;++l)
349
+ {
350
+ VALUE el = rb_ary_entry (rarr, l);
351
+ ACE_CDR_LONG_DOUBLE_ASSIGNMENT (tmp[l], CLD2RLD (el));
352
+ }
353
+ _any <<= tmp;
354
+ return;
355
+ }
356
+ case CORBA::tk_boolean:
357
+ {
358
+ CORBA::BooleanSeq_var tmp = new CORBA::BooleanSeq();
359
+ tmp->length (alen);
360
+ for (CORBA::ULong l=0; l<alen ;++l)
361
+ {
362
+ VALUE el = rb_ary_entry (rarr, l);
363
+ tmp[l] = (NIL_P (el) || el == Qfalse) ? 0 : 1;
364
+ }
365
+ _any <<= tmp;
366
+ return;
367
+ }
368
+ case CORBA::tk_char:
369
+ {
370
+ char* s = NIL_P (rarr) ? 0 : RSTRING_PTR (rarr);
371
+ CORBA::CharSeq_var tmp = new CORBA::CharSeq();
372
+ tmp->length (alen);
373
+ for (unsigned long l=0; l<alen ;++l)
374
+ {
375
+ tmp[l] = s[l];
376
+ }
377
+ _any <<= tmp;
378
+ return;
379
+ }
380
+ case CORBA::tk_octet:
381
+ {
382
+ unsigned char* s = NIL_P (rarr) ? 0 : (unsigned char*)RSTRING_PTR (rarr);
383
+ CORBA::OctetSeq_var tmp = new CORBA::OctetSeq();
384
+ tmp->length (alen);
385
+ for (unsigned long l=0; l<alen ;++l)
386
+ {
387
+ tmp[l] = s[l];
388
+ }
389
+ _any <<= tmp;
390
+ return;
391
+ }
392
+ case CORBA::tk_wchar:
393
+ {
394
+ CORBA::WCharSeq_var tmp = new CORBA::WCharSeq();
395
+ tmp->length (alen);
396
+ for (CORBA::ULong l=0; l<alen ;++l)
397
+ {
398
+ VALUE el = rb_ary_entry (rarr, l);
399
+ tmp[l] = (CORBA::WChar)NUM2INT (el);
400
+ }
401
+ _any <<= tmp;
402
+ return;
403
+ }
404
+ default:
405
+ {
406
+ DynamicAny::DynAny_var da = r2tao_CreateDynAny4tc (_tc);
407
+ DynamicAny::DynSequence_var das = DynamicAny::DynSequence::_narrow (da.in ());
408
+
409
+ if (!NIL_P (rarr) && alen > 0)
410
+ {
411
+ CORBA::ULong seqmax = _tc->length ();
412
+
413
+ DynamicAny::AnySeq_var elems =
414
+ seqmax == 0 ? new DynamicAny::AnySeq () : new DynamicAny::AnySeq (seqmax);
415
+ elems->length (alen);
416
+
417
+ for (CORBA::ULong e=0; e<alen ;++e)
418
+ {
419
+ VALUE elval = rb_ary_entry (rarr, e);
420
+ r2tao_Ruby2Any (elems[e], _ctc.in (), elval);
421
+ }
422
+
423
+ das->set_elements (elems);
424
+ }
425
+
426
+ CORBA::Any_var av = das->to_any ();
427
+ _any = av.in ();
428
+
429
+ das->destroy ();
430
+ return;
431
+ }
432
+ }
433
+
434
+ ACE_ERROR ((LM_ERROR, "R2TAO::Unable to convert Ruby sequence to TAO\n"));
435
+ throw ::CORBA::NO_IMPLEMENT (0, CORBA::COMPLETED_NO);
436
+ }
437
+
438
+ R2TAO_EXPORT void r2tao_Ruby2Any(CORBA::Any& _any, CORBA::TypeCode_ptr _tc, VALUE rval)
439
+ {
440
+ if (TAO_debug_level > 9)
441
+ ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Ruby2Any:: kind=%d, rval=%@\n", _tc->kind (), rval));
442
+
443
+ switch (_tc->kind ())
444
+ {
445
+ case CORBA::tk_null:
446
+ case CORBA::tk_void:
447
+ {
448
+ _any._tao_set_typecode (_tc);
449
+ return;
450
+ }
451
+ case CORBA::tk_alias:
452
+ {
453
+ CORBA::TypeCode_var _ctc = _tc->content_type ();
454
+ r2tao_Ruby2Any(_any, _ctc.in (), rval);
455
+ return;
456
+ }
457
+ case CORBA::tk_short:
458
+ {
459
+ CORBA::Short val = NIL_P(rval) ? 0 : NUM2INT (rval);
460
+ _any <<= val;
461
+ return;
462
+ }
463
+ case CORBA::tk_long:
464
+ {
465
+ CORBA::Long val = NIL_P (rval) ? 0 : NUM2LONG (rval);
466
+ _any <<= val;
467
+ return;
468
+ }
469
+ case CORBA::tk_ushort:
470
+ {
471
+ CORBA::UShort val = NIL_P (rval) ? 0 : NUM2UINT (rval);
472
+ _any <<= val;
473
+ return;
474
+ }
475
+ case CORBA::tk_ulong:
476
+ {
477
+ CORBA::ULong val = NIL_P (rval) ? 0 : NUM2ULONG (rval);
478
+ _any <<= val;
479
+ return;
480
+ }
481
+ case CORBA::tk_longlong:
482
+ {
483
+ CORBA::LongLong val = NIL_P (rval) ? 0 : NUM2LL (rval);
484
+ _any <<= val;
485
+ return;
486
+ }
487
+ case CORBA::tk_ulonglong:
488
+ {
489
+ CORBA::ULongLong val = NIL_P (rval) ? 0 : NUM2ULL (rval);
490
+ _any <<= val;
491
+ return;
492
+ }
493
+ case CORBA::tk_float:
494
+ {
495
+ CORBA::Float val = NIL_P (rval) ? 0.0f : (CORBA::Float)NUM2DBL (rval);
496
+ _any <<= val;
497
+ return;
498
+ }
499
+ case CORBA::tk_double:
500
+ {
501
+ CORBA::Double val = NIL_P (rval) ? 0.0 : NUM2DBL (rval);
502
+ _any <<= val;
503
+ return;
504
+ }
505
+ case CORBA::tk_longdouble:
506
+ {
507
+ CORBA::LongDouble val;
508
+ ACE_CDR_LONG_DOUBLE_ASSIGNMENT (val, NIL_P (rval) ? 0.0 : RLD2CLD (rval));
509
+ _any <<= val;
510
+ return;
511
+ }
512
+ case CORBA::tk_boolean:
513
+ {
514
+ CORBA::Boolean val = (NIL_P (rval) || rval == Qfalse) ? 0 : 1;
515
+ _any <<= CORBA::Any::from_boolean (val);
516
+ return;
517
+ }
518
+ case CORBA::tk_char:
519
+ {
520
+ CORBA::Char val = 0;
521
+ if (!NIL_P (rval))
522
+ {
523
+ CHECK_RTYPE(rval, T_STRING);
524
+ val = *RSTRING_PTR (rval);
525
+ }
526
+ _any <<= CORBA::Any::from_char (val);
527
+ return;
528
+ }
529
+ case CORBA::tk_octet:
530
+ {
531
+ CORBA::Octet val = NIL_P (rval) ? 0 : NUM2UINT (rval);
532
+ _any <<= CORBA::Any::from_octet (val);
533
+ return;
534
+ }
535
+ case CORBA::tk_wchar:
536
+ {
537
+ CORBA::WChar val = NIL_P (rval) ? 0 : NUM2UINT (rval);
538
+ _any <<= CORBA::Any::from_wchar (val);
539
+ return;
540
+ }
541
+ case CORBA::tk_string:
542
+ {
543
+ if (NIL_P (rval))
544
+ {
545
+ _any <<= (char*)0;
546
+ }
547
+ else
548
+ {
549
+ CHECK_RTYPE(rval, T_STRING);
550
+ _any <<= RSTRING_PTR (rval);
551
+ }
552
+ return;
553
+ }
554
+ case CORBA::tk_wstring:
555
+ {
556
+ if (NIL_P (rval))
557
+ {
558
+ _any <<= (CORBA::WChar*)0;
559
+ }
560
+ else
561
+ {
562
+ CHECK_RTYPE(rval, T_ARRAY);
563
+ CORBA::ULong alen = static_cast<unsigned long> (RARRAY_LEN (rval));
564
+ CORBA::WString_var ws = CORBA::wstring_alloc (alen+1);
565
+ for (CORBA::ULong l=0; l<alen ;++l)
566
+ {
567
+ ws[l] = static_cast<CORBA::WChar> (NUM2INT (rb_ary_entry (rval, l)));
568
+ }
569
+ ws[alen] = static_cast<CORBA::WChar> (0);
570
+ _any <<= ws;
571
+ }
572
+ return;
573
+ }
574
+ case CORBA::tk_enum:
575
+ {
576
+ DynamicAny::DynAny_var da = r2tao_CreateDynAny4tc (_tc);
577
+ DynamicAny::DynEnum_var das = DynamicAny::DynEnum::_narrow (da.in ());
578
+
579
+ if (!NIL_P (rval))
580
+ {
581
+ das->set_as_ulong (NUM2ULONG (rval));
582
+ }
583
+
584
+ CORBA::Any_var av = das->to_any ();
585
+ _any = av.in ();
586
+
587
+ das->destroy ();
588
+ return;
589
+ }
590
+ case CORBA::tk_array:
591
+ {
592
+ DynamicAny::DynAny_var da = r2tao_CreateDynAny4tc (_tc);
593
+ DynamicAny::DynArray_var das = DynamicAny::DynArray::_narrow (da.in ());
594
+
595
+ if (!NIL_P (rval))
596
+ {
597
+ CORBA::ULong arrlen = _tc->length ();
598
+
599
+ DynamicAny::AnySeq_var elems = new DynamicAny::AnySeq (arrlen);
600
+ elems->length (arrlen);
601
+
602
+ CORBA::TypeCode_var etc = _tc->content_type ();
603
+
604
+ for (CORBA::ULong e=0; e<arrlen ;++e)
605
+ {
606
+ VALUE eval = rb_ary_entry (rval, e);
607
+ r2tao_Ruby2Any (elems[e], etc.in (), eval);
608
+ }
609
+
610
+ das->set_elements (elems);
611
+ }
612
+
613
+ CORBA::Any_var av = das->to_any ();
614
+ _any = av.in ();
615
+
616
+ das->destroy ();
617
+ return;
618
+ }
619
+ case CORBA::tk_sequence:
620
+ {
621
+ r2tao_Ruby2Sequence(_any, _tc, rval);
622
+ return;
623
+ }
624
+ case CORBA::tk_except:
625
+ case CORBA::tk_struct:
626
+ {
627
+ r2tao_Ruby2Struct (_any, _tc, rval);
628
+ return;
629
+ }
630
+ case CORBA::tk_union:
631
+ {
632
+ r2tao_Ruby2Union (_any, _tc, rval);
633
+ return;
634
+ }
635
+ case CORBA::tk_objref:
636
+ {
637
+ // if (!NIL_P (rval))
638
+ // {
639
+ // _any <<= r2corba_Object_r2t (rval);
640
+ // }
641
+ // else
642
+ // {
643
+ // _any <<= CORBA::Object::_nil ();
644
+ // }
645
+ CORBA::Object_ptr objptr = CORBA::Object::_nil ();
646
+ if (!NIL_P (rval))
647
+ {
648
+ objptr = r2corba_Object_r2t (rval);
649
+ }
650
+ TAO::Any_Impl_T<CORBA::Object>::insert (_any,
651
+ CORBA::Object::_tao_any_destructor,
652
+ _tc,
653
+ CORBA::Object::_duplicate (objptr));
654
+ return;
655
+ }
656
+ case CORBA::tk_abstract_interface:
657
+ {
658
+ if (!NIL_P (rval))
659
+ {
660
+ if (rb_obj_is_kind_of (rval, r2corba_cObject) == Qtrue)
661
+ {
662
+ R2TAO_AbstractObject_ptr abs_obj = 0;
663
+ ACE_NEW_NORETURN (abs_obj,
664
+ R2TAO_AbstractObject (r2corba_Object_r2t (rval), _tc));
665
+ _any <<= &abs_obj;
666
+ }
667
+ else
668
+ {
669
+ // abstract wrapper for Values
670
+ R2TAO_AbstractValue_ptr abs_obj = 0;
671
+ ACE_NEW_NORETURN (abs_obj,
672
+ R2TAO_AbstractValue (rval, _tc));
673
+ _any <<= &abs_obj;
674
+ }
675
+ }
676
+ else
677
+ {
678
+ TAO::Any_Impl_T<CORBA::AbstractBase>::insert (
679
+ _any,
680
+ CORBA::AbstractBase::_tao_any_destructor,
681
+ _tc,
682
+ 0);
683
+ }
684
+ return;
685
+ }
686
+ case CORBA::tk_any:
687
+ {
688
+ CORBA::Any anyval;
689
+ r2tao_Ruby_to_Any(anyval, rval);
690
+ _any <<= anyval;
691
+ return;
692
+ }
693
+ case CORBA::tk_TypeCode:
694
+ {
695
+ if (!NIL_P (rval))
696
+ {
697
+ CORBA::TypeCode_ptr tctc = r2corba_TypeCode_r2t (rval);
698
+ _any <<= tctc;
699
+ }
700
+ else
701
+ {
702
+ _any <<= CORBA::TypeCode::_nil ();
703
+ }
704
+ return;
705
+ }
706
+ case CORBA::tk_Principal:
707
+ {
708
+ break;
709
+ }
710
+ case CORBA::tk_value_box:
711
+ {
712
+ if (!NIL_P (rval) &&
713
+ rb_obj_is_kind_of (rval, r2tao_cBoxedValueBase) != Qtrue)
714
+ {
715
+ // autowrap valuebox values
716
+ rval = r2tao_wrap_Valuebox (rval, _tc);
717
+ }
718
+ // fall through
719
+ }
720
+ case CORBA::tk_value:
721
+ case CORBA::tk_event:
722
+ {
723
+ if (!NIL_P (rval))
724
+ {
725
+ R2TAO_Value_ptr r2tval = 0;
726
+ ACE_NEW_NORETURN (r2tval,
727
+ R2TAO_Value (rval));
728
+ _any <<= &r2tval;
729
+ }
730
+ else
731
+ {
732
+ TAO::Any_Impl_T<R2TAO_Value>::insert (
733
+ _any,
734
+ R2TAO_Value::_tao_any_destructor,
735
+ _tc,
736
+ 0);
737
+ }
738
+ return;
739
+ }
740
+ default:
741
+ break;
742
+ }
743
+
744
+ ACE_ERROR ((LM_ERROR, "R2TAO::Unable to convert Ruby data (kind = %d) to TAO\n", _tc->kind ()));
745
+ throw ::CORBA::NO_IMPLEMENT (0, CORBA::COMPLETED_NO);
746
+ }
747
+
748
+ R2TAO_EXPORT void r2tao_Ruby_to_Any(CORBA::Any& _any, VALUE val)
749
+ {
750
+ if (!NIL_P (val))
751
+ {
752
+ VALUE rvaltc = rb_funcall (r2tao_cAny, typecode_for_value_ID, 1, val);
753
+ if (NIL_P (rvaltc))
754
+ {
755
+ ACE_ERROR ((LM_ERROR, "R2TAO::invalid datatype for CORBA::Any\n"));
756
+
757
+ throw ::CORBA::MARSHAL (0, ::CORBA::COMPLETED_NO);
758
+ }
759
+
760
+ CORBA::TypeCode_ptr atc = r2corba_TypeCode_r2t (rvaltc);
761
+ r2tao_Ruby2Any (_any,
762
+ atc,
763
+ rb_funcall (r2tao_cAny, value_for_any_ID, 1, val));
764
+ }
765
+ }
766
+
767
+ // need this here since TAO does not export this specialization
768
+ TAO_BEGIN_VERSIONED_NAMESPACE_DECL
769
+
770
+ namespace TAO
771
+ {
772
+ template<>
773
+ CORBA::Boolean
774
+ Any_Impl_T<CORBA::Object>::to_object (CORBA::Object_ptr &_tao_elem) const
775
+ {
776
+ _tao_elem = CORBA::Object::_duplicate (this->value_);
777
+ return true;
778
+ }
779
+ }
780
+
781
+ TAO_END_VERSIONED_NAMESPACE_DECL
782
+
783
+ /*===================================================================
784
+ * Data Conversion CORBA Any --> Ruby VALUE
785
+ *
786
+ */
787
+ #define R2TAO_TCTYPE(rtc) \
788
+ rb_funcall ((rtc), get_type_ID, 0)
789
+
790
+ #define R2TAO_NEW_TCOBJECT(rtc) \
791
+ rb_class_new_instance (0, 0, rb_funcall ((rtc), get_type_ID, 0))
792
+
793
+ VALUE r2tao_Struct2Ruby (const CORBA::Any& _any, CORBA::TypeCode_ptr _tc, VALUE rtc, VALUE roottc)
794
+ {
795
+ if (TAO_debug_level > 9)
796
+ ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Struct2Ruby:: tc=%@, id=%s\n", _tc, _tc->id ()));
797
+
798
+ DynamicAny::DynAny_var da = r2tao_CreateDynAny (_any);
799
+ DynamicAny::DynStruct_var das = DynamicAny::DynStruct::_narrow (da.in ());
800
+
801
+ VALUE new_rs = R2TAO_NEW_TCOBJECT (roottc);
802
+
803
+ CORBA::ULong mcount = _tc->member_count ();
804
+
805
+ DynamicAny::NameValuePairSeq_var nvps = das->get_members ();
806
+
807
+ for (CORBA::ULong m=0; m<mcount ;++m)
808
+ {
809
+ CORBA::TypeCode_var mtc = _tc->member_type (m);
810
+ VALUE mrtc = rb_funcall (rtc, member_type_ID, 1, ULONG2NUM(m));
811
+ VALUE rmval = r2tao_Any2Ruby (nvps[m].value, mtc.in (), mrtc, mrtc);
812
+ const char* name = _tc->member_name (m);
813
+ CORBA::String_var mname = CORBA::string_alloc (2 + ACE_OS::strlen (name));
814
+ ACE_OS::sprintf ((char*)mname.in (), "@%s", name);
815
+ rb_iv_set (new_rs, mname.in (), rmval);
816
+ }
817
+
818
+ das->destroy ();
819
+
820
+ return new_rs;
821
+ }
822
+
823
+ VALUE r2tao_Union2Ruby (const CORBA::Any& _any, CORBA::TypeCode_ptr _tc, VALUE rtc, VALUE roottc)
824
+ {
825
+ if (TAO_debug_level > 9)
826
+ ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Union2Ruby:: tc=%@, id=%s\n", _tc, _tc->id ()));
827
+
828
+ VALUE new_ru = R2TAO_NEW_TCOBJECT (roottc);
829
+
830
+ DynamicAny::DynAny_var da = r2tao_CreateDynAny (_any);
831
+ DynamicAny::DynUnion_var dau = DynamicAny::DynUnion::_narrow (da.in ());
832
+
833
+ static ID _value_tc_ID = rb_intern("_value_tc");
834
+ static ID discriminator_type_ID = rb_intern ("discriminator_type");
835
+ static VALUE r2tao_sym_default = rb_eval_string(":default");
836
+
837
+ DynamicAny::DynAny_var dyndisc = dau->get_discriminator ();
838
+ CORBA::Any_var anydisc = dyndisc->to_any ();
839
+ CORBA::Octet defval;
840
+ VALUE rdisc;
841
+ if ((anydisc >>= CORBA::Any::to_octet (defval)) == 1 && defval == 0)
842
+ {
843
+ rdisc = r2tao_sym_default;
844
+ }
845
+ else
846
+ {
847
+ CORBA::TypeCode_var dtc = _tc->discriminator_type ();
848
+ VALUE rdisctype = rb_funcall (rtc, discriminator_type_ID, 0);
849
+ rdisc = r2tao_Any2Ruby (*anydisc, dtc.in (), rdisctype, rdisctype);
850
+ }
851
+ rb_iv_set (new_ru, "@discriminator", rdisc);
852
+
853
+ if (!dau->has_no_active_member ())
854
+ {
855
+ DynamicAny::DynAny_var dynval = dau->member ();
856
+ CORBA::Any_var anyval = dynval->to_any ();
857
+ VALUE rvaltc = rb_funcall (new_ru, _value_tc_ID, 0);
858
+ CORBA::TypeCode_ptr valtc = r2corba_TypeCode_r2t (rvaltc);
859
+ VALUE rvalue = r2tao_Any2Ruby (*anyval, valtc, rvaltc, rvaltc);
860
+ rb_iv_set (new_ru, "@value", rvalue);
861
+ }
862
+
863
+ dau->destroy ();
864
+
865
+ return new_ru;
866
+ }
867
+
868
+ VALUE r2tao_Sequence2Ruby(const CORBA::Any& _any, CORBA::TypeCode_ptr _tc, VALUE rtc, VALUE roottc)
869
+ {
870
+ CORBA::TypeCode_var ctc = _tc->content_type();
871
+
872
+ if (TAO_debug_level > 9)
873
+ ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - Sequence2Ruby:: tc=%@, content_type.kind=%d\n", _tc, ctc->kind ()));
874
+
875
+ VALUE rtcklass = R2TAO_TCTYPE(roottc);
876
+
877
+ switch (ctc->kind ())
878
+ {
879
+ case CORBA::tk_short:
880
+ {
881
+ const CORBA::ShortSeq* tmp;
882
+ if (TAO::Any_Dual_Impl_T<CORBA::ShortSeq>::extract (
883
+ _any,
884
+ CORBA::ShortSeq::_tao_any_destructor,
885
+ _tc,
886
+ tmp))
887
+ {
888
+ VALUE ret = (rtcklass == rb_cArray) ?
889
+ rb_ary_new2 ((long)tmp->length ()) :
890
+ rb_class_new_instance (0, 0, rtcklass);
891
+ for (CORBA::ULong l=0; l<tmp->length () ;++l)
892
+ {
893
+ rb_ary_push (ret, INT2FIX ((int)(*tmp)[l]));
894
+ }
895
+ return ret;
896
+ }
897
+ break;
898
+ }
899
+ case CORBA::tk_long:
900
+ {
901
+ const CORBA::LongSeq* tmp;
902
+ if (TAO::Any_Dual_Impl_T<CORBA::LongSeq>::extract (
903
+ _any,
904
+ CORBA::LongSeq::_tao_any_destructor,
905
+ _tc,
906
+ tmp))
907
+ {
908
+ VALUE ret = (rtcklass == rb_cArray) ?
909
+ rb_ary_new2 ((long)tmp->length ()) :
910
+ rb_class_new_instance (0, 0, rtcklass);
911
+ for (CORBA::ULong l=0; l<tmp->length () ;++l)
912
+ {
913
+ rb_ary_push (ret, INT2FIX ((long)(*tmp)[l]));
914
+ }
915
+ return ret;
916
+ }
917
+ break;
918
+ }
919
+ case CORBA::tk_ushort:
920
+ {
921
+ const CORBA::UShortSeq* tmp;
922
+ if (TAO::Any_Dual_Impl_T<CORBA::UShortSeq>::extract (
923
+ _any,
924
+ CORBA::UShortSeq::_tao_any_destructor,
925
+ _tc,
926
+ tmp))
927
+ {
928
+ VALUE ret = (rtcklass == rb_cArray) ?
929
+ rb_ary_new2 ((long)tmp->length ()) :
930
+ rb_class_new_instance (0, 0, rtcklass);
931
+ for (CORBA::ULong l=0; l<tmp->length () ;++l)
932
+ {
933
+ rb_ary_push (ret, INT2FIX ((int)(*tmp)[l]));
934
+ }
935
+ return ret;
936
+ }
937
+ break;
938
+ }
939
+ case CORBA::tk_ulong:
940
+ {
941
+ const CORBA::ULongSeq* tmp;
942
+ if (TAO::Any_Dual_Impl_T<CORBA::ULongSeq>::extract (
943
+ _any,
944
+ CORBA::ULongSeq::_tao_any_destructor,
945
+ _tc,
946
+ tmp))
947
+ {
948
+ VALUE ret = (rtcklass == rb_cArray) ?
949
+ rb_ary_new2 ((long)tmp->length ()) :
950
+ rb_class_new_instance (0, 0, rtcklass);
951
+ for (CORBA::ULong l=0; l<tmp->length () ;++l)
952
+ {
953
+ rb_ary_push (ret, ULONG2NUM ((unsigned long)(*tmp)[l]));
954
+ }
955
+ return ret;
956
+ }
957
+ break;
958
+ }
959
+ case CORBA::tk_longlong:
960
+ {
961
+ const CORBA::LongLongSeq* tmp;
962
+ if (TAO::Any_Dual_Impl_T<CORBA::LongLongSeq>::extract (
963
+ _any,
964
+ CORBA::LongLongSeq::_tao_any_destructor,
965
+ _tc,
966
+ tmp))
967
+ {
968
+ VALUE ret = (rtcklass == rb_cArray) ?
969
+ rb_ary_new2 ((long)tmp->length ()) :
970
+ rb_class_new_instance (0, 0, rtcklass);
971
+ for (CORBA::ULong l=0; l<tmp->length () ;++l)
972
+ {
973
+ rb_ary_push (ret, LL2NUM ((*tmp)[l]));
974
+ }
975
+ return ret;
976
+ }
977
+ break;
978
+ }
979
+ case CORBA::tk_ulonglong:
980
+ {
981
+ const CORBA::ULongLongSeq* tmp;
982
+ if (TAO::Any_Dual_Impl_T<CORBA::ULongLongSeq>::extract (
983
+ _any,
984
+ CORBA::ULongLongSeq::_tao_any_destructor,
985
+ _tc,
986
+ tmp))
987
+ {
988
+ VALUE ret = (rtcklass == rb_cArray) ?
989
+ rb_ary_new2 ((long)tmp->length ()) :
990
+ rb_class_new_instance (0, 0, rtcklass);
991
+ for (CORBA::ULong l=0; l<tmp->length () ;++l)
992
+ {
993
+ rb_ary_push (ret, ULL2NUM ((*tmp)[l]));
994
+ }
995
+ return ret;
996
+ }
997
+ break;
998
+ }
999
+ case CORBA::tk_float:
1000
+ {
1001
+ const CORBA::FloatSeq* tmp;
1002
+ if (TAO::Any_Dual_Impl_T<CORBA::FloatSeq>::extract (
1003
+ _any,
1004
+ CORBA::FloatSeq::_tao_any_destructor,
1005
+ _tc,
1006
+ tmp))
1007
+ {
1008
+ VALUE ret = (rtcklass == rb_cArray) ?
1009
+ rb_ary_new2 ((long)tmp->length ()) :
1010
+ rb_class_new_instance (0, 0, rtcklass);
1011
+ for (CORBA::ULong l=0; l<tmp->length () ;++l)
1012
+ {
1013
+ rb_ary_push (ret, rb_float_new ((CORBA::Double)(*tmp)[l]));
1014
+ }
1015
+ return ret;
1016
+ }
1017
+ break;
1018
+ }
1019
+ case CORBA::tk_double:
1020
+ {
1021
+ const CORBA::DoubleSeq* tmp;
1022
+ if (TAO::Any_Dual_Impl_T<CORBA::DoubleSeq>::extract (
1023
+ _any,
1024
+ CORBA::DoubleSeq::_tao_any_destructor,
1025
+ _tc,
1026
+ tmp))
1027
+ {
1028
+ VALUE ret = (rtcklass == rb_cArray) ?
1029
+ rb_ary_new2 ((long)tmp->length ()) :
1030
+ rb_class_new_instance (0, 0, rtcklass);
1031
+ for (CORBA::ULong l=0; l<tmp->length () ;++l)
1032
+ {
1033
+ rb_ary_push (ret, rb_float_new ((*tmp)[l]));
1034
+ }
1035
+ return ret;
1036
+ }
1037
+ break;
1038
+ }
1039
+ case CORBA::tk_longdouble:
1040
+ {
1041
+ const CORBA::LongDoubleSeq* tmp;
1042
+ if (TAO::Any_Dual_Impl_T<CORBA::LongDoubleSeq>::extract (
1043
+ _any,
1044
+ CORBA::DoubleSeq::_tao_any_destructor,
1045
+ _tc,
1046
+ tmp))
1047
+ {
1048
+ VALUE ret = (rtcklass == rb_cArray) ?
1049
+ rb_ary_new2 ((long)tmp->length ()) :
1050
+ rb_class_new_instance (0, 0, rtcklass);
1051
+ for (CORBA::ULong l=0; l<tmp->length () ;++l)
1052
+ {
1053
+ rb_ary_push (ret, CLD2RLD ((*tmp)[l]));
1054
+ }
1055
+ return ret;
1056
+ }
1057
+ break;
1058
+ }
1059
+ case CORBA::tk_boolean:
1060
+ {
1061
+ const CORBA::BooleanSeq* tmp;
1062
+ if (TAO::Any_Dual_Impl_T<CORBA::BooleanSeq>::extract (
1063
+ _any,
1064
+ CORBA::BooleanSeq::_tao_any_destructor,
1065
+ _tc,
1066
+ tmp))
1067
+ {
1068
+ VALUE ret = (rtcklass == rb_cArray) ?
1069
+ rb_ary_new2 ((long)tmp->length ()) :
1070
+ rb_class_new_instance (0, 0, rtcklass);
1071
+ for (CORBA::ULong l=0; l<tmp->length () ;++l)
1072
+ {
1073
+ rb_ary_push (ret, ((*tmp)[l] ? Qtrue : Qfalse));
1074
+ }
1075
+ return ret;
1076
+ }
1077
+ break;
1078
+ }
1079
+ case CORBA::tk_char:
1080
+ {
1081
+ const CORBA::CharSeq* tmp;
1082
+ if (TAO::Any_Dual_Impl_T<CORBA::CharSeq>::extract (
1083
+ _any,
1084
+ CORBA::CharSeq::_tao_any_destructor,
1085
+ _tc,
1086
+ tmp))
1087
+ {
1088
+ return rb_str_new ((char*)tmp->get_buffer (), (long)tmp->length ());
1089
+ }
1090
+ break;
1091
+ }
1092
+ case CORBA::tk_octet:
1093
+ {
1094
+ const CORBA::OctetSeq* tmp;
1095
+ if (TAO::Any_Dual_Impl_T<CORBA::OctetSeq>::extract (
1096
+ _any,
1097
+ CORBA::OctetSeq::_tao_any_destructor,
1098
+ _tc,
1099
+ tmp))
1100
+ {
1101
+ return rb_str_new ((char*)tmp->get_buffer (), (long)tmp->length ());
1102
+ }
1103
+ break;
1104
+ }
1105
+ case CORBA::tk_wchar:
1106
+ {
1107
+ const CORBA::WCharSeq* tmp;
1108
+ if (TAO::Any_Dual_Impl_T<CORBA::WCharSeq>::extract (
1109
+ _any,
1110
+ CORBA::WCharSeq::_tao_any_destructor,
1111
+ _tc,
1112
+ tmp))
1113
+ {
1114
+ VALUE ret = (rtcklass == rb_cArray) ?
1115
+ rb_ary_new2 ((long)tmp->length ()) :
1116
+ rb_class_new_instance (0, 0, rtcklass);
1117
+ for (CORBA::ULong l=0; l<tmp->length () ;++l)
1118
+ {
1119
+ rb_ary_push (ret, INT2FIX ((int)(*tmp)[l]));
1120
+ }
1121
+ return ret;
1122
+ }
1123
+ break;
1124
+ }
1125
+ default:
1126
+ {
1127
+ static ID is_recursive_tc_ID = rb_intern ("is_recursive_tc?");
1128
+ static ID recursed_tc_ID = rb_intern ("recursed_tc");
1129
+
1130
+ DynamicAny::DynAny_var da = r2tao_CreateDynAny (_any);
1131
+ DynamicAny::DynSequence_var das = DynamicAny::DynSequence::_narrow (da.in ());
1132
+
1133
+ DynamicAny::AnySeq_var elems = das->get_elements ();
1134
+ CORBA::ULong seqlen = elems->length ();
1135
+
1136
+ VALUE ret = (rtcklass == rb_cArray) ?
1137
+ rb_ary_new2 ((long)seqlen) :
1138
+ rb_class_new_instance (0, 0, rtcklass);
1139
+
1140
+ VALUE ertc = rb_funcall (rtc, content_type_ID, 0);
1141
+ VALUE is_recursive_tc = rb_funcall (ertc, is_recursive_tc_ID, 0);
1142
+ if (is_recursive_tc == Qtrue)
1143
+ {
1144
+ ertc = rb_funcall (ertc, recursed_tc_ID, 0);
1145
+ }
1146
+
1147
+ for (CORBA::ULong l=0; l<seqlen ;++l)
1148
+ {
1149
+ VALUE rval = r2tao_Any2Ruby (elems[l], ctc.in (), ertc, ertc);
1150
+ rb_ary_push (ret, rval);
1151
+ }
1152
+
1153
+ das->destroy ();
1154
+ return ret;
1155
+ }
1156
+ }
1157
+
1158
+ ACE_ERROR ((LM_ERROR, "R2TAO::Cannot convert TAO sequence to Ruby\n"));
1159
+ throw ::CORBA::NO_IMPLEMENT (0, CORBA::COMPLETED_NO);
1160
+
1161
+ return Qnil;
1162
+ }
1163
+
1164
+ /*
1165
+ * Data conversion CORBA Any --> Ruby VALUE
1166
+ * Arguments:
1167
+ * const CORBA::Any& _any : Any value to convert
1168
+ * CORBA::TypeCode_ptr _tc : CORBA::TypeCode of Any value
1169
+ * VALUE rtc : nil or Ruby R2CORBA::CORBA::TypeCode corresponding to _tc
1170
+ * if nil -> will be derived from _tc
1171
+ * VALUE roottc : nil or original Ruby R2CORBA::CORBA::TypeCode corresponding to Any value
1172
+ * if nil -> roottc = rtc
1173
+ * Returns:
1174
+ * VALUE : Ruby VALUE
1175
+ */
1176
+ R2TAO_EXPORT VALUE r2tao_Any2Ruby(const CORBA::Any& _any, CORBA::TypeCode_ptr _tc, VALUE rtc, VALUE roottc)
1177
+ {
1178
+ if (TAO_debug_level > 9)
1179
+ ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - r2tao_Any2Ruby: entry - tc=%@\n", _tc));
1180
+
1181
+ switch (_tc->kind ())
1182
+ {
1183
+ case CORBA::tk_null:
1184
+ case CORBA::tk_void:
1185
+ return Qnil;
1186
+ case CORBA::tk_alias:
1187
+ {
1188
+ if (NIL_P (rtc))
1189
+ rtc = r2corba_TypeCode_t2r (_tc);
1190
+ VALUE rctc = rb_funcall (rtc, content_type_ID, 0);
1191
+ CORBA::TypeCode_var ctc = _tc->content_type ();
1192
+ return r2tao_Any2Ruby(_any, ctc.in (), rctc, NIL_P (roottc) ? rtc : roottc);
1193
+ }
1194
+ case CORBA::tk_short:
1195
+ {
1196
+ CORBA::Short val;
1197
+ _any >>= val;
1198
+ return INT2FIX ((int)val);
1199
+ }
1200
+ case CORBA::tk_long:
1201
+ {
1202
+ CORBA::Long val;
1203
+ _any >>= val;
1204
+ return LONG2NUM (val);
1205
+ }
1206
+ case CORBA::tk_ushort:
1207
+ {
1208
+ CORBA::UShort val;
1209
+ _any >>= val;
1210
+ return UINT2NUM ((unsigned int)val);
1211
+ }
1212
+ case CORBA::tk_ulong:
1213
+ {
1214
+ CORBA::ULong val;
1215
+ _any >>= val;
1216
+ return ULONG2NUM (val);
1217
+ }
1218
+ case CORBA::tk_longlong:
1219
+ {
1220
+ CORBA::LongLong val;
1221
+ _any >>= val;
1222
+ return LL2NUM (val);
1223
+ }
1224
+ case CORBA::tk_ulonglong:
1225
+ {
1226
+ CORBA::ULongLong val;
1227
+ _any >>= val;
1228
+ return ULL2NUM (val);
1229
+ }
1230
+ case CORBA::tk_float:
1231
+ {
1232
+ CORBA::Float val;
1233
+ _any >>= val;
1234
+ return rb_float_new ((double)val);
1235
+ }
1236
+ case CORBA::tk_double:
1237
+ {
1238
+ CORBA::Double val;
1239
+ _any >>= val;
1240
+ return rb_float_new ((double)val);
1241
+ }
1242
+ case CORBA::tk_longdouble:
1243
+ {
1244
+ CORBA::LongDouble val;
1245
+ _any >>= val;
1246
+ return CLD2RLD (val);
1247
+ }
1248
+ case CORBA::tk_boolean:
1249
+ {
1250
+ CORBA::Boolean val;
1251
+ _any >>= CORBA::Any::to_boolean (val);
1252
+ return (val ? Qtrue : Qfalse);
1253
+ }
1254
+ case CORBA::tk_char:
1255
+ {
1256
+ CORBA::Char val;
1257
+ _any >>= CORBA::Any::to_char (val);
1258
+ return rb_str_new (&val, 1);
1259
+ }
1260
+ case CORBA::tk_octet:
1261
+ {
1262
+ CORBA::Octet val;
1263
+ _any >>= CORBA::Any::to_octet (val);
1264
+ return INT2FIX ((int)val);
1265
+ }
1266
+ case CORBA::tk_wchar:
1267
+ {
1268
+ CORBA::WChar val;
1269
+ _any >>= CORBA::Any::to_wchar (val);
1270
+ return INT2FIX ((int)val);
1271
+ }
1272
+ case CORBA::tk_string:
1273
+ {
1274
+ if (_tc->length ()>0)
1275
+ {
1276
+ char *tmp;
1277
+ _any >>= CORBA::Any::to_string (tmp, _tc->length ());
1278
+ return rb_str_new (tmp, (long)_tc->length ());
1279
+ }
1280
+ else
1281
+ {
1282
+ const char *tmp;
1283
+ _any >>= tmp;
1284
+ return tmp ? rb_str_new2 (tmp) : Qnil;
1285
+ }
1286
+ }
1287
+ case CORBA::tk_wstring:
1288
+ {
1289
+ if (NIL_P (roottc))
1290
+ {
1291
+ if (NIL_P (rtc))
1292
+ rtc = r2corba_TypeCode_t2r (_tc);
1293
+ roottc = rtc;
1294
+ }
1295
+ VALUE rtcklass = R2TAO_TCTYPE(roottc);
1296
+ if (_tc->length ()>0)
1297
+ {
1298
+ CORBA::WChar *tmp;
1299
+ _any >>= CORBA::Any::to_wstring (tmp, _tc->length ());
1300
+ VALUE ret = (rtcklass == rb_cArray) ?
1301
+ rb_ary_new2 ((long)_tc->length ()) :
1302
+ rb_class_new_instance (0, 0, rtcklass);
1303
+ for (CORBA::ULong l=0; l<_tc->length () ;++l)
1304
+ rb_ary_push (ret, INT2FIX (tmp[l]));
1305
+ return ret;
1306
+ }
1307
+ else
1308
+ {
1309
+ const CORBA::WChar *tmp;
1310
+ _any >>= tmp;
1311
+ if (tmp == 0)
1312
+ return Qnil;
1313
+
1314
+ VALUE ret = rb_class_new_instance (0, 0, rtcklass);
1315
+ for (CORBA::ULong l=0; tmp[l] != CORBA::WChar(0) ;++l)
1316
+ rb_ary_push (ret, INT2FIX (tmp[l]));
1317
+ return ret;
1318
+ }
1319
+ }
1320
+ case CORBA::tk_enum:
1321
+ {
1322
+ DynamicAny::DynAny_var da = r2tao_CreateDynAny (_any);
1323
+ DynamicAny::DynEnum_var das = DynamicAny::DynEnum::_narrow (da.in ());
1324
+
1325
+ VALUE ret = ULL2NUM (das->get_as_ulong ());
1326
+
1327
+ das->destroy ();
1328
+ return ret;
1329
+ }
1330
+ case CORBA::tk_array:
1331
+ {
1332
+ DynamicAny::DynAny_var da = r2tao_CreateDynAny (_any);
1333
+ DynamicAny::DynArray_var das = DynamicAny::DynArray::_narrow (da.in ());
1334
+
1335
+ DynamicAny::AnySeq_var elems = das->get_elements ();
1336
+ CORBA::ULong arrlen = elems->length ();
1337
+
1338
+ if (NIL_P (roottc))
1339
+ {
1340
+ if (NIL_P (rtc))
1341
+ rtc = r2corba_TypeCode_t2r (_tc);
1342
+ roottc = rtc;
1343
+ }
1344
+ VALUE rtcklass = R2TAO_TCTYPE(roottc);
1345
+ VALUE ret = (rtcklass == rb_cArray) ?
1346
+ rb_ary_new2 ((long)arrlen) :
1347
+ rb_class_new_instance (0, 0, rtcklass);
1348
+
1349
+ CORBA::TypeCode_var etc = _tc->content_type ();
1350
+ VALUE ertc = rb_funcall (rtc, content_type_ID, 0);
1351
+
1352
+ for (CORBA::ULong l=0; l<arrlen ;++l)
1353
+ {
1354
+ VALUE rval = r2tao_Any2Ruby (elems[l], etc.in (), ertc, ertc);
1355
+ rb_ary_push (ret, rval);
1356
+ }
1357
+
1358
+ das->destroy ();
1359
+ return ret;
1360
+ }
1361
+ case CORBA::tk_sequence:
1362
+ {
1363
+ if (NIL_P (roottc))
1364
+ {
1365
+ if (NIL_P (rtc))
1366
+ rtc = r2corba_TypeCode_t2r (_tc);
1367
+ roottc = rtc;
1368
+ }
1369
+ return r2tao_Sequence2Ruby (_any, _tc, rtc, roottc);
1370
+ }
1371
+ case CORBA::tk_except:
1372
+ case CORBA::tk_struct:
1373
+ {
1374
+ if (NIL_P (roottc))
1375
+ {
1376
+ if (NIL_P (rtc))
1377
+ rtc = r2corba_TypeCode_t2r (_tc);
1378
+ roottc = rtc;
1379
+ }
1380
+ return r2tao_Struct2Ruby (_any, _tc, rtc, roottc);
1381
+ }
1382
+ case CORBA::tk_union:
1383
+ {
1384
+ if (NIL_P (roottc))
1385
+ {
1386
+ if (NIL_P (rtc))
1387
+ rtc = r2corba_TypeCode_t2r (_tc);
1388
+ roottc = rtc;
1389
+ }
1390
+ return r2tao_Union2Ruby (_any, _tc, rtc, roottc);
1391
+ }
1392
+ case CORBA::tk_objref:
1393
+ {
1394
+ CORBA::Object_var val;
1395
+ _any >>= CORBA::Any::to_object (val.out ());
1396
+ if (CORBA::is_nil (val))
1397
+ return Qnil;
1398
+
1399
+ if (NIL_P (roottc))
1400
+ {
1401
+ if (NIL_P (rtc))
1402
+ rtc = r2corba_TypeCode_t2r (_tc);
1403
+ roottc = rtc;
1404
+ }
1405
+ VALUE robj = r2corba_Object_t2r(val.in ());
1406
+ VALUE obj_type = R2TAO_TCTYPE(roottc);
1407
+ VALUE ret = rb_funcall (obj_type, _narrow_ID, 1, robj);
1408
+ return ret;
1409
+ }
1410
+ case CORBA::tk_abstract_interface:
1411
+ {
1412
+ CORBA::AbstractBase_ptr abs = 0;
1413
+ TAO::Any_Impl_T<CORBA::AbstractBase>::extract (
1414
+ _any,
1415
+ CORBA::AbstractBase::_tao_any_destructor,
1416
+ _tc,
1417
+ abs);
1418
+ if (CORBA::is_nil (abs))
1419
+ return Qnil;
1420
+
1421
+ if (abs->_is_objref ())
1422
+ {
1423
+ if (NIL_P (roottc))
1424
+ {
1425
+ if (NIL_P (rtc))
1426
+ rtc = r2corba_TypeCode_t2r (_tc);
1427
+ roottc = rtc;
1428
+ }
1429
+
1430
+ CORBA::Object_var val = abs->_to_object ();
1431
+ if (CORBA::is_nil (val))
1432
+ return Qnil;
1433
+ VALUE robj = r2corba_Object_t2r(val.in ());
1434
+ VALUE obj_type = R2TAO_TCTYPE(roottc);
1435
+ VALUE ret = rb_funcall (obj_type, _narrow_ID, 1, robj);
1436
+ return ret;
1437
+ }
1438
+ else
1439
+ {
1440
+ CORBA::ValueBase_var val = abs->_to_value ();
1441
+ return R2TAO_Value::_downcast (val.in ())->get_ruby_value ();
1442
+ }
1443
+ }
1444
+ case CORBA::tk_any:
1445
+ {
1446
+ const CORBA::Any *_anyval;
1447
+ _any >>= _anyval;
1448
+ CORBA::TypeCode_var atc = _anyval->type ();
1449
+ return r2tao_Any2Ruby (*_anyval, atc.in (), Qnil, Qnil);
1450
+ }
1451
+ case CORBA::tk_TypeCode:
1452
+ {
1453
+ CORBA::TypeCode_var _tcval;
1454
+ _any >>= _tcval.out ();
1455
+
1456
+ return r2corba_TypeCode_t2r (_tcval.in ());
1457
+ }
1458
+ case CORBA::tk_Principal:
1459
+ {
1460
+ break;
1461
+ }
1462
+ case CORBA::tk_value_box:
1463
+ case CORBA::tk_value:
1464
+ case CORBA::tk_event:
1465
+ {
1466
+ R2TAO_Value_ptr r2tval = 0;
1467
+ TAO::Any_Impl_T<R2TAO_Value>::extract (
1468
+ _any,
1469
+ R2TAO_Value::_tao_any_destructor,
1470
+ _tc,
1471
+ r2tval);
1472
+ if (r2tval == 0)
1473
+ return Qnil;
1474
+ else
1475
+ {
1476
+ VALUE rval = r2tval->get_ruby_value ();
1477
+ if (_tc->kind () == CORBA::tk_value_box)
1478
+ {
1479
+ // auto-unwrap valuebox
1480
+ rval = rb_funcall (rval, value_ID, 0);
1481
+ }
1482
+ return rval;
1483
+ }
1484
+ }
1485
+ default:
1486
+ break;
1487
+ }
1488
+
1489
+ ACE_ERROR ((LM_ERROR, "R2TAO::Cannot convert TAO data to Ruby\n"));
1490
+ throw ::CORBA::NO_IMPLEMENT (0, CORBA::COMPLETED_NO);
1491
+
1492
+ return Qnil;
1493
+ }
1494
+
1495
+ R2TAO_EXPORT VALUE r2tao_Any_to_Ruby(const CORBA::Any& _any)
1496
+ {
1497
+ static R2TAO_RBFuncall FN_to_any ("to_any", false);
1498
+
1499
+ VALUE rval = r2tao_Any2Ruby (_any, _any._tao_get_typecode (), Qnil, Qnil);
1500
+ if (!NIL_P (rval))
1501
+ {
1502
+ rval = FN_to_any.invoke (r2tao_cAny, 1, &rval);
1503
+ if (FN_to_any.has_caught_exception ())
1504
+ {
1505
+ rb_eval_string ("STDERR.puts $!.to_s+\"\\n\"+$!.backtrace.join(\"\\n\")");
1506
+ throw ::CORBA::MARSHAL (0, ::CORBA::COMPLETED_NO);
1507
+ }
1508
+ }
1509
+ return rval;
1510
+ }
1511
+
1512
+
1513
+ R2TAO_EXPORT void r2tao_Any4Value(CORBA::Any& _any, CORBA::TypeCode_ptr _tc)
1514
+ {
1515
+ if (TAO_debug_level > 9)
1516
+ ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - r2tao_Any4Value:: "
1517
+ "initialising any for value %s\n",
1518
+ _tc->id ()));
1519
+
1520
+ CORBA::ValueFactory factory =
1521
+ TAO_ORB_Core_instance ()->orb ()->lookup_value_factory (
1522
+ _tc->id ());
1523
+ if (factory)
1524
+ {
1525
+ CORBA::ValueBase * vb = factory->create_for_unmarshal ();
1526
+ R2TAO_Value_ptr r2tval = R2TAO_Value::_downcast (vb);
1527
+
1528
+ TAO::Any_Impl * vimpl = 0;
1529
+ ACE_NEW_THROW_EX (vimpl,
1530
+ TAO::Any_Impl_T<R2TAO_Value> (R2TAO_Value::_tao_any_destructor,
1531
+ _tc,
1532
+ r2tval),
1533
+ CORBA::NO_MEMORY());
1534
+ _any.replace (vimpl);
1535
+
1536
+ factory->_remove_ref (); // we're done with this
1537
+ }
1538
+ else
1539
+ {
1540
+ throw CORBA::BAD_PARAM();
1541
+ }
1542
+ }
1543
+