merge -r 58060:58217
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaReader.cs
1
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining
4 // a copy of this software and associated documentation files (the
5 // "Software"), to deal in the Software without restriction, including
6 // without limitation the rights to use, copy, modify, merge, publish,
7 // distribute, sublicense, and/or sell copies of the Software, and to
8 // permit persons to whom the Software is furnished to do so, subject to
9 // the following conditions:
10 // 
11 // The above copyright notice and this permission notice shall be
12 // included in all copies or substantial portions of the Software.
13 // 
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 //
22 using System;\r
23 using System.Xml;\r
24 \r
25 namespace System.Xml.Schema\r
26 {\r
27         /// <summary>\r
28         /// A wrapper around XmlReader\r
29         /// </summary>\r
30         internal class XmlSchemaReader : XmlReader, IXmlLineInfo\r
31         {\r
32                 XmlReader reader;\r
33                 ValidationEventHandler handler;\r
34                 bool hasLineInfo;\r
35                 public XmlSchemaReader(XmlReader reader,ValidationEventHandler handler)\r
36                 {\r
37                         this.reader = reader;\r
38                         this.handler = handler;\r
39                         if(reader is IXmlLineInfo)\r
40                         {\r
41                                 IXmlLineInfo info = (IXmlLineInfo)reader;\r
42                                 hasLineInfo = info.HasLineInfo();\r
43                         }\r
44                 }\r
45 \r
46                 /// <summary>\r
47                 /// Returns the Namespace:LocalName for the object\r
48                 /// </summary>\r
49                 public string FullName\r
50                 {\r
51                         get { return NamespaceURI + ":" + LocalName; }\r
52                 }\r
53 \r
54                 public XmlReader Reader\r
55                 {\r
56                         get { return this.reader; }\r
57                 }\r
58 \r
59                 public void RaiseInvalidElementError()\r
60                 {\r
61                         string errstr = "Element "+FullName + " is invalid in this context.\n";\r
62                         if(hasLineInfo)\r
63                                 errstr += "The error occured on ("+((IXmlLineInfo)reader).LineNumber\r
64                                         +","+((IXmlLineInfo)reader).LinePosition+")";\r
65                         XmlSchemaObject.error(handler, errstr, null);\r
66                         SkipToEnd();\r
67                 }\r
68                 /// <summary>\r
69                 /// Reads till the next Element or EndElement. Also checks that the Namespace of the element is\r
70                 /// Schema's Namespace.\r
71                 /// </summary>\r
72                 /// <returns></returns>\r
73                 public bool ReadNextElement()\r
74                 {\r
75                         MoveToElement();\r
76                         while(Read())\r
77                         {\r
78                                 if(NodeType == XmlNodeType.Element || NodeType == XmlNodeType.EndElement)\r
79                                 {\r
80                                         if(reader.NamespaceURI != XmlSchema.Namespace)\r
81                                         {\r
82                                                 RaiseInvalidElementError();\r
83                                         }\r
84                                         else\r
85                                         {\r
86                                                 return true;\r
87                                         }\r
88                                 }\r
89                         }\r
90                         return false;\r
91                 }\r
92 \r
93                 /// <summary>\r
94                 /// Skips to the end of the current element\r
95                 /// </summary>\r
96                 public void SkipToEnd()\r
97                 {\r
98                         MoveToElement();\r
99                         if(IsEmptyElement || NodeType != XmlNodeType.Element)\r
100                                 return;\r
101                         if(NodeType == XmlNodeType.Element)\r
102                         {\r
103                                 int depth = Depth;\r
104                                 while(Read())\r
105                                 {\r
106                                         if(Depth == depth)\r
107                                                 break;\r
108                                 }\r
109                         }\r
110                         return;\r
111                 }\r
112 \r
113                 #region LineInfo\r
114                 public bool HasLineInfo()\r
115                 {\r
116                         return hasLineInfo;\r
117                 }\r
118                 public int LineNumber\r
119                 {\r
120                         get { return hasLineInfo?((IXmlLineInfo)reader).LineNumber: 0; }\r
121                 }\r
122                 public int LinePosition\r
123                 {\r
124                         get { return hasLineInfo?((IXmlLineInfo)reader).LinePosition: 0; }\r
125                 }\r
126                 #endregion\r
127 \r
128                 #region Delegates\r
129                 public override int AttributeCount \r
130                 {\r
131                         get { return  reader.AttributeCount; }\r
132                 }\r
133                 public override string BaseURI \r
134                 {\r
135                         get { return  reader.BaseURI; }\r
136                 }\r
137                 public override bool CanResolveEntity \r
138                 {\r
139                         get { return  reader.CanResolveEntity; }\r
140                 }\r
141                 public override int Depth \r
142                 {\r
143                         get { return  reader.Depth; }\r
144                 }\r
145                 public override bool EOF \r
146                 {\r
147                         get { return  reader.EOF; }\r
148                 }\r
149                 public override bool HasAttributes \r
150                 {\r
151                         get { return  reader.HasAttributes; }\r
152                 }\r
153                 public override bool HasValue \r
154                 {\r
155                         get { return  reader.HasValue; }\r
156                 }\r
157                 public override bool IsDefault \r
158                 {\r
159                         get { return  reader.IsDefault; }\r
160                 }\r
161                 public override bool IsEmptyElement \r
162                 {\r
163                         get { return  reader.IsEmptyElement; }\r
164                 }\r
165                 public override string this[ int i ] \r
166                 {\r
167                         get { return  reader[i]; }\r
168                 }\r
169                 public override string this[ string name ] \r
170                 {\r
171                         get { return  reader[name]; }\r
172                 }\r
173                 public override string this[ string name, string namespaceURI ] \r
174                 {\r
175                         get { return  reader[name,namespaceURI]; }\r
176                 }\r
177                 public override string LocalName \r
178                 {\r
179                         get { return  reader.LocalName; }\r
180                 }\r
181                 public override string Name \r
182                 {\r
183                         get { return  reader.Name; }\r
184                 }\r
185                 public override string NamespaceURI \r
186                 {\r
187                         get { return  reader.NamespaceURI; }\r
188                 }\r
189                 public override XmlNameTable NameTable \r
190                 {\r
191                         get { return  reader.NameTable; }\r
192                 }\r
193                 public override XmlNodeType NodeType \r
194                 {\r
195                         get { return  reader.NodeType; }\r
196                 }\r
197                 public override string Prefix \r
198                 {\r
199                         get { return  reader.Prefix; }\r
200                 }\r
201                 public override char QuoteChar \r
202                 {\r
203                         get { return  reader.QuoteChar; }\r
204                 }\r
205                 public override ReadState ReadState \r
206                 {\r
207                         get { return  reader.ReadState; }\r
208                 }\r
209                 public override string Value \r
210                 {\r
211                         get { return  reader.Value; }\r
212                 }\r
213                 public override string XmlLang \r
214                 {\r
215                         get { return  reader.XmlLang; }\r
216                 }\r
217                 public override XmlSpace XmlSpace \r
218                 {\r
219                         get { return  reader.XmlSpace; }\r
220                 }\r
221 \r
222                 public override void Close()\r
223                 {\r
224                         reader.Close(); \r
225                 }\r
226 \r
227                 public override bool Equals(object obj)\r
228                 {\r
229                         return reader.Equals(obj); \r
230                 }\r
231 \r
232                 public override string GetAttribute(int i)\r
233                 {\r
234                         return reader.GetAttribute(i); \r
235                 }\r
236 \r
237                 public override string GetAttribute(string name)\r
238                 {\r
239                         return reader.GetAttribute(name); \r
240                 }\r
241 \r
242                 public override string GetAttribute(string name, string namespaceURI)\r
243                 {\r
244                         return reader.GetAttribute(name, namespaceURI); \r
245                 }\r
246 \r
247                 public override int GetHashCode()\r
248                 {\r
249                         return reader.GetHashCode(); \r
250                 }\r
251 \r
252                 public override bool IsStartElement()\r
253                 {\r
254                         return reader.IsStartElement(); \r
255                 }\r
256 \r
257                 public override bool IsStartElement(string localname, string ns)\r
258                 {\r
259                         return reader.IsStartElement(localname, ns); \r
260                 }\r
261 \r
262                 public override bool IsStartElement(string name)\r
263                 {\r
264                         return reader.IsStartElement(name); \r
265                 }\r
266 \r
267                 public override string LookupNamespace(string prefix)\r
268                 {\r
269                         return reader.LookupNamespace(prefix); \r
270                 }\r
271 \r
272                 public override void MoveToAttribute(int i)\r
273                 {\r
274                         reader.MoveToAttribute(i); \r
275                 }\r
276 \r
277                 public override bool MoveToAttribute(string name)\r
278                 {\r
279                         return reader.MoveToAttribute(name); \r
280                 }\r
281 \r
282                 public override bool MoveToAttribute(string name, string ns)\r
283                 {\r
284                         return reader.MoveToAttribute(name,ns); \r
285                 }\r
286 \r
287                 public override System.Xml.XmlNodeType MoveToContent()\r
288                 {\r
289                         return reader.MoveToContent(); \r
290                 }\r
291 \r
292                 public override bool MoveToElement()\r
293                 {\r
294                         return reader.MoveToElement(); \r
295                 }\r
296 \r
297                 public override bool MoveToFirstAttribute()\r
298                 {\r
299                         return reader.MoveToFirstAttribute(); \r
300                 }\r
301 \r
302                 public override bool MoveToNextAttribute()\r
303                 {\r
304                         return reader.MoveToNextAttribute(); \r
305                 }\r
306 \r
307                 public override bool Read()\r
308                 {\r
309                         return reader.Read(); \r
310                 }\r
311 \r
312                 public override bool ReadAttributeValue()\r
313                 {\r
314                         return reader.ReadAttributeValue(); \r
315                 }\r
316 \r
317                 public override string ReadElementString()\r
318                 {\r
319                         return reader.ReadElementString(); \r
320                 }\r
321 \r
322                 public override string ReadElementString(string localname, string ns)\r
323                 {\r
324                         return reader.ReadElementString(localname, ns); \r
325                 }\r
326 \r
327                 public override string ReadElementString(string name)\r
328                 {\r
329                         return reader.ReadElementString(name); \r
330                 }\r
331 \r
332                 public override void ReadEndElement()\r
333                 {\r
334                         reader.ReadEndElement(); \r
335                 }\r
336 \r
337                 public override string ReadInnerXml()\r
338                 {\r
339                         return reader.ReadInnerXml(); \r
340                 }\r
341 \r
342                 public override string ReadOuterXml()\r
343                 {\r
344                         return reader.ReadOuterXml(); \r
345                 }\r
346 \r
347                 public override void ReadStartElement()\r
348                 {\r
349                         reader.ReadStartElement(); \r
350                 }\r
351 \r
352                 public override void ReadStartElement(string localname, string ns)\r
353                 {\r
354                         reader.ReadStartElement(localname, ns); \r
355                 }\r
356 \r
357                 public override void ReadStartElement(string name)\r
358                 {\r
359                         reader.ReadStartElement(name); \r
360                 }\r
361 \r
362                 public override string ReadString()\r
363                 {\r
364                         return reader.ReadString(); \r
365                 }\r
366 \r
367                 public override void ResolveEntity()\r
368                 {\r
369                         reader.ResolveEntity(); \r
370                 }\r
371 \r
372                 public override void Skip()\r
373                 {\r
374                         reader.Skip(); \r
375                 }\r
376 \r
377                 public override string ToString()\r
378                 {\r
379                         return reader.ToString(); \r
380                 }\r
381 \r
382                 #endregion\r
383         }\r
384 }\r