Merge pull request #901 from Blewzman/FixAggregateExceptionGetBaseException
[mono.git] / mcs / class / System.XML / System.Xml / XmlReader.cs
index 03e415f7a4c097c4bcc2930b7745b1d18b787f9d..bb8030264e0872e94f09e941af5669a43f702e91 100644 (file)
@@ -35,11 +35,9 @@ using System.Collections;
 using System.Diagnostics;
 using System.IO;
 using System.Text;
-#if !MOONLIGHT
 using System.Xml.Schema; // only required for NET_2_0 (SchemaInfo)
 using System.Xml.Serialization; // only required for NET_2_0 (SchemaInfo)
 using Mono.Xml.Schema; // only required for NET_2_0
-#endif
 using Mono.Xml; // only required for NET_2_0
 #if NET_4_5
 using System.Threading;
@@ -209,11 +207,9 @@ namespace System.Xml
                public abstract ReadState ReadState { get; }
 
 #if NET_2_0
-#if !MOONLIGHT
                public virtual IXmlSchemaInfo SchemaInfo {
                        get { return null; }
                }
-#endif
 
                public virtual XmlReaderSettings Settings {
                        get { return settings; }
@@ -465,9 +461,6 @@ namespace System.Xml
 
                private static XmlReader CreateValidatingXmlReader (XmlReader reader, XmlReaderSettings settings)
                {
-#if MOONLIGHT
-                       return reader;
-#else
                        XmlValidatingReader xvr = null;
                        switch (settings.ValidationType) {
                        // Auto and XDR are obsoleted in 2.0 and therefore ignored.
@@ -493,10 +486,9 @@ namespace System.Xml
                        //      throw new NotImplementedException ();
 
                        return xvr != null ? xvr : reader;
-#endif
                }
 
-#if NET_4_0 || MOBILE
+#if NET_4_0
                public void Dispose ()
 #else
                void IDisposable.Dispose() 
@@ -1014,7 +1006,11 @@ namespace System.Xml
 #if NET_4_5
                public virtual DateTimeOffset ReadContentAsDateTimeOffset ()
                {
-                       return XmlConvert.ToDateTimeOffset (ReadContentString ());
+                       try {
+                               return XmlConvert.ToDateTimeOffset (ReadContentString ());
+                       } catch (Exception e) {
+                               throw XmlError ("Typed value is invalid.", e);
+                       }
                }
 #endif
 
@@ -1030,6 +1026,11 @@ namespace System.Xml
 
                public virtual object ReadElementContentAs (Type returnType, IXmlNamespaceResolver namespaceResolver, string localName, string namespaceURI)
                {
+                       if (localName == null)
+                               throw new ArgumentNullException ("localName");
+                       if (namespaceURI == null)
+                               throw new ArgumentNullException ("namespaceURI");
+
                        bool isEmpty = IsEmptyElement;
                        ReadStartElement (localName, namespaceURI);
                        if (isEmpty)
@@ -1074,16 +1075,28 @@ namespace System.Xml
                                switch (Type.GetTypeCode (type)) {
                                case TypeCode.Boolean:
                                        return XQueryConvert.StringToBoolean (text);
+                               case TypeCode.Byte:
+                                       return XmlConvert.ToByte (text);
+                               case TypeCode.SByte:
+                                       return XmlConvert.ToSByte (text);
+                               case TypeCode.Int16:
+                                       return XmlConvert.ToInt16 (text);
+                               case TypeCode.UInt16:
+                                       return XQueryConvert.StringToUnsignedShort (text);
+                               case TypeCode.Int32:
+                                       return XQueryConvert.StringToInt (text);
+                               case TypeCode.UInt32:
+                                       return XQueryConvert.StringToUnsignedInt (text);
+                               case TypeCode.Int64:
+                                       return XQueryConvert.StringToInteger (text);
+                               case TypeCode.UInt64:
+                                       return XQueryConvert.StringToUnsignedLong (text);
                                case TypeCode.DateTime:
                                        return XQueryConvert.StringToDateTime (text);
                                case TypeCode.Decimal:
                                        return XQueryConvert.StringToDecimal (text);
                                case TypeCode.Double:
                                        return XQueryConvert.StringToDouble (text);
-                               case TypeCode.Int32:
-                                       return XQueryConvert.StringToInt (text);
-                               case TypeCode.Int64:
-                                       return XQueryConvert.StringToInteger (text);
                                case TypeCode.Single:
                                        return XQueryConvert.StringToFloat (text);
                                case TypeCode.String:
@@ -1092,7 +1105,7 @@ namespace System.Xml
                        } catch (Exception ex) {
                                throw XmlError (String.Format ("Current text value '{0}' is not acceptable for specified type '{1}'. {2}", text, type, ex != null ? ex.Message : String.Empty), ex);
                        }
-                       throw new ArgumentException (String.Format ("Specified type '{0}' is not supported.", type));
+                       throw new XmlException (String.Format ("Specified type '{0}' is not supported.", type));
                }
 
                public virtual bool ReadElementContentAsBoolean ()