1
# SOAP4R - ASP.NET EncodingStyle handler library
2
# Copyright (C) 2001, 2003, 2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
4
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
# redistribute it and/or modify it under the same terms of Ruby's license;
6
# either the dual license version in 2003, or any later version.
9
require 'soap/encodingstyle/handler'
16
class ASPDotNetHandler < Handler
17
Namespace = 'http://tempuri.org/ASP.NET'
20
def initialize(charset = nil)
30
def encode_data(generator, ns, data, parent)
32
# ASPDotNetHandler is intended to be used for accessing an ASP.NET doc/lit
33
# service as an rpc/encoded service. in the situation, local elements
34
# should be qualified. propagate parent's namespace to children.
35
if data.elename.namespace.nil?
36
data.elename.namespace = parent.elename.namespace
38
name = generator.encode_name(ns, data, attrs)
41
generator.encode_tag(name, attrs)
42
generator.encode_rawstring(data.to_s)
44
generator.encode_tag(name, attrs)
45
generator.encode_string(@charset ?
46
XSD::Charset.encoding_to_xml(data.to_s, @charset) : data.to_s)
47
when XSD::XSDAnySimpleType
48
generator.encode_tag(name, attrs)
49
generator.encode_string(data.to_s)
51
generator.encode_tag(name, attrs)
52
data.each do |key, value|
53
generator.encode_child(ns, value, data)
56
generator.encode_tag(name, attrs)
57
data.traverse do |child, *rank|
59
generator.encode_child(ns, child, data)
62
raise EncodingStyleError.new(
63
"unknown object:#{data} in this encodingStyle")
67
def encode_data_end(generator, ns, data, parent)
68
name = generator.encode_name_end(ns, data)
69
cr = data.is_a?(SOAPCompoundtype)
70
generator.encode_tag_end(name, cr)
77
class SOAPTemporalObject
85
class SOAPUnknown < SOAPTemporalObject
86
def initialize(handler, elename)
93
o = SOAPStruct.decode(@elename, XSD::AnyTypeName)
96
@handler.decode_parent(@parent, o)
101
o = SOAPString.decode(@elename)
103
@handler.decode_parent(@parent, o)
108
o = SOAPNil.decode(@elename)
110
@handler.decode_parent(@parent, o)
115
def decode_tag(ns, elename, attrs, parent)
117
o = SOAPUnknown.new(self, elename)
122
def decode_tag_end(ns, node)
124
if o.is_a?(SOAPUnknown)
125
newnode = o.as_string
126
# if /\A\s*\z/ =~ @textbuf
131
node.replace_node(newnode)
139
def decode_text(ns, text)
140
# @textbuf is set at decode_tag_end.
150
def decode_parent(parent, node)
153
newparent = parent.node.as_struct
154
node.parent = newparent
155
parent.replace_node(newparent)
156
decode_parent(parent, node)
159
data = parent.node[node.elename.name]
162
parent.node.add(node.elename.name, node)
164
name, type_ns = node.elename.name, node.type.namespace
166
node.elename, node.type.namespace = name, type_ns
168
parent.node[node.elename.name] = SOAPArray.new
169
name, type_ns = data.elename.name, data.type.namespace
170
parent.node[node.elename.name].add(data)
171
data.elename.name, data.type.namespace = name, type_ns
172
name, type_ns = node.elename.name, node.type.namespace
173
parent.node[node.elename.name].add(node)
174
node.elename.name, node.type.namespace = name, type_ns
179
parent.node[*(decode_arypos(node.position))] = node
180
parent.node.sparse = true
182
parent.node.add(node)
186
raise EncodingStyleError.new("SOAP base type must not have a child")
189
# SOAPUnknown does not have parent.
190
# raise EncodingStyleError.new("illegal parent: #{parent}")
196
def decode_textbuf(node)
197
if node.is_a?(XSD::XSDString)
199
node.set(XSD::Charset.encoding_from_xml(@textbuf, @charset))