Moved chain building and validation from Mono.Security to System
[mono.git] / mcs / class / System.XML / System.Xml.Serialization / XmlAttributes.cs
index a861a4dde32a0f031ba68074dd8bacad70e8ab64..eddc9b0c3bdb72e9c1551b7deb6102ed0bf93a1a 100644 (file)
 // (C) 2002 John Donagher
 //
 
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
 using System.Reflection;
-using System;\r
-using System.ComponentModel;\r
-using System.Collections;\r
-\r
-namespace System.Xml.Serialization\r
-{\r
-       /// <summary>\r
-       /// Summary description for XmlAttributes.\r
-       /// </summary>\r
-       public class XmlAttributes\r
-       {\r
-               private XmlAnyAttributeAttribute xmlAnyAttribute;\r
-               private XmlAnyElementAttributes xmlAnyElements;\r
-               private XmlArrayAttribute xmlArray;\r
-               private XmlArrayItemAttributes xmlArrayItems;\r
-               private XmlAttributeAttribute xmlAttribute;\r
-               private XmlChoiceIdentifierAttribute xmlChoiceIdentifier;\r
-               private object xmlDefaultValue;\r
-               private XmlElementAttributes xmlElements;\r
-               private XmlEnumAttribute xmlEnum;\r
-               private bool xmlIgnore;\r
-               private bool xmlns;\r
-               private XmlRootAttribute xmlRoot;\r
-               private XmlTextAttribute xmlText;\r
-               private XmlTypeAttribute xmlType;\r
-\r
-               private MemberInfo minfo;\r
-               private FieldInfo  finfo;\r
-               private PropertyInfo pinfo;\r
-               internal ArrayList XmlIncludes;\r
-               //internal string ElementName;\r
-\r
-               //The element Order in serialization.\r
-               internal int order;\r
-               internal bool isAttribute;\r
-               internal static XmlAttributes.XmlAttributesComparer attrComparer;\r
-\r
-               //Sorting Order of Elements: XmlNs, XmlAttributes, XmlElement\r
-               internal class XmlAttributesComparer : IComparer\r
-               {\r
-                       public int Compare(object x,object y)\r
-                       {\r
-                               if(x is XmlAttributes && y is XmlAttributes)\r
-                               {\r
-                                       XmlAttributes attx = (XmlAttributes)x;\r
-                                       XmlAttributes atty = (XmlAttributes)y;\r
-                                       if(attx.xmlns)\r
-                                               return -1;\r
-                                       if(atty.xmlns)\r
-                                               return 1;\r
-                                       if(attx.isAttribute)\r
-                                               return -1;\r
-                                       if(atty.isAttribute)\r
-                                               return 1;\r
-                                       int diff = attx.order - atty.order;\r
-                                       if(diff == 0)\r
-                                               return 0;\r
-                                       if(diff > 0)\r
-                                               return 1;\r
-                                       if(diff < 0)\r
-                                               return -1;\r
-                               }\r
-                               if(x == null)\r
-                                       return -1;\r
-                               if(y == null)\r
-                                       return 1;\r
-                               throw new Exception("Should never occur. XmlAttributesComparer.Compare");\r
-                       }\r
-               }\r
-\r
-               public XmlAttributes ()\r
-               {\r
-                       xmlAnyElements = new XmlAnyElementAttributes ();\r
-                       xmlArrayItems = new XmlArrayItemAttributes ();\r
-                       xmlElements = new XmlElementAttributes ();\r
-                       XmlIncludes = new ArrayList();\r
-               }\r
-\r
-               static XmlAttributes ()\r
-               {\r
-                       attrComparer = new XmlAttributes.XmlAttributesComparer();\r
-               }\r
-\r
-               public XmlAttributes (ICustomAttributeProvider provider)\r
-               {\r
-                       object[] attributes = provider.GetCustomAttributes(false);\r
-                       foreach(object obj in attributes)\r
-                       {\r
-                               if(obj is XmlAnyAttributeAttribute)\r
-                                       xmlAnyAttribute = (XmlAnyAttributeAttribute) obj;\r
-                               else if(obj is XmlAnyElementAttribute)\r
-                                       xmlAnyElements.Add((XmlAnyElementAttribute) obj);\r
-                               else if(obj is XmlArrayAttribute)\r
-                                       xmlArray = (XmlArrayAttribute) obj;\r
-                               else if(obj is XmlArrayItemAttribute)\r
-                                       xmlArrayItems.Add((XmlArrayItemAttribute) obj);\r
-                               else if(obj is XmlAttributeAttribute)\r
-                                       xmlAttribute = (XmlAttributeAttribute) obj;\r
-                               else if(obj is XmlChoiceIdentifierAttribute)\r
-                                       xmlChoiceIdentifier = (XmlChoiceIdentifierAttribute) obj;\r
-                               else if(obj is DefaultValueAttribute)\r
-                                       xmlDefaultValue = obj;\r
-                               else if(obj is XmlElementAttribute )\r
-                                       xmlElements.Add((XmlElementAttribute ) obj);\r
-                               else if(obj is XmlEnumAttribute)\r
-                                       xmlEnum = (XmlEnumAttribute) obj;\r
-                               else if(obj is XmlIgnoreAttribute)\r
-                                       xmlIgnore = true;\r
-                               else if(obj is XmlNamespaceDeclarationsAttribute)\r
-                                       xmlns = true;\r
-                               else if(obj is XmlRootAttribute)\r
-                                       xmlRoot = (XmlRootAttribute) obj;\r
-                               else if(obj is XmlTextAttribute)\r
-                                       xmlText = (XmlTextAttribute) obj;\r
-                               else if(obj is XmlTypeAttribute)\r
-                                       xmlType = (XmlTypeAttribute) obj;\r
-                       }\r
-               }\r
-\r
-               #region public properties\r
-               public XmlAnyAttributeAttribute XmlAnyAttribute \r
-               {\r
-                       get \r
+using System;
+using System.ComponentModel;
+using System.Collections;
+
+namespace System.Xml.Serialization
+{
+       /// <summary>
+       /// Summary description for XmlAttributes.
+       /// </summary>
+       public class XmlAttributes
+       {
+               private XmlAnyAttributeAttribute xmlAnyAttribute;
+               private XmlAnyElementAttributes xmlAnyElements = new XmlAnyElementAttributes();
+               private XmlArrayAttribute xmlArray;
+               private XmlArrayItemAttributes xmlArrayItems = new XmlArrayItemAttributes();
+               private XmlAttributeAttribute xmlAttribute;
+               private XmlChoiceIdentifierAttribute xmlChoiceIdentifier;
+               private object xmlDefaultValue = System.DBNull.Value;
+               private XmlElementAttributes xmlElements = new XmlElementAttributes();
+               private XmlEnumAttribute xmlEnum;
+               private bool xmlIgnore;
+               private bool xmlns;
+               private XmlRootAttribute xmlRoot;
+               private XmlTextAttribute xmlText;
+               private XmlTypeAttribute xmlType;
+
+               public XmlAttributes ()
+               {
+               }
+
+               public XmlAttributes (ICustomAttributeProvider provider)
+               {
+                       object[] attributes = provider.GetCustomAttributes(false);
+                       foreach(object obj in attributes)
+                       {
+                               if(obj is XmlAnyAttributeAttribute)
+                                       xmlAnyAttribute = (XmlAnyAttributeAttribute) obj;
+                               else if(obj is XmlAnyElementAttribute)
+                                       xmlAnyElements.Add((XmlAnyElementAttribute) obj);
+                               else if(obj is XmlArrayAttribute)
+                                       xmlArray = (XmlArrayAttribute) obj;
+                               else if(obj is XmlArrayItemAttribute)
+                                       xmlArrayItems.Add((XmlArrayItemAttribute) obj);
+                               else if(obj is XmlAttributeAttribute)
+                                       xmlAttribute = (XmlAttributeAttribute) obj;
+                               else if(obj is XmlChoiceIdentifierAttribute)
+                                       xmlChoiceIdentifier = (XmlChoiceIdentifierAttribute) obj;
+                               else if(obj is DefaultValueAttribute)
+                                       xmlDefaultValue = ((DefaultValueAttribute)obj).Value;
+                               else if(obj is XmlElementAttribute )
+                                       xmlElements.Add((XmlElementAttribute ) obj);
+                               else if(obj is XmlEnumAttribute)
+                                       xmlEnum = (XmlEnumAttribute) obj;
+                               else if(obj is XmlIgnoreAttribute)
+                                       xmlIgnore = true;
+                               else if(obj is XmlNamespaceDeclarationsAttribute)
+                                       xmlns = true;
+                               else if(obj is XmlRootAttribute)
+                                       xmlRoot = (XmlRootAttribute) obj;
+                               else if(obj is XmlTextAttribute)
+                                       xmlText = (XmlTextAttribute) obj;
+                               else if(obj is XmlTypeAttribute)
+                                       xmlType = (XmlTypeAttribute) obj;
+                       }
+               }
+
+               #region public properties
+               public XmlAnyAttributeAttribute XmlAnyAttribute 
+               {
+                       get 
                        {
                                return xmlAnyAttribute;
-                       }\r
-                       set \r
+                       }
+                       set 
                        {
                                xmlAnyAttribute = value;
-                       }\r
-               }\r
-               public XmlAnyElementAttributes XmlAnyElements \r
-               {\r
-                       get \r
+                       }
+               }
+               public XmlAnyElementAttributes XmlAnyElements 
+               {
+                       get 
                        {
                                return xmlAnyElements;
-                       }\r
-               }\r
-               public XmlArrayAttribute XmlArray\r
-               {\r
-                       get \r
+                       }
+               }
+               public XmlArrayAttribute XmlArray
+               {
+                       get 
                        {
                                return xmlArray;
-                       }\r
-                       set \r
+                       }
+                       set 
                        {
                                xmlArray = value;
-                       }\r
-               }\r
-               public XmlArrayItemAttributes XmlArrayItems \r
-               {\r
-                       get \r
+                       }
+               }
+               public XmlArrayItemAttributes XmlArrayItems 
+               {
+                       get 
                        {
                                return xmlArrayItems;
-                       }\r
-               }\r
-               public XmlAttributeAttribute XmlAttribute \r
-               {\r
-                       get \r
+                       }
+               }
+               public XmlAttributeAttribute XmlAttribute 
+               {
+                       get 
                        {
                                return xmlAttribute;
-                       }\r
-                       set \r
+                       }
+                       set 
                        {
                                xmlAttribute = value;
-                       }\r
-               }\r
-               public XmlChoiceIdentifierAttribute XmlChoiceIdentifier \r
-               {\r
-                       get \r
+                       }
+               }
+               public XmlChoiceIdentifierAttribute XmlChoiceIdentifier 
+               {
+                       get 
                        {
                                return xmlChoiceIdentifier;
-                       }\r
-                       set \r
-                       {
-                               xmlChoiceIdentifier = value;
-                       }\r
-               }\r
-               public object XmlDefaultValue \r
-               {\r
-                       get \r
+                       }
+               }
+               public object XmlDefaultValue 
+               {
+                       get 
                        {
                                return xmlDefaultValue;
-                       }\r
-                       set \r
+                       }
+                       set 
                        {
                                xmlDefaultValue = value;
-                       }\r
-               }\r
-               public XmlElementAttributes XmlElements \r
-               {\r
-                       get \r
+                       }
+               }
+               public XmlElementAttributes XmlElements 
+               {
+                       get 
                        {
                                return xmlElements;
-                       }\r
-               }\r
-               public XmlEnumAttribute XmlEnum \r
-               {\r
-                       get \r
+                       }
+               }
+               public XmlEnumAttribute XmlEnum 
+               {
+                       get 
                        {
                                return xmlEnum;
-                       }\r
-                       set \r
+                       }
+                       set 
                        {
                                xmlEnum = value;
-                       }\r
-               }\r
-               public bool XmlIgnore \r
-               {\r
-                       get \r
+                       }
+               }
+               public bool XmlIgnore 
+               {
+                       get 
                        {
                                return xmlIgnore;
-                       }\r
-                       set \r
+                       }
+                       set 
                        {
                                xmlIgnore = value;
-                       }\r
-               }\r
-               public bool Xmlns \r
-               {\r
-                       get \r
+                       }
+               }
+               public bool Xmlns 
+               {
+                       get 
                        {
                                return xmlns;
-                       }\r
-                       set \r
+                       }
+                       set 
                        {
                                xmlns = value;
-                       }\r
-               }\r
-               public XmlRootAttribute XmlRoot \r
-               {\r
-                       get \r
+                       }
+               }
+               public XmlRootAttribute XmlRoot 
+               {
+                       get 
                        {
-                               return xmlRoot;}\r
-                       set \r
+                               return xmlRoot;}
+                       set 
                        {
                                xmlRoot = value;
-                       }\r
-               }\r
-               public XmlTextAttribute XmlText \r
-               {\r
-                       get \r
+                       }
+               }
+               public XmlTextAttribute XmlText 
+               {
+                       get 
                        {
                                return xmlText;
-                       }\r
-                       set \r
+                       }
+                       set 
                        {
                                xmlText = value;
-                       }\r
-               }\r
-               public XmlTypeAttribute XmlType \r
-               {\r
-                       get \r
+                       }
+               }
+               public XmlTypeAttribute XmlType 
+               {
+                       get 
                        {
                                return xmlType;
-                       }\r
-                       set \r
+                       }
+                       set 
                        {
                                xmlType = value;
-                       }\r
-               }\r
-               #endregion\r
-\r
-               #region internal properties\r
-               internal MemberInfo MemberInfo\r
-               {\r
-                       get { return  minfo; }\r
-                       set { minfo = value; }\r
-               }\r
-\r
-               internal FieldInfo FieldInfo \r
-               {\r
-                       get { return  finfo; }\r
-                       set { finfo = value; }\r
-               }\r
-\r
-               internal PropertyInfo PropertyInfo\r
-               {\r
-                       get { return  pinfo; }\r
-                       set { pinfo = value; }\r
-               }\r
-               #endregion\r
-\r
-               //Only permissible attributes for a class type are: XmlRoot and XmlInclude\r
-               internal static XmlAttributes FromClass(Type classType)\r
-               {\r
-                       XmlAttributes XmlAttr = new XmlAttributes();\r
-                       object[] attributes = classType.GetCustomAttributes(false);\r
-                       foreach(object obj in attributes)\r
-                       {\r
-                               if(obj is XmlRootAttribute)\r
-                                       XmlAttr.xmlRoot = (XmlRootAttribute) obj;\r
-                               else if(obj is XmlIncludeAttribute)\r
-                                       XmlAttr.XmlIncludes.Add(obj);\r
-                       }\r
-                       return XmlAttr;\r
-               }\r
-\r
-               internal static XmlAttributes FromField(MemberInfo member, FieldInfo finfo)\r
-               {\r
-                       XmlAttributes XmlAttr = new XmlAttributes();\r
-                       object[] attributes = member.GetCustomAttributes(false);\r
-                       XmlAttr.AddMemberAttributes(attributes);\r
-\r
-                       XmlAttr.minfo = member;\r
-                       XmlAttr.finfo = finfo;\r
-\r
-                       return XmlAttr;\r
-               }\r
-\r
-               \r
-               internal static XmlAttributes FromProperty(MemberInfo member, PropertyInfo pinfo)\r
-               {\r
-\r
-                       XmlAttributes XmlAttr = new XmlAttributes();\r
-                       object[] attributes = member.GetCustomAttributes(false);\r
-                       XmlAttr.AddMemberAttributes(attributes);\r
-\r
-                       XmlAttr.minfo = member;\r
-                       XmlAttr.pinfo = pinfo;\r
-                       return XmlAttr;\r
-               }\r
-\r
-               internal void AddMemberAttributes(object[] attributes)\r
-               {\r
-                       foreach(object obj in attributes)\r
-                       {\r
-                               if(obj is XmlAnyAttributeAttribute)\r
-                               {\r
-                                       xmlAnyAttribute = (XmlAnyAttributeAttribute) obj;\r
-                                       isAttribute = true;     \r
-                               }\r
-                               else if(obj is XmlAttributeAttribute)\r
-                               {\r
-                                       xmlAttribute = (XmlAttributeAttribute) obj;\r
-                                       isAttribute = true;\r
-                               }\r
-                               else if(obj is XmlNamespaceDeclarationsAttribute)\r
-                               {\r
-                                       xmlns = true;\r
-                                       isAttribute = true;\r
-                               }\r
-                               else if(obj is XmlAnyElementAttribute)\r
-                               {\r
-                                       xmlAnyElements.Add((XmlAnyElementAttribute) obj);\r
-                                       order = ((XmlAnyElementAttribute) obj).Order;\r
-                               }\r
-                               else if(obj is XmlArrayAttribute)\r
-                               {\r
-                                       xmlArray = (XmlArrayAttribute) obj;\r
-                                       order = ((XmlArrayAttribute) obj).Order;\r
-                               }\r
-                               else if(obj is XmlArrayItemAttribute)\r
-                               {\r
-                                       xmlArrayItems.Add((XmlArrayItemAttribute) obj);\r
-                                       order = ((XmlArrayItemAttribute) obj).Order;\r
-                               }\r
-                               else if(obj is XmlChoiceIdentifierAttribute)\r
-                               {\r
-                                       xmlChoiceIdentifier = (XmlChoiceIdentifierAttribute) obj;\r
-                                       order = ((XmlChoiceIdentifierAttribute) obj).Order;\r
-                               }\r
-                               else if(obj is XmlTextAttribute)\r
-                               {\r
-                                       xmlText = (XmlTextAttribute) obj;\r
-                                       order = ((XmlTextAttribute) obj).Order;\r
-                               }\r
-                               else if(obj is XmlElementAttribute )\r
-                               {\r
-                                       xmlElements.Add((XmlElementAttribute ) obj);\r
-                                       order = ((XmlElementAttribute ) obj).Order;\r
-                               }\r
-                               else if(obj is DefaultValueAttribute)\r
-                               {\r
-                                       xmlDefaultValue = ((DefaultValueAttribute ) obj).Value;\r
-                               }\r
-                               else if(obj is XmlEnumAttribute)\r
-                               {\r
-                                       xmlEnum = (XmlEnumAttribute) obj;\r
-                               }\r
-                               else if(obj is XmlIgnoreAttribute)\r
-                               {\r
-                                       xmlIgnore = true;\r
-                               }\r
-                               else if(obj is XmlRootAttribute)\r
-                               {\r
-                                       throw new Exception("should never happen. XmlRoot on a member");\r
-                               }\r
-                               else if(obj is XmlTypeAttribute)\r
-                               {\r
-                                       xmlType = (XmlTypeAttribute) obj;\r
-                               }\r
-                       }\r
-               }\r
-\r
-               internal string GetAttributeName(Type type, string defaultName)\r
-               {\r
-                       if(XmlAttribute != null && XmlAttribute.AttributeName != null && XmlAttribute.AttributeName != "")\r
-                               return XmlAttribute.AttributeName;\r
-                       return defaultName;\r
-               }\r
-\r
-               internal string GetElementName(Type type, string defaultName)\r
-               {\r
-                       foreach(XmlElementAttribute elem in XmlElements)\r
-                       {\r
-                               if(elem.Type == type && elem.ElementName != null && elem.ElementName != "")\r
-                                       return elem.ElementName;\r
-                               else if(elem.Type == null && elem.ElementName != null && elem.ElementName != "")\r
-                                       return elem.ElementName;\r
-                       }\r
-                       return defaultName;\r
-               }\r
-\r
-               internal string GetAttributeNamespace(Type type)\r
-               {\r
-                       if(XmlAttribute != null)\r
-                               return XmlAttribute.Namespace;\r
-                       return null;\r
-               }\r
-               internal string GetElementNamespace(Type type)\r
-               {\r
-                       foreach(XmlElementAttribute elem in XmlElements)\r
-                       {\r
-                               if(elem.Type == type )\r
-                                       return elem.Namespace;\r
-                               else if(elem.Type == null)\r
-                                       return elem.Namespace;\r
-                       }\r
-                       return null;\r
-               }\r
-       }\r
-}\r
+                       }
+               }
+               #endregion
+               
+               internal void AddKeyHash (System.Text.StringBuilder sb)
+               {
+                       sb.Append ("XA ");
+                       
+                       KeyHelper.AddField (sb, 1, xmlIgnore);
+                       KeyHelper.AddField (sb, 2, xmlns);
+                       KeyHelper.AddField (sb, 3, xmlAnyAttribute!=null);
+
+                       xmlAnyElements.AddKeyHash (sb);
+                       xmlArrayItems.AddKeyHash (sb);
+                       xmlElements.AddKeyHash (sb);
+                       
+                       if (xmlArray != null)
+                               xmlArray.AddKeyHash (sb);
+                               
+                       if (xmlAttribute != null)
+                               xmlAttribute.AddKeyHash (sb);
+                               
+                       if (xmlDefaultValue == null) {
+                               sb.Append ("n");
+                       }
+                       else if (!(xmlDefaultValue is System.DBNull)) {
+                               string v = XmlCustomFormatter.ToXmlString (TypeTranslator.GetTypeData (xmlDefaultValue.GetType()), xmlDefaultValue);
+                               sb.Append ("v" + v);
+                       }
+                       
+                       if (xmlEnum != null)
+                               xmlEnum.AddKeyHash (sb);
+                               
+                       if (xmlRoot != null)
+                               xmlRoot.AddKeyHash (sb);
+                               
+                       if (xmlText != null)
+                               xmlText.AddKeyHash (sb);
+                               
+                       if (xmlType != null)
+                               xmlType.AddKeyHash (sb);
+                               
+                       if (xmlChoiceIdentifier != null)
+                               xmlChoiceIdentifier.AddKeyHash (sb);
+                               
+                       sb.Append ("|");
+               }
+       }
+}