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,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
+ }