2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / System.XML / System.Xml.Serialization / XmlTypeMapMemberElement.cs
1 //
2 // XmlTypeMapMemberElement.cs: 
3 //
4 // Author:
5 //   Lluis Sanchez Gual (lluis@ximian.com)
6 //
7 // (C) 2002, 2003 Ximian, Inc.  http://www.ximian.com
8 //
9
10 //
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:
18 // 
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 // 
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.
29 //
30
31 using System;
32 using System.Collections;
33 using System.Globalization;
34
35 namespace System.Xml.Serialization
36 {
37         // XmlTypeMapMemberElement
38         // A member of a class that must be serialized as an XmlElement
39
40         internal class XmlTypeMapMemberElement: XmlTypeMapMember
41         {
42                 XmlTypeMapElementInfoList _elementInfo;
43                 string _choiceMember;
44                 bool _isTextCollector;
45
46                 public XmlTypeMapMemberElement()
47                 {
48                 }
49
50                 public XmlTypeMapElementInfoList ElementInfo
51                 {
52                         get
53                         {
54                                 if (_elementInfo == null) _elementInfo = new XmlTypeMapElementInfoList ();
55                                 return _elementInfo;
56                         }
57                         set { _elementInfo = value; }
58                 }
59
60                 public string ChoiceMember
61                 {
62                         get { return _choiceMember; }
63                         set { _choiceMember = value; }
64                 }
65
66                 public XmlTypeMapElementInfo FindElement (object ob, object memberValue)
67                 {
68                         if (_elementInfo.Count == 1) 
69                                 return (XmlTypeMapElementInfo) _elementInfo[0];
70                         else if (_choiceMember != null)
71                         {
72                                 object value = GetValue (ob, _choiceMember);
73                                 string choiceValue = value is IFormattable ? ((IFormattable) value).ToString (null, CultureInfo.InvariantCulture) : value.ToString();
74                                 foreach (XmlTypeMapElementInfo elem in _elementInfo)
75                                         if (elem.ChoiceValue == choiceValue) return elem;
76                         }
77                         else
78                         {
79                                 if (memberValue == null)
80                                         return (XmlTypeMapElementInfo) _elementInfo[0];
81                                 Type type = memberValue.GetType();
82                                 foreach (XmlTypeMapElementInfo elem in _elementInfo)
83                                         if (elem.TypeData.Type == type) return elem;
84                         }
85                         return null;
86                 }
87
88                 public bool IsXmlTextCollector
89                 {
90                         get { return _isTextCollector; }
91                         set { _isTextCollector = value; }
92                 }
93         }
94
95         // XmlTypeMapMemberList
96         // A member of a class that must be serialized as a list
97
98         internal class XmlTypeMapMemberList : XmlTypeMapMemberElement
99         {
100                 public XmlTypeMapping ListTypeMapping
101                 {
102                         get { return ((XmlTypeMapElementInfo) ElementInfo[0]).MappedType; }
103                 }
104
105                 public string ElementName
106                 {
107                         get { return ((XmlTypeMapElementInfo) ElementInfo[0]).ElementName; }
108                 }
109
110                 public string Namespace
111                 {
112                         get { return ((XmlTypeMapElementInfo) ElementInfo[0]).Namespace; }
113                 }
114         }
115
116         // XmlTypeMapMemberFlatList
117         // A member of a class that must be serialized as a flat list
118
119         internal class XmlTypeMapMemberExpandable : XmlTypeMapMemberElement
120         {
121                 int _flatArrayIndex;
122
123                 public int FlatArrayIndex
124                 {
125                         get { return _flatArrayIndex; }
126                         set { _flatArrayIndex = value; }
127                 }
128         }
129
130         internal class XmlTypeMapMemberFlatList : XmlTypeMapMemberExpandable
131         {
132                 ListMap _listMap;
133
134                 public ListMap ListMap
135                 {
136                         get { return _listMap; }
137                         set { _listMap = value; }
138                 }
139         }
140
141         internal class XmlTypeMapMemberAnyElement : XmlTypeMapMemberExpandable
142         {
143                 public bool IsElementDefined (string name, string ns)
144                 {
145                         foreach (XmlTypeMapElementInfo elem in ElementInfo)
146                         {
147                                 if (elem.IsUnnamedAnyElement)           // Default AnyElementAttribute
148                                         return true;
149
150                                 if (elem.ElementName == name && elem.Namespace == ns)
151                                         return true;
152                         }
153                         return false;
154                 }
155
156                 public bool IsDefaultAny
157                 {
158                         get
159                         {
160                                 foreach (XmlTypeMapElementInfo elem in ElementInfo)
161                                 {
162                                         if (elem.IsUnnamedAnyElement) 
163                                                 return true;
164                                 }
165                                 return false;
166                         }
167                 }
168                 
169                 public bool CanBeText
170                 {
171                         get
172                         {
173                                 return (ElementInfo.Count > 0) && ((XmlTypeMapElementInfo)ElementInfo[0]).IsTextElement;
174                         }
175                 }
176         }
177
178         internal class XmlTypeMapMemberAnyAttribute: XmlTypeMapMember
179         {
180         }
181 }