Merge pull request #1275 from ranma42/fix-lib64
[mono.git] / mcs / class / System.XML / System.Xml.Serialization / XmlSerializationReaderInterpreter.cs
index 3659e1d638fe3eeaf1666cc0e451d81d456295b3..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 ();
                }
 
@@ -381,7 +369,7 @@ namespace System.Xml.Serialization
                                        XmlTypeMapElementInfo info;
                                        
                                        if (readBySoapOrder) {
-                                               info = map.GetElement (Reader.LocalName, Reader.NamespaceURI);
+                                               info = map.GetElement (Reader.LocalName, Reader.NamespaceURI, ind);
                                        }
                                        else if (hasAnyReturnMember) {
                                                info = (XmlTypeMapElementInfo) ((XmlTypeMapMemberElement)map.ReturnMember).ElementInfo[0];
@@ -389,24 +377,24 @@ namespace System.Xml.Serialization
                                        }
                                        else {
                                                if (map.IsOrderDependentMap) {
-                                                       info = map.GetElement (Reader.LocalName, Reader.NamespaceURI);
+                                                       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++;
+                                                       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 (readBySoapOrder && info.ExplicitOrder != ind)
-                                                       throw new InvalidOperationException(string.Format("Element '{0}' has wrong order in sequence (expected - {1}, actual - {2}", Reader.LocalName, info.ExplicitOrder, ind));
-
-
                                                if (info.Member.GetType() == typeof (XmlTypeMapMemberList))
                                                {
                                                        if (_format == SerializationFormat.Encoded && info.MultiReferenceType)
@@ -522,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();
                        }
 
@@ -599,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
@@ -764,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)
@@ -817,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)
@@ -857,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);