// (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 ("|");
+ }
+ }
+}