private void ProcessArray(ParseRecord pr, int firstIndex, bool IsInterop)
{
InternalST.Soap( this, "ProcessArray Enter ",firstIndex," ",pr.PRkeyDt);
String dimString = null;
String xmlKey = pr.PRtypeXmlKey;
InternalPrimitiveTypeE primitiveArrayTypeCode = InternalPrimitiveTypeE.Invalid;
pr.PRobjectTypeEnum = InternalObjectTypeE.Array;
pr.PRmemberTypeEnum = InternalMemberTypeE.Item; // Need this set in case this it is a nested empty array
pr.PRprimitiveArrayTypeString = pr.PRkeyDt.Substring(0, firstIndex);
dimString = pr.PRkeyDt.Substring(firstIndex);
if (IsInterop)
{
String assemblyString = (String)assemKeyToInteropAssemblyTable[pr.PRtypeXmlKey];
pr.PRarrayElementType = objectReader.Bind(assemblyString, pr.PRprimitiveArrayTypeString); // try to get type from SerializationBinder
if (pr.PRarrayElementType == null)
pr.PRarrayElementType = SoapServices.GetInteropTypeFromXmlType(pr.PRprimitiveArrayTypeString, assemblyString);
if (pr.PRarrayElementType == null)
pr.PRarrayElementType = SoapServices.GetInteropTypeFromXmlElement(pr.PRprimitiveArrayTypeString, assemblyString);
if (pr.PRarrayElementType == null)
throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_TypeElement"),pr.PRname+" "+pr.PRkeyDt));
pr.PRprimitiveArrayTypeString = pr.PRarrayElementType.FullName;
}
else
{
primitiveArrayTypeCode = Converter.ToCode(pr.PRprimitiveArrayTypeString);
if (primitiveArrayTypeCode != InternalPrimitiveTypeE.Invalid)
{
pr.PRprimitiveArrayTypeString = Converter.SoapToComType(primitiveArrayTypeCode);
xmlKey = urtKey;
}
else if (String.Compare(pr.PRprimitiveArrayTypeString, "string", StringComparison.Ordinal) == 0)
{
pr.PRprimitiveArrayTypeString = "System.String";
xmlKey = urtKey;
}
else if (String.Compare(pr.PRprimitiveArrayTypeString, "anyType", StringComparison.Ordinal) == 0 || String.Compare(pr.PRprimitiveArrayTypeString, "ur-type", StringComparison.Ordinal) == 0)
{
pr.PRprimitiveArrayTypeString = "System.Object";
xmlKey = urtKey;
}
}
int beginIndex = firstIndex;
int endIndex = pr.PRkeyDt.IndexOf(']', beginIndex+1);
if (endIndex < 1)
throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_ArrayDimensions"),pr.PRkeyDt));
int outRank = 0;
int[] outDimensions = null;
String outDimSignature = null;
InternalArrayTypeE outArrayTypeEnum = InternalArrayTypeE.Empty;
int numBrackets = 0;
StringBuilder elementSig = new StringBuilder(10);
while (true)
{
numBrackets++;
outDimensions = ParseArrayDimensions(pr.PRkeyDt.Substring(beginIndex, endIndex-beginIndex+1), out outRank, out outDimSignature, out outArrayTypeEnum);
if (endIndex+1 == pr.PRkeyDt.Length)
break;
elementSig.Append(outDimSignature); // Don't want last dimension in element sig
beginIndex = endIndex+1;
endIndex = pr.PRkeyDt.IndexOf(']', beginIndex);
}
pr.PRlengthA = outDimensions;
pr.PRrank = outRank;
if (numBrackets == 1)
{
pr.PRarrayElementTypeCode = primitiveArrayTypeCode;
pr.PRarrayTypeEnum = outArrayTypeEnum;
pr.PRarrayElementTypeString = pr.PRprimitiveArrayTypeString;
}
else
{
pr.PRarrayElementTypeCode = InternalPrimitiveTypeE.Invalid;
pr.PRarrayTypeEnum = InternalArrayTypeE.Rectangular;
pr.PRarrayElementTypeString = pr.PRprimitiveArrayTypeString+elementSig.ToString();
}
InternalST.Soap( this, "ProcessArray GetType ",pr.PRarrayElementType);
if (!IsInterop || numBrackets > 1)
{
pr.PRarrayElementType = ProcessGetType(pr.PRarrayElementTypeString, xmlKey, out pr.PRassemblyName);
if (pr.PRarrayElementType == null)
throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_ArrayType"),pr.PRarrayElementType));
if ((pr.PRarrayElementType == SoapUtil.typeofObject))
{
pr.PRisArrayVariant = true;
xmlKey = urtKey;
}
}
InternalST.Soap( this, "ProcessArray Exit");
}