2010-06-21 Atsushi Enomoto <atsushi@ximian.com>
[mcs.git] / class / System.XML / System.Xml.Schema / BuiltInDatatype.cs
blobb082221ed071ed83feefff2c671aef974ac85790
1 //
2 // System.Xml.Schema.XmlSchemaDatatype.cs
3 //
4 // Author:
5 // Atsushi Enomoto
6 //
7 // (C)2003 Atsushi Enomoto
8 //
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
18 //
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 //
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System;
31 using System.Collections;
32 using System.Text;
33 using System.Xml;
34 using System.Xml.Schema;
35 using System.Globalization;
36 using System.Security.Cryptography;
38 #if NET_2_0
39 using NSResolver = System.Xml.IXmlNamespaceResolver;
40 #else
41 using NSResolver = System.Xml.XmlNamespaceManager;
42 #endif
45 namespace Mono.Xml.Schema
47 internal enum XsdWhitespaceFacet
49 Preserve,
50 Replace,
51 Collapse
54 internal enum XsdOrderedFacet
56 False,
57 Partial,
58 Total
61 internal enum XsdOrdering
63 LessThan = -1,
64 Equal = 0,
65 GreaterThan = 1,
66 Indeterminate = 2
69 internal class XsdAnySimpleType : XmlSchemaDatatype
71 static XsdAnySimpleType instance;
72 static XsdAnySimpleType ()
74 instance = new XsdAnySimpleType ();
77 public static XsdAnySimpleType Instance {
78 get { return instance; }
81 protected XsdAnySimpleType ()
85 #if NET_2_0
86 public override XmlTypeCode TypeCode {
87 get { return XmlTypeCode.AnyAtomicType; }
89 #endif
91 static readonly char [] whitespaceArray = new char [] {' '};
93 // Fundamental Facets
94 public virtual bool Bounded {
95 get { return false; }
98 public virtual bool Finite {
99 get { return false; }
102 public virtual bool Numeric {
103 get { return false; }
106 public virtual XsdOrderedFacet Ordered {
107 get { return XsdOrderedFacet.False; }
110 public override Type ValueType {
111 get {
112 if (XmlSchemaUtil.StrictMsCompliant)
113 return typeof (string);
114 else
115 return typeof (object);
119 public override XmlTokenizedType TokenizedType {
120 get {
121 return XmlTokenizedType.None;
125 public override object ParseValue (string s,
126 XmlNameTable nameTable, NSResolver nsmgr)
128 return Normalize (s);
131 internal override ValueType ParseValueType (string s,
132 XmlNameTable nameTable, NSResolver nsmgr)
134 return new StringValueType (Normalize (s));
137 internal string [] ParseListValue (string s, XmlNameTable nameTable)
139 return this.Normalize (s, XsdWhitespaceFacet.Collapse).Split (whitespaceArray);
144 // Can you even use XsdAnySimpleType in a schema?
145 // -> Yes. See E1-22 of http://www.w3.org/2001/05/xmlschema-errata#Errata1 (somewhat paranoid ;-)
147 internal bool AllowsFacet(XmlSchemaFacet xsf) {
148 return (AllowedFacets & xsf.ThisFacet)!=0;
153 internal virtual XsdOrdering Compare(object x, object y) {
154 return XsdOrdering.Indeterminate;
157 internal virtual int Length(string s) {
158 return s.Length;
162 // anySimpleType allows any facet
163 internal virtual XmlSchemaFacet.Facet AllowedFacets {
164 get { return XmlSchemaFacet.AllFacets ;}
167 /* Matches facets allowed on boolean type
169 internal static readonly XmlSchemaFacet.Facet booleanAllowedFacets =
170 XmlSchemaFacet.Facet.pattern | XmlSchemaFacet.Facet.whiteSpace;
172 /* Matches facets allowed on decimal type.
174 internal static readonly XmlSchemaFacet.Facet decimalAllowedFacets =
175 XmlSchemaFacet.Facet.pattern | XmlSchemaFacet.Facet.enumeration |
176 XmlSchemaFacet.Facet.whiteSpace | XmlSchemaFacet.Facet.maxInclusive |
177 XmlSchemaFacet.Facet.minInclusive | XmlSchemaFacet.Facet.maxExclusive |
178 XmlSchemaFacet.Facet.minExclusive | XmlSchemaFacet.Facet.fractionDigits |
179 XmlSchemaFacet.Facet.totalDigits ;
181 /* Matches facets allowed on float, double, duration, dateTime, time, date,
182 * gYearMonth, gYear, gMonthDay, gMonth, and gDay types
185 internal static readonly XmlSchemaFacet.Facet durationAllowedFacets =
186 XmlSchemaFacet.Facet.pattern | XmlSchemaFacet.Facet.enumeration |
187 XmlSchemaFacet.Facet.whiteSpace | XmlSchemaFacet.Facet.maxInclusive |
188 XmlSchemaFacet.Facet.minInclusive | XmlSchemaFacet.Facet.maxExclusive |
189 XmlSchemaFacet.Facet.minExclusive ;
191 /* Matches facet allowed on string, hexBinary, base64Binary,
192 * anyURI, QName and NOTATION types
194 * Also used on list types
197 internal static readonly XmlSchemaFacet.Facet stringAllowedFacets =
198 XmlSchemaFacet.Facet.length | XmlSchemaFacet.Facet.minLength |
199 XmlSchemaFacet.Facet.maxLength | XmlSchemaFacet.Facet.pattern |
200 XmlSchemaFacet.Facet.enumeration | XmlSchemaFacet.Facet.whiteSpace;
203 #if NET_2_0
204 internal class XdtAnyAtomicType : XsdAnySimpleType
206 internal XdtAnyAtomicType ()
210 public override XmlTypeCode TypeCode {
211 get { return XmlTypeCode.AnyAtomicType; }
215 internal class XdtUntypedAtomic : XdtAnyAtomicType
217 internal XdtUntypedAtomic ()
221 public override XmlTypeCode TypeCode {
222 get { return XmlTypeCode.UntypedAtomic; }
225 #endif
227 // xs:string
228 internal class XsdString : XsdAnySimpleType
230 internal XsdString ()
234 internal override XmlSchemaFacet.Facet AllowedFacets {
235 get { return stringAllowedFacets; }
238 public override XmlTokenizedType TokenizedType {
239 get { return XmlTokenizedType.CDATA; }
242 #if NET_2_0
243 public override XmlTypeCode TypeCode {
244 get { return XmlTypeCode.String; }
246 #endif
248 public override Type ValueType {
249 get { return typeof (string); }
252 // Fundamental Facets
253 public override bool Bounded {
254 get { return false; }
256 public override bool Finite {
257 get { return false; }
259 public override bool Numeric {
260 get { return false; }
262 public override XsdOrderedFacet Ordered {
263 get { return XsdOrderedFacet.False; }
268 // xs:normalizedString
269 internal class XsdNormalizedString : XsdString
271 internal XsdNormalizedString ()
273 this.WhitespaceValue = XsdWhitespaceFacet.Replace;
276 public override XmlTokenizedType TokenizedType {
278 get { return XmlTokenizedType.CDATA; }
281 #if NET_2_0
282 public override XmlTypeCode TypeCode {
283 get { return XmlTypeCode.NormalizedString; }
285 #endif
287 public override Type ValueType {
288 get { return typeof (string); }
291 // ParseValue () method is as same as that of xs:string
294 // xs:token
295 internal class XsdToken : XsdNormalizedString
297 internal XsdToken ()
299 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
302 public override XmlTokenizedType TokenizedType {
303 get { return XmlTokenizedType.CDATA; }
306 #if NET_2_0
307 public override XmlTypeCode TypeCode {
308 get { return XmlTypeCode.Token; }
310 #endif
312 public override Type ValueType {
313 get { return typeof (string); }
316 // ParseValue () method is as same as that of xs:string
319 // xs:language
320 internal class XsdLanguage : XsdToken
322 internal XsdLanguage ()
326 public override XmlTokenizedType TokenizedType {
327 get { return XmlTokenizedType.CDATA; }
330 #if NET_2_0
331 public override XmlTypeCode TypeCode {
332 get { return XmlTypeCode.Language; }
334 #endif
336 public override Type ValueType {
337 get { return typeof (string); }
340 // ParseValue () method is as same as that of xs:string
343 // xs;NMTOKEN
344 internal class XsdNMToken : XsdToken
346 internal XsdNMToken ()
350 public override XmlTokenizedType TokenizedType {
351 get { return XmlTokenizedType.NMTOKEN; }
354 #if NET_2_0
355 public override XmlTypeCode TypeCode {
356 get { return XmlTypeCode.NmToken; }
358 #endif
360 public override Type ValueType {
361 get { return typeof (string); }
364 public override object ParseValue (string s,
365 XmlNameTable nameTable, NSResolver nsmgr)
367 if (!XmlChar.IsNmToken (s))
368 throw new ArgumentException ("'" + s + "' is an invalid NMTOKEN.");
369 return s;
372 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
374 return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);
378 // xs:NMTOKENS
379 internal class XsdNMTokens : XsdNMToken
381 internal XsdNMTokens ()
385 public override XmlTokenizedType TokenizedType {
386 get { return XmlTokenizedType.NMTOKENS; }
389 #if NET_2_0
390 [MonoTODO]
391 public override XmlTypeCode TypeCode {
392 get { return XmlTypeCode.Item; }
394 #endif
396 public override Type ValueType {
397 get { return typeof (string []); }
400 public override object ParseValue (string value, XmlNameTable nt, NSResolver nsmgr)
402 return GetValidatedArray (value, nt);
405 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
407 return new StringArrayValueType (GetValidatedArray (s, nameTable));
410 private string [] GetValidatedArray (string value, XmlNameTable nt)
412 string [] nmtokens = ParseListValue (value, nt);
413 for (int i = 0; i < nmtokens.Length; i++)
414 if (!XmlChar.IsNmToken (nmtokens [i]))
415 throw new ArgumentException ("Invalid name token.");
416 return nmtokens;
420 // xs:Name
421 internal class XsdName : XsdToken
423 internal XsdName ()
427 public override XmlTokenizedType TokenizedType {
428 get { return XmlTokenizedType.CDATA; }
431 #if NET_2_0
432 public override XmlTypeCode TypeCode {
433 get { return XmlTypeCode.Name; }
435 #endif
437 public override Type ValueType {
438 get { return typeof (string); }
441 public override object ParseValue (string s,
442 XmlNameTable nameTable, NSResolver nsmgr)
444 if (!XmlChar.IsName (s))
445 throw new ArgumentException ("'" + s + "' is an invalid name.");
446 return s;
449 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
451 return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);
455 // xs:NCName
456 internal class XsdNCName : XsdName
458 internal XsdNCName ()
462 public override XmlTokenizedType TokenizedType {
463 get { return XmlTokenizedType.NCName; }
466 #if NET_2_0
467 public override XmlTypeCode TypeCode {
468 get { return XmlTypeCode.NCName; }
470 #endif
472 public override Type ValueType {
473 get { return typeof (string); }
476 public override object ParseValue (string s,
477 XmlNameTable nameTable, NSResolver nsmgr)
479 if (!XmlChar.IsNCName (s))
480 throw new ArgumentException ("'" + s + "' is an invalid NCName.");
481 return s;
484 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
486 return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);
490 // xs:ID
491 internal class XsdID : XsdName
493 internal XsdID ()
497 public override XmlTokenizedType TokenizedType {
498 get { return XmlTokenizedType.ID; }
501 #if NET_2_0
502 public override XmlTypeCode TypeCode {
503 get { return XmlTypeCode.Id; }
505 #endif
507 public override Type ValueType {
508 get { return typeof (string); }
511 public override object ParseValue (string s, XmlNameTable nt, NSResolver nsmgr)
513 if (!XmlChar.IsNCName (s))
514 throw new ArgumentException ("'" + s + "' is an invalid NCName.");
515 return s;
519 // xs:IDREF
520 internal class XsdIDRef : XsdName
522 internal XsdIDRef ()
526 public override XmlTokenizedType TokenizedType {
527 get { return XmlTokenizedType.IDREF; }
530 #if NET_2_0
531 public override XmlTypeCode TypeCode {
532 get { return XmlTypeCode.Idref; }
534 #endif
536 public override Type ValueType {
537 get { return typeof (string); }
540 public override object ParseValue (string s, XmlNameTable nt, NSResolver nsmgr)
542 if (!XmlChar.IsNCName (s))
543 throw new ArgumentException ("'" + s + "' is an invalid NCName.");
544 return s;
548 // xs:IDREFS
549 internal class XsdIDRefs : XsdName
551 internal XsdIDRefs ()
555 public override XmlTokenizedType TokenizedType {
556 get { return XmlTokenizedType.IDREFS; }
559 #if NET_2_0
560 [MonoTODO]
561 public override XmlTypeCode TypeCode {
562 get { return XmlTypeCode.Item; }
564 #endif
566 public override Type ValueType {
567 get { return typeof (string []); }
570 public override object ParseValue (string value, XmlNameTable nt, NSResolver nsmgr)
572 return GetValidatedArray (value, nt);
575 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
577 return new StringArrayValueType (GetValidatedArray (s, nameTable));
580 private string [] GetValidatedArray (string value, XmlNameTable nt)
582 string [] idrefs = ParseListValue (value, nt);
583 for (int i = 0; i < idrefs.Length; i++)
584 XmlConvert.VerifyNCName (idrefs [i]);
585 return idrefs;
589 // xs:ENTITY
590 internal class XsdEntity : XsdName
592 internal XsdEntity ()
596 public override XmlTokenizedType TokenizedType {
597 get { return XmlTokenizedType.ENTITY; }
600 #if NET_2_0
601 public override XmlTypeCode TypeCode {
602 get { return XmlTypeCode.Entity; }
604 #endif
606 public override Type ValueType {
607 get { return typeof (string); }
614 // xs:ENTITIES
615 internal class XsdEntities : XsdName
617 internal XsdEntities ()
621 public override XmlTokenizedType TokenizedType {
622 get { return XmlTokenizedType.ENTITIES; }
625 #if NET_2_0
626 [MonoTODO]
627 public override XmlTypeCode TypeCode {
628 get { return XmlTypeCode.Item; }
630 #endif
632 public override Type ValueType {
633 get { return typeof (string []); }
636 public override object ParseValue (string value, XmlNameTable nt, NSResolver nsmgr)
638 return GetValidatedArray (value, nt);
641 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
643 return new StringArrayValueType (GetValidatedArray (s, nameTable));
646 private string [] GetValidatedArray (string value, XmlNameTable nt)
648 string [] entities = ParseListValue (value, nt);
649 for (int i = 0; i < entities.Length; i++)
650 if (!XmlChar.IsName (entities [i]))
651 throw new ArgumentException ("Invalid entitiy name.");
652 return entities;
656 // xs:NOTATION
657 internal class XsdNotation : XsdAnySimpleType
659 internal XsdNotation ()
663 internal override XmlSchemaFacet.Facet AllowedFacets {
664 get { return stringAllowedFacets; }
667 public override XmlTokenizedType TokenizedType {
668 get { return XmlTokenizedType.NOTATION; }
671 #if NET_2_0
672 public override XmlTypeCode TypeCode {
673 get { return XmlTypeCode.Notation; }
675 #endif
677 public override Type ValueType {
678 get { return typeof (string); }
681 public override object ParseValue (string s,
682 XmlNameTable nameTable, NSResolver nsmgr)
684 return Normalize (s);
687 // Fundamental Facets
688 public override bool Bounded {
689 get { return false; }
691 public override bool Finite {
692 get { return false; }
694 public override bool Numeric {
695 get { return false; }
697 public override XsdOrderedFacet Ordered {
698 get { return XsdOrderedFacet.False; }
703 // xs:decimal
704 internal class XsdDecimal : XsdAnySimpleType
706 internal XsdDecimal ()
708 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
711 internal override XmlSchemaFacet.Facet AllowedFacets {
712 get { return decimalAllowedFacets; }
715 public override XmlTokenizedType TokenizedType {
716 get { return XmlTokenizedType.None; }
719 #if NET_2_0
720 public override XmlTypeCode TypeCode {
721 get { return XmlTypeCode.Decimal; }
723 #endif
725 public override Type ValueType {
726 get { return typeof (decimal); }
729 public override object ParseValue (string s,
730 XmlNameTable nameTable, NSResolver nsmgr)
732 return ParseValueType (s, nameTable, nsmgr);
735 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
737 return XmlConvert.ToDecimal (this.Normalize (s));
740 internal override XsdOrdering Compare(object x, object y) {
741 if ((x is Decimal) && (y is Decimal)) {
742 int ret = Decimal.Compare((Decimal)x, (Decimal)y);
743 if (ret < 0) {
744 return XsdOrdering.LessThan;
746 else if (ret > 0) {
747 return XsdOrdering.GreaterThan;
749 else {
750 return XsdOrdering.Equal;
753 return XsdOrdering.Indeterminate;
756 // Fundamental Facets
757 public override bool Bounded {
758 get { return false; }
760 public override bool Finite {
761 get { return false; }
763 public override bool Numeric {
764 get { return true; }
766 public override XsdOrderedFacet Ordered {
767 get { return XsdOrderedFacet.Total; }
772 // xs:integer
773 internal class XsdInteger : XsdDecimal
775 public XsdInteger ()
779 #if NET_2_0
780 public override XmlTypeCode TypeCode {
781 get { return XmlTypeCode.Integer; }
783 #endif
785 // Here it may be bigger than int's (or long's) MaxValue.
786 public override Type ValueType {
787 get { return typeof (decimal); }
790 public override object ParseValue (string s,
791 XmlNameTable nameTable, NSResolver nsmgr)
793 return ParseValueType (s, nameTable, nsmgr);
796 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
798 decimal d = XmlConvert.ToDecimal (Normalize (s));
799 if (Decimal.Floor (d) != d)
800 throw new FormatException ("Integer contains point number.");
801 return d;
808 // xs:Long
809 internal class XsdLong : XsdInteger
811 #if NET_2_0
812 public override XmlTypeCode TypeCode {
813 get { return XmlTypeCode.Long; }
815 #endif
817 public override Type ValueType {
818 get { return typeof (long); }
821 public override object ParseValue (string s,
822 XmlNameTable nameTable, NSResolver nsmgr)
824 return ParseValueType (s, nameTable, nsmgr);
827 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
829 return XmlConvert.ToInt64 (Normalize (s));
832 internal override XsdOrdering Compare(object x, object y) {
833 if ((x is long) && (y is long)) {
834 if ((long)x==(long)y) {
835 return XsdOrdering.Equal;
837 else if ((long)x<(long)y) {
838 return XsdOrdering.LessThan;
840 else {
841 return XsdOrdering.GreaterThan;
844 return XsdOrdering.Indeterminate;
848 // xs:Int
849 internal class XsdInt : XsdLong
851 #if NET_2_0
852 public override XmlTypeCode TypeCode {
853 get { return XmlTypeCode.Int; }
855 #endif
857 public override Type ValueType {
858 get { return typeof (int); }
861 public override object ParseValue (string s,
862 XmlNameTable nameTable, NSResolver nsmgr)
864 return ParseValueType (s, nameTable, nsmgr);
867 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
869 return XmlConvert.ToInt32 (Normalize (s));
872 internal override XsdOrdering Compare(object x, object y) {
873 if ((x is int) && (y is int)) {
874 if ((int)x==(int)y) {
875 return XsdOrdering.Equal;
877 else if ((int)x<(int)y) {
878 return XsdOrdering.LessThan;
880 else {
881 return XsdOrdering.GreaterThan;
884 return XsdOrdering.Indeterminate;
889 // xs:Short
890 internal class XsdShort : XsdInt
892 #if NET_2_0
893 public override XmlTypeCode TypeCode {
894 get { return XmlTypeCode.Short; }
896 #endif
898 public override Type ValueType {
899 get { return typeof (short); }
902 public override object ParseValue (string s,
903 XmlNameTable nameTable, NSResolver nsmgr)
905 return ParseValueType (s, nameTable, nsmgr);
908 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
910 return XmlConvert.ToInt16 (Normalize (s));
913 internal override XsdOrdering Compare(object x, object y) {
914 if ((x is short) && (y is short)) {
915 if ((short)x==(short)y) {
916 return XsdOrdering.Equal;
918 else if ((short)x<(short)y) {
919 return XsdOrdering.LessThan;
921 else {
922 return XsdOrdering.GreaterThan;
925 return XsdOrdering.Indeterminate;
929 // xs:Byte
930 internal class XsdByte : XsdShort
932 #if NET_2_0
933 public override XmlTypeCode TypeCode {
934 get { return XmlTypeCode.Byte; }
936 #endif
938 public override Type ValueType {
939 get { return typeof (sbyte); }
942 public override object ParseValue (string s,
943 XmlNameTable nameTable, NSResolver nsmgr)
945 return ParseValueType (s, nameTable, nsmgr);
948 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
950 return XmlConvert.ToSByte (Normalize (s));
953 internal override XsdOrdering Compare(object x, object y) {
954 if ((x is sbyte) && (y is sbyte)) {
955 if ((sbyte)x==(sbyte)y) {
956 return XsdOrdering.Equal;
958 else if ((sbyte)x<(sbyte)y) {
959 return XsdOrdering.LessThan;
961 else {
962 return XsdOrdering.GreaterThan;
965 return XsdOrdering.Indeterminate;
969 // xs:nonNegativeInteger
970 // [CLSCompliant (false)]
971 internal class XsdNonNegativeInteger : XsdInteger
973 #if NET_2_0
974 public override XmlTypeCode TypeCode {
975 get { return XmlTypeCode.NonNegativeInteger; }
977 #endif
979 public override Type ValueType {
980 get { return typeof (decimal); }
983 // [CLSCompliant (false)]
984 public override object ParseValue (string s,
985 XmlNameTable nameTable, NSResolver nsmgr)
987 return ParseValueType (s, nameTable, nsmgr);
990 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
992 return XmlConvert.ToDecimal (Normalize (s));
996 // xs:unsignedLong
997 // [CLSCompliant (false)]
998 internal class XsdUnsignedLong : XsdNonNegativeInteger
1000 #if NET_2_0
1001 public override XmlTypeCode TypeCode {
1002 get { return XmlTypeCode.UnsignedLong; }
1004 #endif
1006 public override Type ValueType {
1007 get { return typeof (ulong); }
1010 public override object ParseValue (string s,
1011 XmlNameTable nameTable, NSResolver nsmgr)
1013 return ParseValueType (s, nameTable, nsmgr);
1016 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1018 return XmlConvert.ToUInt64 (Normalize (s));
1021 internal override XsdOrdering Compare(object x, object y) {
1022 if ((x is ulong) && (y is ulong)) {
1023 if ((ulong)x==(ulong)y) {
1024 return XsdOrdering.Equal;
1026 else if ((ulong)x<(ulong)y) {
1027 return XsdOrdering.LessThan;
1029 else {
1030 return XsdOrdering.GreaterThan;
1033 return XsdOrdering.Indeterminate;
1037 // xs:unsignedInt
1038 // [CLSCompliant (false)]
1039 internal class XsdUnsignedInt : XsdUnsignedLong
1041 #if NET_2_0
1042 public override XmlTypeCode TypeCode {
1043 get { return XmlTypeCode.UnsignedInt; }
1045 #endif
1047 public override Type ValueType {
1048 get { return typeof (uint); }
1051 public override object ParseValue (string s,
1052 XmlNameTable nameTable, NSResolver nsmgr)
1054 return ParseValueType (s, nameTable, nsmgr);
1057 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1059 return XmlConvert.ToUInt32 (Normalize (s));
1062 internal override XsdOrdering Compare(object x, object y) {
1063 if ((x is uint) && (y is uint)) {
1064 if ((uint)x==(uint)y) {
1065 return XsdOrdering.Equal;
1067 else if ((uint)x<(uint)y) {
1068 return XsdOrdering.LessThan;
1070 else {
1071 return XsdOrdering.GreaterThan;
1074 return XsdOrdering.Indeterminate;
1079 // xs:unsignedShort
1080 // [CLSCompliant (false)]
1081 internal class XsdUnsignedShort : XsdUnsignedInt
1083 #if NET_2_0
1084 public override XmlTypeCode TypeCode {
1085 get { return XmlTypeCode.UnsignedShort; }
1087 #endif
1089 public override Type ValueType {
1090 get { return typeof (ushort); }
1093 public override object ParseValue (string s,
1094 XmlNameTable nameTable, NSResolver nsmgr)
1096 return ParseValueType (s, nameTable, nsmgr);
1099 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1101 return XmlConvert.ToUInt16 (Normalize (s));
1104 internal override XsdOrdering Compare(object x, object y) {
1105 if ((x is ushort) && (y is ushort)) {
1106 if ((ushort)x==(ushort)y) {
1107 return XsdOrdering.Equal;
1109 else if ((ushort)x<(ushort)y) {
1110 return XsdOrdering.LessThan;
1112 else {
1113 return XsdOrdering.GreaterThan;
1116 return XsdOrdering.Indeterminate;
1120 // xs:unsignedByte
1121 // [CLSCompliant (false)]
1122 internal class XsdUnsignedByte : XsdUnsignedShort
1124 #if NET_2_0
1125 public override XmlTypeCode TypeCode {
1126 get { return XmlTypeCode.UnsignedByte; }
1128 #endif
1130 public override Type ValueType {
1131 get { return typeof (byte); }
1134 public override object ParseValue (string s,
1135 XmlNameTable nameTable, NSResolver nsmgr)
1137 return ParseValueType (s, nameTable, nsmgr);
1140 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1142 return XmlConvert.ToByte(Normalize (s));
1145 internal override XsdOrdering Compare(object x, object y) {
1146 if ((x is byte) && (y is byte)) {
1147 if ((byte)x==(byte)y) {
1148 return XsdOrdering.Equal;
1150 else if ((byte)x<(byte)y) {
1151 return XsdOrdering.LessThan;
1153 else {
1154 return XsdOrdering.GreaterThan;
1157 return XsdOrdering.Indeterminate;
1162 // xs:positiveInteger
1163 // [CLSCompliant (false)]
1164 internal class XsdPositiveInteger : XsdNonNegativeInteger
1166 #if NET_2_0
1167 public override XmlTypeCode TypeCode {
1168 get { return XmlTypeCode.PositiveInteger; }
1170 #endif
1172 // It returns decimal, instead of int or long.
1173 // Maybe MS developers thought about big integer...
1174 public override Type ValueType {
1175 get { return typeof (decimal); }
1178 public override object ParseValue (string s,
1179 XmlNameTable nameTable, NSResolver nsmgr)
1181 return ParseValueType (s, nameTable, nsmgr);
1184 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1186 return XmlConvert.ToDecimal (Normalize (s));
1190 // xs:nonPositiveInteger
1191 internal class XsdNonPositiveInteger : XsdInteger
1193 #if NET_2_0
1194 public override XmlTypeCode TypeCode {
1195 get { return XmlTypeCode.NonPositiveInteger; }
1197 #endif
1199 public override Type ValueType {
1200 get { return typeof (decimal); }
1203 public override object ParseValue (string s,
1204 XmlNameTable nameTable, NSResolver nsmgr)
1206 return ParseValueType (s, nameTable, nsmgr);
1209 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1211 return XmlConvert.ToDecimal (Normalize (s));
1215 // xs:negativeInteger
1216 internal class XsdNegativeInteger : XsdNonPositiveInteger
1218 #if NET_2_0
1219 public override XmlTypeCode TypeCode {
1220 get { return XmlTypeCode.NegativeInteger; }
1222 #endif
1224 public override Type ValueType {
1226 get { return typeof (decimal); }
1229 public override object ParseValue (string s,
1230 XmlNameTable nameTable, NSResolver nsmgr)
1232 return ParseValueType (s, nameTable, nsmgr);
1235 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1237 return XmlConvert.ToDecimal (Normalize (s));
1241 // xs:float
1242 internal class XsdFloat : XsdAnySimpleType
1244 #if NET_2_0
1245 public override XmlTypeCode TypeCode {
1246 get { return XmlTypeCode.Float; }
1248 #endif
1250 internal XsdFloat ()
1252 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
1255 internal override XmlSchemaFacet.Facet AllowedFacets {
1256 get { return durationAllowedFacets; }
1259 // Fundamental Facets
1260 public override bool Bounded {
1261 get { return true; }
1263 public override bool Finite {
1264 get { return true; }
1266 public override bool Numeric {
1267 get { return true; }
1269 public override XsdOrderedFacet Ordered {
1270 get { return XsdOrderedFacet.Total; }
1273 public override Type ValueType {
1274 get { return typeof (float); }
1277 public override object ParseValue (string s,
1278 XmlNameTable nameTable, NSResolver nsmgr)
1280 return ParseValueType (s, nameTable, nsmgr);
1283 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1285 return XmlConvert.ToSingle (Normalize (s));
1288 internal override XsdOrdering Compare(object x, object y) {
1289 if ((x is float) && (y is float)) {
1290 if ((float)x==(float)y) {
1291 return XsdOrdering.Equal;
1293 else if ((float)x<(float)y) {
1294 return XsdOrdering.LessThan;
1296 else {
1297 return XsdOrdering.GreaterThan;
1300 return XsdOrdering.Indeterminate;
1305 // xs:double
1306 internal class XsdDouble : XsdAnySimpleType
1308 internal XsdDouble ()
1310 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
1313 internal override XmlSchemaFacet.Facet AllowedFacets {
1314 get { return durationAllowedFacets; }
1317 // Fundamental Facets
1318 public override bool Bounded {
1319 get { return true; }
1321 public override bool Finite {
1322 get { return true; }
1324 public override bool Numeric {
1325 get { return true; }
1327 public override XsdOrderedFacet Ordered {
1328 get { return XsdOrderedFacet.Total; }
1331 #if NET_2_0
1332 public override XmlTypeCode TypeCode {
1333 get { return XmlTypeCode.Double; }
1335 #endif
1337 public override Type ValueType {
1338 get { return typeof (double); }
1341 public override object ParseValue (string s,
1342 XmlNameTable nameTable, NSResolver nsmgr)
1344 return ParseValueType (s, nameTable, nsmgr);
1347 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1349 return XmlConvert.ToDouble (Normalize (s));
1352 internal override XsdOrdering Compare(object x, object y) {
1353 if ((x is double) && (y is double)) {
1354 if ((double)x==(double)y) {
1355 return XsdOrdering.Equal;
1357 else if ((double)x<(double)y) {
1358 return XsdOrdering.LessThan;
1360 else {
1361 return XsdOrdering.GreaterThan;
1364 return XsdOrdering.Indeterminate;
1369 // xs:base64Binary
1370 internal class XsdBase64Binary : XsdString
1372 internal XsdBase64Binary ()
1376 #if NET_2_0
1377 public override XmlTypeCode TypeCode {
1378 get { return XmlTypeCode.Base64Binary; }
1380 #endif
1382 public override Type ValueType {
1383 get { return typeof (byte[]); }
1386 public override object ParseValue (string s,
1387 XmlNameTable nameTable, NSResolver nsmgr)
1389 // If it isnt ASCII it isnt valid base64 data
1390 byte[] inArr = new System.Text.ASCIIEncoding().GetBytes(s);
1391 FromBase64Transform t = new FromBase64Transform();
1392 return t.TransformFinalBlock(inArr, 0, inArr.Length);
1396 internal override int Length(string s) {
1397 int length = 0;
1398 int pad = 0;
1399 int end = s.Length;
1400 for (int i = 0; i < end; i++) {
1401 char c = s[i];
1402 if (!Char.IsWhiteSpace(c)) {
1403 if (isData(c))
1404 length ++;
1405 else if (isPad(c))
1406 pad++;
1407 else
1408 return -1; // Invalid characters
1411 if (pad > 2)
1412 return -1; // Max 2 padding at the end.
1413 if (pad > 0)
1414 pad = 3-pad;
1416 return ((length/4)*3)+pad;
1419 /* TODO: Use the Base64Table and similar code when it makes it
1420 * out of System.Security.Cryptography (currently internal so I
1421 * don't think we can use it).
1424 private static string ALPHABET =
1425 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1427 private static byte[] decodeTable;
1428 static XsdBase64Binary ()
1430 int len = ALPHABET.Length;
1432 decodeTable = new byte [1 + (int)'z'];
1434 for (int i=0; i < decodeTable.Length; i++) {
1435 decodeTable [i] = Byte.MaxValue;
1438 for (int i=0; i < len; i++) {
1439 char ch = ALPHABET [i];
1440 decodeTable [(int)ch] = (byte) i;
1444 protected static bool isPad(char octect) {
1445 return (octect == '=');
1448 protected static bool isData(char octect) {
1449 return ((octect <= 'z') && (decodeTable[octect] != Byte.MaxValue));
1453 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1455 return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);
1460 // xs:hexBinary
1461 internal class XsdHexBinary : XsdAnySimpleType
1463 internal XsdHexBinary ()
1465 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
1468 internal override XmlSchemaFacet.Facet AllowedFacets {
1469 get { return stringAllowedFacets; }
1472 #if NET_2_0
1473 public override XmlTypeCode TypeCode {
1474 get { return XmlTypeCode.HexBinary; }
1476 #endif
1478 public override XmlTokenizedType TokenizedType {
1479 get { return XmlTokenizedType.None; }
1482 public override Type ValueType {
1483 get { return typeof (byte []); }
1486 public override object ParseValue (string s,
1487 XmlNameTable nameTable, NSResolver nsmgr)
1489 return XmlConvert.FromBinHexString (Normalize (s));
1492 internal override int Length(string s) {
1493 return s.Length / 2 + s.Length % 2 ; // Not sure if odd lengths are even allowed
1496 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1498 return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);
1501 // Fundamental Facets ... no need to override
1504 // xs:QName
1505 internal class XsdQName : XsdName
1507 internal XsdQName ()
1511 // Fundamental facets are the same as anySimpleType.
1513 public override XmlTokenizedType TokenizedType {
1514 get { return XmlTokenizedType.QName; }
1517 #if NET_2_0
1518 public override XmlTypeCode TypeCode {
1519 get { return XmlTypeCode.QName; }
1521 #endif
1523 public override Type ValueType {
1524 get { return typeof (XmlQualifiedName); }
1527 // ParseValue () method is as same as that of xs:string
1528 public override object ParseValue (string s,
1529 XmlNameTable nameTable, NSResolver nsmgr)
1531 if (nameTable == null)
1532 throw new ArgumentNullException ("name table");
1533 if (nsmgr == null)
1534 throw new ArgumentNullException ("namespace manager");
1535 XmlQualifiedName name = XmlQualifiedName.Parse (s, nsmgr, true);
1536 nameTable.Add (name.Name);
1537 nameTable.Add (name.Namespace);
1538 return name;
1541 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1543 return new QNameValueType (ParseValue (s, nameTable, nsmgr) as XmlQualifiedName);
1547 // xs:boolean
1548 internal class XsdBoolean : XsdAnySimpleType
1550 internal XsdBoolean ()
1552 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
1555 internal override XmlSchemaFacet.Facet AllowedFacets {
1556 get { return booleanAllowedFacets; }
1559 public override XmlTokenizedType TokenizedType {
1560 get {
1561 if (XmlSchemaUtil.StrictMsCompliant)
1562 return XmlTokenizedType.None;
1563 else
1564 return XmlTokenizedType.CDATA;
1568 #if NET_2_0
1569 public override XmlTypeCode TypeCode {
1570 get { return XmlTypeCode.Boolean; }
1572 #endif
1574 public override Type ValueType {
1575 get { return typeof (bool); }
1578 public override object ParseValue (string s,
1579 XmlNameTable nameTable, NSResolver nsmgr)
1581 return ParseValueType (s, nameTable, nsmgr);
1584 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1586 return XmlConvert.ToBoolean (this.Normalize (s));
1589 // Fundamental Facets
1590 public override bool Bounded {
1591 get { return false; }
1593 public override bool Finite {
1594 get { return true; }
1596 public override bool Numeric {
1597 get { return false; }
1599 public override XsdOrderedFacet Ordered {
1600 get { return XsdOrderedFacet.Total; }
1606 // xs:anyURI
1607 internal class XsdAnyURI : XsdString
1609 public override XmlTokenizedType TokenizedType {
1611 get { return XmlTokenizedType.CDATA; }
1614 #if NET_2_0
1615 public override XmlTypeCode TypeCode {
1616 get { return XmlTypeCode.AnyUri; }
1618 #endif
1620 public override Type ValueType {
1621 get { return typeof (Uri); }
1624 public override object ParseValue (string s,
1625 XmlNameTable nameTable, NSResolver nsmgr)
1627 return new XmlSchemaUri (Normalize (s));
1630 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1632 return new UriValueType ((XmlSchemaUri) ParseValue (s, nameTable, nsmgr));
1636 internal class XmlSchemaUri : Uri
1638 public string value;
1640 static bool HasValidScheme (string src)
1642 int idx = src.IndexOf (':');
1643 if (idx < 0)
1644 return false;
1645 for (int i = 0; i < idx; i++) {
1646 switch (src [i]) {
1647 case '+':
1648 case '-':
1649 case '.':
1650 continue;
1651 default:
1652 if (Char.IsLetterOrDigit (src [i]))
1653 continue;
1654 return false;
1657 return true;
1660 // MS BUG: Some strings that contain ':' might result in
1661 // exception (MS.NET looks implemented as such).
1662 public XmlSchemaUri (string src)
1663 : this (src, HasValidScheme (src))
1667 private XmlSchemaUri (string src, bool formal)
1668 : base (formal ? src : "anyuri:" + src, !formal)
1670 value = src;
1673 public static bool operator == (XmlSchemaUri v1, XmlSchemaUri v2)
1675 return v1.value == v2.value;
1678 public static bool operator != (XmlSchemaUri v1, XmlSchemaUri v2)
1680 return v1.value != v2.value;
1683 public override bool Equals (object obj)
1685 if (obj is XmlSchemaUri)
1686 return (XmlSchemaUri) obj == this;
1687 else
1688 return false;
1691 public override int GetHashCode ()
1693 return value.GetHashCode ();
1696 public override string ToString ()
1698 return value;
1702 // xs:duration
1703 internal class XsdDuration : XsdAnySimpleType
1705 internal XsdDuration ()
1707 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
1710 internal override XmlSchemaFacet.Facet AllowedFacets {
1711 get { return durationAllowedFacets; }
1714 public override XmlTokenizedType TokenizedType {
1715 get { return XmlTokenizedType.CDATA; }
1718 #if NET_2_0
1719 public override XmlTypeCode TypeCode {
1720 get { return XmlTypeCode.Duration; }
1722 #endif
1724 public override Type ValueType {
1725 get { return typeof (TimeSpan); }
1728 public override object ParseValue (string s,
1729 XmlNameTable nameTable, NSResolver nsmgr)
1731 return ParseValueType (s, nameTable, nsmgr);
1734 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1736 return XmlConvert.ToTimeSpan (Normalize (s));
1739 internal override XsdOrdering Compare(object x, object y) {
1740 /* FIXME: This is really simple so far
1742 * In fact in order to do this correctly in XmlSchema, we cannot use TimeSpan as the base type
1743 * Though it turns out that MS .NET is a little broken in this regard too. Not doing comparisons
1744 * correctly.
1746 if ((x is TimeSpan) && (y is TimeSpan)) {
1747 int ret = TimeSpan.Compare((TimeSpan)x, (TimeSpan)y);
1748 if (ret < 0) {
1749 return XsdOrdering.LessThan;
1751 else if (ret > 0) {
1752 return XsdOrdering.GreaterThan;
1754 else {
1755 return XsdOrdering.Equal;
1758 return XsdOrdering.Indeterminate;
1762 // Fundamental Facets
1763 public override bool Bounded {
1764 get { return false; }
1766 public override bool Finite {
1767 get { return false; }
1769 public override bool Numeric {
1770 get { return false; }
1772 public override XsdOrderedFacet Ordered {
1773 get { return XsdOrderedFacet.Partial; }
1778 #if NET_2_0
1779 // xdt:dayTimeDuration
1780 internal class XdtDayTimeDuration : XsdDuration
1782 internal XdtDayTimeDuration ()
1786 public override XmlTypeCode TypeCode {
1787 get { return XmlTypeCode.DayTimeDuration; }
1790 public override Type ValueType {
1791 get { return typeof (TimeSpan); }
1794 public override object ParseValue (string s,
1795 XmlNameTable nameTable, NSResolver nsmgr)
1797 return ParseValueType (s, nameTable, nsmgr);
1800 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1802 return XmlConvert.ToTimeSpan (Normalize (s));
1805 // FIXME: Fundamental Facets
1806 public override bool Bounded {
1807 get { return false; }
1809 public override bool Finite {
1810 get { return false; }
1812 public override bool Numeric {
1813 get { return false; }
1815 public override XsdOrderedFacet Ordered {
1816 get { return XsdOrderedFacet.Partial; }
1821 // xdt:yearMonthDuration
1822 internal class XdtYearMonthDuration : XsdDuration
1824 internal XdtYearMonthDuration ()
1828 public override XmlTypeCode TypeCode {
1829 get { return XmlTypeCode.YearMonthDuration; }
1832 public override Type ValueType {
1833 get { return typeof (TimeSpan); }
1836 public override object ParseValue (string s,
1837 XmlNameTable nameTable, NSResolver nsmgr)
1839 return ParseValueType (s, nameTable, nsmgr);
1842 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1844 return XmlConvert.ToTimeSpan (Normalize (s));
1847 // FIXME: Fundamental Facets
1848 public override bool Bounded {
1849 get { return false; }
1851 public override bool Finite {
1852 get { return false; }
1854 public override bool Numeric {
1855 get { return false; }
1857 public override XsdOrderedFacet Ordered {
1858 get { return XsdOrderedFacet.Partial; }
1862 #endif
1864 // xs:dateTime
1865 internal class XsdDateTime : XsdAnySimpleType
1867 internal XsdDateTime ()
1869 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
1872 internal override XmlSchemaFacet.Facet AllowedFacets {
1873 get { return durationAllowedFacets; }
1876 public override XmlTokenizedType TokenizedType {
1877 get { return XmlTokenizedType.CDATA; }
1880 #if NET_2_0
1881 public override XmlTypeCode TypeCode {
1882 get { return XmlTypeCode.DateTime; }
1884 #endif
1886 public override Type ValueType {
1887 get { return typeof (DateTime); }
1890 public override object ParseValue (string s,
1891 XmlNameTable nameTable, NSResolver nsmgr)
1893 return ParseValueType (s, nameTable, nsmgr);
1896 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1898 return XmlConvert.ToDateTime (Normalize (s));
1901 internal override XsdOrdering Compare(object x, object y) {
1902 /* Really simple so far */
1903 if ((x is DateTime) && (y is DateTime)) {
1904 int ret = DateTime.Compare((DateTime)x, (DateTime)y);
1905 if (ret < 0) {
1906 return XsdOrdering.LessThan;
1908 else if (ret > 0) {
1909 return XsdOrdering.GreaterThan;
1911 else {
1912 return XsdOrdering.Equal;
1915 return XsdOrdering.Indeterminate;
1918 // Fundamental Facets
1919 public override bool Bounded {
1920 get { return false; }
1922 public override bool Finite {
1923 get { return false; }
1925 public override bool Numeric {
1926 get { return false; }
1928 public override XsdOrderedFacet Ordered {
1929 get { return XsdOrderedFacet.Partial; }
1934 // xs:date
1935 internal class XsdDate : XsdAnySimpleType
1937 internal XsdDate ()
1939 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
1942 internal override XmlSchemaFacet.Facet AllowedFacets {
1943 get { return durationAllowedFacets; }
1946 public override XmlTokenizedType TokenizedType {
1947 get { return XmlTokenizedType.CDATA; }
1950 #if NET_2_0
1951 public override XmlTypeCode TypeCode {
1952 get { return XmlTypeCode.Date; }
1954 #endif
1956 public override Type ValueType {
1957 get { return typeof (DateTime); }
1960 public override object ParseValue (string s,
1961 XmlNameTable nameTable, NSResolver nsmgr)
1963 return ParseValueType (s, nameTable, nsmgr);
1966 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
1968 return DateTime.ParseExact (Normalize (s), "yyyy-MM-dd", null);
1971 internal override XsdOrdering Compare(object x, object y) {
1972 /* Really simple so far */
1973 if ((x is DateTime) && (y is DateTime)) {
1974 int ret = DateTime.Compare((DateTime)x, (DateTime)y);
1975 if (ret < 0) {
1976 return XsdOrdering.LessThan;
1978 else if (ret > 0) {
1979 return XsdOrdering.GreaterThan;
1981 else {
1982 return XsdOrdering.Equal;
1985 return XsdOrdering.Indeterminate;
1987 // Fundamental Facets ... no need to override except for Ordered.
1988 public override XsdOrderedFacet Ordered {
1989 get { return XsdOrderedFacet.Partial; }
1994 // xs:time
1995 internal class XsdTime : XsdAnySimpleType
1997 static string [] timeFormats = new string [] {
1998 // copied from XmlConvert.
1999 "HH:mm:ss",
2000 "HH:mm:ss.f",
2001 "HH:mm:ss.ff",
2002 "HH:mm:ss.fff",
2003 "HH:mm:ss.ffff",
2004 "HH:mm:ss.fffff",
2005 "HH:mm:ss.ffffff",
2006 "HH:mm:ss.fffffff",
2007 "HH:mm:sszzz",
2008 "HH:mm:ss.fzzz",
2009 "HH:mm:ss.ffzzz",
2010 "HH:mm:ss.fffzzz",
2011 "HH:mm:ss.ffffzzz",
2012 "HH:mm:ss.fffffzzz",
2013 "HH:mm:ss.ffffffzzz",
2014 "HH:mm:ss.fffffffzzz",
2015 "HH:mm:ssZ",
2016 "HH:mm:ss.fZ",
2017 "HH:mm:ss.ffZ",
2018 "HH:mm:ss.fffZ",
2019 "HH:mm:ss.ffffZ",
2020 "HH:mm:ss.fffffZ",
2021 "HH:mm:ss.ffffffZ",
2022 "HH:mm:ss.fffffffZ"};
2024 internal XsdTime ()
2026 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
2029 internal override XmlSchemaFacet.Facet AllowedFacets {
2030 get { return durationAllowedFacets; }
2033 public override XmlTokenizedType TokenizedType {
2034 get { return XmlTokenizedType.CDATA; }
2037 #if NET_2_0
2038 public override XmlTypeCode TypeCode {
2039 get { return XmlTypeCode.Time; }
2041 #endif
2043 public override Type ValueType {
2044 get { return typeof (DateTime); }
2047 public override object ParseValue (string s,
2048 XmlNameTable nameTable, NSResolver nsmgr)
2050 return ParseValueType (s, nameTable, nsmgr);
2053 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
2055 return DateTime.ParseExact (Normalize (s), timeFormats, null, DateTimeStyles.None);
2058 internal override XsdOrdering Compare(object x, object y) {
2059 /* Really simple so far */
2060 if ((x is DateTime) && (y is DateTime)) {
2061 int ret = DateTime.Compare((DateTime)x, (DateTime)y);
2062 if (ret < 0) {
2063 return XsdOrdering.LessThan;
2065 else if (ret > 0) {
2066 return XsdOrdering.GreaterThan;
2068 else {
2069 return XsdOrdering.Equal;
2072 return XsdOrdering.Indeterminate;
2074 // Fundamental Facets ... no need to override except for Ordered.
2075 public override XsdOrderedFacet Ordered {
2076 get { return XsdOrderedFacet.Partial; }
2081 // xs:gYearMonth
2082 internal class XsdGYearMonth : XsdAnySimpleType
2084 internal XsdGYearMonth ()
2086 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
2089 internal override XmlSchemaFacet.Facet AllowedFacets {
2090 get { return durationAllowedFacets; }
2093 #if NET_2_0
2094 public override XmlTypeCode TypeCode {
2095 get { return XmlTypeCode.GYearMonth; }
2097 #endif
2099 public override Type ValueType {
2100 get { return typeof (DateTime); }
2103 public override object ParseValue (string s,
2104 XmlNameTable nameTable, NSResolver nsmgr)
2106 return ParseValueType (s, nameTable, nsmgr);
2109 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
2111 return DateTime.ParseExact (Normalize (s), "yyyy-MM", null);
2114 internal override XsdOrdering Compare(object x, object y) {
2115 /* Really simple so far */
2116 if ((x is DateTime) && (y is DateTime)) {
2117 int ret = DateTime.Compare((DateTime)x, (DateTime)y);
2118 if (ret < 0) {
2119 return XsdOrdering.LessThan;
2121 else if (ret > 0) {
2122 return XsdOrdering.GreaterThan;
2124 else {
2125 return XsdOrdering.Equal;
2128 return XsdOrdering.Indeterminate;
2132 // xs:gMonthDay
2133 internal class XsdGMonthDay : XsdAnySimpleType
2135 internal XsdGMonthDay ()
2137 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
2140 internal override XmlSchemaFacet.Facet AllowedFacets {
2141 get { return durationAllowedFacets; }
2144 #if NET_2_0
2145 public override XmlTypeCode TypeCode {
2146 get { return XmlTypeCode.GMonthDay; }
2148 #endif
2150 public override Type ValueType {
2151 get { return typeof (DateTime); }
2154 public override object ParseValue (string s,
2155 XmlNameTable nameTable, NSResolver nsmgr)
2157 return ParseValueType (s, nameTable, nsmgr);
2160 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
2162 return DateTime.ParseExact (Normalize (s), "--MM-dd", null);
2165 internal override XsdOrdering Compare(object x, object y) {
2166 /* Really simple so far */
2167 if ((x is DateTime) && (y is DateTime)) {
2168 int ret = DateTime.Compare((DateTime)x, (DateTime)y);
2169 if (ret < 0) {
2170 return XsdOrdering.LessThan;
2172 else if (ret > 0) {
2173 return XsdOrdering.GreaterThan;
2175 else {
2176 return XsdOrdering.Equal;
2179 return XsdOrdering.Indeterminate;
2183 // xs:gYear
2184 internal class XsdGYear : XsdAnySimpleType
2186 internal XsdGYear ()
2188 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
2191 internal override XmlSchemaFacet.Facet AllowedFacets {
2192 get { return durationAllowedFacets; }
2195 #if NET_2_0
2196 public override XmlTypeCode TypeCode {
2197 get { return XmlTypeCode.GYear; }
2199 #endif
2201 public override Type ValueType {
2202 get { return typeof (DateTime); }
2205 // LAMESPEC: XML Schema Datatypes allows leading '-' to identify B.C. years,
2206 // but CLR DateTime does not allow such expression.
2207 public override object ParseValue (string s,
2208 XmlNameTable nameTable, NSResolver nsmgr)
2210 return ParseValueType (s, nameTable, nsmgr);
2213 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
2215 return DateTime.ParseExact (Normalize(s), "yyyy", null);
2218 internal override XsdOrdering Compare(object x, object y) {
2219 /* Really simple so far */
2220 if ((x is DateTime) && (y is DateTime)) {
2221 int ret = DateTime.Compare((DateTime)x, (DateTime)y);
2222 if (ret < 0) {
2223 return XsdOrdering.LessThan;
2225 else if (ret > 0) {
2226 return XsdOrdering.GreaterThan;
2228 else {
2229 return XsdOrdering.Equal;
2232 return XsdOrdering.Indeterminate;
2236 // xs:gMonth
2237 internal class XsdGMonth : XsdAnySimpleType
2239 internal XsdGMonth ()
2241 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
2244 internal override XmlSchemaFacet.Facet AllowedFacets {
2245 get { return durationAllowedFacets; }
2248 #if NET_2_0
2249 public override XmlTypeCode TypeCode {
2250 get { return XmlTypeCode.GMonth; }
2252 #endif
2254 public override Type ValueType {
2255 get { return typeof (DateTime); }
2258 public override object ParseValue (string s,
2259 XmlNameTable nameTable, NSResolver nsmgr)
2261 return ParseValueType (s, nameTable, nsmgr);
2264 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
2266 return DateTime.ParseExact (Normalize(s), "--MM--", null);
2269 internal override XsdOrdering Compare(object x, object y) {
2270 /* Really simple so far */
2271 if ((x is DateTime) && (y is DateTime)) {
2272 int ret = DateTime.Compare((DateTime)x, (DateTime)y);
2273 if (ret < 0) {
2274 return XsdOrdering.LessThan;
2276 else if (ret > 0) {
2277 return XsdOrdering.GreaterThan;
2279 else {
2280 return XsdOrdering.Equal;
2283 return XsdOrdering.Indeterminate;
2287 // xs:gDay
2288 internal class XsdGDay : XsdAnySimpleType
2290 internal XsdGDay ()
2292 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
2295 internal override XmlSchemaFacet.Facet AllowedFacets {
2296 get { return durationAllowedFacets; }
2299 #if NET_2_0
2300 public override XmlTypeCode TypeCode {
2301 get { return XmlTypeCode.GDay; }
2303 #endif
2305 public override Type ValueType {
2306 get { return typeof (DateTime); }
2309 public override object ParseValue (string s,
2310 XmlNameTable nameTable, NSResolver nsmgr)
2312 return ParseValueType (s, nameTable, nsmgr);
2315 internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr)
2317 return DateTime.ParseExact (Normalize(s), "---dd", null);
2320 internal override XsdOrdering Compare(object x, object y) {
2321 /* Really simple so far */
2322 if ((x is DateTime) && (y is DateTime)) {
2323 int ret = DateTime.Compare((DateTime)x, (DateTime)y);
2324 if (ret < 0) {
2325 return XsdOrdering.LessThan;
2327 else if (ret > 0) {
2328 return XsdOrdering.GreaterThan;
2330 else {
2331 return XsdOrdering.Equal;
2334 return XsdOrdering.Indeterminate;