* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / class / Mono.Xml.Ext / Mono.Xml / SubtreeXmlReader.cs
1 //\r
2 // SubtreeXmlReader.cs - reads descendant nodes in XmlReader\r
3 //\r
4 // Author:\r
5 //      Atsushi Enomoto <atsushi@ximian.com>\r
6 //\r
7 // Copyright (c) 2004 Novell Inc. All rights reserved\r
8 //\r
9 // Permission is hereby granted, free of charge, to any person obtaining\r
10 // a copy of this software and associated documentation files (the\r
11 // "Software"), to deal in the Software without restriction, including\r
12 // without limitation the rights to use, copy, modify, merge, publish,\r
13 // distribute, sublicense, and/or sell copies of the Software, and to\r
14 // permit persons to whom the Software is furnished to do so, subject to\r
15 // the following conditions:\r
16 // \r
17 // The above copyright notice and this permission notice shall be\r
18 // included in all copies or substantial portions of the Software.\r
19 // \r
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
27 //\r
28 \r
29 #if NET_2_0\r
30 \r
31 using System;\r
32 using System.Collections;\r
33 using System.Xml;\r
34 \r
35 namespace Mono.Xml\r
36 {\r
37         public class SubtreeXmlReader : XmlReader, IXmlLineInfo, IXmlNamespaceResolver\r
38         {\r
39                 int startDepth;\r
40                 bool eof;\r
41                 bool initial;\r
42                 bool read;\r
43                 XmlReader Reader;\r
44                 IXmlLineInfo li;\r
45                 IXmlNamespaceResolver nsResolver;\r
46 \r
47                 public SubtreeXmlReader (XmlReader reader)\r
48                 {\r
49                         this.Reader = reader;\r
50                         li = reader as IXmlLineInfo;\r
51                         nsResolver = reader as IXmlNamespaceResolver;\r
52                         initial = true;\r
53                         startDepth = reader.Depth;\r
54                         if (reader.ReadState == ReadState.Initial)\r
55                                 startDepth = -1; // end == the reader's end\r
56                 }\r
57 \r
58                 public override int AttributeCount {\r
59                         get { return initial ? 0 : Reader.AttributeCount; }\r
60                 }\r
61 \r
62                 public override int Depth {\r
63                         get { return Reader.Depth - startDepth; }\r
64                 }\r
65 \r
66                 public override string BaseURI {\r
67                         get { return Reader.BaseURI; }\r
68                 }\r
69 \r
70                 public override bool EOF {\r
71                         get { return eof || Reader.EOF; }\r
72                 }\r
73 \r
74                 public int LineNumber {\r
75                         get { return initial ? 0 : li != null ? li.LineNumber : 0; }\r
76                 }\r
77 \r
78                 public int LinePosition {\r
79                         get { return initial ? 0 : li != null ? li.LinePosition : 0; }\r
80                 }\r
81 \r
82                 public override bool HasValue {\r
83                         get { return initial ? false : Reader.HasValue; }\r
84                 }\r
85 \r
86                 public override string LocalName {\r
87                         get { return initial ? String.Empty : Reader.LocalName; }\r
88                 }\r
89 \r
90                 public override string Name {\r
91                         get { return initial ? String.Empty : Reader.Name; }\r
92                 }\r
93 \r
94                 public override XmlNameTable NameTable {\r
95                         get { return Reader.NameTable; }\r
96                 }\r
97 \r
98                 public override string NamespaceURI {\r
99                         get { return initial ? String.Empty : Reader.NamespaceURI; }\r
100                 }\r
101 \r
102                 public override XmlNodeType NodeType {\r
103                         get { return initial ? XmlNodeType.None : Reader.NodeType; }\r
104                 }\r
105 \r
106                 public override string Prefix {\r
107                         get { return initial ? String.Empty : Reader.Prefix; }\r
108                 }\r
109 \r
110                 public override ReadState ReadState {\r
111                         get { return initial ? ReadState.Initial : eof ? ReadState.EndOfFile : Reader.ReadState ; }\r
112                 }\r
113 \r
114                 public override XmlReaderSettings Settings {\r
115                         get { return Reader.Settings; }\r
116                 }\r
117 \r
118                 public override string Value {\r
119                         get { return initial ? String.Empty : Reader.Value; }\r
120                 }\r
121 \r
122                 public override void Close ()\r
123                 {\r
124                         // do nothing\r
125                 }\r
126 \r
127                 public override string GetAttribute (int i)\r
128                 {\r
129                         return initial ? null : Reader.GetAttribute (i);\r
130                 }\r
131 \r
132                 public override string GetAttribute (string name)\r
133                 {\r
134                         return initial ? null : Reader.GetAttribute (name);\r
135                 }\r
136 \r
137                 public override string GetAttribute (string local, string ns)\r
138                 {\r
139                         return initial ? null : Reader.GetAttribute (local, ns);\r
140                 }\r
141 \r
142                 IDictionary IXmlNamespaceResolver.GetNamespacesInScope (XmlNamespaceScope scope)\r
143                 {\r
144                         return nsResolver != null ? nsResolver.GetNamespacesInScope (scope) : new Hashtable ();\r
145                 }\r
146 \r
147                 public bool HasLineInfo ()\r
148                 {\r
149                         return li != null ? li.HasLineInfo () : false;\r
150                 }\r
151 \r
152                 public override string LookupNamespace (string prefix)\r
153                 {\r
154                         return Reader.LookupNamespace (prefix);\r
155                 }\r
156 \r
157                 string IXmlNamespaceResolver.LookupPrefix (string ns)\r
158                 {\r
159                         return nsResolver != null ? nsResolver.LookupPrefix (ns) : String.Empty;\r
160                 }\r
161 \r
162                 string IXmlNamespaceResolver.LookupPrefix (string ns, bool atomizedNames)\r
163                 {\r
164                         return nsResolver != null ? nsResolver.LookupPrefix (ns, atomizedNames) : String.Empty;\r
165                 }\r
166 \r
167                 public override bool MoveToFirstAttribute ()\r
168                 {\r
169                         return initial ? false : Reader.MoveToFirstAttribute ();\r
170                 }\r
171 \r
172                 public override bool MoveToNextAttribute ()\r
173                 {\r
174                         return initial ? false : Reader.MoveToNextAttribute ();\r
175                 }\r
176 \r
177                 public override void MoveToAttribute (int i)\r
178                 {\r
179                         if (!initial)\r
180                                 Reader.MoveToAttribute (i);\r
181                 }\r
182 \r
183                 public override bool MoveToAttribute (string name)\r
184                 {\r
185                         return initial ? false : Reader.MoveToAttribute (name);\r
186                 }\r
187 \r
188                 public override bool MoveToAttribute (string local, string ns)\r
189                 {\r
190                         return initial ? false : Reader.MoveToAttribute (local, ns);\r
191                 }\r
192 \r
193                 public override bool MoveToElement ()\r
194                 {\r
195                         return initial ? false : Reader.MoveToElement ();\r
196                 }\r
197 \r
198                 public override bool Read ()\r
199                 {\r
200                         if (initial) {\r
201                                 initial = false;\r
202                                 return true;\r
203                         }\r
204                         if (!read) {\r
205                                 read = true;\r
206                                 return !Reader.IsEmptyElement && Reader.Read ();\r
207                         }\r
208                         if (Reader.Depth > startDepth)\r
209                                 if (Reader.Read ())\r
210                                         return true;\r
211                         eof = true;\r
212                         return false;\r
213                 }\r
214 \r
215                 public override bool ReadAttributeValue ()\r
216                 {\r
217                         if (initial || eof)\r
218                                 return false;\r
219                         return Reader.ReadAttributeValue ();\r
220                 }\r
221 \r
222                 public override void ResolveEntity ()\r
223                 {\r
224                         if (initial || eof)\r
225                                 return;\r
226                         Reader.ResolveEntity ();\r
227                 }\r
228         }\r
229 }\r
230 \r
231 #endif\r