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,396 @@
1
+ /*--------------------------------------------------------------------
2
+ # values.h - R2TAO CORBA Valuetype 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 "tao/Valuetype/AbstractBase.h"
15
+ #include "tao/Valuetype/ValueBase.h"
16
+ #include "tao/Valuetype/ValueFactory.h"
17
+ #include "tao/Stub.h"
18
+ #include "tao/AnyTypeCode/Any.h"
19
+ #include "tao/AnyTypeCode/Any_Impl_T.h"
20
+ #include "tao/AnyTypeCode/Any_Dual_Impl_T.h"
21
+ #include "tao/Valuetype/Value_VarOut_T.h"
22
+ #include "tao/Objref_VarOut_T.h"
23
+ #include "tao/VarOut_T.h"
24
+ //#include "ace/Auto_Ptr.h"
25
+ //#include "ace/Array_Base.h"
26
+
27
+ extern VALUE r2tao_cBoxedValueBase;
28
+
29
+ //-------------------------------------------------------------------
30
+ // R2TAO_ArrayAny_Impl_T
31
+ //
32
+ // Template for Any implementation containing C array typs
33
+ // to marshal to TAO CDR streams (not used for demarshaling).
34
+ //===================================================================
35
+
36
+ template<typename T>
37
+ class R2TAO_ArrayAny_Impl_T : public TAO::Any_Impl
38
+ {
39
+ public:
40
+ R2TAO_ArrayAny_Impl_T (CORBA::TypeCode_ptr,
41
+ T * const,
42
+ CORBA::ULong);
43
+ virtual ~R2TAO_ArrayAny_Impl_T (void);
44
+
45
+ static void insert (CORBA::Any &,
46
+ CORBA::TypeCode_ptr,
47
+ T * const,
48
+ CORBA::ULong);
49
+
50
+ virtual CORBA::Boolean marshal_value (TAO_OutputCDR &);
51
+ virtual const void *value (void) const;
52
+ virtual void free_value (void);
53
+
54
+ private:
55
+ void* value_;
56
+ CORBA::ULong length_;
57
+ };
58
+
59
+
60
+ //-------------------------------------------------------------------
61
+ // R2TAO Value class
62
+ //
63
+ // Wrapper class for reference to R2CORBA Value instance to enable
64
+ // to marshal/demarshal to/from TAO CDR streams.
65
+ //===================================================================
66
+
67
+ class R2TAO_Value;
68
+ typedef R2TAO_Value * R2TAO_Value_ptr;
69
+ typedef
70
+ TAO_Value_Var_T<
71
+ R2TAO_Value
72
+ >
73
+ R2TAO_Value_var;
74
+
75
+ typedef
76
+ TAO_Value_Out_T<
77
+ R2TAO_Value
78
+ >
79
+ R2TAO_Value_out;
80
+
81
+ class R2TAO_Value : public ::CORBA::DefaultValueRefCountBase
82
+ {
83
+ public:
84
+ R2TAO_Value (VALUE rbValue, bool for_unmarshal=false);
85
+ virtual ~R2TAO_Value ();
86
+
87
+ virtual CORBA::ValueBase* _copy_value (void);
88
+
89
+ static void _tao_any_destructor (void *);
90
+
91
+ virtual void truncation_hook ();
92
+
93
+ static R2TAO_Value* _downcast (::CORBA::ValueBase *v);
94
+
95
+ virtual CORBA::TypeCode_ptr _tao_type (void) const;
96
+
97
+ /// Return the repository id of this valuetype.
98
+ virtual const char * _tao_obv_repository_id (void) const;
99
+
100
+ /// Give the list of the RepositoryIds in the valuetype "truncatable"
101
+ /// inheritance hierarchy. List the id of this valuetype as first
102
+ /// RepositoryID and go up the "truncatable" derivation hierarchy.
103
+ /// Note the truncatable repo ids only list the truncatable base types
104
+ /// to which this type is safe to truncate, not all its parents.
105
+ virtual void _tao_obv_truncatable_repo_ids (Repository_Id_List &) const;
106
+
107
+ virtual ::CORBA::Boolean _tao_marshal_v (TAO_OutputCDR &) const;
108
+ virtual ::CORBA::Boolean _tao_unmarshal_v (TAO_InputCDR &);
109
+
110
+ // always return false -> i.e. always marshal type Id
111
+ virtual ::CORBA::Boolean _tao_match_formal_type (ptrdiff_t ) const;
112
+
113
+ VALUE get_ruby_value () const { return this->rbValue_; }
114
+
115
+ bool add_chunk ();
116
+
117
+ bool add_chunk_element (CORBA::Any_var& elem);
118
+
119
+ bool requires_truncation () const { return this->requires_truncation_; }
120
+
121
+ bool has_started_chunk_unmarshalling () const { return this->started_chunk_unmarshal_; }
122
+
123
+ void started_chunk_unmarshalling () { this->started_chunk_unmarshal_ = true; }
124
+
125
+ void ended_chunk_unmarshalling () { this->started_chunk_unmarshal_ = false; }
126
+
127
+ private:
128
+ typedef ACE_Array_Base<CORBA::Any*> ChunkElements;
129
+ struct Chunk {
130
+ Chunk () : next_(0) {}
131
+ ~Chunk() {
132
+ for (ChunkElements::size_type i=0; i<this->elems_.size () ;++i)
133
+ { delete this->elems_[i]; }
134
+ delete this->next_;
135
+ this->next_ = 0;
136
+ }
137
+ ChunkElements elems_;
138
+ Chunk* next_;
139
+ };
140
+
141
+ void init ();
142
+
143
+ bool for_unmarshal_;
144
+ bool started_chunk_unmarshal_;
145
+
146
+ bool requires_truncation_;
147
+
148
+ VALUE rbValue_; // the Ruby valuetype instance
149
+
150
+ VALUE rbValueClass_; // the Ruby valuetype class
151
+
152
+ VALUE rbCIHolder_; // Ruby wrapper object to hold TAO_ChunkInfo
153
+
154
+ CORBA::TypeCode_var val_tc_; // the typecode for the valuetype
155
+
156
+ ACE_Auto_Ptr<Chunk> chunk_list_;
157
+ Chunk* last_chunk_;
158
+ };
159
+
160
+ void operator<<= (::CORBA::Any &, R2TAO_Value_ptr); // copying
161
+ void operator<<= (::CORBA::Any &, R2TAO_Value_ptr *); // non-copying
162
+
163
+ ::CORBA::Boolean operator<< (TAO_OutputCDR &/*strm*/, const R2TAO_Value * /*_tao_valref*/);
164
+ ::CORBA::Boolean operator>> (TAO_InputCDR &/*strm*/, R2TAO_Value *&/*_tao_valref*/);
165
+
166
+ VALUE r2tao_wrap_Valuebox(VALUE rval, CORBA::TypeCode_ptr tc);
167
+
168
+ //-------------------------------------------------------------------
169
+ // R2TAO Valuefactory class
170
+ //
171
+ // Wrapper class for reference to R2CORBA valuefactory instance
172
+ //===================================================================
173
+
174
+ class R2TAO_ValueFactory
175
+ : public CORBA::ValueFactoryBase
176
+ {
177
+ public:
178
+ R2TAO_ValueFactory (VALUE rbValueFactory);
179
+
180
+ static R2TAO_ValueFactory* _downcast ( ::CORBA::ValueFactoryBase *);
181
+
182
+ virtual ::CORBA::ValueBase *
183
+ create_for_unmarshal (void);
184
+
185
+ virtual ::CORBA::AbstractBase_ptr
186
+ create_for_unmarshal_abstract (void);
187
+
188
+ // TAO-specific extensions
189
+ virtual const char* tao_repository_id (void);
190
+
191
+ VALUE get_ruby_factory () { return this->rbValueFactory_; }
192
+
193
+ protected:
194
+ virtual ~R2TAO_ValueFactory (void);
195
+
196
+ private:
197
+ VALUE rbValueFactory_;
198
+
199
+ static R2TAO_RBFuncall fn_create_default_;
200
+ };
201
+
202
+ VALUE r2tao_VFB_register_value_factory(VALUE self, VALUE id, VALUE rfact);
203
+ VALUE r2tao_VFB_unregister_value_factory(VALUE self, VALUE id);
204
+ VALUE r2tao_VFB_lookup_value_factory(VALUE self, VALUE id);
205
+
206
+ //-------------------------------------------------------------------
207
+ // R2TAO AbstractValue class
208
+ //
209
+ // Wrapper class for value type to present CORBA::AbstractBase
210
+ // interface to TAO Any
211
+ //===================================================================
212
+
213
+ class R2TAO_AbstractValue;
214
+ typedef R2TAO_AbstractValue* R2TAO_AbstractValue_ptr;
215
+
216
+ typedef
217
+ TAO_Objref_Var_T<
218
+ R2TAO_AbstractValue
219
+ >
220
+ R2TAO_AbstractValue_var;
221
+
222
+ typedef
223
+ TAO_Objref_Out_T<
224
+ R2TAO_AbstractValue
225
+ >
226
+ R2TAO_AbstractValue_out;
227
+
228
+ class R2TAO_AbstractValue :
229
+ public ::CORBA::AbstractBase,
230
+ public R2TAO_Value
231
+ {
232
+ public:
233
+ R2TAO_AbstractValue (VALUE rbValue,
234
+ CORBA::TypeCode_ptr abs_tc);
235
+ R2TAO_AbstractValue (VALUE rbValue); // for unmarshaling only
236
+ virtual ~R2TAO_AbstractValue ();
237
+
238
+ static void _tao_any_destructor (void *);
239
+
240
+ static R2TAO_AbstractValue_ptr _duplicate (R2TAO_AbstractValue_ptr obj);
241
+
242
+ static R2TAO_AbstractValue* _downcast ( ::CORBA::ValueBase *v);
243
+
244
+ virtual const char* _tao_obv_repository_id (void) const;
245
+ virtual CORBA::Boolean _tao_marshal_v (TAO_OutputCDR &strm) const;
246
+ virtual CORBA::Boolean _tao_unmarshal_v (TAO_InputCDR &strm);
247
+ virtual CORBA::Boolean _tao_match_formal_type (ptrdiff_t) const;
248
+
249
+ virtual void _add_ref (void);
250
+ virtual void _remove_ref (void);
251
+ virtual ::CORBA::ValueBase *_tao_to_value (void);
252
+
253
+ CORBA::TypeCode_ptr abstract_type () const;
254
+
255
+ private:
256
+ CORBA::TypeCode_var abs_tc_;
257
+ };
258
+
259
+ void operator<<= (::CORBA::Any &, R2TAO_AbstractValue_ptr); // copying
260
+ void operator<<= (::CORBA::Any &, R2TAO_AbstractValue_ptr *); // non-copying
261
+
262
+ /* Extract through:
263
+ *
264
+ TAO::Any_Impl_T<R2TAO_AbstractValue>::extract (
265
+ const CORBA::Any & _tao_any,
266
+ R2TAO_AbstractValue::_tao_any_destructor,
267
+ CORBA::TypeCode_ptr _tc,
268
+ R2TAO_AbstractValue_ptr & _tao_elem);
269
+ */
270
+
271
+ ::CORBA::Boolean operator<< (TAO_OutputCDR &, const R2TAO_AbstractValue_ptr);
272
+ /* Extract through:
273
+ *
274
+ ::CORBA::Boolean operator>> (TAO_InputCDR &, CORBA::AbstractBase_ptr & abs_ptr);
275
+
276
+ * then use abs_ptr->to_object () or abs_ptr->to_value ()
277
+ */
278
+ // Dummy to allow compilation
279
+ ::CORBA::Boolean operator>> (TAO_InputCDR &/*strm*/, R2TAO_AbstractValue_ptr &/*_tao_objref*/);
280
+
281
+ //-------------------------------------------------------------------
282
+ // R2TAO AbstractObject class
283
+ //
284
+ // Wrapper class for object reference to present CORBA::AbstractBase
285
+ // interface to TAO Any
286
+ //===================================================================
287
+
288
+ class R2TAO_AbstractObject;
289
+ typedef R2TAO_AbstractObject* R2TAO_AbstractObject_ptr;
290
+
291
+ typedef
292
+ TAO_Objref_Var_T<
293
+ R2TAO_AbstractObject
294
+ >
295
+ R2TAO_AbstractObject_var;
296
+
297
+ typedef
298
+ TAO_Objref_Out_T<
299
+ R2TAO_AbstractObject
300
+ >
301
+ R2TAO_AbstractObject_out;
302
+
303
+ class R2TAO_AbstractObject :
304
+ public ::CORBA::AbstractBase,
305
+ public ::CORBA::Object
306
+ {
307
+ public:
308
+ R2TAO_AbstractObject (CORBA::Object_ptr objref,
309
+ CORBA::TypeCode_ptr abs_tc);
310
+ virtual ~R2TAO_AbstractObject () ;
311
+
312
+ static void _tao_any_destructor (void *);
313
+
314
+ static R2TAO_AbstractObject_ptr _duplicate (R2TAO_AbstractObject_ptr obj);
315
+
316
+ static void _tao_release (R2TAO_AbstractObject_ptr obj);
317
+
318
+ virtual void _add_ref (void);
319
+ virtual void _remove_ref (void);
320
+
321
+ virtual ::CORBA::Boolean _is_a (const char *type_id);
322
+ virtual const char* _interface_repository_id (void) const;
323
+ virtual ::CORBA::Boolean marshal (TAO_OutputCDR &cdr);
324
+
325
+ CORBA::TypeCode_ptr abstract_type () const;
326
+
327
+ private:
328
+ CORBA::TypeCode_var abs_tc_;
329
+ };
330
+
331
+ void operator<<= (::CORBA::Any &, R2TAO_AbstractObject_ptr); // copying
332
+ void operator<<= (::CORBA::Any &, R2TAO_AbstractObject_ptr *); // non-copying
333
+
334
+ /* Extract through:
335
+ *
336
+ TAO::Any_Impl_T<R2TAO_AbstractObject>::extract (
337
+ const CORBA::Any & _tao_any,
338
+ R2TAO_AbstractObject::_tao_any_destructor,
339
+ CORBA::TypeCode_ptr _tc,
340
+ R2TAO_AbstractObject_ptr & _tao_elem);
341
+ */
342
+
343
+ ::CORBA::Boolean operator<< (TAO_OutputCDR &, const R2TAO_AbstractObject_ptr);
344
+ /* Extract through:
345
+ *
346
+ ::CORBA::Boolean operator>> (TAO_InputCDR &, CORBA::AbstractBase_ptr & abs_ptr);
347
+
348
+ * then use abs_ptr->to_object () or abs_ptr->to_value ()
349
+ */
350
+ // Dummy to allow compilation
351
+ ::CORBA::Boolean operator>> (TAO_InputCDR &/*strm*/, R2TAO_AbstractObject_ptr &/*_tao_objref*/);
352
+
353
+ namespace CORBA
354
+ {
355
+ void release (R2TAO_AbstractObject_ptr);
356
+ ::CORBA::Boolean is_nil (R2TAO_AbstractObject_ptr);
357
+ }
358
+
359
+ R2TAO_AbstractObject_ptr r2tao_AbstractObject_r2t (VALUE rval, VALUE rtc, CORBA::TypeCode_ptr tc);
360
+
361
+ namespace TAO
362
+ {
363
+ template<>
364
+ struct Value_Traits<R2TAO_Value>
365
+ {
366
+ static void add_ref (R2TAO_Value *);
367
+ static void remove_ref (R2TAO_Value *);
368
+ static void release (R2TAO_Value *);
369
+ };
370
+
371
+ template<>
372
+ struct Objref_Traits< R2TAO_AbstractValue>
373
+ {
374
+ static R2TAO_AbstractValue_ptr duplicate (
375
+ R2TAO_AbstractValue_ptr p);
376
+ static void release (
377
+ R2TAO_AbstractValue_ptr p);
378
+ static R2TAO_AbstractValue_ptr nil (void);
379
+ static ::CORBA::Boolean marshal (
380
+ const R2TAO_AbstractValue_ptr p,
381
+ TAO_OutputCDR & cdr);
382
+ };
383
+
384
+ template<>
385
+ struct Objref_Traits< R2TAO_AbstractObject>
386
+ {
387
+ static R2TAO_AbstractObject_ptr duplicate (
388
+ R2TAO_AbstractObject_ptr p);
389
+ static void release (
390
+ R2TAO_AbstractObject_ptr p);
391
+ static R2TAO_AbstractObject_ptr nil (void);
392
+ static ::CORBA::Boolean marshal (
393
+ const R2TAO_AbstractObject_ptr p,
394
+ TAO_OutputCDR & cdr);
395
+ };
396
+ }
@@ -0,0 +1,250 @@
1
+ /*--------------------------------------------------------------------
2
+ # iortable.cpp - R2TAO TAO IORTable support (non-standard extension)
3
+ #
4
+ # Author: Martin Corino
5
+ #
6
+ # This program is free software; you can redistribute it and/or
7
+ # modify it under the terms of the R2CORBA LICENSE which is
8
+ # included with this program.
9
+ #
10
+ # Copyright (c) Remedy IT Expertise BV
11
+ # Chamber of commerce Rotterdam nr.276339, The Netherlands
12
+ #------------------------------------------------------------------*/
13
+
14
+ #include "poa.h"
15
+ #include "tao/ORB.h"
16
+ #include "tao/IORTable/IORTable.h"
17
+ #include "object.h"
18
+ #include "exception.h"
19
+ #include "orb.h"
20
+
21
+ #define RUBY_INVOKE_FUNC RUBY_ALLOC_FUNC
22
+
23
+ static VALUE r2tao_nsIORTable;
24
+ static VALUE r2tao_cIORTableLocator;
25
+ static VALUE r2tao_cIORTableNotFoundX;
26
+
27
+ static VALUE r2tao_IORTable_bind(VALUE self, VALUE obj_key, VALUE ior);
28
+ static VALUE r2tao_IORTable_rebind(VALUE self, VALUE obj_key, VALUE ior);
29
+ static VALUE r2tao_IORTable_unbind(VALUE self, VALUE obj_key);
30
+ static VALUE r2tao_IORTable_set_locator(VALUE self, VALUE locator);
31
+
32
+ void r2tao_init_IORTable()
33
+ {
34
+ VALUE klass;
35
+
36
+ r2tao_nsIORTable = klass = rb_eval_string("::R2CORBA::IORTable::Table");
37
+
38
+ rb_define_method(klass, "bind", RUBY_METHOD_FUNC(r2tao_IORTable_bind), 2);
39
+ rb_define_method(klass, "rebind", RUBY_METHOD_FUNC(r2tao_IORTable_rebind), 2);
40
+ rb_define_method(klass, "unbind", RUBY_METHOD_FUNC(r2tao_IORTable_unbind), 1);
41
+ rb_define_method(klass, "set_locator", RUBY_METHOD_FUNC(r2tao_IORTable_set_locator), 1);
42
+
43
+ r2tao_cIORTableNotFoundX = rb_eval_string("::R2CORBA::IORTable::NotFound");
44
+ r2tao_cIORTableLocator = rb_eval_string("::R2CORBA::IORTable::Locator");
45
+ }
46
+
47
+ //-------------------------------------------------------------------
48
+ // Ruby IORTable methods
49
+ //
50
+ //===================================================================
51
+
52
+ class R2taoLocator : public IORTable::Locator
53
+ {
54
+ public:
55
+ R2taoLocator(VALUE rbloc)
56
+ : IORTable::Locator(), rb_locator_(rbloc)
57
+ {
58
+ // register to prevent GC
59
+ r2tao_register_object (this->rb_locator_);
60
+ }
61
+
62
+ ~R2taoLocator()
63
+ {
64
+ // unregister to allow GC; mind GVL
65
+ r2tao_call_thread_safe (R2taoLocator::thread_safe_unregister, this);
66
+ }
67
+
68
+ virtual char * locate (const char * object_key);
69
+
70
+ private:
71
+ VALUE rb_locator_;
72
+
73
+ void inner_unregister ();
74
+ char * inner_locate (const char * object_key);
75
+
76
+ struct ThreadSafeArg
77
+ {
78
+ ThreadSafeArg (R2taoLocator* loc,
79
+ const char * obj_key)
80
+ : locator_(loc),
81
+ object_key_(obj_key),
82
+ exception_ (false) {}
83
+ R2taoLocator* locator_;
84
+ const char * object_key_;
85
+ bool exception_;
86
+ };
87
+
88
+ static void* thread_safe_invoke (void * arg);
89
+ static void* thread_safe_unregister (void* arg);
90
+ };
91
+
92
+ void R2taoLocator::inner_unregister()
93
+ {
94
+ // unregister to allow GC
95
+ r2tao_unregister_object (this->rb_locator_);
96
+ }
97
+
98
+ // invocation helper for threadsafe calling of Ruby code
99
+ void* R2taoLocator::thread_safe_unregister (void * arg)
100
+ {
101
+ R2taoLocator* tloc = reinterpret_cast<R2taoLocator*> (arg);
102
+
103
+ try {
104
+ tloc->inner_unregister ();
105
+ }
106
+ catch (...) {
107
+ return ::CORBA::UNKNOWN (0, CORBA::COMPLETED_MAYBE)._tao_duplicate ();
108
+ }
109
+ return 0;
110
+ }
111
+
112
+ // invocation helper for threadsafe calling of Ruby code
113
+ void* R2taoLocator::thread_safe_invoke (void * arg)
114
+ {
115
+ ThreadSafeArg* tca = reinterpret_cast<ThreadSafeArg*> (arg);
116
+
117
+ try {
118
+ return tca->locator_->inner_locate (tca->object_key_);
119
+ }
120
+ catch (const CORBA::SystemException& ex) {
121
+ tca->exception_ = true;
122
+ return ex._tao_duplicate ();
123
+ }
124
+ catch (...) {
125
+ tca->exception_ = true;
126
+ return ::CORBA::UNKNOWN (0, CORBA::COMPLETED_MAYBE)._tao_duplicate ();
127
+ }
128
+ }
129
+
130
+ char* R2taoLocator::locate (const char * object_key)
131
+ {
132
+ ThreadSafeArg tca_(this, object_key);
133
+
134
+ void* rc = r2tao_call_thread_safe (R2taoLocator::thread_safe_invoke, &tca_);
135
+ if (tca_.exception_)
136
+ {
137
+ CORBA::SystemException* exc = reinterpret_cast<CORBA::SystemException*> (rc);
138
+ ACE_Auto_Basic_Ptr<CORBA::SystemException> e_ptr(exc);
139
+ exc->_raise ();
140
+ return 0;
141
+ }
142
+ else
143
+ {
144
+ return reinterpret_cast<char*> (rc);
145
+ }
146
+ }
147
+
148
+ char* R2taoLocator::inner_locate (const char * object_key)
149
+ {
150
+ static R2TAO_RBFuncall FN_locate ("locate", false);
151
+
152
+ // invoke locator implementation
153
+ VALUE rargs = rb_ary_new2 (1);
154
+ rb_ary_push (rargs, object_key ? rb_str_new2 (object_key) : Qnil);
155
+ VALUE ior = FN_locate.invoke (this->rb_locator_, rargs);
156
+ if (FN_locate.has_caught_exception ())
157
+ {
158
+ // handle exception
159
+ VALUE rexc = rb_gv_get ("$!");
160
+ if (rb_obj_is_kind_of(rexc, r2tao_cIORTableNotFoundX) == Qtrue)
161
+ {
162
+ throw ::IORTable::NotFound();
163
+ }
164
+ else if(rb_obj_is_kind_of(rexc, r2tao_cSystemException) == Qtrue)
165
+ {
166
+ VALUE rid = rb_funcall (rexc, rb_intern ("_interface_repository_id"), 0);
167
+ CORBA::SystemException* _exc = TAO::create_system_exception (RSTRING_PTR(rid));
168
+
169
+ _exc->minor (
170
+ static_cast<CORBA::ULong> (NUM2ULONG (rb_iv_get (rexc, "@minor"))));
171
+ _exc->completed (
172
+ static_cast<CORBA::CompletionStatus> (NUM2ULONG (rb_iv_get (rexc, "@completed"))));
173
+
174
+ ACE_Auto_Basic_Ptr<CORBA::SystemException> e_ptr(_exc);
175
+ _exc->_raise ();
176
+ }
177
+ else
178
+ {
179
+ rb_eval_string ("STDERR.puts $!.to_s+\"\\n\"+$!.backtrace.join(\"\\n\")");
180
+ throw ::CORBA::UNKNOWN (0, CORBA::COMPLETED_MAYBE);
181
+ }
182
+ }
183
+
184
+ if (rb_type (ior) != T_STRING)
185
+ {
186
+ throw CORBA::BAD_PARAM(0, CORBA::COMPLETED_NO);
187
+ }
188
+
189
+ return CORBA::string_dup (RSTRING_PTR (ior));
190
+ }
191
+
192
+ IORTable::Table_ptr r2tao_IORTable_r2t(VALUE obj)
193
+ {
194
+ CORBA::Object_ptr _obj = r2corba_Object_r2t (obj);
195
+ return IORTable::Table::_narrow (_obj);
196
+ }
197
+
198
+ VALUE r2tao_IORTable_bind(VALUE self, VALUE obj_key, VALUE ior)
199
+ {
200
+ obj_key = rb_check_convert_type (obj_key, T_STRING, "String", "to_s");
201
+ ior = rb_check_convert_type (ior, T_STRING, "String", "to_s");
202
+ R2TAO_TRY
203
+ {
204
+ IORTable::Table_var _iortbl = r2tao_IORTable_r2t (self);
205
+ _iortbl->bind (RSTRING_PTR (obj_key), RSTRING_PTR (ior));
206
+ }
207
+ R2TAO_CATCH;
208
+ return Qnil;
209
+ }
210
+
211
+ VALUE r2tao_IORTable_rebind(VALUE self, VALUE obj_key, VALUE ior)
212
+ {
213
+ obj_key = rb_check_convert_type (obj_key, T_STRING, "String", "to_s");
214
+ ior = rb_check_convert_type (ior, T_STRING, "String", "to_s");
215
+ R2TAO_TRY
216
+ {
217
+ IORTable::Table_var _iortbl = r2tao_IORTable_r2t (self);
218
+ _iortbl->rebind (RSTRING_PTR (obj_key), RSTRING_PTR (ior));
219
+ }
220
+ R2TAO_CATCH;
221
+ return Qnil;
222
+ }
223
+
224
+ VALUE r2tao_IORTable_unbind(VALUE self, VALUE obj_key)
225
+ {
226
+ obj_key = rb_check_convert_type (obj_key, T_STRING, "String", "to_s");
227
+ R2TAO_TRY
228
+ {
229
+ IORTable::Table_var _iortbl = r2tao_IORTable_r2t (self);
230
+ _iortbl->unbind (RSTRING_PTR (obj_key));
231
+ }
232
+ R2TAO_CATCH;
233
+ return Qnil;
234
+ }
235
+
236
+ VALUE r2tao_IORTable_set_locator(VALUE self, VALUE locator)
237
+ {
238
+ r2tao_check_type (locator, r2tao_cIORTableLocator);
239
+
240
+ R2TAO_TRY
241
+ {
242
+ IORTable::Table_var _iortbl = r2tao_IORTable_r2t (self);
243
+
244
+ IORTable::Locator_var _locvar = new R2taoLocator(locator);
245
+
246
+ _iortbl->set_locator (_locvar.in ());
247
+ }
248
+ R2TAO_CATCH;
249
+ return Qnil;
250
+ }