Pārlūkot izejas kodu

2004-10-29 Atsushi Enomoto <[email protected]>

	* XmlNodeReader.cs : Reimplemented ResolveEntity(). It does not use
	  XmlTextReader trick anymore. XmlNodeReader itself it used instead.

svn path=/trunk/mcs/; revision=35427
Atsushi Eno 21 gadi atpakaļ
vecāks
revīzija
83b1983ad7

+ 5 - 0
mcs/class/System.XML/System.Xml/ChangeLog

@@ -1,3 +1,8 @@
+2004-10-29  Atsushi Enomoto <[email protected]>
+
+	* XmlNodeReader.cs : Reimplemented ResolveEntity(). It does not use
+	  XmlTextReader trick anymore. XmlNodeReader itself it used instead.
+
 2004-10-29  Atsushi Enomoto <[email protected]>
 
 	* XmlNodeReader.cs : for NET_1_0 ReadInnerXml(), just use

+ 43 - 53
mcs/class/System.XML/System.Xml/XmlNodeReader.cs

@@ -51,8 +51,6 @@ namespace System.Xml
 		int depth;
 		bool isEndElement;
 		bool alreadyRead;
-		XmlNamespaceManager defaultNsmgr;
-		Stack entityReaderStack = new Stack ();
 		XmlReader entityReader;
 
 		private XmlNode ownerLinkedNode {
@@ -69,15 +67,26 @@ namespace System.Xml
 		#region Constructor
 
 		public XmlNodeReader (XmlNode node)
+			: this (node, 0)
+		{
+		}
+		
+		private XmlNodeReader (XmlNode node, int startDepth)
 		{
 			startNode = node;
+			depth = startDepth;
 			document = startNode.NodeType == XmlNodeType.Document ?
 				startNode as XmlDocument : startNode.OwnerDocument;
 
-			if (node.NodeType != XmlNodeType.Document
-				&& node.NodeType != XmlNodeType.DocumentFragment)
+			switch (node.NodeType) {
+			case XmlNodeType.Document:
+			case XmlNodeType.DocumentFragment:
+			case XmlNodeType.EntityReference:
+				break;
+			default:
 				alreadyRead = true;
-			defaultNsmgr = new XmlNamespaceManager (this.NameTable);
+				break;
+			}
 
 		}
 		
@@ -90,6 +99,8 @@ namespace System.Xml
 				if (entityReader != null)
 					return entityReader.ReadState == ReadState.Interactive ?
 						entityReader.AttributeCount : 0;
+				if (state != ReadState.Interactive)
+					return 0;
 
 				if (isEndElement || current == null)
 					return 0;
@@ -118,7 +129,7 @@ namespace System.Xml
 		public override int Depth {
 			get {
 				if (entityReader != null && entityReader.ReadState == ReadState.Interactive)
-					return entityReader.Depth + depth + entityReaderStack.Count + 1;
+					return entityReader.Depth + depth;// + entityReaderStack.Count + 1;
 
 				if (current == null)
 					return 0;
@@ -163,7 +174,7 @@ namespace System.Xml
 			get {
 				if (entityReader != null)
 					return entityReader.ReadState == ReadState.Interactive ?
-						entityReader.IsDefault : false;
+						entityReader.HasValue : false;
 
 				if (current == null)
 					return false;
@@ -206,7 +217,7 @@ namespace System.Xml
 			get {
 				if (entityReader != null)
 					return entityReader.ReadState == ReadState.Interactive ?
-						entityReader.IsDefault : false;
+						entityReader.IsEmptyElement : false;
 
 				if (current == null)
 					return false;
@@ -295,7 +306,7 @@ namespace System.Xml
 
 		public override XmlNodeType NodeType {
 			get {
-				if (entityReader != null)
+				if (entityReader != null) {
 					switch (entityReader.ReadState) {
 					case ReadState.Interactive:
 						return entityReader.NodeType;
@@ -304,6 +315,7 @@ namespace System.Xml
 					case ReadState.EndOfFile:
 						return XmlNodeType.EndEntity;
 					}
+				}
 
 				if (current == null)
 					return XmlNodeType.None;
@@ -320,10 +332,7 @@ namespace System.Xml
 				if (current == null)
 					return String.Empty;
 
-//				if (current.NodeType == XmlNodeType.Attribute)
-//					return current.Prefix != String.Empty ? current.Prefix : null;
-//				else
-					return current.Prefix;
+				return current.Prefix;
 			}
 		}
 
@@ -396,8 +405,7 @@ namespace System.Xml
 			if (current != null && current.ParentNode != null &&
 				current.ParentNode.NodeType == XmlNodeType.Attribute) {
 				entityReader.Close ();
-				entityReader = entityReaderStack.Count > 0 ?
-					entityReaderStack.Pop () as XmlTextReader : null;
+				entityReader = null;
 				return true;
 			}
 			else
@@ -408,9 +416,6 @@ namespace System.Xml
 		{
 			if (entityReader != null)
 				entityReader.Close ();
-			while (entityReaderStack.Count > 0)
-				((XmlTextReader) entityReaderStack.Pop ()).Close ();
-
 			current = null;
 			state = ReadState.Closed;
 		}
@@ -847,8 +852,7 @@ namespace System.Xml
 					entityReader.Read ();
 					return true;
 				default:
-					entityReader = entityReaderStack.Count > 0 ?
-						entityReaderStack.Pop () as XmlTextReader : null;
+					entityReader = null;
 					return Read ();
 				}
 				// and go on ...
@@ -871,6 +875,13 @@ namespace System.Xml
 
 			MoveToElement ();
 
+			if (alreadyRead) {
+				alreadyRead = false;
+				return current != null;
+			}
+
+			bool isEnd = false;
+
 			if (IsEmptyElement || isEndElement) {
 				// Then go up and move to next.
 				// If no more nodes, then set EOF.
@@ -878,9 +889,7 @@ namespace System.Xml
 				if (current.ParentNode == null
 					|| current.ParentNode.NodeType == XmlNodeType.Document
 					|| current.ParentNode.NodeType == XmlNodeType.DocumentFragment) {
-					current = null;
-					state = ReadState.EndOfFile;
-					return false;
+					isEnd = true;
 				} else if (current.NextSibling == null) {
 					depth--;
 					current = current.ParentNode;
@@ -890,10 +899,16 @@ namespace System.Xml
 					current = current.NextSibling;
 					return true;
 				}
+			}
 
-			} else if (alreadyRead) {
-				alreadyRead = false;
-				return current != null;
+			if (current.NextSibling == null
+				&& current.ParentNode is XmlEntityReference)
+				isEnd = true;
+
+			if (isEnd) {
+				current = null;
+				state = ReadState.EndOfFile;
+				return false;
 			}
 
 			if (!isEndElement && current.FirstChild != null && current.NodeType != XmlNodeType.EntityReference) {
@@ -919,8 +934,7 @@ namespace System.Xml
 					// If it is ended, then other properties/methods will take care.
 					return entityReader.ReadAttributeValue ();
 				default:
-					entityReader = entityReaderStack.Count > 0 ?
-						entityReaderStack.Pop () as XmlTextReader : null;
+					entityReader = null;
 					// and go on ...
 					return ReadAttributeValue ();
 				}
@@ -961,31 +975,7 @@ namespace System.Xml
 		{
 			if (NodeType != XmlNodeType.EntityReference)
 				throw new InvalidOperationException ("The current node is not an Entity Reference");
-
-			// FIXME: Now that XmlEntityReference holds the target 
-			// entity's child nodes, we don't have to use 
-			// XmlTextReader and simply use those nodes directly.
-			string replacementText = current.InnerXml;
-
-			XmlNodeType xmlReaderNodeType = 
-				(current.ParentNode != null && current.ParentNode.NodeType == XmlNodeType.Attribute) ?
-				XmlNodeType.Attribute : XmlNodeType.Element;
-
-			XmlParserContext ctx = null;
-			if (entityReader != null) {
-				entityReaderStack.Push (entityReader);
-				ctx = ((IHasXmlParserContext) entityReader).ParserContext;
-			}
-			if (ctx == null) {
-				ctx = new XmlParserContext (document.NameTable,
-					current.ConstructNamespaceManager (),
-					document.DocumentType != null ? document.DocumentType.DTD : null,
-					BaseURI, XmlLang, XmlSpace, Encoding.Unicode);
-			}
-			XmlTextReader xtr = new XmlTextReader (replacementText, xmlReaderNodeType, ctx);
-			xtr.XmlResolver = document.Resolver;
-			xtr.SkipTextDeclaration ();
-			entityReader = xtr;
+			entityReader = new XmlNodeReader (current, 1);
 		}
 
 		public override void Skip ()