diff options
Diffstat (limited to 'lib/soap/mapping/wsdlencodedregistry.rb')
-rw-r--r-- | lib/soap/mapping/wsdlencodedregistry.rb | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/lib/soap/mapping/wsdlencodedregistry.rb b/lib/soap/mapping/wsdlencodedregistry.rb index 8d495668e9..4efb60188f 100644 --- a/lib/soap/mapping/wsdlencodedregistry.rb +++ b/lib/soap/mapping/wsdlencodedregistry.rb @@ -149,8 +149,9 @@ private def base2soap(obj, type) soap_obj = nil if type <= XSD::XSDString - soap_obj = type.new(XSD::Charset.is_ces(obj, $KCODE) ? - XSD::Charset.encoding_conv(obj, $KCODE, XSD::Charset.encoding) : obj) + str = XSD::Charset.encoding_conv(obj.to_s, + Thread.current[:SOAPExternalCES], XSD::Charset.encoding) + soap_obj = type.new(str) mark_marshalled_obj(obj, soap_obj) else soap_obj = type.new(obj) @@ -234,7 +235,9 @@ private elements, as_array = schema_element_definition(obj.class) vars = {} node.each do |name, value| - if class_name = elements[name] + item = elements.find { |k, v| k.name == name } + if item + elename, class_name = item if klass = Mapping.class_from_name(class_name) # klass must be a SOAPBasetype or a class if klass.ancestors.include?(::SOAP::SOAPBasetype) @@ -246,6 +249,14 @@ private else child = Mapping._soap2obj(value, self, klass) end + elsif klass = Mapping.module_from_name(class_name) + # simpletype + if value.respond_to?(:data) + child = value.data + else + raise MappingError.new( + "cannot map to a module value: #{class_name}") + end else raise MappingError.new("unknown class: #{class_name}") end |