Class: R2CORBA::CORBA::Any
- Inherits:
-
Object
- Object
- R2CORBA::CORBA::Any
- Defined in:
- lib/corba/jbase/Any.rb,
lib/corba/common/Any.rb
Class Method Summary collapse
-
.from_java(jany, jorb = nil, rtc = nil) ⇒ Object
to_java.
- .to_any(o, tc = nil) ⇒ Object
- .typecode_for_value(val) ⇒ Object
- .value_for_any(any) ⇒ Object
Instance Method Summary collapse
Class Method Details
.from_java(jany, jorb = nil, rtc = nil) ⇒ Object
to_java
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 |
# File 'lib/corba/jbase/Any.rb', line 156 def Any.from_java(jany, jorb=nil, rtc=nil) rtc ||= CORBA::TypeCode.from_native(jany.type) rval = nil begin if [TK_NULL,TK_VOID,TK_ANY,TK_BOOLEAN,TK_SHORT,TK_LONG,TK_USHORT, TK_WCHAR,TK_ULONG,TK_LONGLONG,TK_ULONGLONG,TK_OCTET, TK_FLOAT,TK_DOUBLE,TK_LONGDOUBLE,TK_CHAR,TK_STRING,TK_WSTRING, TK_VALUE, TK_VALUE_BOX,TK_TYPECODE,TK_OBJREF, TK_ABSTRACT_INTERFACE,TK_PRINCIPAL].include?(rtc.resolved_tc.kind) case rtc.resolved_tc.kind when TK_NULL, TK_VOID # leave as is when TK_ANY rval = Any.from_java(jany.extract_any(), jorb) when TK_BOOLEAN rval = jany.extract_boolean() when TK_SHORT rval = jany.extract_short() when TK_LONG rval = jany.extract_long() when TK_USHORT rval = [jany.extract_ushort()].pack('s').unpack('S').first when TK_WCHAR rval = jany.extract_wchar() when TK_ULONG rval = [jany.extract_ulong()].pack('l').unpack('L').first when TK_LONGLONG rval = jany.extract_longlong() when TK_ULONGLONG rval = [jany.extract_ulonglong()].pack('q').unpack('Q').first when TK_OCTET rval = [jany.extract_octet()].pack('c').unpack('C').first when TK_FLOAT rval = jany.extract_float() when TK_DOUBLE rval = jany.extract_double() when TK_LONGDOUBLE raise CORBA::NO_IMPLEMENT.new('LongDouble not supported',0,CORBA::COMPLETED_NO) when TK_FIXED rval = BigDecimal.new(jany.extract_fixed().toString()) when TK_CHAR rval = jany.extract_char().chr when TK_STRING rval = jany.extract_string() when TK_WSTRING rval = jany.extract_wstring() when TK_VALUE rval = jany.extract_Value() when TK_VALUE_BOX rtc.get_type::Factory._check_factory(jorb || CORBA::ORB._orb) # make sure valuebox factory has been registered rval = jany.extract_Value() rval = rval.value unless rval.nil? when TK_TYPECODE rval = CORBA::TypeCode.from_native(jany.extract_TypeCode()) when TK_OBJREF rval = CORBA::Object._wrap_native(jany.extract_Object()) rval = rtc.get_type._narrow(rval) if rval when TK_ABSTRACT_INTERFACE jobj = jany.create_input_stream().read_abstract_interface() rval = if jobj.is_a?(CORBA::Native::Object) rtc.get_type._narrow(CORBA::Object._wrap_native(jobj)) else jobj end when TK_PRINCIPAL raise CORBA::NO_IMPLEMENT.new('Principal not supported',0,CORBA::COMPLETED_NO) ## TODO: TK_NATIVE else raise CORBA::MARSHAL.new("unknown kind [#{rtc.kind}]",0,CORBA::COMPLETED_NO) end else dynFactory = CORBA::Native::Dynamic::DynAnyFactoryHelper.narrow( (jorb || CORBA::ORB._orb).resolve_initial_references("DynAnyFactory")) jdynany = dynFactory.create_dyn_any(jany) begin restc = rtc.resolved_tc case restc.kind when TK_ENUM rval = jdynany.get_as_ulong() when TK_ARRAY rval = rtc.get_type.new jdynany.get_elements().each {|e| rval << Any.from_java(e, jorb, restc.content_type) } when TK_SEQUENCE rval = rtc.get_type.new jdynany.get_elements().each {|e| rval << Any.from_java(e, jorb, restc.content_type) } when TK_STRUCT, TK_EXCEPT rval = rtc.get_type.new jdynany.get_members().each_with_index {|nvp,i| rval.__send__("#{nvp.id}=".intern, Any.from_java(nvp.value, jorb, restc.member_type(i))) } when TK_UNION rval = rtc.get_type.new if jdynany.get_discriminator().type().kind().value() == CORBA::TK_OCTET rdisc = jdynany.get_discriminator().get_octet() # Octet 0 designates default member rdisc = rdisc == 0 ? :default : rdisc else rdisc = Any.from_java(jdynany.get_discriminator().to_any(), jorb, restc.discriminator_type) end rval.instance_variable_set('@discriminator', rdisc) unless jdynany.has_no_active_member minx = rtc.label_index(rdisc) rval.instance_variable_set('@value', Any.from_java(jdynany.member.to_any, jorb, restc.member_type(minx))) end else raise CORBA::MARSHAL.new("unknown kind [#{rtc.kind}]",0,CORBA::COMPLETED_NO) end ensure jdynany.destroy end end rescue ::NativeException CORBA::Exception.native2r($!) end return rval end |
.to_any(o, tc = nil) ⇒ Object
62 63 64 65 66 67 68 69 70 71 |
# File 'lib/corba/common/Any.rb', line 62 def Any.to_any(o, tc=nil) if tc.nil? tc = self.typecode_for_value(o) if tc.is_a?(CORBA::TypeCode) return new(o, tc) end raise CORBA::MARSHAL.new('missing TypeCode',0,CORBA::COMPLETED_NO) end return new(o, tc) end |
.typecode_for_value(val) ⇒ Object
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/corba/common/Any.rb', line 17 def Any.typecode_for_value(val) case val when CORBA::Any return val._tc when ::NilClass return CORBA._tc_null when ::Bignum return CORBA._tc_longlong when ::Integer return CORBA._tc_long when ::Float return CORBA._tc_double when ::TrueClass, ::FalseClass return CORBA._tc_boolean when ::String return CORBA._tc_string else if val.class.respond_to?(:_tc) begin tc = val.class._tc if tc.is_a? CORBA::TypeCode return tc end rescue end else if val.is_a? CORBA::Object return CORBA._tc_Object elsif val.is_a? CORBA::TypeCode return CORBA._tc_TypeCode end end end return nil end |
Instance Method Details
#_tc ⇒ Object
73 74 75 |
# File 'lib/corba/common/Any.rb', line 73 def _tc @__tc end |
#_value ⇒ Object
76 77 78 |
# File 'lib/corba/common/Any.rb', line 76 def _value @__value end |
#to_java(jorb = nil, jany = nil) ⇒ Object
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
# File 'lib/corba/jbase/Any.rb', line 24 def to_java(jorb=nil,jany=nil) rtc = self._tc rval = self._value.nil? ? self._value : rtc.validate(self._value) restc = rtc.resolved_tc begin if [TK_VALUE, TK_VALUE_BOX, TK_ABSTRACT_INTERFACE].include?(restc.kind) || (!rval.nil? && [TK_NULL,TK_ANY,TK_BOOLEAN,TK_SHORT,TK_LONG,TK_USHORT, TK_WCHAR,TK_ULONG,TK_LONGLONG,TK_ULONGLONG,TK_OCTET, TK_FLOAT,TK_DOUBLE,TK_LONGDOUBLE,TK_CHAR,TK_STRING,TK_WSTRING, TK_VALUE, TK_VALUE_BOX,TK_TYPECODE,TK_OBJREF,TK_PRINCIPAL].include?(restc.kind)) jorb ||= CORBA::ORB._orb jany ||= jorb.create_any() case restc.kind when TK_NULL # leave any as is when TK_ANY jany.insert_any(rval.to_java(jorb)) when TK_BOOLEAN jany.insert_boolean(rval) when TK_SHORT jany.insert_short(rval) when TK_LONG jany.insert_long(rval) when TK_USHORT jany.insert_ushort([rval].pack('S').unpack('s').first) when TK_WCHAR jany.insert_wchar(rval) when TK_ULONG jany.insert_ulong([rval].pack('L').unpack('l').first) when TK_LONGLONG jany.insert_longlong(rval) when TK_ULONGLONG jany.insert_ulonglong([rval].pack('Q').unpack('q').first) when TK_OCTET jany.insert_octet([rval].pack('C').unpack('c').first) when TK_FLOAT jany.insert_float(rval) when TK_DOUBLE jany.insert_double(rval) when TK_LONGDOUBLE raise CORBA::NO_IMPLEMENT.new('LongDouble not supported',0,CORBA::COMPLETED_NO) when TK_FIXED jany.insert_fixed(java.math.BigDecimal.new(rval.to_s)) when TK_CHAR jany.insert_char(rval[0]) when TK_STRING jany.insert_string(rval) when TK_WSTRING jany.insert_wstring(rval.inject('') {|s,b| s << b.chr}) when TK_VALUE jany.insert_Value(rval, rtc.tc_) when TK_VALUE_BOX rtc.get_type::Factory._check_factory(jorb) # make sure valuebox factory has been registered rval = rtc.get_type.new(rval) unless rval.nil? || rval.is_a?(CORBA::Portable::BoxedValueBase) jany.insert_Value(rval, rtc.tc_) when TK_TYPECODE jany.insert_TypeCode(rtc.tc_) when TK_OBJREF jany.insert_Object(rval.objref_) when TK_ABSTRACT_INTERFACE if rval.is_a?(CORBA::Object) # since we know what we're doing use this convenience method provided # by JacORB so we only make a shallow copy of the object ref # insert_Object() will throw an exception because the typecode is not # an objref tc but rather an abstract interface tc if CORBA::Native::Jacorb::MAJOR_VERSION < 3 jany.insert_object(rtc.tc_, rval.objref_) else jany.insert(rtc.tc_, rval.objref_) end else jany.insert_Value(rval, rtc.tc_) end when TK_PRINCIPAL raise CORBA::NO_IMPLEMENT.new('Principal not supported',0,CORBA::COMPLETED_NO) ## TODO: TK_NATIVE else raise CORBA::MARSHAL.new("unknown kind [#{rtc.kind}]",0,CORBA::COMPLETED_NO) end return jany else dynFactory = CORBA::Native::Dynamic::DynAnyFactoryHelper.narrow( (jorb || CORBA::ORB._orb).resolve_initial_references("DynAnyFactory")) jdynany = dynFactory.create_dyn_any_from_type_code(rtc.tc_) begin unless rval.nil? restc = rtc.resolved_tc case restc.kind when TK_ENUM jdynany.set_as_ulong(rval) when TK_ARRAY jelems = CORBA::Native::Reflect::Array.newInstance(CORBA::Native::Any.java_class, rval.size) rval.each_with_index {|e,i| jelems[i] = Any.to_any(e, restc.content_type).to_java(jorb) } jdynany.set_elements(jelems) when TK_SEQUENCE jelems = CORBA::Native::Reflect::Array.newInstance(CORBA::Native::Any.java_class, rval.size) rval.each_with_index {|e,i| jelems[i] = Any.to_any(e, restc.content_type).to_java(jorb) } jdynany.set_elements(jelems) when TK_STRUCT, TK_EXCEPT jmembers = CORBA::Native::Reflect::Array.newInstance(CORBA::Native::Dynamic::NameValuePair.java_class, restc.members.size) rtc.members.each_with_index {|(mn, mt),i| jmembers[i] = CORBA::Native::Dynamic::NameValuePair.new(mn, Any.to_any(rval.__send__(mn.intern), mt).to_java(jorb)) } jdynany.set_members(jmembers) when TK_UNION if rval._is_at_default? jdynany.set_to_default_member elsif rval._disc.nil? jdynany.set_to_no_active_member else jdynany.set_discriminator(dynFactory.create_dyn_any(Any.to_any(rval._disc, restc.discriminator_type).to_java(jorb))) end unless rval._disc.nil? || rval._value.nil? jdynany.member.from_any(Any.to_any(rval._value, rval._value_tc).to_java(jorb)) end else raise CORBA::MARSHAL.new("unknown kind [#{rtc.kind}]",0,CORBA::COMPLETED_NO) end end if jany.nil? jany = jdynany.to_any else jany.read_value(jdynany.to_any.create_input_stream(), rtc.tc_) end ensure jdynany.destroy end return jany end rescue ::NativeException CORBA::Exception.native2r($!) end end |