private SoapArrayInfo ParseArrayType(string value)
{
if (value == null)
{
throw new ArgumentNullException(SR.Format(SR.XmlMissingArrayType, CurrentTag()));
}
if (value.Length == 0)
{
throw new ArgumentException(SR.Format(SR.XmlEmptyArrayType, CurrentTag()), nameof(value));
}
char[] chars = value.ToCharArray();
int charsLength = chars.Length;
SoapArrayInfo soapArrayInfo = new SoapArrayInfo();
// Parse backwards to get length first, then optional dimensions, then qname.
int pos = charsLength - 1;
// Must end with ]
if (chars[pos] != ']')
{
throw new ArgumentException(SR.XmlInvalidArraySyntax, nameof(value));
}
pos--;
// Find [
while (pos != -1 && chars[pos] != '[')
{
if (chars[pos] == ',')
throw new ArgumentException(SR.Format(SR.XmlInvalidArrayDimentions, CurrentTag()), nameof(value));
pos--;
}
if (pos == -1)
{
throw new ArgumentException(SR.XmlMismatchedArrayBrackets, nameof(value));
}
int len = charsLength - pos - 2;
if (len > 0)
{
string lengthString = new String(chars, pos + 1, len);
try
{
soapArrayInfo.length = Int32.Parse(lengthString, CultureInfo.InvariantCulture);
}
catch (Exception e)
{
if (e is OutOfMemoryException)
{
throw;
}
throw new ArgumentException(SR.Format(SR.XmlInvalidArrayLength, lengthString), nameof(value));
}
}
else
{
soapArrayInfo.length = -1;
}
pos--;
soapArrayInfo.jaggedDimensions = 0;
while (pos != -1 && chars[pos] == ']')
{
pos--;
if (pos < 0)
throw new ArgumentException(SR.XmlMismatchedArrayBrackets, nameof(value));
if (chars[pos] == ',')
throw new ArgumentException(SR.Format(SR.XmlInvalidArrayDimentions, CurrentTag()), nameof(value));
else if (chars[pos] != '[')
throw new ArgumentException(SR.XmlInvalidArraySyntax, nameof(value));
pos--;
soapArrayInfo.jaggedDimensions++;
}
soapArrayInfo.dimensions = 1;
// everything else is qname - validation of qnames?
soapArrayInfo.qname = new String(chars, 0, pos + 1);
return soapArrayInfo;
}