private string GenerateEncodedMembersElement(XmlMembersMapping xmlMembersMapping)
{
ElementAccessor element = xmlMembersMapping.Accessor;
MembersMapping membersMapping = (MembersMapping)element.Mapping;
MemberMapping[] mappings = membersMapping.Members;
bool hasWrapperElement = membersMapping.HasWrapperElement;
bool writeAccessors = membersMapping.WriteAccessors;
string methodName = NextMethodName(element.Name);
Writer.WriteLine();
Writer.Write("public object[] ");
Writer.Write(methodName);
Writer.WriteLine("() {");
Writer.Indent++;
Writer.WriteLine("Reader.MoveToContent();");
Writer.Write("object[] p = new object[");
Writer.Write(mappings.Length.ToString(CultureInfo.InvariantCulture));
Writer.WriteLine("];");
InitializeValueTypes("p", mappings);
if (hasWrapperElement)
{
WriteReadNonRoots();
if (membersMapping.ValidateRpcWrapperElement)
{
Writer.Write("if (!");
WriteXmlNodeEqual("Reader", element.Name, element.Form == XmlSchemaForm.Qualified ? element.Namespace : "");
Writer.WriteLine(") throw CreateUnknownNodeException();");
}
Writer.WriteLine("bool isEmptyWrapper = Reader.IsEmptyElement;");
Writer.WriteLine("Reader.ReadStartElement();");
}
Member[] members = new Member[mappings.Length];
for (int i = 0; i < mappings.Length; i++)
{
MemberMapping mapping = mappings[i];
string source = "p[" + i.ToString(CultureInfo.InvariantCulture) + "]";
string arraySource = source;
if (mapping.Xmlns != null)
{
arraySource = "((" + mapping.TypeDesc.CSharpName + ")" + source + ")";
}
Member member = new Member(this, source, arraySource, "a", i, mapping);
if (!mapping.IsSequence)
member.ParamsReadSource = "paramsRead[" + i.ToString(CultureInfo.InvariantCulture) + "]";
members[i] = member;
if (mapping.CheckSpecified == SpecifiedAccessor.ReadWrite)
{
string nameSpecified = mapping.Name + "Specified";
for (int j = 0; j < mappings.Length; j++)
{
if (mappings[j].Name == nameSpecified)
{
member.CheckSpecifiedSource = "p[" + j.ToString(CultureInfo.InvariantCulture) + "]";
break;
}
}
}
}
string fixupMethodName = "fixup_" + methodName;
bool anyFixups = WriteMemberFixupBegin(members, fixupMethodName, "p");
if (members.Length > 0 && members[0].Mapping.IsReturnValue) Writer.WriteLine("IsReturnValue = true;");
string checkTypeHrefSource = (!hasWrapperElement && !writeAccessors) ? "hrefList" : null;
if (checkTypeHrefSource != null)
WriteInitCheckTypeHrefList(checkTypeHrefSource);
WriteParamsRead(mappings.Length);
int loopIndex = WriteWhileNotLoopStart();
Writer.Indent++;
string unrecognizedElementSource = checkTypeHrefSource == null ? "UnknownNode((object)p);" : "if (Reader.GetAttribute(\"id\", null) != null) { ReadReferencedElement(); } else { UnknownNode((object)p); }";
WriteMemberElements(members, unrecognizedElementSource, "UnknownNode((object)p);", null, null, checkTypeHrefSource);
Writer.WriteLine("Reader.MoveToContent();");
WriteWhileLoopEnd(loopIndex);
if (hasWrapperElement)
Writer.WriteLine("if (!isEmptyWrapper) ReadEndElement();");
if (checkTypeHrefSource != null)
WriteHandleHrefList(members, checkTypeHrefSource);
Writer.WriteLine("ReadReferencedElements();");
Writer.WriteLine("return p;");
Writer.Indent--;
Writer.WriteLine("}");
if (anyFixups) WriteFixupMethod(fixupMethodName, members, "object[]", false, false, "p");
return methodName;
}