System.Runtime.Serialization.Formatters.Soap.SoapHandler.ProcessArray C# (CSharp) Method

ProcessArray() private method

private ProcessArray ( ParseRecord pr, int firstIndex, bool IsInterop ) : void
pr ParseRecord
firstIndex int
IsInterop bool
return void
        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");
        }