The Labs \ Source Viewer \ SSCLI \ System.Xml.Schema \ XmlSchemaParticle

  1. //------------------------------------------------------------------------------
  2. // <copyright file="XmlSchemaParticle.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. // <owner current="true" primary="true">priyal</owner>
  15. //------------------------------------------------------------------------------
  16. namespace System.Xml.Schema
  17. {
  18.    
  19.     using System.Xml.Serialization;
  20.    
  21.     /// <include file='doc\XmlSchemaParticle.uex' path='docs/doc[@for="XmlSchemaParticle"]/*' />
  22.     /// <devdoc>
  23.     /// <para>[To be supplied.]</para>
  24.     /// </devdoc>
  25.     public abstract class XmlSchemaParticle : XmlSchemaAnnotated
  26.     {
  27.         [Flags()]
  28.         enum Occurs
  29.         {
  30.             None,
  31.             Min,
  32.             Max
  33.         }
  34.         decimal minOccurs = decimal.One;
  35.         decimal maxOccurs = decimal.One;
  36.         Occurs flags = Occurs.None;
  37.        
  38.         /// <include file='doc\XmlSchemaParticle.uex' path='docs/doc[@for="XmlSchemaParticle.MinOccursString"]/*' />
  39.         /// <devdoc>
  40.         /// <para>[To be supplied.]</para>
  41.         /// </devdoc>
  42.         [XmlAttribute("minOccurs")]
  43.         public string MinOccursString {
  44.             get { return (flags & Occurs.Min) == 0 ? null : XmlConvert.ToString(minOccurs); }
  45.             set {
  46.                 if (value == null) {
  47.                     minOccurs = decimal.One;
  48.                     flags &= ~Occurs.Min;
  49.                 }
  50.                 else {
  51.                     minOccurs = XmlConvert.ToInteger(value);
  52.                     if (minOccurs < decimal.Zero) {
  53.                         throw new XmlSchemaException(Res.Sch_MinOccursInvalidXsd, string.Empty);
  54.                     }
  55.                     flags |= Occurs.Min;
  56.                 }
  57.             }
  58.         }
  59.        
  60.         /// <include file='doc\XmlSchemaParticle.uex' path='docs/doc[@for="XmlSchemaParticle.MaxOccursString"]/*' />
  61.         /// <devdoc>
  62.         /// <para>[To be supplied.]</para>
  63.         /// </devdoc>
  64.         [XmlAttribute("maxOccurs")]
  65.         public string MaxOccursString {
  66.             get { return (flags & Occurs.Max) == 0 ? null : (maxOccurs == decimal.MaxValue) ? "unbounded" : XmlConvert.ToString(maxOccurs); }
  67.             set {
  68.                 if (value == null) {
  69.                     maxOccurs = decimal.One;
  70.                     flags &= ~Occurs.Max;
  71.                 }
  72.                 else {
  73.                     if (value == "unbounded") {
  74.                         maxOccurs = decimal.MaxValue;
  75.                     }
  76.                     else {
  77.                         maxOccurs = XmlConvert.ToInteger(value);
  78.                         if (maxOccurs < decimal.Zero) {
  79.                             throw new XmlSchemaException(Res.Sch_MaxOccursInvalidXsd, string.Empty);
  80.                         }
  81.                         else if (maxOccurs == decimal.Zero && (flags & Occurs.Min) == 0) {
  82.                             minOccurs = decimal.Zero;
  83.                         }
  84.                     }
  85.                     flags |= Occurs.Max;
  86.                 }
  87.             }
  88.         }
  89.        
  90.         /// <include file='doc\XmlSchemaParticle.uex' path='docs/doc[@for="XmlSchemaParticle.MinOccurs"]/*' />
  91.         /// <devdoc>
  92.         /// <para>[To be supplied.]</para>
  93.         /// </devdoc>
  94.         [XmlIgnore()]
  95.         public decimal MinOccurs {
  96.             get { return minOccurs; }
  97.             set {
  98.                 if (value < decimal.Zero || value != decimal.Truncate(value)) {
  99.                     throw new XmlSchemaException(Res.Sch_MinOccursInvalidXsd, string.Empty);
  100.                 }
  101.                 minOccurs = value;
  102.                 flags |= Occurs.Min;
  103.             }
  104.         }
  105.        
  106.         /// <include file='doc\XmlSchemaParticle.uex' path='docs/doc[@for="XmlSchemaParticle.MaxOccurs"]/*' />
  107.         /// <devdoc>
  108.         /// <para>[To be supplied.]</para>
  109.         /// </devdoc>
  110.         [XmlIgnore()]
  111.         public decimal MaxOccurs {
  112.             get { return maxOccurs; }
  113.             set {
  114.                 if (value < decimal.Zero || value != decimal.Truncate(value)) {
  115.                     throw new XmlSchemaException(Res.Sch_MaxOccursInvalidXsd, string.Empty);
  116.                 }
  117.                 maxOccurs = value;
  118.                 if (maxOccurs == decimal.Zero && (flags & Occurs.Min) == 0) {
  119.                     minOccurs = decimal.Zero;
  120.                 }
  121.                 flags |= Occurs.Max;
  122.             }
  123.         }
  124.        
  125.         internal virtual bool IsEmpty {
  126.             get { return maxOccurs == decimal.Zero; }
  127.         }
  128.        
  129.         internal bool IsMultipleOccurrence {
  130.             get { return maxOccurs > decimal.One; }
  131.         }
  132.        
  133.         internal virtual string NameString {
  134.             get { return string.Empty; }
  135.         }
  136.        
  137.         internal XmlQualifiedName GetQualifiedName()
  138.         {
  139.             XmlSchemaElement elem = this as XmlSchemaElement;
  140.             if (elem != null) {
  141.                 return elem.QualifiedName;
  142.             }
  143.             else {
  144.                 XmlSchemaAny any = this as XmlSchemaAny;
  145.                 if (any != null) {
  146.                     string ns = any.Namespace;
  147.                     if (ns != null) {
  148.                         ns = ns.Trim();
  149.                     }
  150.                     else {
  151.                         ns = string.Empty;
  152.                     }
  153.                     return new XmlQualifiedName("*", ns.Length == 0 ? "##any" : ns);
  154.                 }
  155.             }
  156.             return XmlQualifiedName.Empty;
  157.             //If ever called on other particles
  158.         }
  159.        
  160.         class EmptyParticle : XmlSchemaParticle
  161.         {
  162.             internal override bool IsEmpty {
  163.                 get { return true; }
  164.             }
  165.         }
  166.        
  167.         static internal readonly XmlSchemaParticle Empty = new EmptyParticle();
  168.     }
  169. }

Developer Fusion