2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / System.XML / Mono.Xml.XPath / XPathNavigatorReader.cs
index 999385eba24dabab28a5b56acef1ea4af4d36835..5a5cf1f3f2c4169e32f64705b140f1a4e0a3d0d7 100755 (executable)
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
 //\r
+\r
 using System;\r
 using System.Text;\r
 using System.Xml;\r
+using System.Xml.Schema;\r
 using System.Xml.XPath;\r
 \r
 namespace Mono.Xml.XPath\r
@@ -39,6 +41,13 @@ namespace Mono.Xml.XPath
        {\r
                public XPathNavigatorReader (XPathNavigator nav)\r
                {\r
+                       // It seems that this class have only to support linked\r
+                       // node as its parameter\r
+                       switch (nav.NodeType) {\r
+                       case XPathNodeType.Attribute:\r
+                       case XPathNodeType.Namespace:\r
+                               throw new InvalidOperationException (String.Format ("NodeType {0} is not supported to read as a subtree of an XPathNavigator.", nav.NodeType));\r
+                       }\r
                        root = nav.Clone ();\r
                        current = nav.Clone ();\r
                }\r
@@ -50,7 +59,9 @@ namespace Mono.Xml.XPath
                bool endElement;\r
                bool attributeValueConsumed;\r
                StringBuilder readStringBuffer = new StringBuilder ();\r
+#if NET_2_0\r
                StringBuilder innerXmlBuilder = new StringBuilder ();\r
+#endif\r
 \r
                int depth = 0;\r
                int attributeCount = 0;\r
@@ -58,6 +69,17 @@ namespace Mono.Xml.XPath
                bool nextIsEOF;\r
 \r
                #region Properties\r
+\r
+#if NET_2_0\r
+               public override bool CanReadBinaryContent {\r
+                       get { return true; }\r
+               }\r
+\r
+               public override bool CanReadValueChunk {\r
+                       get { return true; }\r
+               }\r
+#endif\r
+\r
                public override XmlNodeType NodeType \r
                {\r
                        get {\r
@@ -121,7 +143,7 @@ namespace Mono.Xml.XPath
                                if (eof)\r
                                        return String.Empty;\r
                                else if (current.NodeType == XPathNodeType.Namespace)\r
-                                       return XmlNamespaceManager.XmlnsXmlns;\r
+                                       return "http://www.w3.org/2000/xmlns/";\r
                                else\r
                                        return current.NamespaceURI;\r
                        }\r
@@ -194,9 +216,15 @@ namespace Mono.Xml.XPath
                        get { return current.IsEmptyElement; }\r
                }\r
 \r
-               // It makes no sense.\r
                public override bool IsDefault {\r
-                       get { return false; }\r
+                       get {\r
+#if NET_2_0\r
+                               IXmlSchemaInfo si = current as IXmlSchemaInfo;\r
+                               return si != null && si.IsDefault;\r
+#else\r
+                               return false; // no way to check this.\r
+#endif\r
+                       }\r
                }\r
 \r
                // It makes no sense.\r
@@ -204,6 +232,12 @@ namespace Mono.Xml.XPath
                        get { return '\"'; }\r
                }\r
 \r
+#if NET_2_0\r
+               public override IXmlSchemaInfo SchemaInfo {\r
+                       get { return current.SchemaInfo; }\r
+               }\r
+#endif\r
+\r
                public override string XmlLang {\r
                        get { return current.XmlLang; }\r
                }\r
@@ -424,6 +458,11 @@ namespace Mono.Xml.XPath
 \r
                public override bool Read ()\r
                {\r
+#if NET_2_0\r
+                       if (Binary != null)\r
+                               Binary.Reset ();\r
+#endif\r
+\r
                        switch (ReadState) {\r
                        case ReadState.EndOfFile:\r
                        case ReadState.Closed:\r
@@ -431,9 +470,17 @@ namespace Mono.Xml.XPath
                                return false;\r
                        case ReadState.Initial:\r
                                started = true;\r
-                               if (current.NodeType != XPathNodeType.Root) {\r
+                               switch (current.NodeType) {\r
+                               case XPathNodeType.Root:\r
+                                       // recurse, but as Interactive\r
+                                       return Read ();\r
+                               case XPathNodeType.Element:\r
                                        if (current.IsEmptyElement)\r
                                                nextIsEOF = true;\r
+                                       attributeCount = GetAttributeCount ();\r
+                                       return true;\r
+                               default:\r
+                                       nextIsEOF = true;\r
                                        return true;\r
                                }\r
                                break;\r
@@ -656,3 +703,4 @@ namespace Mono.Xml.XPath
                #endregion\r
        }\r
 }\r
+\r