r2corba 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
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
+