Welcome to the "trac"-ing site of soap4r!
[soap4r] [httpclient] [openpgp4u] [pkcs1] [logger] [csv] [vtr]

root/trunk/lib/soap/encodingstyle/aspDotNetHandler.rb

Revision 1836, 4.8 kB (checked in by nahi, 2 years ago)
  • let SOAPElement include a SOAPCompoundtype module and added have_member method for simplified XML pretty print control.
  • Property svn:eol-style set to native
  • Property svn:keywords set to author date id revision
Line 
1 # SOAP4R - ASP.NET EncodingStyle handler library
2 # Copyright (C) 2000-2007  NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
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.
7
8
9 require 'soap/encodingstyle/handler'
10
11
12 module SOAP
13 module EncodingStyle
14
15
16 class ASPDotNetHandler < Handler
17   Namespace = 'http://tempuri.org/ASP.NET'
18   add_handler
19
20   def initialize(charset = nil)
21     super(charset)
22     @textbuf = ''
23     @decode_typemap = nil
24   end
25
26
27   ###
28   ## encode interface.
29   #
30   def encode_data(generator, ns, data, parent)
31     attrs = {}
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 =
37         XSD::QName.new(parent.elename.namespace, data.elename.name)
38     end
39     name = generator.encode_name(ns, data, attrs)
40     case data
41     when SOAPRawString
42       generator.encode_tag(name, attrs)
43       generator.encode_rawstring(data.to_s)
44     when XSD::XSDString
45       generator.encode_tag(name, attrs)
46       generator.encode_string(@charset ?
47         XSD::Charset.encoding_to_xml(data.to_s, @charset) : data.to_s)
48     when XSD::XSDAnySimpleType
49       generator.encode_tag(name, attrs)
50       generator.encode_string(data.to_s)
51     when SOAPStruct
52       generator.encode_tag(name, attrs)
53       data.each do |key, value|
54         generator.encode_child(ns, value, data)
55       end
56     when SOAPArray
57       generator.encode_tag(name, attrs)
58       data.traverse do |child, *rank|
59         data.position = nil
60         generator.encode_child(ns, child, data)
61       end
62     else
63       raise EncodingStyleError.new(
64         "unknown object:#{data} in this encodingStyle")
65     end
66   end
67
68   def encode_data_end(generator, ns, data, parent)
69     name = generator.encode_name_end(ns, data)
70     cr = (data.is_a?(SOAPCompoundtype) and data.have_member)
71     generator.encode_tag_end(name, cr)
72   end
73
74
75   ###
76   ## decode interface.
77   #
78   class SOAPTemporalObject
79     attr_accessor :parent
80
81     def initialize
82       @parent = nil
83     end
84   end
85
86   class SOAPUnknown < SOAPTemporalObject
87     def initialize(handler, elename)
88       super()
89       @handler = handler
90       @elename = elename
91     end
92
93     def as_struct
94       o = SOAPStruct.decode(@elename, XSD::AnyTypeName)
95       o.parent = @parent
96       o.type.name = @name
97       @handler.decode_parent(@parent, o)
98       o
99     end
100
101     def as_string
102       o = SOAPString.decode(@elename)
103       o.parent = @parent
104       @handler.decode_parent(@parent, o)
105       o
106     end
107   end
108
109   def decode_tag(ns, elename, attrs, parent)
110     @textbuf = ''
111     o = SOAPUnknown.new(self, elename)
112     o.parent = parent
113     o
114   end
115
116   def decode_tag_end(ns, node)
117     o = node.node
118     if o.is_a?(SOAPUnknown)
119       newnode = o.as_string
120 #       if /\A\s*\z/ =~ @textbuf
121 #         o.as_struct
122 #       else
123 #         o.as_string
124 #       end
125       node.replace_node(newnode)
126       o = node.node
127     end
128
129     decode_textbuf(o)
130     @textbuf = ''
131   end
132
133   def decode_text(ns, text)
134     # @textbuf is set at decode_tag_end.
135     @textbuf << text
136   end
137
138   def decode_prologue
139   end
140
141   def decode_epilogue
142   end
143
144   def decode_parent(parent, node)
145     case parent.node
146     when SOAPUnknown
147       newparent = parent.node.as_struct
148       node.parent = newparent
149       parent.replace_node(newparent)
150       decode_parent(parent, node)
151
152     when SOAPStruct
153       data = parent.node[node.elename.name]
154       case data
155       when nil
156         parent.node.add(node.elename.name, node)
157       when SOAPArray
158         name, type_ns = node.elename.name, node.type.namespace
159         data.add(node)
160         node.elename, node.type.namespace = name, type_ns
161       else
162         parent.node[node.elename.name] = SOAPArray.new
163         name, type_ns = data.elename.name, data.type.namespace
164         parent.node[node.elename.name].add(data)
165         data.elename.name, data.type.namespace = name, type_ns
166         name, type_ns = node.elename.name, node.type.namespace
167         parent.node[node.elename.name].add(node)
168         node.elename.name, node.type.namespace = name, type_ns
169       end
170
171     when SOAPArray
172       if node.position
173         parent.node[*(decode_arypos(node.position))] = node
174         parent.node.sparse = true
175       else
176         parent.node.add(node)
177       end
178
179     when SOAPBasetype
180       raise EncodingStyleError.new("SOAP base type must not have a child")
181
182     else
183       # SOAPUnknown does not have parent.
184       # raise EncodingStyleError.new("illegal parent: #{parent}")
185     end
186   end
187
188 private
189
190   def decode_textbuf(node)
191     if node.is_a?(XSD::XSDString)
192       if @charset
193         node.set(XSD::Charset.encoding_from_xml(@textbuf, @charset))
194       else
195         node.set(@textbuf)
196       end
197     else
198       # Nothing to do...
199     end
200   end
201 end
202
203 ASPDotNetHandler.new
204
205
206 end
207 end
Note: See TracBrowser for help on using the browser.