internal void StartElement(String prefix, String name, String urn)
{
#if _DEBUG
InternalST.Soap( this,SerTraceString("StartElement Begin ", (ParseRecord)stack.Peek(), name, prefix, urn, currentState, headerState));
#endif
String actualName = NameFilter(name);
String actualPrefix = prefix;
ParseRecord pr = null;
if (!((urn == null) || (urn.Length == 0)) && ((prefix == null) || (prefix.Length == 0)))
{
// Need to assign a prefix to the urn
if (nameSpaceToKey.ContainsKey(urn))
actualPrefix = (String)nameSpaceToKey[urn];
else
{
actualPrefix = NextPrefix();
nameSpaceToKey[urn] = actualPrefix;
}
InternalST.Soap( this,"StartElement Begin null urn assigned prefix ", actualPrefix);
}
switch (currentState)
{
case InternalParseStateE.Object:
pr = GetPr();
pr.PRname = actualName;
pr.PRnameXmlKey = actualPrefix;
pr.PRxmlNameSpace = urn;
pr.PRparseStateEnum = InternalParseStateE.Object;
if ((String.Compare(name, "Array", StringComparison.OrdinalIgnoreCase ) == 0) && actualPrefix.Equals(soapKey))
pr.PRparseTypeEnum = InternalParseTypeE.Object;
else if (((String.Compare(name, "anyType", StringComparison.OrdinalIgnoreCase ) == 0) || (String.Compare(name, "ur-type", StringComparison.OrdinalIgnoreCase ) == 0)) && actualPrefix.Equals(xsdKey))
{
pr.PRname = "System.Object";
pr.PRnameXmlKey = urtKey;
pr.PRxmlNameSpace = urn;
pr.PRparseTypeEnum = InternalParseTypeE.Object;
}
else if (String.Compare(urn, "http://schemas.xmlsoap.org/soap/envelope/", StringComparison.OrdinalIgnoreCase) == 0)
{
if (String.Compare(name, "Envelope", StringComparison.OrdinalIgnoreCase) == 0)
{
if (isEnvelope)
throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_Parser_Envelope"),prefix+":"+name));
isEnvelope = true;
pr.PRparseTypeEnum = InternalParseTypeE.Envelope;
}
else if (String.Compare(name, "Body", StringComparison.OrdinalIgnoreCase) == 0)
{
if (!isEnvelope)
throw new SerializationException(SoapUtil.GetResourceString("Serialization_Parser_BodyChild"));
if (isBody)
throw new SerializationException(SoapUtil.GetResourceString("Serialization_Parser_BodyOnce"));
isBody = true;
headerState = HeaderStateEnum.None;
isTopFound = false;
pr.PRparseTypeEnum = InternalParseTypeE.Body;
}
else if (String.Compare(name, "Header", StringComparison.OrdinalIgnoreCase) == 0)
{
if (!isEnvelope)
throw new SerializationException(SoapUtil.GetResourceString("Serialization_Parser_Header"));
pr.PRparseTypeEnum = InternalParseTypeE.Headers;
headerState = HeaderStateEnum.FirstHeaderRecord;
}
else
pr.PRparseTypeEnum = InternalParseTypeE.Object; //SoapFault has an envelope key
}
else
{
pr.PRparseTypeEnum = InternalParseTypeE.Object;
}
stack.Push(pr);
break;
case InternalParseStateE.Member:
pr = GetPr();
// Members of Top object records cannot be reused because of the need to resolving fake element
ParseRecord objectPr = (ParseRecord)stack.Peek();
pr.PRname = actualName;
pr.PRnameXmlKey = actualPrefix;
pr.PRxmlNameSpace = urn;
pr.PRparseTypeEnum = InternalParseTypeE.Member;
pr.PRparseStateEnum = InternalParseStateE.Member;
stack.Push(pr);
break;
case InternalParseStateE.MemberChild:
objectPr = (ParseRecord)stack.PeekPeek();
pr = (ParseRecord)stack.Peek();
pr.PRmemberValueEnum = InternalMemberValueE.Nested;
ProcessAttributes(pr, objectPr);
switch (headerState)
{
case HeaderStateEnum.None:
case HeaderStateEnum.TopLevelObject:
InternalST.Soap( this,"ObjectReader.Parse 1");
objectReader.Parse(pr);
pr.PRisParsed = true;
break;
case HeaderStateEnum.HeaderRecord:
case HeaderStateEnum.NestedObject:
ProcessHeaderMember(pr);
break;
}
ParseRecord nestPr = GetPr();
nestPr.PRparseTypeEnum = InternalParseTypeE.Member;
nestPr.PRparseStateEnum = InternalParseStateE.Member;
nestPr.PRname = actualName;
nestPr.PRnameXmlKey = actualPrefix;
pr.PRxmlNameSpace = urn;
currentState = InternalParseStateE.Member;
stack.Push(nestPr);
break;
default:
MarshalError("StartElement", (ParseRecord)stack.Peek(), actualName, currentState);
break;
}
#if _DEBUG
InternalST.Soap( this,SerTraceString("StartElement End ", (ParseRecord)stack.Peek(), name, currentState, headerState));
#endif
}