2004-05-06 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaLengthFacet.cs
1 // Author: Dwivedi, Ajay kumar\r
2 //            Adwiv@Yahoo.com\r
3 using System;\r
4 using System.Xml;\r
5 \r
6 namespace System.Xml.Schema\r
7 {\r
8         /// <summary>\r
9         /// Summary description for XmlSchemaLengthFacet.\r
10         /// </summary>\r
11         public class XmlSchemaLengthFacet : XmlSchemaNumericFacet\r
12         {\r
13                 const string xmlname = "length";\r
14 \r
15                 public XmlSchemaLengthFacet()\r
16                 {\r
17                 }\r
18 \r
19                 internal override Facet ThisFacet {\r
20                         get { return Facet.length ; }\r
21                 }\r
22                 \r
23                 //<length\r
24                 //      fixed = boolean : false\r
25                 //      id = ID\r
26                 //      value = nonNegativeInteger\r
27                 //      {any attributes with non-schema namespace . . .}>\r
28                 //      Content: (annotation?)\r
29                 //</length>\r
30                 internal static XmlSchemaLengthFacet Read(XmlSchemaReader reader, ValidationEventHandler h)\r
31                 {\r
32                         XmlSchemaLengthFacet length = new XmlSchemaLengthFacet();\r
33                         reader.MoveToElement();\r
34 \r
35                         if(reader.NamespaceURI != XmlSchema.Namespace || reader.LocalName != xmlname)\r
36                         {\r
37                                 error(h,"Should not happen :1: XmlSchemaLengthFacet.Read, name="+reader.Name,null);\r
38                                 reader.Skip();\r
39                                 return null;\r
40                         }\r
41 \r
42                         length.LineNumber = reader.LineNumber;\r
43                         length.LinePosition = reader.LinePosition;\r
44                         length.SourceUri = reader.BaseURI;\r
45 \r
46                         while(reader.MoveToNextAttribute())\r
47                         {\r
48                                 if(reader.Name == "id")\r
49                                 {\r
50                                         length.Id = reader.Value;\r
51                                 }\r
52                                 else if(reader.Name == "fixed")\r
53                                 {\r
54                                         Exception innerex;\r
55                                         length.IsFixed = XmlSchemaUtil.ReadBoolAttribute(reader,out innerex);\r
56                                         if(innerex != null)\r
57                                                 error(h, reader.Value + " is not a valid value for fixed attribute",innerex);\r
58                                 }\r
59                                 else if(reader.Name == "value")\r
60                                 {\r
61                                         length.Value = reader.Value;\r
62                                 }\r
63                                 else if((reader.NamespaceURI == "" && reader.Name != "xmlns") || reader.NamespaceURI == XmlSchema.Namespace)\r
64                                 {\r
65                                         error(h,reader.Name + " is not a valid attribute for group",null);\r
66                                 }\r
67                                 else\r
68                                 {\r
69                                         XmlSchemaUtil.ReadUnhandledAttribute(reader,length);\r
70                                 }\r
71                         }\r
72                         \r
73                         reader.MoveToElement();\r
74                         if(reader.IsEmptyElement)\r
75                                 return length;\r
76 \r
77                         //  Content: (annotation?)\r
78                         int level = 1;\r
79                         while(reader.ReadNextElement())\r
80                         {\r
81                                 if(reader.NodeType == XmlNodeType.EndElement)\r
82                                 {\r
83                                         if(reader.LocalName != xmlname)\r
84                                                 error(h,"Should not happen :2: XmlSchemaLengthFacet.Read, name="+reader.Name,null);\r
85                                         break;\r
86                                 }\r
87                                 if(level <= 1 && reader.LocalName == "annotation")\r
88                                 {\r
89                                         level = 2;      //Only one annotation\r
90                                         XmlSchemaAnnotation annotation = XmlSchemaAnnotation.Read(reader,h);\r
91                                         if(annotation != null)\r
92                                                 length.Annotation = annotation;\r
93                                         continue;\r
94                                 }\r
95                                 reader.RaiseInvalidElementError();\r
96                         }                       \r
97                         return length;\r
98                 }\r
99         }\r
100 }\r