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
44 private XmlAnyAttributeAttribute xmlAnyAttribute;
46 private XmlAnyElementAttributes xmlAnyElements = new XmlAnyElementAttributes();
47 private XmlArrayAttribute xmlArray;
48 private XmlArrayItemAttributes xmlArrayItems = new XmlArrayItemAttributes();
49 private XmlAttributeAttribute xmlAttribute;
50 private XmlChoiceIdentifierAttribute xmlChoiceIdentifier;
51 private object xmlDefaultValue = System.DBNull.Value;
52 private XmlElementAttributes xmlElements = new XmlElementAttributes();
53 private XmlEnumAttribute xmlEnum;
54 private bool xmlIgnore;
56 private XmlRootAttribute xmlRoot;
57 private XmlTextAttribute xmlText;
58 private XmlTypeAttribute xmlType;
60 public XmlAttributes ()
64 public XmlAttributes (ICustomAttributeProvider provider)
66 object[] attributes = provider.GetCustomAttributes(false);
67 foreach(object obj in attributes)
70 if(obj is XmlAnyAttributeAttribute)
71 xmlAnyAttribute = (XmlAnyAttributeAttribute) obj;
74 if(obj is XmlAnyElementAttribute)
75 xmlAnyElements.Add((XmlAnyElementAttribute) obj);
76 else if(obj is XmlArrayAttribute)
77 xmlArray = (XmlArrayAttribute) obj;
78 else if(obj is XmlArrayItemAttribute)
79 xmlArrayItems.Add((XmlArrayItemAttribute) obj);
80 else if(obj is XmlAttributeAttribute)
81 xmlAttribute = (XmlAttributeAttribute) obj;
82 else if(obj is XmlChoiceIdentifierAttribute)
83 xmlChoiceIdentifier = (XmlChoiceIdentifierAttribute) obj;
84 else if(obj is DefaultValueAttribute)
85 xmlDefaultValue = ((DefaultValueAttribute)obj).Value;
86 else if(obj is XmlElementAttribute )
87 xmlElements.Add((XmlElementAttribute ) obj);
88 else if(obj is XmlEnumAttribute)
89 xmlEnum = (XmlEnumAttribute) obj;
90 else if(obj is XmlIgnoreAttribute)
92 else if(obj is XmlNamespaceDeclarationsAttribute)
94 else if(obj is XmlRootAttribute)
95 xmlRoot = (XmlRootAttribute) obj;
96 else if(obj is XmlTextAttribute)
97 xmlText = (XmlTextAttribute) obj;
98 else if(obj is XmlTypeAttribute)
99 xmlType = (XmlTypeAttribute) obj;
103 #region public properties
105 public XmlAnyAttributeAttribute XmlAnyAttribute
109 return xmlAnyAttribute;
113 xmlAnyAttribute = value;
117 public XmlAnyElementAttributes XmlAnyElements
121 return xmlAnyElements;
124 public XmlArrayAttribute XmlArray
135 public XmlArrayItemAttributes XmlArrayItems
139 return xmlArrayItems;
142 public XmlAttributeAttribute XmlAttribute
150 xmlAttribute = value;
153 public XmlChoiceIdentifierAttribute XmlChoiceIdentifier
157 return xmlChoiceIdentifier;
160 public object XmlDefaultValue
164 return xmlDefaultValue;
168 xmlDefaultValue = value;
171 public XmlElementAttributes XmlElements
178 public XmlEnumAttribute XmlEnum
189 public bool XmlIgnore
211 public XmlRootAttribute XmlRoot
221 public XmlTextAttribute XmlText
232 public XmlTypeAttribute XmlType
245 internal void AddKeyHash (System.Text.StringBuilder sb)
249 KeyHelper.AddField (sb, 1, xmlIgnore);
250 KeyHelper.AddField (sb, 2, xmlns);
252 KeyHelper.AddField (sb, 3, xmlAnyAttribute!=null);
255 xmlAnyElements.AddKeyHash (sb);
256 xmlArrayItems.AddKeyHash (sb);
257 xmlElements.AddKeyHash (sb);
259 if (xmlArray != null)
260 xmlArray.AddKeyHash (sb);
262 if (xmlAttribute != null)
263 xmlAttribute.AddKeyHash (sb);
265 if (xmlDefaultValue == null) {
268 else if (!(xmlDefaultValue is System.DBNull)) {
269 string v = XmlCustomFormatter.ToXmlString (TypeTranslator.GetTypeData (xmlDefaultValue.GetType()), xmlDefaultValue);
274 xmlEnum.AddKeyHash (sb);
277 xmlRoot.AddKeyHash (sb);
280 xmlText.AddKeyHash (sb);
283 xmlType.AddKeyHash (sb);
285 if (xmlChoiceIdentifier != null)
286 xmlChoiceIdentifier.AddKeyHash (sb);
291 internal int? Order {
294 if (XmlElements.Count > 0)
295 order = XmlElements.Order;
296 else if (XmlArray != null)
297 order = XmlArray.Order;
298 else if (XmlAnyElements.Count > 0)
299 order = XmlAnyElements.Order;
304 internal int SortableOrder {
305 get { return Order != null ? (int) Order : int.MinValue; }