Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

318 lines
6.9 KiB
C#

//
// XmlAttributes.cs:
//
// Author:
// John Donagher (john@webmeta.com)
//
// (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;
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;
}
if (xmlIgnore) {
xmlAnyAttribute = null;
xmlAnyElements.Clear ();
xmlArray = null;
xmlArrayItems.Clear ();
xmlAttribute = null;
xmlChoiceIdentifier = null;
xmlDefaultValue = null;
xmlElements.Clear ();
xmlEnum = null;
xmlns = false;
xmlRoot = null;
xmlText = null;
xmlType = null;
}
}
#region public properties
public XmlAnyAttributeAttribute XmlAnyAttribute
{
get
{
return xmlAnyAttribute;
}
set
{
xmlAnyAttribute = value;
}
}
public XmlAnyElementAttributes XmlAnyElements
{
get
{
return xmlAnyElements;
}
}
public XmlArrayAttribute XmlArray
{
get
{
return xmlArray;
}
set
{
xmlArray = value;
}
}
public XmlArrayItemAttributes XmlArrayItems
{
get
{
return xmlArrayItems;
}
}
public XmlAttributeAttribute XmlAttribute
{
get
{
return xmlAttribute;
}
set
{
xmlAttribute = value;
}
}
public XmlChoiceIdentifierAttribute XmlChoiceIdentifier
{
get
{
return xmlChoiceIdentifier;
}
}
public object XmlDefaultValue
{
get
{
return xmlDefaultValue;
}
set
{
xmlDefaultValue = value;
}
}
public XmlElementAttributes XmlElements
{
get
{
return xmlElements;
}
}
public XmlEnumAttribute XmlEnum
{
get
{
return xmlEnum;
}
set
{
xmlEnum = value;
}
}
public bool XmlIgnore
{
get
{
return xmlIgnore;
}
set
{
xmlIgnore = value;
}
}
public bool Xmlns
{
get
{
return xmlns;
}
set
{
xmlns = value;
}
}
public XmlRootAttribute XmlRoot
{
get
{
return xmlRoot;}
set
{
xmlRoot = value;
}
}
public XmlTextAttribute XmlText
{
get
{
return xmlText;
}
set
{
xmlText = value;
}
}
public XmlTypeAttribute XmlType
{
get
{
return xmlType;
}
set
{
xmlType = value;
}
}
#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 ("|");
}
internal int? Order {
get {
int? order = null;
if (XmlElements.Count > 0)
order = XmlElements.Order;
else if (XmlArray != null)
order = XmlArray.Order;
else if (XmlAnyElements.Count > 0)
order = XmlAnyElements.Order;
return order;
}
}
internal int SortableOrder {
get { return Order != null ? (int) Order : int.MinValue; }
}
}
}