| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400 |
- //------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //------------------------------------------------------------
- namespace System.Xml
- {
- using System;
- abstract class ArrayHelper<TArgument, TArray>
- {
- public TArray[] ReadArray(XmlDictionaryReader reader, TArgument localName, TArgument namespaceUri, int maxArrayLength)
- {
- TArray[][] arrays = null;
- TArray[] array = null;
- int arrayCount = 0;
- int totalRead = 0;
- int count;
- if (reader.TryGetArrayLength(out count))
- {
- if (count > maxArrayLength)
- XmlExceptionHelper.ThrowMaxArrayLengthOrMaxItemsQuotaExceeded(reader, maxArrayLength);
- if (count > XmlDictionaryReader.MaxInitialArrayLength)
- count = XmlDictionaryReader.MaxInitialArrayLength;
- }
- else
- {
- count = 32;
- }
- while (true)
- {
- array = new TArray[count];
- int read = 0;
- while (read < array.Length)
- {
- int actual = ReadArray(reader, localName, namespaceUri, array, read, array.Length - read);
- if (actual == 0)
- break;
- read += actual;
- }
- if (totalRead > maxArrayLength - read)
- XmlExceptionHelper.ThrowMaxArrayLengthOrMaxItemsQuotaExceeded(reader, maxArrayLength);
- totalRead += read;
- if (read < array.Length || reader.NodeType == XmlNodeType.EndElement)
- break;
- if (arrays == null)
- arrays = new TArray[32][];
- arrays[arrayCount++] = array;
- count = count * 2;
- }
- if (totalRead != array.Length || arrayCount > 0)
- {
- TArray[] newArray = new TArray[totalRead];
- int offset = 0;
- for (int i = 0; i < arrayCount; i++)
- {
- Array.Copy(arrays[i], 0, newArray, offset, arrays[i].Length);
- offset += arrays[i].Length;
- }
- Array.Copy(array, 0, newArray, offset, totalRead - offset);
- array = newArray;
- }
- return array;
- }
- public void WriteArray(XmlDictionaryWriter writer, string prefix, TArgument localName, TArgument namespaceUri, XmlDictionaryReader reader)
- {
- int count;
- if (reader.TryGetArrayLength(out count))
- count = Math.Min(count, 256);
- else
- count = 256;
- TArray[] array = new TArray[count];
- while (true)
- {
- int actual = ReadArray(reader, localName, namespaceUri, array, 0, array.Length);
- if (actual == 0)
- break;
- WriteArray(writer, prefix, localName, namespaceUri, array, 0, actual);
- }
- }
- protected abstract int ReadArray(XmlDictionaryReader reader, TArgument localName, TArgument namespaceUri, TArray[] array, int offset, int count);
- protected abstract void WriteArray(XmlDictionaryWriter writer, string prefix, TArgument localName, TArgument namespaceUri, TArray[] array, int offset, int count);
- }
- // Supported array types
- // bool
- // Int16
- // Int32
- // Int64
- // Float
- // Double
- // Decimal
- // DateTime
- // Guid
- // TimeSpan
- // Int8 is not supported since sbyte[] is non-cls compliant, and uncommon
- // UniqueId is not supported since elements may be variable size strings
- class BooleanArrayHelperWithString : ArrayHelper<string, bool>
- {
- static public readonly BooleanArrayHelperWithString Instance = new BooleanArrayHelperWithString();
- protected override int ReadArray(XmlDictionaryReader reader, string localName, string namespaceUri, bool[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, string localName, string namespaceUri, bool[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class BooleanArrayHelperWithDictionaryString : ArrayHelper<XmlDictionaryString, bool>
- {
- static public readonly BooleanArrayHelperWithDictionaryString Instance = new BooleanArrayHelperWithDictionaryString();
- protected override int ReadArray(XmlDictionaryReader reader, XmlDictionaryString localName, XmlDictionaryString namespaceUri, bool[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, XmlDictionaryString localName, XmlDictionaryString namespaceUri, bool[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class Int16ArrayHelperWithString : ArrayHelper<string, Int16>
- {
- static public readonly Int16ArrayHelperWithString Instance = new Int16ArrayHelperWithString();
- protected override int ReadArray(XmlDictionaryReader reader, string localName, string namespaceUri, Int16[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, string localName, string namespaceUri, Int16[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class Int16ArrayHelperWithDictionaryString : ArrayHelper<XmlDictionaryString, Int16>
- {
- static public readonly Int16ArrayHelperWithDictionaryString Instance = new Int16ArrayHelperWithDictionaryString();
- protected override int ReadArray(XmlDictionaryReader reader, XmlDictionaryString localName, XmlDictionaryString namespaceUri, Int16[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, XmlDictionaryString localName, XmlDictionaryString namespaceUri, Int16[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class Int32ArrayHelperWithString : ArrayHelper<string, Int32>
- {
- static public readonly Int32ArrayHelperWithString Instance = new Int32ArrayHelperWithString();
- protected override int ReadArray(XmlDictionaryReader reader, string localName, string namespaceUri, Int32[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, string localName, string namespaceUri, Int32[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class Int32ArrayHelperWithDictionaryString : ArrayHelper<XmlDictionaryString, Int32>
- {
- static public readonly Int32ArrayHelperWithDictionaryString Instance = new Int32ArrayHelperWithDictionaryString();
- protected override int ReadArray(XmlDictionaryReader reader, XmlDictionaryString localName, XmlDictionaryString namespaceUri, Int32[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, XmlDictionaryString localName, XmlDictionaryString namespaceUri, Int32[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class Int64ArrayHelperWithString : ArrayHelper<string, Int64>
- {
- static public readonly Int64ArrayHelperWithString Instance = new Int64ArrayHelperWithString();
- protected override int ReadArray(XmlDictionaryReader reader, string localName, string namespaceUri, Int64[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, string localName, string namespaceUri, Int64[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class Int64ArrayHelperWithDictionaryString : ArrayHelper<XmlDictionaryString, Int64>
- {
- static public readonly Int64ArrayHelperWithDictionaryString Instance = new Int64ArrayHelperWithDictionaryString();
- protected override int ReadArray(XmlDictionaryReader reader, XmlDictionaryString localName, XmlDictionaryString namespaceUri, Int64[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, XmlDictionaryString localName, XmlDictionaryString namespaceUri, Int64[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class SingleArrayHelperWithString : ArrayHelper<string, float>
- {
- static public readonly SingleArrayHelperWithString Instance = new SingleArrayHelperWithString();
- protected override int ReadArray(XmlDictionaryReader reader, string localName, string namespaceUri, float[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, string localName, string namespaceUri, float[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class SingleArrayHelperWithDictionaryString : ArrayHelper<XmlDictionaryString, float>
- {
- static public readonly SingleArrayHelperWithDictionaryString Instance = new SingleArrayHelperWithDictionaryString();
- protected override int ReadArray(XmlDictionaryReader reader, XmlDictionaryString localName, XmlDictionaryString namespaceUri, float[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, XmlDictionaryString localName, XmlDictionaryString namespaceUri, float[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class DoubleArrayHelperWithString : ArrayHelper<string, double>
- {
- static public readonly DoubleArrayHelperWithString Instance = new DoubleArrayHelperWithString();
- protected override int ReadArray(XmlDictionaryReader reader, string localName, string namespaceUri, double[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, string localName, string namespaceUri, double[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class DoubleArrayHelperWithDictionaryString : ArrayHelper<XmlDictionaryString, double>
- {
- static public readonly DoubleArrayHelperWithDictionaryString Instance = new DoubleArrayHelperWithDictionaryString();
- protected override int ReadArray(XmlDictionaryReader reader, XmlDictionaryString localName, XmlDictionaryString namespaceUri, double[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, XmlDictionaryString localName, XmlDictionaryString namespaceUri, double[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class DecimalArrayHelperWithString : ArrayHelper<string, decimal>
- {
- static public readonly DecimalArrayHelperWithString Instance = new DecimalArrayHelperWithString();
- protected override int ReadArray(XmlDictionaryReader reader, string localName, string namespaceUri, decimal[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, string localName, string namespaceUri, decimal[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class DecimalArrayHelperWithDictionaryString : ArrayHelper<XmlDictionaryString, decimal>
- {
- static public readonly DecimalArrayHelperWithDictionaryString Instance = new DecimalArrayHelperWithDictionaryString();
- protected override int ReadArray(XmlDictionaryReader reader, XmlDictionaryString localName, XmlDictionaryString namespaceUri, decimal[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, XmlDictionaryString localName, XmlDictionaryString namespaceUri, decimal[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class DateTimeArrayHelperWithString : ArrayHelper<string, DateTime>
- {
- static public readonly DateTimeArrayHelperWithString Instance = new DateTimeArrayHelperWithString();
- protected override int ReadArray(XmlDictionaryReader reader, string localName, string namespaceUri, DateTime[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, string localName, string namespaceUri, DateTime[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class DateTimeArrayHelperWithDictionaryString : ArrayHelper<XmlDictionaryString, DateTime>
- {
- static public readonly DateTimeArrayHelperWithDictionaryString Instance = new DateTimeArrayHelperWithDictionaryString();
- protected override int ReadArray(XmlDictionaryReader reader, XmlDictionaryString localName, XmlDictionaryString namespaceUri, DateTime[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, XmlDictionaryString localName, XmlDictionaryString namespaceUri, DateTime[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class GuidArrayHelperWithString : ArrayHelper<string, Guid>
- {
- static public readonly GuidArrayHelperWithString Instance = new GuidArrayHelperWithString();
- protected override int ReadArray(XmlDictionaryReader reader, string localName, string namespaceUri, Guid[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, string localName, string namespaceUri, Guid[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class GuidArrayHelperWithDictionaryString : ArrayHelper<XmlDictionaryString, Guid>
- {
- static public readonly GuidArrayHelperWithDictionaryString Instance = new GuidArrayHelperWithDictionaryString();
- protected override int ReadArray(XmlDictionaryReader reader, XmlDictionaryString localName, XmlDictionaryString namespaceUri, Guid[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, XmlDictionaryString localName, XmlDictionaryString namespaceUri, Guid[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class TimeSpanArrayHelperWithString : ArrayHelper<string, TimeSpan>
- {
- static public readonly TimeSpanArrayHelperWithString Instance = new TimeSpanArrayHelperWithString();
- protected override int ReadArray(XmlDictionaryReader reader, string localName, string namespaceUri, TimeSpan[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, string localName, string namespaceUri, TimeSpan[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- class TimeSpanArrayHelperWithDictionaryString : ArrayHelper<XmlDictionaryString, TimeSpan>
- {
- static public readonly TimeSpanArrayHelperWithDictionaryString Instance = new TimeSpanArrayHelperWithDictionaryString();
- protected override int ReadArray(XmlDictionaryReader reader, XmlDictionaryString localName, XmlDictionaryString namespaceUri, TimeSpan[] array, int offset, int count)
- {
- return reader.ReadArray(localName, namespaceUri, array, offset, count);
- }
- protected override void WriteArray(XmlDictionaryWriter writer, string prefix, XmlDictionaryString localName, XmlDictionaryString namespaceUri, TimeSpan[] array, int offset, int count)
- {
- writer.WriteArray(prefix, localName, namespaceUri, array, offset, count);
- }
- }
- }
|