private void ParseMember(ParseRecord pr)
{
ParseRecord parentPr = (ParseRecord) this.stack.Peek();
if (parentPr != null)
{
string pRname = parentPr.PRname;
}
if ((parentPr.PRdtType == Converter.typeofSoapFault) && (pr.PRname.ToLower(CultureInfo.InvariantCulture) == "faultstring"))
{
this.faultString = pr.PRvalue;
}
if ((parentPr.PRobjectPositionEnum == InternalObjectPositionE.Top) && !this.isTopObjectResolved)
{
if (pr.PRdtType == Converter.typeofString)
{
this.ParseString(pr, parentPr);
}
this.topStack.Push(pr.Copy());
}
else
{
switch (pr.PRmemberTypeEnum)
{
case InternalMemberTypeE.Item:
this.ParseArrayMember(pr);
return;
}
if (parentPr.PRobjectInfo != null)
{
parentPr.PRobjectInfo.AddMemberSeen();
}
bool flag = ((this.IsFakeTopObject && (parentPr.PRobjectPositionEnum == InternalObjectPositionE.Top)) && (parentPr.PRobjectInfo != null)) && (parentPr.PRdtType != Converter.typeofSoapFault);
if ((pr.PRdtType == null) && parentPr.PRobjectInfo.isTyped)
{
if (flag)
{
pr.PRdtType = parentPr.PRobjectInfo.GetType(this.paramPosition++);
}
else
{
pr.PRdtType = parentPr.PRobjectInfo.GetType(pr.PRname);
}
if (pr.PRdtType == null)
{
throw new SerializationException(string.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_TypeResolved"), new object[] { parentPr.PRnewObj + " " + pr.PRname }));
}
pr.PRdtTypeCode = Converter.ToCode(pr.PRdtType);
}
else if (flag)
{
this.paramPosition++;
}
if (pr.PRmemberValueEnum == InternalMemberValueE.Null)
{
parentPr.PRobjectInfo.AddValue(pr.PRname, null);
}
else if (pr.PRmemberValueEnum == InternalMemberValueE.Nested)
{
this.ParseObject(pr);
this.stack.Push(pr);
if ((pr.PRobjectInfo != null) && pr.PRobjectInfo.objectType.IsValueType)
{
if (this.IsFakeTopObject)
{
parentPr.PRobjectInfo.AddParamName(pr.PRname);
}
pr.PRisValueTypeFixup = true;
this.valueFixupStack.Push(new ValueFixup(parentPr.PRnewObj, pr.PRname, parentPr.PRobjectInfo));
}
else
{
parentPr.PRobjectInfo.AddValue(pr.PRname, pr.PRnewObj);
}
}
else if (pr.PRmemberValueEnum == InternalMemberValueE.Reference)
{
object obj2 = this.m_objectManager.GetObject(pr.PRidRef);
if (obj2 == null)
{
parentPr.PRobjectInfo.AddValue(pr.PRname, null);
parentPr.PRobjectInfo.RecordFixup(parentPr.PRobjectId, pr.PRname, pr.PRidRef);
}
else
{
parentPr.PRobjectInfo.AddValue(pr.PRname, obj2);
}
}
else if (pr.PRmemberValueEnum == InternalMemberValueE.InlineValue)
{
if (pr.PRdtType == Converter.typeofString)
{
this.ParseString(pr, parentPr);
parentPr.PRobjectInfo.AddValue(pr.PRname, pr.PRvalue);
}
else if (pr.PRdtTypeCode != InternalPrimitiveTypeE.Invalid)
{
object pRvarValue = null;
if (pr.PRvarValue != null)
{
pRvarValue = pr.PRvarValue;
}
else
{
pRvarValue = Converter.FromString(pr.PRvalue, pr.PRdtTypeCode);
}
if ((pr.PRdtTypeCode == InternalPrimitiveTypeE.QName) && (pRvarValue != null))
{
SoapQName name = (SoapQName) pRvarValue;
if (name.Key != null)
{
if (name.Key.Length == 0)
{
name.Namespace = (string) this.soapHandler.keyToNamespaceTable["xmlns"];
}
else
{
name.Namespace = (string) this.soapHandler.keyToNamespaceTable["xmlns:" + name.Key];
}
}
}
parentPr.PRobjectInfo.AddValue(pr.PRname, pRvarValue);
}
else if (pr.PRarrayTypeEnum == InternalArrayTypeE.Base64)
{
parentPr.PRobjectInfo.AddValue(pr.PRname, Convert.FromBase64String(this.FilterBin64(pr.PRvalue)));
}
else if ((pr.PRdtType != Converter.typeofObject) || (pr.PRvalue == null))
{
if ((pr.PRdtType != null) && pr.PRdtType.IsEnum)
{
object obj3 = Enum.Parse(pr.PRdtType, pr.PRvalue);
parentPr.PRobjectInfo.AddValue(pr.PRname, obj3);
}
else if ((pr.PRdtType != null) && (pr.PRdtType == Converter.typeofTypeArray))
{
parentPr.PRobjectInfo.AddValue(pr.PRname, pr.PRvarValue);
}
else
{
if (!pr.PRisRegistered && (pr.PRobjectId > 0L))
{
if (pr.PRvalue == null)
{
pr.PRvalue = "";
}
this.RegisterObject(pr.PRvalue, pr, parentPr);
}
if (pr.PRdtType == Converter.typeofSystemVoid)
{
parentPr.PRobjectInfo.AddValue(pr.PRname, pr.PRdtType);
}
else if (parentPr.PRobjectInfo.isSi)
{
parentPr.PRobjectInfo.AddValue(pr.PRname, pr.PRvalue);
}
}
}
else if ((parentPr != null) && (parentPr.PRdtType == Converter.typeofHeader))
{
pr.PRdtType = Converter.typeofString;
this.ParseString(pr, parentPr);
parentPr.PRobjectInfo.AddValue(pr.PRname, pr.PRvalue);
}
}
else
{
this.ParseError(pr, parentPr);
}
}
}