5 // John Donagher (john@webmeta.com)
7 // (C) 2002 John Donagher
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:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
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.
31 using System.Reflection;
33 using System.ComponentModel;
34 using System.Collections;
36 namespace System.Xml.Serialization
39 /// Summary description for XmlAttributes.
41 public class XmlAttributes
43 private XmlAnyAttributeAttribute xmlAnyAttribute;
44 private XmlAnyElementAttributes xmlAnyElements = new XmlAnyElementAttributes();
45 private XmlArrayAttribute xmlArray;
46 private XmlArrayItemAttributes xmlArrayItems = new XmlArrayItemAttributes();
47 private XmlAttributeAttribute xmlAttribute;
48 private XmlChoiceIdentifierAttribute xmlChoiceIdentifier;
49 private object xmlDefaultValue = System.DBNull.Value;
50 private XmlElementAttributes xmlElements = new XmlElementAttributes();
51 private XmlEnumAttribute xmlEnum;
52 private bool xmlIgnore;
54 private XmlRootAttribute xmlRoot;
55 private XmlTextAttribute xmlText;
56 private XmlTypeAttribute xmlType;
58 public XmlAttributes ()
62 public XmlAttributes (ICustomAttributeProvider provider)
64 object[] attributes = provider.GetCustomAttributes(false);
65 foreach(object obj in attributes)
67 if(obj is XmlAnyAttributeAttribute)
68 xmlAnyAttribute = (XmlAnyAttributeAttribute) obj;
70 if(obj is XmlAnyElementAttribute)
71 xmlAnyElements.Add((XmlAnyElementAttribute) obj);
72 else if(obj is XmlArrayAttribute)
73 xmlArray = (XmlArrayAttribute) obj;
74 else if(obj is XmlArrayItemAttribute)
75 xmlArrayItems.Add((XmlArrayItemAttribute) obj);
76 else if(obj is XmlAttributeAttribute)
77 xmlAttribute = (XmlAttributeAttribute) obj;
78 else if(obj is XmlChoiceIdentifierAttribute)
79 xmlChoiceIdentifier = (XmlChoiceIdentifierAttribute) obj;
80 else if(obj is DefaultValueAttribute)
81 xmlDefaultValue = ((DefaultValueAttribute)obj).Value;
82 else if(obj is XmlElementAttribute )
83 xmlElements.Add((XmlElementAttribute ) obj);
84 else if(obj is XmlEnumAttribute)
85 xmlEnum = (XmlEnumAttribute) obj;
86 else if(obj is XmlIgnoreAttribute)
88 else if(obj is XmlNamespaceDeclarationsAttribute)
90 else if(obj is XmlRootAttribute)
91 xmlRoot = (XmlRootAttribute) obj;
92 else if(obj is XmlTextAttribute)
93 xmlText = (XmlTextAttribute) obj;
94 else if(obj is XmlTypeAttribute)
95 xmlType = (XmlTypeAttribute) obj;
99 xmlAnyAttribute = null;
100 xmlAnyElements.Clear ();
102 xmlArrayItems.Clear ();
104 xmlChoiceIdentifier = null;
105 xmlDefaultValue = null;
106 xmlElements.Clear ();
115 #region public properties
116 public XmlAnyAttributeAttribute XmlAnyAttribute
120 return xmlAnyAttribute;
124 xmlAnyAttribute = value;
128 public XmlAnyElementAttributes XmlAnyElements
132 return xmlAnyElements;
135 public XmlArrayAttribute XmlArray
146 public XmlArrayItemAttributes XmlArrayItems
150 return xmlArrayItems;
153 public XmlAttributeAttribute XmlAttribute
161 xmlAttribute = value;
164 public XmlChoiceIdentifierAttribute XmlChoiceIdentifier
168 return xmlChoiceIdentifier;
171 public object XmlDefaultValue
175 return xmlDefaultValue;
179 xmlDefaultValue = value;
182 public XmlElementAttributes XmlElements
189 public XmlEnumAttribute XmlEnum
200 public bool XmlIgnore
222 public XmlRootAttribute XmlRoot
232 public XmlTextAttribute XmlText
243 public XmlTypeAttribute XmlType
256 internal void AddKeyHash (System.Text.StringBuilder sb)
260 KeyHelper.AddField (sb, 1, xmlIgnore);
261 KeyHelper.AddField (sb, 2, xmlns);
262 KeyHelper.AddField (sb, 3, xmlAnyAttribute!=null);
264 xmlAnyElements.AddKeyHash (sb);
265 xmlArrayItems.AddKeyHash (sb);
266 xmlElements.AddKeyHash (sb);
268 if (xmlArray != null)
269 xmlArray.AddKeyHash (sb);
271 if (xmlAttribute != null)
272 xmlAttribute.AddKeyHash (sb);
274 if (xmlDefaultValue == null) {
277 else if (!(xmlDefaultValue is System.DBNull)) {
278 string v = XmlCustomFormatter.ToXmlString (TypeTranslator.GetTypeData (xmlDefaultValue.GetType()), xmlDefaultValue);
283 xmlEnum.AddKeyHash (sb);
286 xmlRoot.AddKeyHash (sb);
289 xmlText.AddKeyHash (sb);
292 xmlType.AddKeyHash (sb);
294 if (xmlChoiceIdentifier != null)
295 xmlChoiceIdentifier.AddKeyHash (sb);
300 internal int? Order {
303 if (XmlElements.Count > 0)
304 order = XmlElements.Order;
305 else if (XmlArray != null)
306 order = XmlArray.Order;
307 else if (XmlAnyElements.Count > 0)
308 order = XmlAnyElements.Order;
313 internal int SortableOrder {
314 get { return Order != null ? (int) Order : int.MinValue; }