34 |
private XmlRpcMethod method; |
private XmlRpcMethod method; |
35 |
private XmlTextReader xmlReader; |
private XmlTextReader xmlReader; |
36 |
private XmlRpcStruct structure; |
private XmlRpcStruct structure; |
37 |
|
private XmlRpcArray array; |
38 |
|
|
39 |
public XmlRpcReader( String request ) |
public XmlRpcReader( String buffer ) |
40 |
: this( new StringReader( request ) ){ |
: this( new StringReader( buffer ) ){ |
41 |
} |
} |
42 |
|
|
43 |
public XmlRpcReader( StringReader reader ) |
public XmlRpcReader( StringReader reader ) |
44 |
{ |
{ |
|
method = new XmlRpcMethod(); |
|
45 |
structure = null; |
structure = null; |
46 |
|
array = null; |
47 |
|
method = new XmlRpcMethod(); |
48 |
xmlReader = new XmlTextReader( reader ); |
xmlReader = new XmlTextReader( reader ); |
|
xmlReader.WhitespaceHandling = WhitespaceHandling.None; |
|
|
|
|
49 |
|
|
50 |
// Itereate through the tree and construct an n-ary tree with |
// Itereate through the tree and construct an n-ary tree with |
51 |
// XmlRpcNodes so we can detect protocol errors and the current |
// XmlRpcNodes so we can detect protocol errors and the current |
118 |
// Arrays |
// Arrays |
119 |
case "array": |
case "array": |
120 |
node = new ArrayNode( xmlReader, node ); |
node = new ArrayNode( xmlReader, node ); |
121 |
|
array = new XmlRpcArray(); |
122 |
break; |
break; |
123 |
case "data": |
case "data": |
124 |
node = new DataNode( xmlReader, node ); |
node = new DataNode( xmlReader, node ); |
125 |
break; |
break; |
126 |
default: |
default: |
127 |
node = new UnknownNode( xmlReader, node ); |
node = new UnknownNode( xmlReader, node ); |
128 |
throw new XmlRpcBadFormatException( 100, "Unknown Element: " + xmlReader.Name, xmlReader ); |
throw new XmlRpcBadFormatException( 100, "Unknown Element: " + |
129 |
|
xmlReader.Name, xmlReader ); |
130 |
break; |
break; |
131 |
} |
} |
132 |
#if __DEBUG__ |
#if __DEBUG__ |
133 |
Console.Out.WriteLine( "Adding Node {0} with parent{1}", node, node.Parent ); |
Console.Out.WriteLine( "Opening {0} with parent {1}", |
134 |
|
node, node.Parent ); |
135 |
#endif |
#endif |
136 |
break; |
break; |
137 |
|
|
172 |
Add( dtval ); |
Add( dtval ); |
173 |
} |
} |
174 |
catch( FormatException e ){ |
catch( FormatException e ){ |
175 |
throw new XmlRpcBadFormatException( 100, "Cannot parse DateTime value: " + xmlReader.Value, xmlReader ); |
throw new XmlRpcBadFormatException( 100, "Cannot parse DateTime value: " + |
176 |
|
xmlReader.Value, xmlReader ); |
177 |
} |
} |
178 |
*/ |
*/ |
179 |
break; |
break; |
185 |
structure.MemberName = xmlReader.Value; |
structure.MemberName = xmlReader.Value; |
186 |
} |
} |
187 |
else { |
else { |
188 |
Console.Out.WriteLine( "Error: not in struct context: {0} name='{1}'", node, xmlReader.Value ); |
// TODO: make and throw an exception here... |
189 |
|
Console.Out.WriteLine( "Error: not in struct context: {0} name='{1}'", |
190 |
|
node, xmlReader.Value ); |
191 |
} |
} |
192 |
break; |
break; |
193 |
// anything below here should never have a value. slap and bark at user. |
// anything below here should never have a value. slap and bark at user. |
200 |
case "array": |
case "array": |
201 |
case "data": |
case "data": |
202 |
default: |
default: |
203 |
throw new XmlRpcBadFormatException( 100, "Node Does Not Set Value: " + node.Tag, xmlReader ); |
throw new XmlRpcBadFormatException( 100, "Node Does Not Set Value: " + |
204 |
|
node.Tag, xmlReader ); |
205 |
break; |
break; |
206 |
} |
} |
207 |
break; |
break; |
208 |
|
|
209 |
// close the scope |
// close the scope |
210 |
case XmlNodeType.EndElement: |
case XmlNodeType.EndElement: |
211 |
// TODO: ensure the tags close propperly -- if thats really necessary... |
// TODO: ensure the tags are well formed -- if thats really |
212 |
// yep. its necessary |
// necessary... yep. its necessary... or maybe not... hehe |
213 |
|
|
214 |
|
#if __DEBUG__ |
215 |
|
Console.Out.WriteLine( "Closing {0} with parent {1} [{2}]", |
216 |
|
node, node.Parent, xmlReader.Name ); |
217 |
|
#endif |
218 |
switch( xmlReader.Name ) { |
switch( xmlReader.Name ) { |
219 |
case "methodCall" : |
case "methodCall" : |
220 |
case "methodName": |
case "methodName": |
229 |
case "base64": |
case "base64": |
230 |
case "string": |
case "string": |
231 |
case "name": |
case "name": |
232 |
|
node = node.Parent; |
233 |
|
break; |
234 |
case "array": |
case "array": |
235 |
node = node.Parent; |
node = node.Parent; |
236 |
|
#if __DEBUG__ |
237 |
|
Console.Out.WriteLine( array + ":" + array.Count ); |
238 |
|
#endif |
239 |
|
array = null; |
240 |
break; |
break; |
241 |
case "member": |
case "member": |
242 |
node = node.Parent; |
node = node.Parent; |
246 |
node = node.Parent; |
node = node.Parent; |
247 |
break; |
break; |
248 |
case "struct": |
case "struct": |
249 |
|
node = node.Parent; |
250 |
|
#if __DEBUG__ |
251 |
Console.Out.WriteLine( structure ); |
Console.Out.WriteLine( structure ); |
252 |
|
#endif |
253 |
structure = null; |
structure = null; |
254 |
break; |
break; |
255 |
default: |
default: |
256 |
node = new UnknownNode( xmlReader, node ); |
node = new UnknownNode( xmlReader, node ); |
257 |
throw new XmlRpcBadFormatException( 100, "Unknown Element: " + xmlReader.Name, xmlReader ); |
throw new XmlRpcBadFormatException( 100, "Unknown Element: " + |
258 |
|
xmlReader.Name, xmlReader ); |
259 |
break; |
break; |
260 |
} |
} |
261 |
break; // case XmlNodeType.EndElement |
break; // case XmlNodeType.EndElement |
266 |
|
|
267 |
private void Add( object o ) |
private void Add( object o ) |
268 |
{ |
{ |
269 |
if( structure != null ) { |
// HACK!!!: this could be done more elegantly |
270 |
|
if( (structure == null) && (array == null) ) { |
271 |
|
method.Parameters.Add( o ); |
272 |
|
} |
273 |
|
else if( (structure != null) && (array == null) ) { |
274 |
structure.MemberValue = o; |
structure.MemberValue = o; |
275 |
} |
} |
276 |
|
else if( (structure == null) && (array != null) ) { |
277 |
|
array.Add( o ); |
278 |
|
} |
279 |
else { |
else { |
280 |
method.Parameters.Add( o ); |
// Oh dear. This should never happen |
281 |
|
// TODO: make and throw exception |
282 |
|
Console.Out.WriteLine( "Parameter BUMMER: Unknown state" ); |
283 |
} |
} |
284 |
} |
} |
285 |
|
|