summaryrefslogtreecommitdiff
path: root/lib/soap/mapping/wsdlencodedregistry.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/soap/mapping/wsdlencodedregistry.rb')
-rw-r--r--lib/soap/mapping/wsdlencodedregistry.rb17
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