Merge pull request #1275 from ranma42/fix-lib64
[mono.git] / mcs / class / System.XML / System.Xml.Serialization / XmlSerializationReaderInterpreter.cs
index db1f19d0bf7b722231b6f33f6026e39026c5086f..1853ad1497615a244b44df1c26ef7fe79b75d621 100644 (file)
@@ -94,9 +94,6 @@ namespace System.Xml.Serialization
 
                object ReadEncodedObject (XmlTypeMapping typeMap)
                {
-#if MOONLIGHT
-                       throw new NotSupportedException ();
-#else
                        object ob = null;
                        Reader.MoveToContent();
                        if (Reader.NodeType == System.Xml.XmlNodeType.Element) 
@@ -111,14 +108,10 @@ namespace System.Xml.Serialization
 
                        ReadReferencedElements();
                        return ob;
-#endif
                }
 
                protected virtual object ReadMessage (XmlMembersMapping typeMap)
                {
-#if MOONLIGHT
-                       throw new NotSupportedException ();
-#else
                        object[] parameters = new object[typeMap.Count];
 
                        if (typeMap.HasWrapperElement)
@@ -175,7 +168,6 @@ namespace System.Xml.Serialization
                                ReadReferencedElements();
 
                        return parameters;
-#endif
                }
 
                object ReadRoot (XmlTypeMapping rootMap)
@@ -186,7 +178,7 @@ namespace System.Xml.Serialization
                        }
                        else
                        {
-                               if (Reader.LocalName != rootMap.ElementName || Reader.NamespaceURI != rootMap.Namespace)
+                               if (!rootMap.IsAny && (Reader.LocalName != rootMap.ElementName || Reader.NamespaceURI != rootMap.Namespace))
                                        throw CreateUnknownNodeException();
                                
                                return ReadObject (rootMap, rootMap.IsNullable, true);
@@ -279,7 +271,6 @@ namespace System.Xml.Serialization
                                                        nss.Add ("", Reader.Value);
                                        }
                                }       
-#if !MOONLIGHT
                                else if (anyAttrMember != null) 
                                {
                                        XmlAttribute attr = (XmlAttribute) Document.ReadNode(Reader);
@@ -288,16 +279,13 @@ namespace System.Xml.Serialization
                                }
                                else
                                        ProcessUnknownAttribute(ob);
-#endif
                        }
 
-#if !MOONLIGHT
                        if (anyAttrMember != null)
                        {
                                anyAttributeArray = ShrinkArray ((Array)anyAttributeArray, anyAttributeIndex, anyAttrMember.TypeData.Type.GetElementType(), true);
                                SetMemberValue (anyAttrMember, ob, anyAttributeArray, isValueList);
                        }
-#endif
                        Reader.MoveToElement ();
                }
 
@@ -329,12 +317,12 @@ namespace System.Xml.Serialization
                        object[] flatLists = null;
                        object[] flatListsChoices = null;
                        Fixup fixup = null;
-                       int ind = 0;
+                       int ind = -1;
                        int maxInd;
 
                        if (readBySoapOrder) {
                                if (map.ElementMembers != null) maxInd = map.ElementMembers.Count;
-                               else maxInd = 0;
+                               else maxInd = -1;
                        }
                        else
                                maxInd = int.MaxValue;
@@ -373,14 +361,15 @@ namespace System.Xml.Serialization
                                AddFixup (fixup);
                        }
 
-                       while (Reader.NodeType != System.Xml.XmlNodeType.EndElement && (ind < maxInd)) 
+                       XmlTypeMapMember previousMember = null;
+                       while (Reader.NodeType != System.Xml.XmlNodeType.EndElement && (ind < maxInd - 1))
                        {
                                if (Reader.NodeType == System.Xml.XmlNodeType.Element) 
                                {
                                        XmlTypeMapElementInfo info;
                                        
                                        if (readBySoapOrder) {
-                                               info = map.GetElement (ind++);
+                                               info = map.GetElement (Reader.LocalName, Reader.NamespaceURI, ind);
                                        }
                                        else if (hasAnyReturnMember) {
                                                info = (XmlTypeMapElementInfo) ((XmlTypeMapMemberElement)map.ReturnMember).ElementInfo[0];
@@ -388,16 +377,24 @@ namespace System.Xml.Serialization
                                        }
                                        else {
                                                if (map.IsOrderDependentMap) {
-                                                       while ((info = map.GetElement (ind++)) != null)
-                                                               if (info.ElementName == Reader.LocalName && info.Namespace == Reader.NamespaceURI)
-                                                                       break;
+                                                       info = map.GetElement (Reader.LocalName, Reader.NamespaceURI, ind);
                                                }
                                                else
-                                                       info = map.GetElement (Reader.LocalName, Reader.NamespaceURI, -1);
+                                                       info = map.GetElement (Reader.LocalName, Reader.NamespaceURI);
                                        }
 
                                        if (info != null && !readFlag[info.Member.Index] )
                                        {
+                                               if (info.Member != previousMember)
+                                               {
+                                                       ind = info.ExplicitOrder + 1;
+                                                       // If the member is a flat list don't increase the index, since the next element may
+                                                       // be another item of the list. This is a fix for Xamarin bug #9193.
+                                                       if (info.Member is XmlTypeMapMemberFlatList)
+                                                               ind--;
+                                                       previousMember = info.Member;
+                                               }
+
                                                if (info.Member.GetType() == typeof (XmlTypeMapMemberList))
                                                {
                                                        if (_format == SerializationFormat.Encoded && info.MultiReferenceType)
@@ -513,10 +510,8 @@ namespace System.Xml.Serialization
                                                        SetMemberValue (mem, ob, GetValueFromXmlString (Reader.ReadString(), info.TypeData, info.MappedType), isValueList);
                                        }
                                }
-#if !MOONLIGHT
                                else 
                                        UnknownNode(ob);
-#endif
                                Reader.MoveToContent();
                        }
 
@@ -590,6 +585,10 @@ namespace System.Xml.Serialization
 
                void SetMemberValue (XmlTypeMapMember member, object ob, object value, bool isValueList)
                {
+                       var memberType = member.TypeData.Type;
+                       if (value != null && !value.GetType().IsAssignableFrom (memberType))
+                               value = XmlSerializationWriterInterpreter.ImplicitConvert (value, memberType);
+
                        if (isValueList)
                                ((object[])ob)[member.GlobalIndex] = value;
                        else
@@ -755,11 +754,7 @@ namespace System.Xml.Serialization
 
                static object CreateInstance (Type type, bool nonPublic)
                {
-#if MOONLIGHT
-                       return Activator.CreateInstance (type); // always false
-#else
                        return Activator.CreateInstance (type, nonPublic);
-#endif
                }
 
                object CreateInstance (Type type)
@@ -808,14 +803,10 @@ namespace System.Xml.Serialization
                
                object ReadXmlNode (TypeData type, bool wrapped)
                {
-#if MOONLIGHT
-                       throw new NotSupportedException ();
-#else
                        if (type.Type == typeof (XmlDocument))
                                return ReadXmlDocument (wrapped);
                        else
                                return ReadXmlNode (wrapped);
-#endif
                }
 
                object ReadPrimitiveElement (XmlTypeMapping typeMap, bool isNullable)
@@ -848,7 +839,7 @@ namespace System.Xml.Serialization
                        Reader.MoveToContent ();
                        if (Reader.NodeType == XmlNodeType.Element)
                        {
-                               if (Reader.LocalName == typeMap.ElementName && Reader.NamespaceURI == typeMap.Namespace)
+                               if (typeMap.IsAny || (Reader.LocalName == typeMap.ElementName && Reader.NamespaceURI == typeMap.Namespace))
                                {
                                        object ob = CreateInstance (typeMap.TypeData.Type, true);
                                        return ReadSerializable ((IXmlSerializable)ob);