2010-04-21 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.XML / System.Xml / XmlTextReader.cs
index 881038e850400dd580aa845bdd6d28a035b7a724..7c80182e12792a236a0df7c4b349596c8aa12c2d 100644 (file)
@@ -129,9 +129,13 @@ namespace System.Xml
                // argument is uri, not an xml fragment.
                internal XmlTextReader (bool dummy, XmlResolver resolver, string url, XmlNodeType fragType, XmlParserContext context)
                {
-                       if (resolver == null)
+                       if (resolver == null) {
+#if MOONLIGHT
+                               resolver = new XmlXapResolver ();
+#else
                                resolver = new XmlUrlResolver ();
-
+#endif
+                       }
                        this.XmlResolver = resolver;
                        string uriString;
                        Stream stream = GetStreamFromUrl (url, out uriString);
@@ -178,6 +182,12 @@ namespace System.Xml
 
                private Stream GetStreamFromUrl (string url, out string absoluteUriString)
                {
+#if NET_2_1
+                       if (url == null)
+                               throw new ArgumentNullException ("url");
+                       if (url.Length == 0)
+                               throw new ArgumentException ("url");
+#endif
                        Uri uri = resolver.ResolveUri (null, url);
                        absoluteUriString = uri != null ? uri.ToString () : String.Empty;
                        return resolver.GetEntity (uri, null, typeof (Stream)) as Stream;
@@ -253,11 +263,9 @@ namespace System.Xml
                        get { return readState == ReadState.EndOfFile; }
                }
 
-#if !NET_2_1
                public override bool HasValue {
                        get { return cursorToken.Value != null; }
                }
-#endif
 
                public override bool IsDefault {
                        // XmlTextReader does not expand default attributes.
@@ -323,7 +331,7 @@ namespace System.Xml
                }
 
                public override XmlNameTable NameTable {
-                       get { return parserContext.NameTable; }
+                       get { return nameTable; }
                }
 
                public override XmlNodeType NodeType {
@@ -439,7 +447,7 @@ namespace System.Xml
 #if NET_2_0
                public IDictionary<string, string> GetNamespacesInScope (XmlNamespaceScope scope)
                {
-                       return parserContext.NamespaceManager.GetNamespacesInScope (scope);
+                       return nsmgr.GetNamespacesInScope (scope);
                }
 
                IDictionary<string, string> IXmlNamespaceResolver.GetNamespacesInScope (XmlNamespaceScope scope)
@@ -471,7 +479,7 @@ namespace System.Xml
 
                private string LookupNamespace (string prefix, bool atomizedNames)
                {
-                       string s = parserContext.NamespaceManager.LookupNamespace (
+                       string s = nsmgr.LookupNamespace (
                                prefix, atomizedNames);
                        return s == String.Empty ? null : s;
                }
@@ -484,7 +492,7 @@ namespace System.Xml
 
                public string LookupPrefix (string ns, bool atomizedName)
                {
-                       return parserContext.NamespaceManager.LookupPrefix (ns, atomizedName);
+                       return nsmgr.LookupPrefix (ns, atomizedName);
                }
 #endif
 
@@ -566,6 +574,7 @@ namespace System.Xml
                        curNodePeekIndex = peekCharsIndex;
                        preserveCurrentTag = true;
                        nestLevel = 0;
+                       ClearValueBuffer ();
 
                        if (startNodeType == XmlNodeType.Attribute) {
                                if (currentAttribute == 0)
@@ -616,7 +625,6 @@ namespace System.Xml
                        return more;
                }
 
-#if !NET_2_1
                public override bool ReadAttributeValue ()
                {
                        if (readState == ReadState.Initial && startNodeType == XmlNodeType.Attribute) {
@@ -637,7 +645,6 @@ namespace System.Xml
                        else
                                return false;
                }
-#endif
 
                public int ReadBase64 (byte [] buffer, int offset, int length)
                {
@@ -700,13 +707,11 @@ namespace System.Xml
                        Clear ();
                }
 
-#if !NET_2_1
                public override void ResolveEntity ()
                {
                        // XmlTextReader does not resolve entities.
                        throw new InvalidOperationException ("XmlTextReader cannot resolve external entities.");
                }
-#endif
 
 #if NET_2_0
                [MonoTODO] // FIXME: Implement, for performance improvement
@@ -849,9 +854,9 @@ namespace System.Xml
                        internal void FillXmlns ()
                        {
                                if (Object.ReferenceEquals (Prefix, XmlNamespaceManager.PrefixXmlns))
-                                       Reader.parserContext.NamespaceManager.AddNamespace (LocalName, Value);
+                                       Reader.nsmgr.AddNamespace (LocalName, Value);
                                else if (Object.ReferenceEquals (Name, XmlNamespaceManager.PrefixXmlns))
-                                       Reader.parserContext.NamespaceManager.AddNamespace (String.Empty, Value);
+                                       Reader.nsmgr.AddNamespace (String.Empty, Value);
                        }
 
                        internal void FillNamespace ()
@@ -877,6 +882,8 @@ namespace System.Xml
                private int attributeCount;
 
                private XmlParserContext parserContext;
+               private XmlNameTable nameTable;
+               private XmlNamespaceManager nsmgr;
 
                private ReadState readState;
                private bool disallowReset;
@@ -951,7 +958,11 @@ namespace System.Xml
                // These values are never re-initialized.
                private bool namespaces = true;
                private WhitespaceHandling whitespaceHandling = WhitespaceHandling.All;
+#if MOONLIGHT
+               private XmlResolver resolver = new XmlXapResolver ();
+#else
                private XmlResolver resolver = new XmlUrlResolver ();
+#endif
                private bool normalization = false;
 
                private bool checkCharacters;
@@ -1043,15 +1054,27 @@ namespace System.Xml
                                        String.Empty,
                                        XmlSpace.None);
                        }
+                       nameTable = parserContext.NameTable;
+                       nameTable = nameTable != null ? nameTable : new NameTable ();
+                       nsmgr = parserContext.NamespaceManager;
+                       nsmgr = nsmgr != null ? nsmgr : new XmlNamespaceManager (nameTable);
 
                        if (url != null && url.Length > 0) {
+#if NET_2_1
+                               Uri uri = new Uri (url, UriKind.RelativeOrAbsolute);
+#else
                                Uri uri = null;
                                try {
+#if NET_2_0
+                                       uri = new Uri (url, UriKind.RelativeOrAbsolute);
+#else
                                        uri = new Uri (url);
+#endif
                                } catch (Exception) {
                                        string path = Path.GetFullPath ("./a");
                                        uri = new Uri (new Uri (path), url);
                                }
+#endif
                                parserContext.BaseURI = uri.ToString ();
                        }
 
@@ -1262,7 +1285,7 @@ namespace System.Xml
                private bool ReadContent ()
                {
                        if (popScope) {
-                               parserContext.NamespaceManager.PopScope ();
+                               nsmgr.PopScope ();
                                parserContext.PopScope ();
                                popScope = false;
                        }
@@ -1358,7 +1381,7 @@ namespace System.Xml
                                throw NotWFError ("Multiple document element was detected.");
                        currentState = XmlNodeType.Element;
 
-                       parserContext.NamespaceManager.PushScope ();
+                       nsmgr.PushScope ();
 
                        currentLinkedNodeLineNumber = line;
                        currentLinkedNodeLinePosition = column;
@@ -1423,7 +1446,7 @@ namespace System.Xml
                        if (prefix.Length > 0)
                                currentToken.NamespaceURI = LookupNamespace (prefix, true);
                        else if (namespaces)
-                               currentToken.NamespaceURI = parserContext.NamespaceManager.DefaultNamespace;
+                               currentToken.NamespaceURI = nsmgr.DefaultNamespace;
 
                        if (namespaces) {
                                if (NamespaceURI == null)
@@ -1524,7 +1547,7 @@ namespace System.Xml
                        if (expected.Prefix.Length > 0)
                                currentToken.NamespaceURI = LookupNamespace (expected.Prefix, true);
                        else if (namespaces)
-                               currentToken.NamespaceURI = parserContext.NamespaceManager.DefaultNamespace;
+                               currentToken.NamespaceURI = nsmgr.DefaultNamespace;
 
                        popScope = true;
 
@@ -1557,7 +1580,7 @@ namespace System.Xml
 
                private void AppendValueChar (int ch)
                {
-                       if (ch < Char.MaxValue)
+                       if (ch <= Char.MaxValue)
                                valueBuffer.Append ((char) ch);
                        else
                                AppendSurrogatePairValueChar (ch);
@@ -1639,7 +1662,7 @@ namespace System.Xml
                                // FIXME: it might be optimized by the JIT later,
 //                             AppendValueChar (ch);
                                {
-                                       if (ch < Char.MaxValue)
+                                       if (ch <= Char.MaxValue)
                                                valueBuffer.Append ((char) ch);
                                        else
                                                AppendSurrogatePairValueChar (ch);
@@ -1810,7 +1833,7 @@ namespace System.Xml
                {
                        IncrementAttributeToken ();
                        XmlAttributeTokenInfo ati = attributeTokens [currentAttribute];
-                       ati.Name = parserContext.NameTable.Add (name);
+                       ati.Name = NameTable.Add (name);
                        ati.Prefix = String.Empty;
                        ati.NamespaceURI = String.Empty;
                        IncrementAttributeValueToken ();
@@ -1936,7 +1959,7 @@ namespace System.Xml
 #if NET_2_0
                                                if (entityHandling == EntityHandling.ExpandEntities) {
                                                        string value = DTD.GenerateEntityAttributeText (entName);
-                                                       foreach (char c in value)
+                                                       foreach (char c in (IEnumerable<char>) value)
                                                                AppendValueChar (c);
                                                } else
 #endif
@@ -1960,7 +1983,7 @@ namespace System.Xml
                                        // FIXME: it might be optimized by the JIT later,
 //                                     AppendValueChar (ch);
                                        {
-                                               if (ch < Char.MaxValue)
+                                               if (ch <= Char.MaxValue)
                                                        valueBuffer.Append ((char) ch);
                                                else
                                                        AppendSurrogatePairValueChar (ch);
@@ -2353,7 +2376,7 @@ namespace System.Xml
                                // FIXME: it might be optimized by the JIT later,
 //                             AppendValueChar (ch);
                                {
-                                       if (ch < Char.MaxValue)
+                                       if (ch <= Char.MaxValue)
                                                valueBuffer.Append ((char) ch);
                                        else
                                                AppendSurrogatePairValueChar (ch);
@@ -2724,13 +2747,13 @@ namespace System.Xml
 
                        int start = curNodePeekIndex + startOffset;
 
-                       string name = parserContext.NameTable.Add (
+                       string name = NameTable.Add (
                                peekChars, start, length);
 
                        if (colonAt > 0) {
-                               prefix = parserContext.NameTable.Add (
+                               prefix = NameTable.Add (
                                        peekChars, start, colonAt);
-                               localName = parserContext.NameTable.Add (
+                               localName = NameTable.Add (
                                        peekChars, start + colonAt + 1, length - colonAt - 1);
                        } else {
                                prefix = String.Empty;
@@ -2751,7 +2774,7 @@ namespace System.Xml
                        // AppendNameChar (ch);
                        {
                                // nameBuffer.Length is always non-0 so no need to ExpandNameCapacity () here
-                               if (ch < Char.MaxValue)
+                               if (ch <= Char.MaxValue)
                                        nameBuffer [nameLength++] = (char) ch;
                                else
                                        AppendSurrogatePairNameChar (ch);
@@ -2768,18 +2791,18 @@ namespace System.Xml
                                {
                                        if (nameLength == nameCapacity)
                                                ExpandNameCapacity ();
-                                       if (ch < Char.MaxValue)
+                                       if (ch <= Char.MaxValue)
                                                nameBuffer [nameLength++] = (char) ch;
                                        else
                                                AppendSurrogatePairNameChar (ch);
                                }
                        }
 
-                       string name = parserContext.NameTable.Add (nameBuffer, 0, nameLength);
+                       string name = NameTable.Add (nameBuffer, 0, nameLength);
 
                        if (colonAt > 0) {
-                               prefix = parserContext.NameTable.Add (nameBuffer, 0, colonAt);
-                               localName = parserContext.NameTable.Add (nameBuffer, colonAt + 1, nameLength - colonAt - 1);
+                               prefix = NameTable.Add (nameBuffer, 0, colonAt);
+                               localName = NameTable.Add (nameBuffer, colonAt + 1, nameLength - colonAt - 1);
                        } else {
                                prefix = String.Empty;
                                localName = name;
@@ -2924,7 +2947,7 @@ namespace System.Xml
                                        return i;
                                default:
                                        Advance (c);
-                                       if (c < Char.MaxValue)
+                                       if (c <= Char.MaxValue)
                                                buffer [bufIndex++] = (char) c;
                                        else {
                                                buffer [bufIndex++] = (char) ((c - 0x10000) / 0x400 + 0xD800);