1 // mono binary-writer-method-gen.exe > System.Xml/XmlBinaryDictionaryWriterAutoGen.cs
3 using System
.Collections
.Generic
;
4 using System
.Globalization
;
6 using System
.CodeDom
.Compiler
;
7 using Microsoft
.CSharp
;
11 public static void Main ()
13 Console
.Out
.NewLine
= "\n";
14 Type
[] types
= new Type
[] {
15 typeof (bool), typeof (DateTime
), typeof (decimal), typeof (double),
16 typeof (Guid
), typeof (short), typeof (int), typeof (long), typeof (float), typeof (TimeSpan
) };
18 Dictionary
<Type
,byte> table
= new Dictionary
<Type
,byte> ();
19 // LAMESPEC: [MC-NBFX] section 2.3.3 dedscribes wrong RecordTypes.
20 table
.Add (typeof (bool), 0xB5);
21 table
.Add (typeof (short), 0x8B);
22 table
.Add (typeof (int), 0x8D);
23 table
.Add (typeof (long), 0x8F);
24 table
.Add (typeof (float), 0x91);
25 table
.Add (typeof (double), 0x93);
26 table
.Add (typeof (decimal), 0x95);
27 table
.Add (typeof (DateTime
), 0x97);
28 table
.Add (typeof (TimeSpan
), 0xAF);
29 table
.Add (typeof (Guid
), 0xB1);
33 using BF = System.Xml.XmlBinaryFormat;
37 internal partial class XmlBinaryDictionaryWriter : XmlDictionaryWriter
39 void CheckWriteArrayArguments (Array array, int offset, int length)
42 throw new ArgumentNullException (""array"");
44 throw new ArgumentOutOfRangeException (""offset is negative"");
45 if (offset > array.Length)
46 throw new ArgumentOutOfRangeException (""offset exceeds the length of the destination array"");
48 throw new ArgumentOutOfRangeException (""length is negative"");
49 if (length > array.Length - offset)
50 throw new ArgumentOutOfRangeException (""length + offset exceeds the length of the destination array"");
53 void CheckDictionaryStringArgs (XmlDictionaryString localName, XmlDictionaryString namespaceUri)
55 if (localName == null)
56 throw new ArgumentNullException (""localName"");
57 if (namespaceUri == null)
58 throw new ArgumentNullException (""namespaceUri"");
62 foreach (Type type
in types
) {
65 public override void WriteArray (string prefix, XmlDictionaryString localName, XmlDictionaryString namespaceUri, {0} [] array, int offset, int length)
67 CheckDictionaryStringArgs (localName, namespaceUri);
68 writer.Write (BF.Array);
69 WriteStartElement (prefix, localName, namespaceUri);
71 WriteArrayRemaining (array, offset, length);
74 public override void WriteArray (string prefix, string localName, string namespaceUri, {0} [] array, int offset, int length)
76 CheckWriteArrayArguments (array, offset, length);
77 writer.Write (BF.Array);
78 WriteStartElement (prefix, localName, namespaceUri);
80 WriteArrayRemaining (array, offset, length);
83 void WriteArrayRemaining ({0} [] array, int offset, int length)
85 writer.Write ((byte) 0x{2:X02}); // ident
86 writer.WriteFlexibleInt (length);
87 for (int i = offset; i < offset + length; i++)
88 WriteValueContent (array [i]);
89 }}", ToCSharp (type
), type
.Name
, table
[type
]);
92 // WriteArrayRemaining() is generated, but are modified and moved into
93 // XmlBinaryDictionaryWriter. (I keep it open here so that we
94 // make sure to remove this before compiling. Remove this to get
100 Console
.WriteLine (@"
105 static CodeDomProvider cs
= new CSharpCodeProvider ();
107 static string ToCSharp (Type type
)
109 string r
= cs
.GetTypeOutput (new CodeTypeReference (type
));
110 return r
!= type
.FullName
? r
: type
.Name
;