37 |
// Grrr Grrr Grrrrr |
// Grrr Grrr Grrrrr |
38 |
public class XmlRpcWriter |
public class XmlRpcWriter |
39 |
{ |
{ |
40 |
private IndentedTextWriter writer; |
private XmlTextWriter writer; |
41 |
private StringWriter sw; |
private StringWriter sw; |
42 |
private XmlRpcMethod m; |
private XmlRpcMethod m; |
43 |
|
|
44 |
public XmlRpcWriter() |
public XmlRpcWriter() |
45 |
{ |
{ |
46 |
sw = new StringWriter(); |
sw = new StringWriter(); |
47 |
writer = new IndentedTextWriter( sw, " " ); |
writer = new XmlTextWriter( sw ); |
48 |
|
//writer.Formatting = Formatting.Indented; |
49 |
} |
} |
50 |
|
|
51 |
private void WriteHead() |
private void WriteHead() |
52 |
{ |
{ |
53 |
writer.WriteLine( "<?xml version=\"1.0\"?>" ); |
writer.WriteStartDocument(); |
54 |
writer.WriteLine( "<methodResponse>" ); |
writer.WriteStartElement( "methodResponse" ); |
55 |
writer.Indent++; |
writer.WriteStartElement( "params" ); |
56 |
writer.WriteLine( "<params>" ); |
writer.WriteStartElement( "param" ); |
57 |
writer.Indent++; |
writer.WriteStartElement( "value" ); |
|
writer.WriteLine( "<param>" ); |
|
|
writer.Indent++; |
|
|
writer.WriteLine( "<value>" ); |
|
|
writer.Indent++; |
|
58 |
} |
} |
59 |
|
|
60 |
private void WriteTail() |
private void WriteTail() |
61 |
{ |
{ |
62 |
writer.Indent--; |
writer.WriteEndElement(); // value |
63 |
writer.WriteLine( "</value>" ); |
writer.WriteEndElement(); // param |
64 |
writer.Indent--; |
writer.WriteEndElement(); // params |
65 |
writer.WriteLine( "</param>" ); |
writer.WriteEndElement(); // methodResponse |
66 |
writer.Indent--; |
writer.WriteEndDocument(); |
|
writer.WriteLine( "</params>" ); |
|
|
writer.Indent--; |
|
|
writer.WriteLine( "</methodResponse>" ); |
|
67 |
} |
} |
68 |
|
|
69 |
private void Write( object o ) |
private void Write( object o ) |
70 |
{ |
{ |
|
string tag; |
|
71 |
if( o is int ) { |
if( o is int ) { |
72 |
tag = "i4"; |
writer.WriteElementString( "i4", XmlConvert.ToString( (int)o ) ); |
|
Write( tag, o ); |
|
73 |
} |
} |
74 |
else if( o is double ) { |
else if( o is double ) { |
75 |
tag = "double"; |
// XmlConvert is HORRID doing this!!!! Try this with a value |
76 |
Write( tag, o ); |
// of 2.0 and see what i mean |
77 |
|
writer.WriteElementString( "double", o.ToString() ); |
78 |
} |
} |
79 |
else if( o is string ) { |
else if( o is string ) { |
80 |
tag = "string"; |
writer.WriteElementString( "string", (string)o ); |
|
Write( tag, o ); |
|
81 |
} |
} |
82 |
else if( o is bool ) { |
else if( o is bool ) { |
83 |
tag = "boolean"; |
writer.WriteElementString( "boolean", XmlConvert.ToString( (bool)o ) ); |
|
Write( tag, o ); |
|
84 |
} |
} |
85 |
else if( o is DateTime ) { |
else if( o is DateTime ) { |
86 |
tag = "dateTime.iso8601"; |
// ensure this is iso compliant |
87 |
Write( tag, o ); |
DateTime dt = (DateTime)o; |
88 |
|
|
89 |
|
// Why has MS got no clue about ISO 8601??? Horrid. All |
90 |
|
// these newbies working on specs. this is as close as it |
91 |
|
// gets but not exactly since the 'T' can be left out |
92 |
|
writer.WriteElementString( "dateTime.iso860", dt.ToString( "s" ) ); |
93 |
} |
} |
94 |
else if( o is byte[] ) { |
else if( o is byte[] ) { |
|
StringWriter sw = new StringWriter(); |
|
|
XmlTextWriter tw = new XmlTextWriter( sw ); |
|
95 |
byte[] buf = (byte[])o; |
byte[] buf = (byte[])o; |
96 |
tw.WriteStartElement( "base64" ); |
writer.WriteStartElement( "base64" ); |
97 |
tw.WriteBase64( buf, 0, buf.Length); |
writer.WriteBase64( buf, 0, buf.Length); |
98 |
tw.WriteEndElement(); |
writer.WriteEndElement(); // base64 |
|
//tag = "base64"; |
|
|
//Write( tag, o ); |
|
|
writer.WriteLine( sw ); |
|
99 |
} |
} |
100 |
else if( o is XmlRpcStruct ) { |
else if( o is XmlRpcStruct ) { |
101 |
tag = "struct"; |
writer.WriteStartElement( "struct" ); |
|
writer.WriteLine( "<struct>" ); |
|
|
writer.Indent++; |
|
102 |
|
|
103 |
foreach( DictionaryEntry entry in (XmlRpcStruct)o ) { |
foreach( DictionaryEntry entry in (XmlRpcStruct)o ) { |
104 |
writer.WriteLine( "<member>" ); |
writer.WriteStartElement( "member" ); |
105 |
writer.Indent++; |
writer.WriteElementString( "name", (string)entry.Key ); |
106 |
writer.WriteLine( "<name>" ); |
writer.WriteStartElement( "value" ); |
|
writer.Indent++; |
|
|
writer.WriteLine( entry.Key ); |
|
|
writer.Indent--; |
|
|
writer.WriteLine( "</name>" ); |
|
|
writer.WriteLine( "<value>" ); |
|
|
writer.Indent++; |
|
107 |
Write( entry.Value ); |
Write( entry.Value ); |
108 |
writer.Indent--; |
writer.WriteEndElement(); // value |
109 |
writer.WriteLine( "</value>" ); |
writer.WriteEndElement(); // member |
|
writer.Indent--; |
|
|
writer.WriteLine( "</member>" ); |
|
110 |
} |
} |
111 |
writer.Indent--; |
writer.WriteEndElement(); // struct |
|
writer.WriteLine( "</struct>" ); |
|
112 |
} |
} |
113 |
else if( o is XmlRpcArray ) { |
else if( o is XmlRpcArray ) { |
114 |
tag = "array"; |
writer.WriteStartElement( "array" ); |
115 |
writer.WriteLine( "<array>" ); |
writer.WriteStartElement( "data" ); |
|
writer.Indent++; |
|
|
writer.WriteLine( "<data>" ); |
|
|
writer.Indent++; |
|
116 |
foreach( object entry in (XmlRpcArray)o ) { |
foreach( object entry in (XmlRpcArray)o ) { |
117 |
writer.WriteLine( "<value>" ); |
writer.WriteStartElement( "value" ); |
|
writer.Indent++; |
|
118 |
this.Write( entry ); |
this.Write( entry ); |
119 |
writer.Indent--; |
writer.WriteEndElement(); // value |
|
writer.WriteLine( "</value>" ); |
|
120 |
} |
} |
121 |
writer.Indent--; |
writer.WriteEndElement(); // data |
122 |
writer.WriteLine( "</data>" ); |
writer.WriteEndElement(); // array |
|
writer.Indent--; |
|
|
writer.WriteLine( "</array>" ); |
|
123 |
} |
} |
124 |
} |
} |
|
|
|
|
private void Write( string tag, object o ) |
|
|
{ |
|
|
writer.WriteLine( "<{0}>", tag ); |
|
|
writer.Indent++; |
|
|
writer.WriteLine( o ); |
|
|
writer.Indent--; |
|
|
writer.WriteLine( "</{0}>", tag ); |
|
|
} |
|
125 |
|
|
126 |
public string Parse( XmlRpcStruct s ) |
public string Parse( XmlRpcStruct s ) |
127 |
{ |
{ |
128 |
WriteHead(); |
WriteHead(); |
129 |
Write( s ); |
Write( s ); |
130 |
WriteTail(); |
WriteTail(); |
|
|
|
|
/* |
|
|
|
|
|
pile of bollocks. i thought XmlTextWriter was re-implemented? |
|
|
The indentation is still horribly broken |
|
|
|
|
|
StringWriter sw = new StringWriter(); |
|
|
XmlTextWriter tw = new XmlTextWriter( sw ); |
|
|
tw.Formatting = Formatting.Indented; |
|
|
tw.Indentation = 4; |
|
|
|
|
|
tw.WriteStartDocument(); |
|
|
tw.WriteStartElement( "foo" ); |
|
|
tw.WriteStartElement( "bar" ); |
|
|
tw.WriteString( "hello there" ); |
|
|
tw.WriteEndElement(); |
|
|
tw.WriteEndElement(); |
|
|
tw.WriteEndDocument(); |
|
|
*/ |
|
|
|
|
|
//tw.Indentation=4; |
|
131 |
return sw.ToString(); |
return sw.ToString(); |
132 |
} |
} |
|
|
|
|
//public override string ToString() |
|
|
//{ |
|
|
//} |
|
133 |
} |
} |
134 |
} |
} |