* MapCodeGenerator.cs: Changed some methods to make them easier to reuse.
authorLluis Sanchez <lluis@novell.com>
Wed, 11 Feb 2004 11:27:23 +0000 (11:27 -0000)
committerLluis Sanchez <lluis@novell.com>
Wed, 11 Feb 2004 11:27:23 +0000 (11:27 -0000)
* TypeTranslator.cs: NMTOKENS, ENTITIES and IDREFS must be mapped to
  string, not string[].
* XmlCodeExporter.cs: AddMappingMetadata(): improved attribute generation
  for array parameters. In general, improved generation of schema Form
  property.
* XmlMemberMapping.cs: Added Form property.
* XmlReflectionImporter.cs: Types that inherit from other types cannot be
  simple types. Added a check for this.
* XmlSchemaExporter.cs: several fixes: better generation of IsMixed and
  Form. The key used to determine if a map has been already generated must
  include the XmlType, since there can be two xml types with the same CLR
  type and namespace (for example, they may differ in the Form property).
* XmlSchemaImporter.cs: When getting the TypeData for a schema element,
  also return the corresponding map. There can be two maps that have the
  same TypeData, so given a TypeData is not always possible to get the
  correct corresponding map (for example two arrays that only differ in the
  Form of the item).
* XmlTypeMapping.cs: Added method to set if a map can represent a simple
  type or not.

svn path=/trunk/mcs/; revision=22968

mcs/class/System.XML/System.Xml.Serialization/ChangeLog
mcs/class/System.XML/System.Xml.Serialization/MapCodeGenerator.cs
mcs/class/System.XML/System.Xml.Serialization/TypeTranslator.cs
mcs/class/System.XML/System.Xml.Serialization/XmlCodeExporter.cs
mcs/class/System.XML/System.Xml.Serialization/XmlMemberMapping.cs
mcs/class/System.XML/System.Xml.Serialization/XmlReflectionImporter.cs
mcs/class/System.XML/System.Xml.Serialization/XmlSchemaExporter.cs
mcs/class/System.XML/System.Xml.Serialization/XmlSchemaImporter.cs
mcs/class/System.XML/System.Xml.Serialization/XmlTypeMapping.cs

index f7d30780e60dba6131eb6ad567e4dabb5df8cda9..010565c8d93ba7aac58163c34c22f2e3442d0e60 100755 (executable)
@@ -1,3 +1,26 @@
+2004-02-11  Lluis Sanchez Gual  <lluis@ximian.com>
+
+       * MapCodeGenerator.cs: Changed some methods to make them easier to reuse.
+       * TypeTranslator.cs: NMTOKENS, ENTITIES and IDREFS must be mapped to
+         string, not string[].
+       * XmlCodeExporter.cs: AddMappingMetadata(): improved attribute generation
+         for array parameters. In general, improved generation of schema Form 
+         property.
+       * XmlMemberMapping.cs: Added Form property.
+       * XmlReflectionImporter.cs: Types that inherit from other types cannot be
+         simple types. Added a check for this.
+       * XmlSchemaExporter.cs: several fixes: better generation of IsMixed and
+         Form. The key used to determine if a map has been already generated must
+         include the XmlType, since there can be two xml types with the same CLR
+         type and namespace (for example, they may differ in the Form property).
+       * XmlSchemaImporter.cs: When getting the TypeData for a schema element,
+         also return the corresponding map. There can be two maps that have the
+         same TypeData, so given a TypeData is not always possible to get the
+         correct corresponding map (for example two arrays that only differ in the
+         Form of the item).
+       * XmlTypeMapping.cs: Added method to set if a map can represent a simple
+         type or not.
+
 2004-02-04  Lluis Sanchez Gual  <lluis@ximian.com>
 
        * TypeTranslator.cs, XmlCustomFormatter.cs: Added support for the
index c439b31550ece0b99a3128443752da758c83543c..7b3c69a9e3f11c5080359e26e230f071cc44cb43 100644 (file)
@@ -245,13 +245,21 @@ namespace System.Xml.Serialization {
                        codeField.Attributes = MemberAttributes.Public;
                        codeClass.Members.Add (codeField);
                        
-                       GenerateArrayElement (codeField, member, defaultNamespace);
+                       CodeAttributeDeclarationCollection attributes = new CodeAttributeDeclarationCollection ();
+                       AddArrayAttributes (attributes, member, defaultNamespace, false);
 
                        ListMap listMap = (ListMap) member.ListTypeMapping.ObjectMap;
-                       AddArrayItemAttributes (codeField, listMap, member.TypeData.ListItemTypeData, defaultNamespace, 0);
+                       AddArrayItemAttributes (attributes, listMap, member.TypeData.ListItemTypeData, defaultNamespace, 0);
+                       
+                       if (attributes.Count > 0) codeField.CustomAttributes = attributes;
+               }
+
+               public void AddArrayAttributes (CodeAttributeDeclarationCollection attributes, XmlTypeMapMemberElement member, string defaultNamespace, bool forceUseMemberName)
+               {
+                       GenerateArrayElement (attributes, member, defaultNamespace, forceUseMemberName);
                }
 
-               void AddArrayItemAttributes (CodeMemberField codeField, ListMap listMap, TypeData type, string defaultNamespace, int nestingLevel)
+               public void AddArrayItemAttributes (CodeAttributeDeclarationCollection attributes, ListMap listMap, TypeData type, string defaultNamespace, int nestingLevel)
                {
                        foreach (XmlTypeMapElementInfo ainfo in listMap.ItemInfo)
                        {
@@ -259,14 +267,14 @@ namespace System.Xml.Serialization {
                                if (ainfo.MappedType != null) defaultName = ainfo.MappedType.ElementName;
                                else defaultName = ainfo.TypeData.XmlType;
 
-                               GenerateArrayItemAttributes (codeField, listMap, type, ainfo, defaultName, defaultNamespace, nestingLevel);
+                               GenerateArrayItemAttributes (attributes, listMap, type, ainfo, defaultName, defaultNamespace, nestingLevel);
                                if (ainfo.MappedType != null) ExportMapCode (ainfo.MappedType);
                        }
 
                        if (listMap.IsMultiArray)
                        {
                                XmlTypeMapping nmap = listMap.NestedArrayMapping;
-                               AddArrayItemAttributes (codeField, (ListMap) nmap.ObjectMap, nmap.TypeData.ListItemTypeData, defaultNamespace, nestingLevel + 1);
+                               AddArrayItemAttributes (attributes, (ListMap) nmap.ObjectMap, nmap.TypeData.ListItemTypeData, defaultNamespace, nestingLevel + 1);
                        }
                }
                
@@ -371,7 +379,7 @@ namespace System.Xml.Serialization {
                        return new CodeAttributeArgument (name, new CodeTypeOfExpression(typeName));
                }
 
-               public CodeAttributeArgument GetEnumArg (string name, string enumType, string enumValue)
+               public static CodeAttributeArgument GetEnumArg (string name, string enumType, string enumValue)
                {
                        return new CodeAttributeArgument (name, new CodeFieldReferenceExpression (new CodeTypeReferenceExpression(enumType), enumValue));
                }
@@ -420,11 +428,11 @@ namespace System.Xml.Serialization {
                {
                }
                
-               protected virtual void GenerateArrayElement (CodeMemberField codeField, XmlTypeMapMemberElement member, string defaultNamespace)
+               protected virtual void GenerateArrayElement (CodeAttributeDeclarationCollection attributes, XmlTypeMapMemberElement member, string defaultNamespace, bool forceUseMemberName)
                {
                }
                
-               protected virtual void GenerateArrayItemAttributes (CodeMemberField codeField, ListMap listMap, TypeData type, XmlTypeMapElementInfo ainfo, string defaultName, string defaultNamespace, int nestingLevel)
+               protected virtual void GenerateArrayItemAttributes (CodeAttributeDeclarationCollection attributes, ListMap listMap, TypeData type, XmlTypeMapElementInfo ainfo, string defaultName, string defaultNamespace, int nestingLevel)
                {
                }
 
index b28fc4e895cbed7af7491085a9e0490359a47d60..50e0d8512d94eb4b46dae80c5cfd3bb0abd2a771 100644 (file)
@@ -66,7 +66,7 @@ namespace System.Xml.Serialization
                        primitiveTypes.Add ("gYearMonth", new TypeData (typeof (string), "gYearMonth", true));
                        primitiveTypes.Add ("month", new TypeData (typeof (DateTime), "month", true));
                        primitiveTypes.Add ("NMTOKEN", new TypeData (typeof (string), "NMTOKEN", true));
-                       primitiveTypes.Add ("NMTOKENS", new TypeData (typeof (string[]), "NMTOKENS", true));
+                       primitiveTypes.Add ("NMTOKENS", new TypeData (typeof (string), "NMTOKENS", true));
                        primitiveTypes.Add ("Name", new TypeData (typeof (string), "Name", true));
                        primitiveTypes.Add ("NCName", new TypeData (typeof (string), "NCName", true));
                        primitiveTypes.Add ("language", new TypeData (typeof (string), "language", true));
@@ -75,12 +75,12 @@ namespace System.Xml.Serialization
                        primitiveTypes.Add ("nonPositiveInteger", new TypeData (typeof (string), "nonPositiveInteger", true));
                        primitiveTypes.Add ("negativeInteger", new TypeData (typeof (string), "negativeInteger", true));
                        primitiveTypes.Add ("nonNegativeInteger", new TypeData (typeof (string), "nonNegativeInteger", true));
-                       primitiveTypes.Add ("ENTITIES", new TypeData (typeof (string[]), "ENTITIES", true));
+                       primitiveTypes.Add ("ENTITIES", new TypeData (typeof (string), "ENTITIES", true));
                        primitiveTypes.Add ("ENTITY", new TypeData (typeof (string), "ENTITY", true));
                        primitiveTypes.Add ("hexBinary", new TypeData (typeof (byte[]), "hexBinary", true));
                        primitiveTypes.Add ("ID", new TypeData (typeof (string), "ID", true));
                        primitiveTypes.Add ("IDREF", new TypeData (typeof (string), "IDREF", true));
-                       primitiveTypes.Add ("IDREFS", new TypeData (typeof (string[]), "IDREFS", true));
+                       primitiveTypes.Add ("IDREFS", new TypeData (typeof (string), "IDREFS", true));
                        primitiveTypes.Add ("NOTATION", new TypeData (typeof (string), "NOTATION", true));
                        primitiveTypes.Add ("token", new TypeData (typeof (string), "token", true));
                        primitiveTypes.Add ("normalizedString", new TypeData (typeof (string), "normalizedString", true));
index b5bdcaa5803d4a60acc93aa23aa90fecd58b0e68..539897ca06c24fdfe5def25b71f26b99adccf66a 100644 (file)
@@ -90,10 +90,12 @@ namespace System.Xml.Serialization {
                        else if (memType.SchemaType == SchemaTypes.Array)\r
                        {\r
                                // Array parameter\r
-                               att = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlArray");\r
-                               if (forceUseMemberName || (member.ElementName != member.MemberName)) att.Arguments.Add (MapCodeGenerator.GetArg ("ElementName", member.ElementName));\r
-                               if (member.Namespace != ns) att.Arguments.Add (MapCodeGenerator.GetArg ("Namespace", member.Namespace));\r
-                               if (att.Arguments.Count > 0) metadata.Add (att);\r
+                               \r
+                               XmlTypeMapMemberList list = member.TypeMapMember as XmlTypeMapMemberList;\r
+                               ListMap listMap = (ListMap) list.ListTypeMapping.ObjectMap;\r
+                               \r
+                               codeGenerator.AddArrayAttributes (metadata, list, ns, forceUseMemberName);\r
+                               codeGenerator.AddArrayItemAttributes (metadata, listMap, memType.ListItemTypeData, list.Namespace, 0);\r
                        }\r
                        else if (!member.Any)\r
                        {\r
@@ -101,6 +103,7 @@ namespace System.Xml.Serialization {
                                if (forceUseMemberName || (member.ElementName != member.MemberName)) att.Arguments.Add (MapCodeGenerator.GetArg ("ElementName", member.ElementName));\r
                                if (member.Namespace != ns) att.Arguments.Add (MapCodeGenerator.GetArg ("Namespace", member.Namespace));\r
                                if (!TypeTranslator.IsDefaultPrimitiveTpeData (memType)) att.Arguments.Add (MapCodeGenerator.GetArg ("DataType", member.TypeName));\r
+                               if (member.Form == XmlSchemaForm.Unqualified) att.Arguments.Add (MapCodeGenerator.GetEnumArg ("Form", "System.Xml.Schema.XmlSchemaForm", member.Form.ToString()));\r
                                if (att.Arguments.Count > 0) metadata.Add (att);\r
                        }\r
                }\r
@@ -172,6 +175,7 @@ namespace System.Xml.Serialization {
                        if (einfo.ElementName != member.Name) att.Arguments.Add (GetArg (einfo.ElementName));\r
                        if (einfo.TypeData.FullTypeName != defaultType.FullTypeName) att.Arguments.Add (GetTypeArg ("Type", einfo.TypeData.FullTypeName));\r
                        if (einfo.Namespace != defaultNamespace) att.Arguments.Add (GetArg ("Namespace", einfo.Namespace));\r
+                       if (einfo.Form == XmlSchemaForm.Unqualified) att.Arguments.Add (GetEnumArg ("Form", "System.Xml.Schema.XmlSchemaForm", einfo.Form.ToString()));\r
                        if (einfo.IsNullable) att.Arguments.Add (GetArg ("IsNullable", true));\r
                        if (!TypeTranslator.IsDefaultPrimitiveTpeData(einfo.TypeData)) att.Arguments.Add (GetArg ("DataType",einfo.TypeData.XmlType));\r
                        AddCustomAttribute (codeField, att, addAlwaysAttr);\r
@@ -183,17 +187,18 @@ namespace System.Xml.Serialization {
                                AddCustomAttribute (codeField, "System.Xml.Serialization.XmlChoiceIdentifier", GetArg(member.ChoiceMember));\r
                }\r
                \r
-               protected override void GenerateArrayElement (CodeMemberField codeField, XmlTypeMapMemberElement member, string defaultNamespace)\r
+               protected override void GenerateArrayElement (CodeAttributeDeclarationCollection attributes, XmlTypeMapMemberElement member, string defaultNamespace, bool forceUseMemberName)\r
                {\r
                        XmlTypeMapElementInfo einfo = (XmlTypeMapElementInfo) member.ElementInfo[0];\r
                        CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlArray");\r
-                       if (einfo.ElementName != member.Name) att.Arguments.Add (GetArg ("ElementName", einfo.ElementName));\r
+                       if (forceUseMemberName || (einfo.ElementName != member.Name)) att.Arguments.Add (GetArg ("ElementName", einfo.ElementName));\r
                        if (einfo.Namespace != defaultNamespace) att.Arguments.Add (GetArg ("Namespace", einfo.Namespace));\r
+                       if (einfo.Form == XmlSchemaForm.Unqualified) att.Arguments.Add (MapCodeGenerator.GetEnumArg ("Form", "System.Xml.Schema.XmlSchemaForm", einfo.Form.ToString()));\r
                        if (einfo.IsNullable) att.Arguments.Add (GetArg ("IsNullable", true));\r
-                       AddCustomAttribute (codeField, att, false);\r
+                       if (att.Arguments.Count > 0) attributes.Add (att);\r
                }\r
                \r
-               protected override void GenerateArrayItemAttributes (CodeMemberField codeField, ListMap listMap, TypeData type, XmlTypeMapElementInfo ainfo, string defaultName, string defaultNamespace, int nestingLevel)\r
+               protected override void GenerateArrayItemAttributes (CodeAttributeDeclarationCollection attributes, ListMap listMap, TypeData type, XmlTypeMapElementInfo ainfo, string defaultName, string defaultNamespace, int nestingLevel)\r
                {\r
                        bool needsType = (listMap.ItemInfo.Count > 1) ||\r
                                                         (ainfo.TypeData.FullTypeName != type.FullTypeName && !listMap.IsMultiArray);\r
@@ -202,9 +207,11 @@ namespace System.Xml.Serialization {
                        if (ainfo.ElementName != defaultName) att.Arguments.Add (GetArg ("ElementName", ainfo.ElementName));\r
                        if (ainfo.Namespace != defaultNamespace && ainfo.Namespace != XmlSchema.Namespace) att.Arguments.Add (GetArg ("Namespace", ainfo.Namespace));\r
                        if (needsType) att.Arguments.Add (GetTypeArg ("Type", ainfo.TypeData.FullTypeName));\r
-                       if (ainfo.IsNullable) att.Arguments.Add (GetArg ("IsNullable", true));\r
+                       if (!ainfo.IsNullable) att.Arguments.Add (GetArg ("IsNullable", false));\r
+                       if (ainfo.Form == XmlSchemaForm.Unqualified) att.Arguments.Add (MapCodeGenerator.GetEnumArg ("Form", "System.Xml.Schema.XmlSchemaForm", ainfo.Form.ToString()));\r
                        if (att.Arguments.Count > 0 && nestingLevel > 0) att.Arguments.Add (GetArg ("NestingLevel", nestingLevel));\r
-                       AddCustomAttribute (codeField, att, false);\r
+                       \r
+                       if (att.Arguments.Count > 0) attributes.Add (att);\r
                }\r
 \r
                protected override void GenerateTextElementAttribute (CodeMemberField codeField, XmlTypeMapElementInfo einfo, TypeData defaultType)\r
index 3658091f44ca1bf567e7b38312a5fa073e89d3ff..9bbb8e8c14d78d2e81ffa8f4c7e8ece7f7ec264f 100644 (file)
@@ -8,6 +8,8 @@
 // Copyright (C) Tim Coleman, 2002
 //
 
+using System.Xml.Schema;
+
 namespace System.Xml.Serialization 
 {
        public class XmlMemberMapping {
@@ -17,6 +19,7 @@ namespace System.Xml.Serialization
                string _memberName;
                string _namespace;
                string _typeNamespace;
+               XmlSchemaForm _form;
 
                internal XmlMemberMapping (string memberName, string defaultNamespace, XmlTypeMapMember mapMem, bool encodedFormat)
                {
@@ -47,6 +50,7 @@ namespace System.Xml.Serialization
                                        _namespace = info.Namespace;
                                        if (info.MappedType != null) _typeNamespace = info.MappedType.Namespace;
                                        else _typeNamespace = "";
+                                       _form = info.Form;
                                }
                        }
                        else
@@ -54,6 +58,9 @@ namespace System.Xml.Serialization
                                _elementName = _memberName;
                                _namespace = "";
                        }
+                       
+                       if (_form == XmlSchemaForm.None) 
+                               _form = XmlSchemaForm.Qualified;
                }
 
                #region Properties
@@ -89,6 +96,10 @@ namespace System.Xml.Serialization
                internal XmlTypeMapMember TypeMapMember {
                        get { return _mapMember; }
                }
+               
+               internal XmlSchemaForm Form {
+                       get { return _form; }
+               }
 
                #endregion // Properties
        }
index 1899b325b7a4f84b2f2d1b767aad30f785690006..5abe1a1323ba1d099afd41e9f0683937c60faabe 100644 (file)
@@ -27,7 +27,10 @@ namespace System.Xml.Serialization {
 
                static readonly string errSimple = "Cannot serialize object of type '{0}'. Base " +
                        "type '{1}' has simpleContent and can be only extended by adding XmlAttribute " +
-                       "elements. Please consider changing XmlTextMember of the base class to string array";
+                       "elements. Please consider changing XmlText member of the base class to string array";
+
+               static readonly string errSimple2 = "Cannot serialize object of type '{0}'. " +
+                       "Consider changing type of XmlText member '{1}' from '{2}' to string or string array";
 
                #region Constructors
 
@@ -242,8 +245,10 @@ namespace System.Xml.Serialization {
                        {
                                XmlTypeMapping bmap = ImportClassMapping (type.BaseType, root, defaultNamespace);
                                
-                               if (type.BaseType != typeof (object))
+                               if (type.BaseType != typeof (object)) {
                                        map.BaseMap = bmap;
+                                       classMap.SetCanBeSimpleType (false);
+                               }
                                
                                // At this point, derived classes of this map must be already registered
                                
@@ -253,6 +258,16 @@ namespace System.Xml.Serialization {
                                        throw new InvalidOperationException (String.Format (errSimple, map.TypeData.TypeName, map.BaseMap.TypeData.TypeName));
                        }
                        
+                       if (classMap.XmlTextCollector != null && !classMap.HasSimpleContent)
+                       {
+                               XmlTypeMapMember mem = classMap.XmlTextCollector;
+                               if (mem.TypeData.Type != typeof(string) && 
+                                  mem.TypeData.Type != typeof(string[]) && 
+                                  mem.TypeData.Type != typeof(XmlNode[]))
+                                  
+                                       throw new InvalidOperationException (String.Format (errSimple2, map.TypeData.TypeName, mem.Name, mem.TypeData.TypeName));
+                       }
+                       
                        return map;
                }
                
@@ -632,6 +647,8 @@ namespace System.Xml.Serialization {
                                        elem.Namespace = (atts.XmlArray != null && atts.XmlArray.Namespace != null) ? atts.XmlArray.Namespace : defaultNamespace;
                                        elem.MappedType = ImportListMapping (rmember.MemberType, null, elem.Namespace, atts, 0);
                                        elem.IsNullable = (atts.XmlArray != null) ? atts.XmlArray.IsNullable : false;
+                                       elem.Form = (atts.XmlArray != null) ? atts.XmlArray.Form : XmlSchemaForm.Qualified;
+
                                        member.ElementInfo.Add (elem);
                                        mapMember = member;
                                }
index dc686344222bfb30a25aac5e66068b6281b6a715..bd101788cfc934499b3865d87977544c02900ec4 100644 (file)
@@ -228,6 +228,7 @@ namespace System.Xml.Serialization {
                                ExportMembersMapSchema (schema, cmap, map.BaseMap, ext.Attributes, out particle, out anyAttribute);
                                ext.Particle = particle;
                                ext.AnyAttribute = anyAttribute;
+                               stype.IsMixed = cmap.XmlTextCollector != null;
 
                                ImportNamespace (schema, map.BaseMap.XmlTypeNamespace);
                                ExportClassSchema (map.BaseMap);
@@ -252,7 +253,7 @@ namespace System.Xml.Serialization {
                        XmlSchemaSequence seq = new XmlSchemaSequence ();
 
                        ICollection members = map.ElementMembers;
-                       if (members != null)
+                       if (members != null && !map.HasSimpleContent)
                        {
                                foreach (XmlTypeMapMemberElement member in members)
                                {
@@ -261,7 +262,8 @@ namespace System.Xml.Serialization {
                                        Type memType = member.GetType();
                                        if (memType == typeof(XmlTypeMapMemberFlatList))
                                        {
-                                               seq.Items.Add (GetSchemaArrayElement (schema, member.ElementInfo));
+                                               XmlSchemaParticle part = GetSchemaArrayElement (schema, member.ElementInfo);
+                                               if (part != null) seq.Items.Add (part);
                                        }
                                        else if (memType == typeof(XmlTypeMapMemberAnyElement))
                                        {
@@ -405,6 +407,9 @@ namespace System.Xml.Serialization {
 
                                if (defaultValue != System.DBNull.Value)
                                        selem.DefaultValue = XmlCustomFormatter.ToXmlString (einfo.TypeData, defaultValue);
+                                       
+                               if (einfo.Form != XmlSchemaForm.Qualified)
+                                       selem.Form = einfo.Form;
 
                                switch (einfo.TypeData.SchemaType)
                                {
@@ -673,7 +678,7 @@ namespace System.Xml.Serialization {
                
                string GetMapKey (XmlTypeMapping map)
                {
-                       return map.TypeData.FullTypeName + " " + map.XmlTypeNamespace;
+                       return map.TypeData.FullTypeName + " " + map.XmlType + " " + map.XmlTypeNamespace;
                }
 
                void CompileSchemas ()
index 75d53e82b3433f75619bd6ddf7c806e78707e1ad..6e9641e77b9ea622fee10a4133230e461dabc4af 100644 (file)
@@ -77,7 +77,7 @@ namespace System.Xml.Serialization {
                                XmlTypeMapMemberAnyElement mapMem = new XmlTypeMapMemberAnyElement ();\r
                                mapMem.Name = typeName.Name;\r
                                mapMem.TypeData = TypeTranslator.GetTypeData(typeof(XmlNode));\r
-                               mapMem.ElementInfo.Add (CreateElementInfo (typeName.Namespace, mapMem, typeName.Name, mapMem.TypeData, true));\r
+                               mapMem.ElementInfo.Add (CreateElementInfo (typeName.Namespace, mapMem, typeName.Name, mapMem.TypeData, true, XmlSchemaForm.None));\r
                                \r
                                XmlMemberMapping[] mm = new XmlMemberMapping [1];\r
                                mm[0] = new XmlMemberMapping (typeName.Name, typeName.Namespace, mapMem, encodedFormat);\r
@@ -180,9 +180,10 @@ namespace System.Xml.Serialization {
                                if (elem == null) throw new InvalidOperationException ("Schema element '" + names[n] + "' not found");\r
                                \r
                                XmlQualifiedName typeQName = new XmlQualifiedName ("Message", names[n].Namespace);\r
-                               TypeData td = GetElementTypeData (typeQName, elem);\r
+                               XmlTypeMapping tmap;\r
+                               TypeData td = GetElementTypeData (typeQName, elem, out tmap);\r
                                \r
-                               mapping[n] = ImportMemberMapping (elem.Name, typeQName.Namespace, td);\r
+                               mapping[n] = ImportMemberMapping (elem.Name, typeQName.Namespace, td, tmap);\r
                        }\r
                        BuildPendingMaps ();\r
                        return new XmlMembersMapping (mapping);\r
@@ -194,7 +195,8 @@ namespace System.Xml.Serialization {
                        for (int n=0; n<members.Length; n++)\r
                        {\r
                                TypeData td = GetTypeData (members[n].MemberType, null);\r
-                               mapping[n] = ImportMemberMapping (members[n].MemberName, members[n].MemberType.Namespace, td);\r
+                               XmlTypeMapping tmap = GetTypeMapping (td);\r
+                               mapping[n] = ImportMemberMapping (members[n].MemberName, members[n].MemberType.Namespace, td, tmap);\r
                        }\r
                        BuildPendingMaps ();\r
                        return new XmlMembersMapping (name, ns, hasWrapperElement, false, mapping);\r
@@ -232,12 +234,18 @@ namespace System.Xml.Serialization {
                        return mapping;\r
                }\r
                \r
-               XmlMemberMapping ImportMemberMapping (string name, string ns, TypeData type)\r
+               XmlMemberMapping ImportMemberMapping (string name, string ns, TypeData type, XmlTypeMapping emap)\r
                {\r
-                       XmlTypeMapMemberElement mapMem = new XmlTypeMapMemberElement ();\r
+                       XmlTypeMapMemberElement mapMem;\r
+                       \r
+                       if (type.IsListType)\r
+                               mapMem = new XmlTypeMapMemberList ();\r
+                       else\r
+                               mapMem = new XmlTypeMapMemberElement ();\r
+                       \r
                        mapMem.Name = name;\r
                        mapMem.TypeData = type;\r
-                       mapMem.ElementInfo.Add (CreateElementInfo (ns, mapMem, name, type, true));\r
+                       mapMem.ElementInfo.Add (CreateElementInfo (ns, mapMem, name, type, true, XmlSchemaForm.None, emap));\r
                        return new XmlMemberMapping (name, ns, mapMem, encodedFormat);\r
                }\r
                \r
@@ -529,7 +537,7 @@ namespace System.Xml.Serialization {
                                ClassMap cmap = new ClassMap ();\r
                                CodeIdentifiers classIds = new CodeIdentifiers();\r
                                ImportParticleComplexContent (typeQName, cmap, stype.Particle, classIds, stype.IsMixed);\r
-       \r
+\r
                                XmlTypeMapMemberFlatList list = (cmap.AllMembers.Count == 1) ? cmap.AllMembers[0] as XmlTypeMapMemberFlatList : null;\r
                                if (list != null && list.ChoiceMember == null)\r
                                {\r
@@ -573,7 +581,7 @@ namespace System.Xml.Serialization {
                        arrayTypeData = itemTypeData.ListTypeData;\r
                        \r
                        map.ItemInfo = new XmlTypeMapElementInfoList();\r
-                       map.ItemInfo.Add (CreateElementInfo ("", null, "Item", itemTypeData, true));\r
+                       map.ItemInfo.Add (CreateElementInfo ("", null, "Item", itemTypeData, true, XmlSchemaForm.None));\r
                        return map;\r
                }\r
                \r
@@ -640,7 +648,8 @@ namespace System.Xml.Serialization {
                                {\r
                                        string ns;\r
                                        XmlSchemaElement elem = (XmlSchemaElement) item;\r
-                                       TypeData typeData = GetElementTypeData (typeQName, elem);\r
+                                       XmlTypeMapping emap;\r
+                                       TypeData typeData = GetElementTypeData (typeQName, elem, out emap);\r
                                        XmlSchemaElement refElem = GetRefElement (typeQName, elem, out ns);\r
 \r
                                        if (elem.MaxOccurs == 1 && !multiValue)\r
@@ -668,7 +677,7 @@ namespace System.Xml.Serialization {
                                                member.Name = classIds.AddUnique(CodeIdentifier.MakeValid(refElem.Name), member);\r
                                                member.Documentation = GetDocumentation (elem);\r
                                                member.TypeData = typeData;\r
-                                               member.ElementInfo.Add (CreateElementInfo (ns, member, refElem.Name, typeData, refElem.IsNillable));\r
+                                               member.ElementInfo.Add (CreateElementInfo (ns, member, refElem.Name, typeData, refElem.IsNillable, refElem.Form, emap));\r
                                                cmap.AddMember (member);\r
                                        }\r
                                        else\r
@@ -678,7 +687,7 @@ namespace System.Xml.Serialization {
                                                member.Name = classIds.AddUnique(CodeIdentifier.MakeValid(refElem.Name), member);\r
                                                member.Documentation = GetDocumentation (elem);\r
                                                member.TypeData = typeData.ListTypeData;\r
-                                               member.ElementInfo.Add (CreateElementInfo (ns, member, refElem.Name, typeData, refElem.IsNillable));\r
+                                               member.ElementInfo.Add (CreateElementInfo (ns, member, refElem.Name, typeData, refElem.IsNillable, refElem.Form, emap));\r
                                                member.ListMap.ItemInfo = member.ElementInfo;\r
                                                cmap.AddMember (member);\r
                                        }\r
@@ -761,7 +770,6 @@ namespace System.Xml.Serialization {
                                        // When comparing class types, use the most generic class in the\r
                                        // inheritance hierarchy\r
 \r
-\r
                                        XmlTypeMapping choiceMap = GetTypeMapping (choiceType);\r
                                        BuildPendingMap (choiceMap);\r
                                        while (choiceMap.BaseMap != null) {\r
@@ -800,7 +808,7 @@ namespace System.Xml.Serialization {
                                enumMap.ObjectMap = new EnumMap (members, false);\r
 \r
                                choiceMember.TypeData = multiValue ? enumMap.TypeData.ListTypeData : enumMap.TypeData;\r
-                               choiceMember.ElementInfo.Add (CreateElementInfo (typeQName.Namespace, choiceMember, choiceMember.Name, choiceMember.TypeData, false));\r
+                               choiceMember.ElementInfo.Add (CreateElementInfo (typeQName.Namespace, choiceMember, choiceMember.Name, choiceMember.TypeData, false, XmlSchemaForm.None));\r
                                cmap.AddMember (choiceMember);\r
                        }\r
 \r
@@ -826,9 +834,10 @@ namespace System.Xml.Serialization {
                                {\r
                                        string ns;\r
                                        XmlSchemaElement elem = (XmlSchemaElement) item;\r
-                                       TypeData typeData = GetElementTypeData (typeQName, elem);\r
+                                       XmlTypeMapping emap;\r
+                                       TypeData typeData = GetElementTypeData (typeQName, elem, out emap);\r
                                        XmlSchemaElement refElem = GetRefElement (typeQName, elem, out ns);\r
-                                       choices.Add (CreateElementInfo (ns, member, refElem.Name, typeData, refElem.IsNillable));\r
+                                       choices.Add (CreateElementInfo (ns, member, refElem.Name, typeData, refElem.IsNillable, refElem.Form, emap));\r
                                        if (elem.MaxOccurs > 1) multiValue = true;\r
                                }\r
                                else if (item is XmlSchemaAny)\r
@@ -1057,7 +1066,7 @@ namespace System.Xml.Serialization {
                                ListMap listMap = new ListMap ();\r
 \r
                                listMap.ItemInfo = new XmlTypeMapElementInfoList ();\r
-                               listMap.ItemInfo.Add (CreateElementInfo (typeQName.Namespace, null, "Item", arrayTypeData.ListItemTypeData, false));\r
+                               listMap.ItemInfo.Add (CreateElementInfo (typeQName.Namespace, null, "Item", arrayTypeData.ListItemTypeData, false, XmlSchemaForm.None));\r
 \r
                                XmlTypeMapping map = CreateArrayTypeMapping (typeQName, arrayTypeData);\r
                                map.ObjectMap = listMap;\r
@@ -1231,14 +1240,23 @@ namespace System.Xml.Serialization {
                        return (Type) forcedBaseTypes [tname];\r
                }\r
 \r
-               XmlTypeMapElementInfo CreateElementInfo (string ns, XmlTypeMapMember member, string name, TypeData typeData, bool isNillable)\r
+               XmlTypeMapElementInfo CreateElementInfo (string ns, XmlTypeMapMember member, string name, TypeData typeData, bool isNillable, XmlSchemaForm form)\r
+               {\r
+                       if (typeData.IsComplexType)\r
+                               return CreateElementInfo (ns, member, name, typeData, isNillable, form, GetTypeMapping (typeData));\r
+                       else\r
+                               return CreateElementInfo (ns, member, name, typeData, isNillable, form, null);\r
+               }\r
+               \r
+               XmlTypeMapElementInfo CreateElementInfo (string ns, XmlTypeMapMember member, string name, TypeData typeData, bool isNillable, XmlSchemaForm form, XmlTypeMapping emap)\r
                {\r
                        XmlTypeMapElementInfo einfo = new XmlTypeMapElementInfo (member, typeData);\r
                        einfo.ElementName = name;\r
                        einfo.Namespace = ns;\r
                        einfo.IsNullable = isNillable;\r
-                       if (einfo.TypeData.IsComplexType)\r
-                               einfo.MappedType = GetTypeMapping (typeData);\r
+                       einfo.Form = form;\r
+                       if (typeData.IsComplexType)\r
+                               einfo.MappedType = emap;\r
                        return einfo;\r
                }\r
 \r
@@ -1322,10 +1340,11 @@ namespace System.Xml.Serialization {
                        }\r
                }\r
 \r
-               TypeData GetElementTypeData (XmlQualifiedName typeQName, XmlSchemaElement elem)\r
+               TypeData GetElementTypeData (XmlQualifiedName typeQName, XmlSchemaElement elem, out XmlTypeMapping map)\r
                {\r
                        bool sharedAnnType = false;\r
                        XmlQualifiedName root = null;\r
+                       map = null;\r
                        \r
                        if (!elem.RefName.IsEmpty) {\r
                                XmlSchemaElement refElem = FindRefElement (elem);\r
@@ -1335,9 +1354,20 @@ namespace System.Xml.Serialization {
                                sharedAnnType = true;\r
                        }\r
 \r
-                       if (!elem.SchemaTypeName.IsEmpty) return GetTypeData (elem.SchemaTypeName, root);\r
-                       else if (elem.SchemaType == null) return TypeTranslator.GetTypeData (typeof(object));\r
-                       else return GetTypeData (elem.SchemaType, typeQName, elem.Name, sharedAnnType, root);\r
+                       TypeData td;\r
+                       if (!elem.SchemaTypeName.IsEmpty) {\r
+                               td = GetTypeData (elem.SchemaTypeName, root);\r
+                               map = GetRegisteredTypeMapping (elem.SchemaTypeName);\r
+                       }\r
+                       else if (elem.SchemaType == null) \r
+                               td = TypeTranslator.GetTypeData (typeof(object));\r
+                       else \r
+                               td = GetTypeData (elem.SchemaType, typeQName, elem.Name, sharedAnnType, root);\r
+                       \r
+                       if (map == null && td.IsComplexType)\r
+                               map = GetTypeMapping (td);\r
+                               \r
+                       return td;\r
                }\r
 \r
                TypeData GetAttributeTypeData (XmlQualifiedName typeQName, XmlSchemaAttribute attr)\r
@@ -1405,7 +1435,7 @@ namespace System.Xml.Serialization {
 \r
                                ListMap listMap = new ListMap ();\r
                                listMap.ItemInfo = new XmlTypeMapElementInfoList();\r
-                               listMap.ItemInfo.Add (CreateElementInfo (itemMap.Namespace, null, typeData.ListItemTypeData.XmlType, typeData.ListItemTypeData, false));\r
+                               listMap.ItemInfo.Add (CreateElementInfo (itemMap.Namespace, null, typeData.ListItemTypeData.XmlType, typeData.ListItemTypeData, false, XmlSchemaForm.None));\r
                                map.ObjectMap = listMap;\r
                                \r
                                mappedTypes [new XmlQualifiedName(map.ElementName, map.Namespace)] = map;\r
index aa6991950fe9fbabef5e102d4964eab57f84f4b9..e3bb0ac0dec6a31abe12e887731d7c116b7f6b98 100644 (file)
@@ -145,6 +145,7 @@ namespace System.Xml.Serialization
                XmlTypeMapMemberNamespaces _namespaceDeclarations;\r
                XmlTypeMapMember _xmlTextCollector;\r
                bool _ignoreMemberNamespace;\r
+               bool _canBeSimpleType = true;\r
 \r
                public void AddMember (XmlTypeMapMember member)\r
                {\r
@@ -311,16 +312,21 @@ namespace System.Xml.Serialization
                {\r
                        get\r
                        {\r
-                               if (_elementMembers == null || _elementMembers.Count != 1) return null;\r
+                               if (!_canBeSimpleType || _elementMembers == null || _elementMembers.Count != 1) return null;\r
                                XmlTypeMapMemberElement member = (XmlTypeMapMemberElement) _elementMembers[0];\r
                                if (member.ElementInfo.Count != 1) return null;\r
                                XmlTypeMapElementInfo einfo = (XmlTypeMapElementInfo) member.ElementInfo[0];\r
                                if (!einfo.IsTextElement) return null;\r
-                               if (einfo.TypeData.SchemaType == SchemaTypes.Primitive || einfo.TypeData.SchemaType == SchemaTypes.Enum)\r
+                               if (member.TypeData.SchemaType == SchemaTypes.Primitive || member.TypeData.SchemaType == SchemaTypes.Enum)\r
                                        return new XmlQualifiedName (einfo.TypeData.XmlType, einfo.DataTypeNamespace);\r
                                return null;\r
                        }\r
                }\r
+               \r
+               public void SetCanBeSimpleType (bool can)\r
+               {\r
+                       _canBeSimpleType = can;\r
+               }\r
 \r
                public bool HasSimpleContent\r
                {\r