2003-09-30 Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
[mono.git] / mcs / class / System.XML / System.Xml.Schema / BuiltInDatatype.cs
1 //\r
2 // System.Xml.Schema.XmlSchemaDatatype.cs\r
3 //\r
4 // Author:\r
5 //      Atsushi Enomoto\r
6 //\r
7 // (C)2003 Atsushi Enomoto\r
8 //\r
9 using System;\r
10 using System.Collections;\r
11 using System.Text;\r
12 using System.Xml;\r
13 using System.Xml.Schema;\r
14 \r
15 namespace Mono.Xml.Schema\r
16 {\r
17         public enum XsdWhitespaceFacet\r
18         {\r
19                 Preserve,\r
20                 Replace,\r
21                 Collapse\r
22         }\r
23 \r
24         public enum XsdOrderedFacet\r
25         {\r
26                 False,\r
27                 Partial,\r
28                 Total\r
29         }\r
30 \r
31         public class XsdAnySimpleType : XmlSchemaDatatype\r
32         {\r
33                 static XsdAnySimpleType instance;\r
34                 static XsdAnySimpleType ()\r
35                 {\r
36                         instance = new XsdAnySimpleType ();\r
37                 }\r
38 \r
39                 public static XsdAnySimpleType Instance {\r
40                         get { return instance; }\r
41                 }\r
42 \r
43                 readonly char [] whitespaceArray = new char [] {' '};\r
44 \r
45                 // Fundamental Facets\r
46                 public virtual bool Bounded {\r
47                         get { return false; }\r
48                 }\r
49 \r
50                 public virtual bool Finite {\r
51                         get { return false; }\r
52                 }\r
53 \r
54                 public virtual bool Numeric { \r
55                         get { return false; }\r
56                 }\r
57 \r
58                 public virtual XsdOrderedFacet Ordered { \r
59                         get { return XsdOrderedFacet.False; }\r
60                 }\r
61 \r
62                 public override Type ValueType {\r
63                         get { return typeof (object); }\r
64                 }\r
65 \r
66                 public override XmlTokenizedType TokenizedType {\r
67                         get {\r
68                                 return XmlTokenizedType.None;\r
69                         }\r
70                 }\r
71 \r
72                 public override object ParseValue (string s,\r
73                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
74                 {\r
75                         return Normalize (s);\r
76                 }\r
77 \r
78                 internal object ParseListValue (string s,\r
79                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
80                 {\r
81                         return this.Normalize (s).Split (whitespaceArray);\r
82                 }\r
83         }\r
84 \r
85         // xs:string\r
86         public class XsdString : XsdAnySimpleType\r
87         {\r
88                 internal XsdString ()\r
89                 {\r
90                 }\r
91 \r
92                 public override XmlTokenizedType TokenizedType {\r
93                         get { return XmlTokenizedType.CDATA; }\r
94                 }\r
95 \r
96                 public override Type ValueType {\r
97                         get { return typeof (string); }\r
98                 }\r
99 \r
100                 // Fundamental Facets\r
101                 public override bool Bounded {\r
102                         get { return false; }\r
103                 }\r
104                 public override bool Finite {\r
105                         get { return false; }\r
106                 }\r
107                 public override bool Numeric {\r
108                         get { return false; }\r
109                 }\r
110                 public override XsdOrderedFacet Ordered {\r
111                         get { return XsdOrderedFacet.False; }\r
112                 }\r
113 \r
114                 // Constraining Facets\r
115                 public bool HasLengthFacet;\r
116                 public bool HasMaxLengthFacet;\r
117                 public bool HasMinLengthFacet;\r
118                 public int Length;\r
119                 public int MaxLength;\r
120                 public int MinLength;\r
121                 public string Pattern;\r
122                 public ICollection Enumeration;\r
123         }\r
124 \r
125         // xs:normalizedString\r
126         public class XsdNormalizedString : XsdString\r
127         {\r
128                 internal XsdNormalizedString ()\r
129                 {\r
130                         this.WhitespaceValue = XsdWhitespaceFacet.Replace;\r
131                 }\r
132 \r
133                 public override XmlTokenizedType TokenizedType {\r
134 \r
135                         get { return XmlTokenizedType.CDATA; }\r
136                 }\r
137 \r
138                 public override Type ValueType {\r
139                         get { return typeof (string); }\r
140                 }\r
141 \r
142                 // ParseValue () method is as same as that of xs:string\r
143         }\r
144 \r
145         // xs:token\r
146         public class XsdToken : XsdNormalizedString\r
147         {\r
148                 internal XsdToken ()\r
149                 {\r
150                         this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
151                 }\r
152 \r
153                 public override XmlTokenizedType TokenizedType {\r
154                         get { return XmlTokenizedType.CDATA; }\r
155                 }\r
156 \r
157                 public override Type ValueType {\r
158                         get { return typeof (string); }\r
159                 }\r
160 \r
161                 // ParseValue () method is as same as that of xs:string\r
162         }\r
163 \r
164         // xs:language\r
165         public class XsdLanguage : XsdToken\r
166         {\r
167                 internal XsdLanguage ()\r
168                 {\r
169                 }\r
170 \r
171                 public override XmlTokenizedType TokenizedType {\r
172                         get { return XmlTokenizedType.CDATA; }\r
173                 }\r
174 \r
175                 public override Type ValueType {\r
176                         get { return typeof (string); }\r
177                 }\r
178 \r
179                 // ParseValue () method is as same as that of xs:string\r
180         }\r
181 \r
182         // xs;NMTOKEN\r
183         public class XsdNMToken : XsdToken\r
184         {\r
185                 internal XsdNMToken ()\r
186                 {\r
187                 }\r
188 \r
189                 public override XmlTokenizedType TokenizedType {\r
190                         get { return XmlTokenizedType.NMTOKEN; }\r
191                 }\r
192 \r
193                 public override Type ValueType {\r
194                         get { return typeof (string); }\r
195                 }\r
196 \r
197                 public override object ParseValue (string s,\r
198                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
199                 {\r
200                         if (!XmlChar.IsNmToken (s))\r
201                                 throw new ArgumentException ("'" + s + "' is an invalid NMTOKEN.");\r
202                         return s;\r
203                 }\r
204 \r
205         }\r
206 \r
207         // xs:NMTOKENS\r
208         public class XsdNMTokens : XsdNMToken\r
209         {\r
210                 internal XsdNMTokens ()\r
211                 {\r
212                 }\r
213 \r
214                 public override XmlTokenizedType TokenizedType {\r
215                         get { return XmlTokenizedType.NMTOKENS; }\r
216                 }\r
217 \r
218                 public override Type ValueType {\r
219                         get { return typeof (string []); }\r
220                 }\r
221 \r
222                 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)\r
223                 {\r
224                         return ParseListValue (value, nt, nsmgr);\r
225                 }\r
226         }\r
227 \r
228         // xs:Name\r
229         public class XsdName : XsdToken\r
230         {\r
231                 internal XsdName ()\r
232                 {\r
233                 }\r
234 \r
235                 public override XmlTokenizedType TokenizedType {\r
236                         get { return XmlTokenizedType.CDATA; }\r
237                 }\r
238 \r
239                 public override Type ValueType {\r
240                         get { return typeof (string); }\r
241                 }\r
242 \r
243                 public override object ParseValue (string s,\r
244                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
245                 {\r
246                         if (!XmlChar.IsName (s))\r
247                                 throw new ArgumentException ("'" + s + "' is an invalid name.");\r
248                         return s;\r
249                 }\r
250         }\r
251 \r
252         // xs:NCName\r
253         public class XsdNCName : XsdName\r
254         {\r
255                 internal XsdNCName ()\r
256                 {\r
257                 }\r
258 \r
259                 public override XmlTokenizedType TokenizedType {\r
260                         get { return XmlTokenizedType.NCName; }\r
261                 }\r
262 \r
263                 public override Type ValueType {\r
264                         get { return typeof (string); }\r
265                 }\r
266 \r
267                 public override object ParseValue (string s,\r
268                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
269                 {\r
270                         if (!XmlChar.IsNCName (s))\r
271                                 throw new ArgumentException ("'" + s + "' is an invalid NCName.");\r
272                         return s;\r
273                 }\r
274 \r
275         }\r
276 \r
277         // xs:ID\r
278         public class XsdID : XsdName\r
279         {\r
280                 internal XsdID ()\r
281                 {\r
282                 }\r
283 \r
284                 public override XmlTokenizedType TokenizedType {\r
285                         get { return XmlTokenizedType.ID; }\r
286                 }\r
287 \r
288                 public override Type ValueType {\r
289                         get { return typeof (string); }\r
290                 }\r
291 \r
292                 // ParseValue () method is as same as that of xs:string\r
293         }\r
294 \r
295         // xs:IDREF\r
296         public class XsdIDRef : XsdName\r
297         {\r
298                 internal XsdIDRef ()\r
299                 {\r
300                 }\r
301 \r
302                 public override XmlTokenizedType TokenizedType {\r
303                         get { return XmlTokenizedType.IDREF; }\r
304                 }\r
305 \r
306                 public override Type ValueType {\r
307                         get { return typeof (string); }\r
308                 }\r
309 \r
310                 // ParseValue () method is as same as that of xs:string\r
311         }\r
312 \r
313         // xs:IDREFS\r
314         public class XsdIDRefs : XsdName\r
315         {\r
316                 internal XsdIDRefs ()\r
317                 {\r
318                 }\r
319 \r
320                 public override XmlTokenizedType TokenizedType {\r
321                         get { return XmlTokenizedType.IDREFS; }\r
322                 }\r
323 \r
324                 public override Type ValueType {\r
325                         get { return typeof (string []); }\r
326                 }\r
327 \r
328                 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)\r
329                 {\r
330                         return ParseListValue (value, nt, nsmgr);\r
331                 }\r
332         }\r
333 \r
334         // xs:ENTITY\r
335         public class XsdEntity : XsdName\r
336         {\r
337                 internal XsdEntity ()\r
338 \r
339                 {\r
340                 }\r
341 \r
342                 public override XmlTokenizedType TokenizedType {\r
343                         get { return XmlTokenizedType.ENTITY; }\r
344                 }\r
345 \r
346                 public override Type ValueType {\r
347                         get { return typeof (string); }\r
348                 }\r
349 \r
350                 // ParseValue () method is as same as that of xs:string\r
351         }\r
352 \r
353 \r
354         // xs:ENTITIES\r
355         public class XsdEntities : XsdName\r
356         {\r
357                 internal XsdEntities ()\r
358                 {\r
359                 }\r
360 \r
361                 public override XmlTokenizedType TokenizedType {\r
362                         get { return XmlTokenizedType.ENTITIES; }\r
363                 }\r
364 \r
365                 public override Type ValueType {\r
366                         get { return typeof (string []); }\r
367                 }\r
368 \r
369                 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)\r
370                 {\r
371                         return ParseListValue (value, nt, nsmgr);\r
372                 }\r
373         }\r
374 \r
375         // xs:NOTATION\r
376         public class XsdNotation : XsdAnySimpleType\r
377         {\r
378                 internal XsdNotation ()\r
379                 {\r
380                 }\r
381 \r
382                 public override XmlTokenizedType TokenizedType {\r
383                         get { return XmlTokenizedType.NOTATION; }\r
384                 }\r
385 \r
386                 public override Type ValueType {\r
387                         get { return typeof (string); }\r
388                 }\r
389 \r
390                 public override object ParseValue (string s,\r
391                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
392                 {\r
393                         return Normalize (s);\r
394                 }\r
395 \r
396                 // Fundamental Facets\r
397                 public override bool Bounded {\r
398                         get { return false; }\r
399                 }\r
400                 public override bool Finite {\r
401                         get { return false; }\r
402                 }\r
403                 public override bool Numeric {\r
404                         get { return false; }\r
405                 }\r
406                 public override XsdOrderedFacet Ordered {\r
407                         get { return XsdOrderedFacet.False; }\r
408                 }\r
409 \r
410                 // Constraining Facets\r
411                 public bool HasLengthFacet;\r
412                 public bool HasMaxLengthFacet;\r
413                 public bool HasMinLengthFacet;\r
414                 public int Length;\r
415                 public int MaxLength;\r
416                 public int MinLength;\r
417                 public string Pattern;\r
418                 public ICollection Enumeration;\r
419         }\r
420 \r
421         // xs:decimal\r
422         public class XsdDecimal : XsdAnySimpleType\r
423         {\r
424                 internal XsdDecimal ()\r
425                 {\r
426                 }\r
427 \r
428                 public override XmlTokenizedType TokenizedType {\r
429                         get { return XmlTokenizedType.None; }\r
430                 }\r
431 \r
432                 public override Type ValueType {\r
433                         get { return typeof (decimal); }\r
434                 }\r
435 \r
436                 public override object ParseValue (string s,\r
437                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
438                 {\r
439                         return XmlConvert.ToDecimal (this.Normalize (s));\r
440                 }\r
441 \r
442                 // Fundamental Facets\r
443                 public override bool Bounded {\r
444                         get { return false; }\r
445                 }\r
446                 public override bool Finite {\r
447                         get { return false; }\r
448                 }\r
449                 public override bool Numeric {\r
450                         get { return true; }\r
451                 }\r
452                 public override XsdOrderedFacet Ordered {\r
453                         get { return XsdOrderedFacet.Total; }\r
454                 }\r
455 \r
456                 // Constraining Facets\r
457                 public bool HasLengthFacet;\r
458                 public bool HasMaxLengthFacet;\r
459                 public bool HasMinLengthFacet;\r
460                 public int Length;\r
461                 public int MaxLength;\r
462                 public int MinLength;\r
463                 public string Pattern;\r
464                 public ICollection Enumeration;\r
465         }\r
466 \r
467         // xs:integer\r
468         public class XsdInteger : XsdDecimal\r
469         {\r
470                 public XsdInteger ()\r
471                 {\r
472                         this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
473                 }\r
474 \r
475                 // Here it may be bigger than int's (or long's) MaxValue.\r
476                 public override Type ValueType {\r
477                         get { return typeof (decimal); }\r
478                 }\r
479 \r
480                 public override object ParseValue (string s,\r
481                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
482                 {\r
483                         return XmlConvert.ToDecimal (Normalize (s));\r
484                 }\r
485         }\r
486 \r
487         // xs:Long\r
488         public class XsdLong : XsdInteger\r
489         {\r
490                 public override Type ValueType {\r
491                         get { return typeof (long); }\r
492                 }\r
493 \r
494                 public override object ParseValue (string s,\r
495                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
496                 {\r
497                         return XmlConvert.ToInt64 (Normalize (s));\r
498                 }\r
499         }\r
500 \r
501         // xs:Int\r
502         public class XsdInt : XsdLong\r
503         {\r
504                 public override Type ValueType {\r
505                         get { return typeof (int); }\r
506                 }\r
507 \r
508                 public override object ParseValue (string s,\r
509                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
510                 {\r
511                         return XmlConvert.ToInt32 (Normalize (s));\r
512                 }\r
513         }\r
514 \r
515 \r
516         // xs:Short\r
517         public class XsdShort : XsdInt\r
518         {\r
519                 public override Type ValueType {\r
520                         get { return typeof (short); }\r
521                 }\r
522 \r
523                 public override object ParseValue (string s,\r
524                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
525                 {\r
526                         return XmlConvert.ToInt16 (Normalize (s));\r
527                 }\r
528         }\r
529 \r
530         // xs:Byte\r
531         public class XsdByte : XsdShort\r
532         {\r
533                 public override Type ValueType {\r
534                         get { return typeof (byte); }\r
535                 }\r
536 \r
537                 public override object ParseValue (string s,\r
538                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
539                 {\r
540                         return XmlConvert.ToByte (Normalize (s));\r
541                 }\r
542         }\r
543 \r
544         // xs:nonNegativeInteger\r
545         [CLSCompliant (false)]\r
546         public class XsdNonNegativeInteger : XsdInteger\r
547         {\r
548                 public override Type ValueType {\r
549                         get { return typeof (decimal); }\r
550                 }\r
551 \r
552                 [CLSCompliant (false)]\r
553                 public override object ParseValue (string s,\r
554                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
555                 {\r
556                         return XmlConvert.ToDecimal (Normalize (s));\r
557                 }\r
558         }\r
559 \r
560         // xs:unsignedLong\r
561         [CLSCompliant (false)]\r
562         public class XsdUnsignedLong : XsdNonNegativeInteger\r
563         {\r
564                 public override Type ValueType {\r
565                         get { return typeof (ulong); }\r
566                 }\r
567 \r
568                 public override object ParseValue (string s,\r
569                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
570                 {\r
571                         return XmlConvert.ToUInt64 (Normalize (s));\r
572                 }\r
573         }\r
574 \r
575         // xs:unsignedInt\r
576         [CLSCompliant (false)]\r
577         public class XsdUnsignedInt : XsdUnsignedLong\r
578         {\r
579                 public override Type ValueType {\r
580                         get { return typeof (uint); }\r
581                 }\r
582 \r
583                 public override object ParseValue (string s,\r
584                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
585                 {\r
586                         return XmlConvert.ToUInt32 (Normalize (s));\r
587                 }\r
588         }\r
589 \r
590 \r
591         // xs:unsignedShort\r
592         [CLSCompliant (false)]\r
593         public class XsdUnsignedShort : XsdUnsignedInt\r
594         {\r
595                 public override Type ValueType {\r
596                         get { return typeof (ushort); }\r
597                 }\r
598 \r
599                 public override object ParseValue (string s,\r
600                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
601                 {\r
602                         return XmlConvert.ToUInt16 (Normalize (s));\r
603                 }\r
604         }\r
605 \r
606         // xs:unsignedByte\r
607         [CLSCompliant (false)]\r
608         public class XsdUnsignedByte : XsdUnsignedShort\r
609         {\r
610                 public override Type ValueType {\r
611                         get { return typeof (byte); }\r
612                 }\r
613 \r
614                 public override object ParseValue (string s,\r
615                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
616                 {\r
617                         return XmlConvert.ToByte(Normalize (s));\r
618                 }\r
619         }\r
620 \r
621 \r
622         // xs:positiveInteger\r
623         public class XsdPositiveInteger : XsdNonNegativeInteger\r
624         {\r
625                 // It returns decimal, instead of int or long.\r
626                 // Maybe MS developers thought about big integer...\r
627                 public override Type ValueType {\r
628                         get { return typeof (decimal); }\r
629                 }\r
630 \r
631                 public override object ParseValue (string s,\r
632                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
633                 {\r
634                         return XmlConvert.ToDecimal (Normalize (s));\r
635                 }\r
636         }\r
637 \r
638         // xs:nonPositiveInteger\r
639         public class XsdNonPositiveInteger : XsdInteger\r
640         {\r
641                 public override Type ValueType {\r
642                         get { return typeof (decimal); }\r
643                 }\r
644 \r
645                 public override object ParseValue (string s,\r
646                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
647                 {\r
648                         return XmlConvert.ToDecimal (Normalize (s));\r
649                 }\r
650         }\r
651 \r
652         // xs:negativeInteger\r
653         public class XsdNegativeInteger : XsdNonPositiveInteger\r
654         {\r
655                 public override Type ValueType {\r
656 \r
657                         get { return typeof (decimal); }\r
658                 }\r
659 \r
660                 public override object ParseValue (string s,\r
661                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
662                 {\r
663                         return XmlConvert.ToDecimal (Normalize (s));\r
664                 }\r
665         }\r
666 \r
667         // xs:float\r
668         public class XsdFloat : XsdAnySimpleType\r
669         {\r
670                 // Fundamental Facets\r
671                 public override bool Bounded {\r
672                         get { return true; }\r
673                 }\r
674                 public override bool Finite {\r
675                         get { return true; }\r
676                 }\r
677                 public override bool Numeric {\r
678                         get { return true; }\r
679                 }\r
680                 public override XsdOrderedFacet Ordered {\r
681                         get { return XsdOrderedFacet.Total; }\r
682                 }\r
683 \r
684                 public override Type ValueType {\r
685                         get { return typeof (float); }\r
686                 }\r
687 \r
688                 public override object ParseValue (string s,\r
689                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
690                 {\r
691                         return XmlConvert.ToSingle (Normalize (s));\r
692                 }\r
693         }\r
694 \r
695         // xs:double\r
696         public class XsdDouble : XsdAnySimpleType\r
697         {\r
698                 // Fundamental Facets\r
699                 public override bool Bounded {\r
700                         get { return true; }\r
701                 }\r
702                 public override bool Finite {\r
703                         get { return true; }\r
704                 }\r
705                 public override bool Numeric {\r
706                         get { return true; }\r
707                 }\r
708                 public override XsdOrderedFacet Ordered {\r
709                         get { return XsdOrderedFacet.Total; }\r
710                 }\r
711 \r
712                 public override Type ValueType {\r
713                         get { return typeof (double); }\r
714                 }\r
715 \r
716                 public override object ParseValue (string s,\r
717                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
718                 {\r
719                         return XmlConvert.ToDouble (Normalize (s));\r
720                 }\r
721         }\r
722 \r
723         // xs:base64Binary\r
724         public class XsdBase64Binary : XsdString\r
725         {\r
726                 internal XsdBase64Binary ()\r
727                 {\r
728                 }\r
729 \r
730                 public override Type ValueType {\r
731                         get { return typeof (byte[]); }\r
732                 }\r
733 \r
734                 public override object ParseValue (string s,\r
735                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
736                 {\r
737                         return Convert.FromBase64String (s);\r
738                 }\r
739         }\r
740 \r
741         // xs:hexBinary\r
742         public class XsdHexBinary : XsdAnySimpleType\r
743         {\r
744                 internal XsdHexBinary ()\r
745                 {\r
746                 }\r
747 \r
748                 public override XmlTokenizedType TokenizedType {\r
749                         get { return XmlTokenizedType.None; }\r
750                 }\r
751 \r
752                 public override Type ValueType {\r
753                         get { return typeof (byte []); }\r
754                 }\r
755 \r
756                 [MonoTODO]\r
757                 public override object ParseValue (string s,\r
758                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
759                 {\r
760                         throw new NotImplementedException ();\r
761                 }\r
762 \r
763                 // Fundamental Facets ... no need to override\r
764         }\r
765
766         // xs:QName\r
767         public class XsdQName : XsdName\r
768         {\r
769                 internal XsdQName ()\r
770                 {\r
771                 }\r
772 \r
773                 // Fundamental facets are the same as anySimpleType.\r
774 \r
775                 public override XmlTokenizedType TokenizedType {\r
776                         get { return XmlTokenizedType.QName; }\r
777                 }\r
778 \r
779                 public override Type ValueType {\r
780                         get { return typeof (XmlQualifiedName); }\r
781                 }\r
782 \r
783                 // ParseValue () method is as same as that of xs:string\r
784                 public override object ParseValue (string s,\r
785                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
786                 {\r
787                         if (nameTable == null)\r
788                                 throw new ArgumentNullException ("name table");\r
789                         if (nsmgr == null)\r
790                                 throw new ArgumentNullException ("namespace manager");\r
791                         int colonAt = s.IndexOf (':');\r
792                         string localName = \r
793                                 nameTable.Add (colonAt < 0 ? s : s.Substring (colonAt + 1));\r
794                         return new XmlQualifiedName (localName, nsmgr.LookupNamespace (\r
795                                 colonAt < 0 ? "" : s.Substring (0, colonAt - 1)));\r
796                 }\r
797         }\r
798 \r
799         // xs:boolean\r
800         public class XsdBoolean : XsdAnySimpleType\r
801         {\r
802                 internal XsdBoolean ()\r
803                 {\r
804                 }\r
805 \r
806                 public override XmlTokenizedType TokenizedType {\r
807                         get { return XmlTokenizedType.CDATA; }\r
808                 }\r
809 \r
810                 public override Type ValueType {\r
811                         get { return typeof (bool); }\r
812                 }\r
813 \r
814                 public override object ParseValue (string s,\r
815                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
816                 {\r
817                         return XmlConvert.ToBoolean (this.Normalize (s));\r
818                 }\r
819 \r
820                 // Fundamental Facets\r
821                 public override bool Bounded {\r
822                         get { return false; }\r
823                 }\r
824                 public override bool Finite {\r
825                         get { return true; }\r
826                 }\r
827                 public override bool Numeric {\r
828                         get { return false; }\r
829                 }\r
830                 public override XsdOrderedFacet Ordered {\r
831                         get { return XsdOrderedFacet.Total; }\r
832                 }\r
833         }\r
834 \r
835         // xs:anyURI\r
836         public class XsdAnyURI : XsdString\r
837         {\r
838                 public override XmlTokenizedType TokenizedType {\r
839 \r
840                         get { return XmlTokenizedType.CDATA; }\r
841                 }\r
842 \r
843                 public override Type ValueType {\r
844                         get { return typeof (Uri); }\r
845                 }\r
846 \r
847                 public override object ParseValue (string s,\r
848                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
849                 {\r
850                         return new Uri (s);\r
851                 }\r
852         }\r
853         \r
854         // xs:duration\r
855         public class XsdDuration : XsdAnySimpleType\r
856         {\r
857                 internal XsdDuration ()\r
858                 {\r
859                 }\r
860 \r
861                 public override XmlTokenizedType TokenizedType {\r
862                         get { return XmlTokenizedType.CDATA; }\r
863                 }\r
864 \r
865                 public override Type ValueType {\r
866                         get { return typeof (TimeSpan); }\r
867                 }\r
868 \r
869                 public override object ParseValue (string s,\r
870                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
871                 {\r
872                         return XmlConvert.ToTimeSpan (s);\r
873                 }\r
874 \r
875                 // Fundamental Facets\r
876                 public override bool Bounded {\r
877                         get { return false; }\r
878                 }\r
879                 public override bool Finite {\r
880                         get { return false; }\r
881                 }\r
882                 public override bool Numeric {\r
883                         get { return false; }\r
884                 }\r
885                 public override XsdOrderedFacet Ordered {\r
886                         get { return XsdOrderedFacet.Partial; }\r
887                 }\r
888         }\r
889 \r
890         // xs:dateTime\r
891         public class XsdDateTime : XsdAnySimpleType\r
892         {\r
893                 internal XsdDateTime ()\r
894                 {\r
895                 }\r
896 \r
897                 public override XmlTokenizedType TokenizedType {\r
898                         get { return XmlTokenizedType.CDATA; }\r
899                 }\r
900 \r
901                 public override Type ValueType {\r
902                         get { return typeof (DateTime); }\r
903                 }\r
904 \r
905                 public override object ParseValue (string s,\r
906                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
907                 {\r
908                         return XmlConvert.ToDateTime (s);\r
909                 }\r
910 \r
911                 // Fundamental Facets\r
912                 public override bool Bounded {\r
913                         get { return false; }\r
914                 }\r
915                 public override bool Finite {\r
916                         get { return false; }\r
917                 }\r
918                 public override bool Numeric {\r
919                         get { return false; }\r
920                 }\r
921                 public override XsdOrderedFacet Ordered {\r
922                         get { return XsdOrderedFacet.Partial; }\r
923                 }\r
924         }\r
925 \r
926         // xs:date\r
927         public class XsdDate : XsdDateTime\r
928         {\r
929                 public override object ParseValue (string s,\r
930                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
931                 {\r
932                         return DateTime.ParseExact (s, "yyyy-MM-dd", null);\r
933                 }\r
934         }\r
935 \r
936         // xs:time\r
937         public class XsdTime : XsdDateTime\r
938         {\r
939                 public override object ParseValue (string s,\r
940                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
941                 {\r
942                         return DateTime.ParseExact (s, "HH:mm:ss.fffffffzzz", null);\r
943                 }\r
944         }\r
945
946         // xs:gYearMonth\r
947         public class XsdGYearMonth : XsdAnySimpleType\r
948         {\r
949                 public override Type ValueType {\r
950                         get { return typeof (DateTime); }\r
951                 }\r
952 \r
953                 [MonoTODO]\r
954                 public override object ParseValue (string s,\r
955                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
956                 {\r
957                         return XmlConvert.ToDateTime (Normalize (s));\r
958                 }\r
959         }\r
960 \r
961         // xs:gMonthDay\r
962         public class XsdGMonthDay : XsdAnySimpleType\r
963         {\r
964                 public override Type ValueType {\r
965                         get { return typeof (DateTime); }\r
966                 }\r
967 \r
968                 [MonoTODO]\r
969                 public override object ParseValue (string s,\r
970                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
971                 {\r
972                         return XmlConvert.ToDateTime (Normalize (s));\r
973                 }\r
974         }\r
975 \r
976         // xs:gYear\r
977         public class XsdGYear : XsdAnySimpleType\r
978         {\r
979                 public override Type ValueType {\r
980                         get { return typeof (DateTime); }\r
981                 }\r
982 \r
983                 [MonoTODO]\r
984                 public override object ParseValue (string s,\r
985                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
986                 {\r
987                         return new DateTime (int.Parse (s), 1, 1);\r
988                 }\r
989         }\r
990 \r
991         // xs:gMonth\r
992         public class XsdGMonth : XsdAnySimpleType\r
993         {\r
994                 public override Type ValueType {\r
995                         get { return typeof (DateTime); }\r
996                 }\r
997 \r
998                 [MonoTODO]\r
999                 public override object ParseValue (string s,\r
1000                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
1001                 {\r
1002                         return new DateTime (0, int.Parse (s), 1);\r
1003                 }\r
1004         }\r
1005 \r
1006         // xs:gDay\r
1007         public class XsdGDay : XsdAnySimpleType\r
1008         {\r
1009                 public override Type ValueType {\r
1010                         get { return typeof (DateTime); }\r
1011                 }\r
1012 \r
1013                 [MonoTODO]\r
1014                 public override object ParseValue (string s,\r
1015                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
1016                 {\r
1017                         return new DateTime (0, 1, int.Parse (s));\r
1018                 }\r
1019         }\r
1020 \r
1021 }