void GenerateWriteObjectElement (XmlMapping xmlMap, string ob, bool isValueList)
{
XmlTypeMapping typeMap = xmlMap as XmlTypeMapping;
Type xmlMapType = (typeMap != null) ? typeMap.TypeData.Type : typeof(object[]);
ClassMap map = (ClassMap)xmlMap.ObjectMap;
if (!GenerateWriteHook (HookType.attributes, xmlMapType))
{
if (map.NamespaceDeclarations != null) {
WriteLine ("WriteNamespaceDeclarations ((XmlSerializerNamespaces) " + ob + ".@" + map.NamespaceDeclarations.Name + ");");
WriteLine ("");
}
XmlTypeMapMember anyAttrMember = map.DefaultAnyAttributeMember;
if (anyAttrMember != null)
{
if (!GenerateWriteMemberHook (xmlMapType, anyAttrMember))
{
string cond = GenerateMemberHasValueCondition (anyAttrMember, ob, isValueList);
if (cond != null) WriteLineInd ("if (" + cond + ") {");
string tmpVar = GetObTempVar ();
WriteLine ("ICollection " + tmpVar + " = " + GenerateGetMemberValue (anyAttrMember, ob, isValueList) + ";");
WriteLineInd ("if (" + tmpVar + " != null) {");
string tmpVar2 = GetObTempVar ();
WriteLineInd ("foreach (XmlAttribute " + tmpVar2 + " in " + tmpVar + ")");
WriteLineInd ("if (" + tmpVar2 + ".NamespaceURI != xmlNamespace)");
WriteLine ("WriteXmlAttribute (" + tmpVar2 + ", " + ob + ");");
Unindent ();
Unindent ();
WriteLineUni ("}");
if (cond != null) WriteLineUni ("}");
WriteLine ("");
GenerateEndHook ();
}
}
ICollection attributes = map.AttributeMembers;
if (attributes != null)
{
foreach (XmlTypeMapMemberAttribute attr in attributes)
{
if (GenerateWriteMemberHook (xmlMapType, attr)) continue;
string val = GenerateGetMemberValue (attr, ob, isValueList);
string cond = GenerateMemberHasValueCondition (attr, ob, isValueList);
if (cond != null) WriteLineInd ("if (" + cond + ") {");
string strVal = GenerateGetStringValue (attr.MappedType, attr.TypeData, val, false);
WriteLine ("WriteAttribute (" + GetLiteral(attr.AttributeName) + ", " + GetLiteral(attr.Namespace) + ", " + strVal + ");");
if (cond != null) WriteLineUni ("}");
GenerateEndHook ();
}
WriteLine ("");
}
GenerateEndHook ();
}
if (!GenerateWriteHook (HookType.elements, xmlMapType))
{
ICollection members = map.ElementMembers;
if (members != null)
{
foreach (XmlTypeMapMemberElement member in members)
{
if (GenerateWriteMemberHook (xmlMapType, member)) continue;
string cond = GenerateMemberHasValueCondition (member, ob, isValueList);
if (cond != null) WriteLineInd ("if (" + cond + ") {");
string memberValue = GenerateGetMemberValue (member, ob, isValueList);
Type memType = member.GetType();
if (memType == typeof(XmlTypeMapMemberList))
{
GenerateWriteMemberElement ((XmlTypeMapElementInfo) member.ElementInfo[0], memberValue);
}
else if (memType == typeof(XmlTypeMapMemberFlatList))
{
WriteLineInd ("if (" + memberValue + " != null) {");
GenerateWriteListContent (ob, member.TypeData, ((XmlTypeMapMemberFlatList)member).ListMap, memberValue, false);
WriteLineUni ("}");
}
else if (memType == typeof(XmlTypeMapMemberAnyElement))
{
WriteLineInd ("if (" + memberValue + " != null) {");
GenerateWriteAnyElementContent ((XmlTypeMapMemberAnyElement)member, memberValue);
WriteLineUni ("}");
}
else if (memType == typeof(XmlTypeMapMemberAnyElement))
{
WriteLineInd ("if (" + memberValue + " != null) {");
GenerateWriteAnyElementContent ((XmlTypeMapMemberAnyElement)member, memberValue);
WriteLineUni ("}");
}
else if (memType == typeof(XmlTypeMapMemberAnyAttribute))
{
// Ignore
}
else if (memType == typeof(XmlTypeMapMemberElement))
{
if (member.ElementInfo.Count == 1) {
XmlTypeMapElementInfo elem = (XmlTypeMapElementInfo)member.ElementInfo[0];
GenerateWriteMemberElement (elem, GetCast(elem.TypeData, member.TypeData, memberValue));
}
else if (member.ChoiceMember != null)
{
string choiceValue = ob + ".@" + member.ChoiceMember;
foreach (XmlTypeMapElementInfo elem in member.ElementInfo) {
WriteLineInd ("if (" + choiceValue + " == " + GetLiteral(elem.ChoiceValue) + ") {");
GenerateWriteMemberElement (elem, GetCast(elem.TypeData, member.TypeData, memberValue));
WriteLineUni ("}");
}
}
else
{
// WriteLineInd ("if (" + memberValue + " == null) {");
// GenerateWriteMemberElement ((XmlTypeMapElementInfo)member.ElementInfo[0], memberValue);
// WriteLineUni ("}");
bool first = true;
foreach (XmlTypeMapElementInfo elem in member.ElementInfo)
{
WriteLineInd ((first?"":"else ") + "if (" + memberValue + " is " + elem.TypeData.CSharpFullName + ") {");
GenerateWriteMemberElement (elem, GetCast(elem.TypeData, member.TypeData, memberValue));
WriteLineUni ("}");
first = false;
}
}
}
else
throw new InvalidOperationException ("Unknown member type");
if (cond != null)
WriteLineUni ("}");
GenerateEndHook ();
}
}
GenerateEndHook ();
}
}