2002-09-18 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.XML / System.Xml / XmlNodeReader.cs
1 //
2 // System.Xml.XmlNodeReader.cs
3 //
4 // Author:
5 //      Duncan Mak  (duncan@ximian.com)
6 //
7 // (C) Ximian, Inc.
8 //
9
10 using System;
11 using System.Collections;
12 using System.Xml;
13
14 namespace System.Xml
15 {
16         public class XmlNodeReader : XmlReader
17         {
18                 #region Constructor
19
20                 XmlNode current;
21                 ReadState state = ReadState.Initial;
22                 int depth;
23
24                 public XmlNodeReader (XmlNode node)
25                 {
26                         current = node;
27                 }
28                 
29                 #endregion
30
31                 #region Properties
32
33                 public override int AttributeCount {
34                         get {
35                                 return ((ICollection) current.Attributes).Count;
36                         }
37                 }
38
39                 public override string BaseURI {
40                         get { return current.BaseURI; }
41                 }
42
43                 public override bool CanResolveEntity {
44                         get { return false; }
45                 }
46
47                 public override int Depth {
48                         get { return depth; }
49                 }
50
51                 [MonoTODO]
52                 public override bool EOF {
53                         get { return false; }
54                 }
55
56                 public override bool HasAttributes {
57                         get {
58                                 if (current.Attributes == null)
59                                         return false;
60                                 else
61                                         return true;
62                         }
63                 }
64
65                 public override bool HasValue {
66                         get {
67                                 if (current.NodeType == XmlNodeType.Element ||
68                                     current.NodeType == XmlNodeType.EntityReference ||
69                                     current.NodeType == XmlNodeType.Document ||
70                                     current.NodeType == XmlNodeType.DocumentFragment ||
71                                     current.NodeType == XmlNodeType.Notation ||
72                                     current.NodeType == XmlNodeType.EndElement ||
73                                     current.NodeType == XmlNodeType.EndEntity)
74                                         return false;
75                                 else
76                                         return true;
77                         }
78                               
79                 }
80
81                 [MonoTODO]
82                 public override bool IsDefault {
83                         get {
84                                 if (current.NodeType != XmlNodeType.Attribute)
85                                         return false;
86                                 else
87                                         return false;
88                         }
89                 }
90
91                 [MonoTODO]
92                 public override bool IsEmptyElement {
93                         get {
94                                 if (current.NodeType == XmlNodeType.Entity &&
95                                     ((XmlEntity) current).Value.EndsWith ("/>"))
96                                         return true;
97                                 else 
98                                         return false;
99                         }
100                 }
101
102                 public override string this [int i] {
103                         get {
104                                 if (i < 0 || i > AttributeCount)
105                                         throw new ArgumentOutOfRangeException ("i is out of range.");
106                                 
107                                 return current.Attributes [i].Value;
108                         }
109                 }
110
111                 public override string this [string name] {
112                         get {
113                                 string ret =  current.Attributes [name].Value;
114                                 
115                                 if (ret == null)
116                                         return String.Empty;
117                                 else
118                                         return ret;
119                         }
120                 }
121
122                 public override string this [string name, string namespaceURI] {
123                         get {
124                                 string ret =  current.Attributes [name].Value;
125                                 
126                                 if (ret == null)
127                                         return String.Empty;
128                                 else
129                                         return ret;
130                         }
131                 }
132
133                 public override string LocalName {
134                         get {
135                                 if (current is XmlCharacterData)
136                                         return String.Empty;
137                                 else
138                                         return current.LocalName;
139                         }
140                 }
141
142                 public override string Name {
143                         get { return current.Name; }
144                 }
145
146                 public override string NamespaceURI {
147                         get {
148                                 return current.NamespaceURI;
149                         }
150                 }
151
152                 [MonoTODO]
153                 public override XmlNameTable NameTable {
154                         get { return null; }
155                 }
156
157                 public override XmlNodeType NodeType {
158                         get {
159                                 return current.NodeType;
160                         }
161                 }
162
163                 public override string Prefix {
164                         get { 
165                                 return current.Prefix;
166                         }
167                 }
168
169                 public override char QuoteChar {
170                         get { return '"'; }
171                 }
172
173                 public override ReadState ReadState {
174                         get { return state; }
175                 }
176
177                 public override string Value {
178                         get { return current.Value; }
179                 }
180
181                 [MonoTODO]
182                 public override string XmlLang {
183                         get { return String.Empty; }
184                 }
185
186                 [MonoTODO]
187                 public override XmlSpace XmlSpace {
188                         get { return 0; }
189                 }
190                 #endregion
191
192                 #region Methods
193
194                 public override void Close ()
195                 {
196                         current = null;
197                         state = ReadState.Closed;
198                 }
199
200                 public override string GetAttribute (int attributeIndex)
201                 {
202                         return this [attributeIndex];
203                 }
204
205                 public override string GetAttribute (string name)
206                 {
207                         return this [name];
208                 }
209
210                 public override string GetAttribute (string name, string namespaceURI)
211                 {
212                         return this [name, namespaceURI];
213                 }
214
215                 [MonoTODO]
216                 public override string LookupNamespace (string prefix)
217                 {
218                         return null;
219                 }
220
221                 public override void MoveToAttribute (int attributeIndex)
222                 {
223                         if (attributeIndex < 0 || attributeIndex > AttributeCount)
224                                 throw new ArgumentOutOfRangeException ();
225                         
226                         state = ReadState.Interactive;
227                         current = current.Attributes [attributeIndex];
228                 }
229
230                 public override bool MoveToAttribute (string name)
231                 {
232                         if (GetAttribute (name) == null)
233                                 return false;
234                         else
235                                 return true;
236                 }
237
238                 public override bool MoveToAttribute (string name, string namespaceURI)
239                 {
240                         if (GetAttribute (name, namespaceURI) == null)
241                                 return false;
242                         else
243                                 return true;
244                 }
245
246                 public override bool MoveToElement ()
247                 {
248                         if (current.NodeType == XmlNodeType.Attribute) {
249                                 current = ((XmlAttribute) current).OwnerElement;
250                                 return true;
251                         } else 
252                                 return false;
253                 }
254
255                 [MonoTODO]
256                 public override bool MoveToFirstAttribute ()
257                 {
258                         return false;
259                 }
260
261                 [MonoTODO]
262                 public override bool MoveToNextAttribute ()
263                 {
264                         if (current.NodeType != XmlNodeType.Attribute)
265                                 return MoveToFirstAttribute ();
266                         else
267                                 return false;
268                 }
269
270                 [MonoTODO]
271                 public override bool Read ()
272                 {
273                         return false;
274                 }
275
276                 [MonoTODO]
277                 public override bool ReadAttributeValue ()
278                 {
279                         return false;
280                 }
281
282                 public override string ReadInnerXml ()
283                 {
284                         if (current.NodeType != XmlNodeType.Attribute &&
285                             current.NodeType != XmlNodeType.Element)
286                                 return String.Empty;
287                         else
288                                 return current.InnerXml;
289                 }
290
291                 public override string ReadOuterXml ()
292                 {
293                         if (current.NodeType != XmlNodeType.Attribute &&
294                             current.NodeType != XmlNodeType.Element)
295                                 return String.Empty;
296                         else
297                                 return current.OuterXml;
298                 }
299
300                 [MonoTODO]
301                 public override string ReadString ()
302                 {
303                         return null;
304                 }
305
306                 [MonoTODO]
307                 public override void ResolveEntity ()
308                 {
309                         if (current.NodeType != XmlNodeType.EntityReference)
310                                 throw new InvalidOperationException ("The current node is not an Entity Reference");
311                 }
312
313                 [MonoTODO]
314                 public override void Skip ()
315                 {
316                 }
317                 #endregion
318         }
319 }