2005-08-06 Lluis Sanchez Gual <lluis@novell.com>
[mono.git] / mcs / class / System.XML / System.Xml.Serialization / XmlTypeMapping.cs
1 //\r
2 // XmlTypeMapping.cs: \r
3 //\r
4 // Author:\r
5 //   John Donagher (john@webmeta.com)\r
6 //   Lluis Sanchez Gual (lluis@ximian.com)\r
7 //\r
8 // (C) 2002 John Donagher\r
9 //\r
10
11 //
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
19 // 
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 // 
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 //
31 \r
32 using System.Xml;\r
33 using System;\r
34 using System.Collections;\r
35 using System.Globalization;
36 using System.Xml.Schema;\r
37 \r
38 namespace System.Xml.Serialization\r
39 {\r
40         public class XmlTypeMapping : XmlMapping\r
41         {\r
42                 private string xmlType;\r
43                 private string xmlTypeNamespace;\r
44                 TypeData type;\r
45                 XmlTypeMapping baseMap;\r
46                 bool multiReferenceType = false;\r
47                 bool isSimpleType;\r
48                 string documentation;\r
49                 bool includeInSchema;\r
50                 bool isNullable = true;\r
51 \r
52                 ArrayList _derivedTypes = new ArrayList();\r
53 \r
54                 internal XmlTypeMapping(string elementName, string ns, TypeData typeData, string xmlType, string xmlTypeNamespace)\r
55                 : base (elementName, ns)\r
56                 {\r
57                         this.type = typeData;\r
58                         this.xmlType = xmlType;\r
59                         this.xmlTypeNamespace = xmlTypeNamespace;\r
60                 }\r
61 \r
62 #if !NET_2_0\r
63                 public string ElementName\r
64                 {\r
65                         get { return _elementName; }\r
66                 }\r
67 \r
68                 public string Namespace\r
69                 {\r
70                         get { return _namespace; }\r
71                 }\r
72 #endif\r
73 \r
74                 public string TypeFullName\r
75                 {\r
76                         get { return type.FullTypeName; }\r
77                 }\r
78 \r
79                 public string TypeName\r
80                 {\r
81                         get { return type.TypeName; }\r
82                 }\r
83 \r
84                 internal TypeData TypeData\r
85                 {\r
86                         get { return type; }\r
87                 }\r
88 \r
89                 internal string XmlType\r
90                 {\r
91                         get { return xmlType; }\r
92                 }\r
93 \r
94                 internal string XmlTypeNamespace\r
95                 {\r
96                         get { return xmlTypeNamespace; }\r
97                 }\r
98 \r
99                 internal ArrayList DerivedTypes\r
100                 {\r
101                         get { return _derivedTypes; }\r
102                         set { _derivedTypes = value; }\r
103                 }\r
104 \r
105                 internal bool MultiReferenceType\r
106                 {\r
107                         get { return multiReferenceType; }\r
108                         set { multiReferenceType = value; }\r
109                 }\r
110 \r
111                 internal XmlTypeMapping BaseMap\r
112                 {\r
113                         get { return baseMap; }\r
114                         set { baseMap = value; }\r
115                 }\r
116 \r
117                 internal bool IsSimpleType\r
118                 {\r
119                         get { return isSimpleType; }\r
120                         set { isSimpleType = value; }\r
121                 }\r
122 \r
123                 internal string Documentation\r
124                 {\r
125                         set { documentation = value; }\r
126                         get { return documentation; }\r
127                 }\r
128 \r
129                 internal bool IncludeInSchema\r
130                 {\r
131                         get { return includeInSchema; }\r
132                         set { includeInSchema = value; }\r
133                 }\r
134                 \r
135                 internal bool IsNullable\r
136                 {\r
137                         get { return isNullable; }\r
138                         set { isNullable = value; }\r
139                 }\r
140 \r
141                 internal XmlTypeMapping GetRealTypeMap (string objectFullTypeName)\r
142                 {\r
143                         // Returns the map for a subtype of this map's type\r
144 \r
145                         objectFullTypeName = objectFullTypeName.Replace ('+','.');\r
146                         if (TypeFullName == objectFullTypeName) return this;\r
147                         for (int n=0; n<_derivedTypes.Count; n++) {\r
148                                 XmlTypeMapping map = (XmlTypeMapping) _derivedTypes[n];\r
149                                 if (map.TypeFullName == objectFullTypeName) return map;\r
150                         }\r
151                         \r
152                         return null;\r
153                 }\r
154 \r
155                 internal XmlTypeMapping GetRealElementMap (string name, string ens)\r
156                 {\r
157                         if (xmlType == name && xmlTypeNamespace == ens) return this;\r
158                         foreach (XmlTypeMapping map in _derivedTypes)\r
159                                 if (map.xmlType == name && map.xmlTypeNamespace == ens) return map;\r
160                         \r
161                         return null;\r
162                 }\r
163                 \r
164                 internal void UpdateRoot (XmlQualifiedName qname)\r
165                 {\r
166                         if (qname != null) {\r
167                                 this._elementName = qname.Name;\r
168                                 this._namespace = qname.Namespace;\r
169                         }\r
170                 }\r
171         }\r
172 \r
173  
174         // Mapping info for XmlSerializable
175         internal class XmlSerializableMapping : XmlTypeMapping
176         {
177                 XmlSchema _schema;
178
179                 internal XmlSerializableMapping(string elementName, string ns, TypeData typeData, string xmlType, string xmlTypeNamespace)
180                         : base(elementName, ns, typeData, xmlType, xmlTypeNamespace)
181                 {
182                         IXmlSerializable serializable = (IXmlSerializable)Activator.CreateInstance(typeData.Type);
183                         _schema = serializable.GetSchema();
184                         if (_schema != null) 
185                         {
186                                 if (_schema.Id == null || _schema.Id.Length == 0) 
187                                         throw new InvalidOperationException("Schema Id is missing. The schema returned from " + typeData.Type.FullName + ".GetSchema() must have an Id.");
188                         }
189                 }
190
191                 internal XmlSchema Schema
192                 {
193                         get { return _schema; }
194                 }
195         }
196  
197
198         // Mapping info for classes and structs\r
199 \r
200         internal class ClassMap: ObjectMap\r
201         {\r
202                 Hashtable _elements = new Hashtable ();\r
203                 ArrayList _elementMembers;\r
204                 Hashtable _attributeMembers;\r
205                 XmlTypeMapMemberAttribute[] _attributeMembersArray;\r
206                 XmlTypeMapElementInfo[] _elementsByIndex;\r
207                 ArrayList _flatLists;\r
208                 ArrayList _allMembers = new ArrayList ();\r
209                 ArrayList _membersWithDefault;\r
210                 ArrayList _listMembers;\r
211                 XmlTypeMapMemberAnyElement _defaultAnyElement;\r
212                 XmlTypeMapMemberAnyAttribute _defaultAnyAttribute;\r
213                 XmlTypeMapMemberNamespaces _namespaceDeclarations;\r
214                 XmlTypeMapMember _xmlTextCollector;\r
215                 XmlTypeMapMember _returnMember;\r
216                 bool _ignoreMemberNamespace;\r
217                 bool _canBeSimpleType = true;\r
218 \r
219                 public void AddMember (XmlTypeMapMember member)\r
220                 {\r
221                         _allMembers.Add (member);\r
222                         \r
223                         if (!(member.DefaultValue is System.DBNull) && member.DefaultValue != null) {\r
224                                 if (_membersWithDefault == null) _membersWithDefault = new ArrayList ();\r
225                                 _membersWithDefault.Add (member);\r
226                         }\r
227                         \r
228                         if (member.IsReturnValue)\r
229                                 _returnMember = member;\r
230                         \r
231                         if (member is XmlTypeMapMemberAttribute)\r
232                         {\r
233                                 XmlTypeMapMemberAttribute atm = (XmlTypeMapMemberAttribute)member;\r
234                                 if (_attributeMembers == null) _attributeMembers = new Hashtable();\r
235                                 string key = BuildKey (atm.AttributeName, atm.Namespace);\r
236                                 if (_attributeMembers.ContainsKey (key))\r
237                                         throw new InvalidOperationException ("The XML attribute named '" + atm.AttributeName + "' from namespace '" + atm.Namespace + "' already present in the current scope. Use XML attributes to specify another XML name or namespace for the attribute.");\r
238                                 member.Index = _attributeMembers.Count;\r
239                                 _attributeMembers.Add (key, member);\r
240                                 return;\r
241                         }\r
242                         else if (member is XmlTypeMapMemberFlatList)\r
243                         {\r
244                                 RegisterFlatList ((XmlTypeMapMemberFlatList)member);\r
245                         }\r
246                         else if (member is XmlTypeMapMemberAnyElement)\r
247                         {\r
248                                 XmlTypeMapMemberAnyElement mem = (XmlTypeMapMemberAnyElement) member;\r
249                                 if (mem.IsDefaultAny) _defaultAnyElement = mem;\r
250                                 if (mem.TypeData.IsListType) RegisterFlatList (mem);\r
251                         }\r
252                         else if (member is XmlTypeMapMemberAnyAttribute)\r
253                         {\r
254                                 _defaultAnyAttribute = (XmlTypeMapMemberAnyAttribute) member;\r
255                                 return;\r
256                         }\r
257                         else if (member is XmlTypeMapMemberNamespaces)\r
258                         {\r
259                                 _namespaceDeclarations = (XmlTypeMapMemberNamespaces) member;\r
260                                 return;\r
261                         }\r
262 \r
263                         if (member is XmlTypeMapMemberElement && ((XmlTypeMapMemberElement)member).IsXmlTextCollector)\r
264                         {\r
265                                 if (_xmlTextCollector != null) throw new InvalidOperationException ("XmlTextAttribute can only be applied once in a class");\r
266                                 _xmlTextCollector = member;\r
267                         }\r
268 \r
269                         if (_elementMembers == null) {\r
270                                 _elementMembers = new ArrayList();\r
271                                 _elements = new Hashtable();\r
272                         }\r
273 \r
274                         member.Index = _elementMembers.Count;\r
275                         _elementMembers.Add (member);\r
276 \r
277                         ICollection elemsInfo = ((XmlTypeMapMemberElement)member).ElementInfo;\r
278                         foreach (XmlTypeMapElementInfo elem in elemsInfo)\r
279                         {\r
280                                 string key = BuildKey (elem.ElementName, elem.Namespace);\r
281                                 if (_elements.ContainsKey (key)) \r
282                                         throw new InvalidOperationException ("The XML element named '" + elem.ElementName + "' from namespace '" + elem.Namespace + "' already present in the current scope. Use XML attributes to specify another XML name or namespace for the element.");\r
283                                 _elements.Add (key, elem);\r
284                         }
285                         
286                         if (member.TypeData.IsListType && member.TypeData.Type != null && !member.TypeData.Type.IsArray) {
287                                 if (_listMembers == null) _listMembers = new ArrayList ();\r
288                                 _listMembers.Add (member);\r
289                         }\r
290                 }\r
291 \r
292                 void RegisterFlatList (XmlTypeMapMemberExpandable member)\r
293                 {\r
294                         if (_flatLists == null) _flatLists = new ArrayList ();\r
295                         member.FlatArrayIndex = _flatLists.Count;\r
296                         _flatLists.Add (member);\r
297                 }\r
298 \r
299                 public XmlTypeMapMemberAttribute GetAttribute (string name, string ns)\r
300                 {\r
301                         if (_attributeMembers == null) return null;\r
302                         return (XmlTypeMapMemberAttribute)_attributeMembers [BuildKey(name,ns)];\r
303                 }\r
304 \r
305                 public XmlTypeMapElementInfo GetElement (string name, string ns)\r
306                 {\r
307                         if (_elements == null) return null;\r
308                         return (XmlTypeMapElementInfo)_elements [BuildKey(name,ns)];\r
309                 }\r
310                 \r
311                 public XmlTypeMapElementInfo GetElement (int index)\r
312                 {\r
313                         if (_elements == null) return null;\r
314                         \r
315                         if (_elementsByIndex == null)\r
316                         {\r
317                                 _elementsByIndex = new XmlTypeMapElementInfo [_elementMembers.Count];\r
318                                 foreach (XmlTypeMapMemberElement mem in _elementMembers)\r
319                                 {\r
320                                         if (mem.ElementInfo.Count != 1) \r
321                                                 throw new InvalidOperationException ("Read by order only possible for encoded/bare format");\r
322                                                 \r
323                                         _elementsByIndex [mem.Index] = (XmlTypeMapElementInfo) mem.ElementInfo [0];\r
324                                 }\r
325                         }\r
326                         \r
327                         return _elementsByIndex [index];\r
328                 }\r
329                 \r
330                 private string BuildKey (string name, string ns)\r
331                 {\r
332                         if (_ignoreMemberNamespace) return name;\r
333                         else return name + " / " + ns;\r
334                 }\r
335                 \r
336                 public ICollection AllElementInfos\r
337                 {\r
338                         get { return _elements.Values; }\r
339                 }\r
340                 \r
341                 \r
342                 public bool IgnoreMemberNamespace\r
343                 {\r
344                         get { return _ignoreMemberNamespace; }\r
345                         set { _ignoreMemberNamespace = value; }\r
346                 }\r
347 \r
348                 public XmlTypeMapMember FindMember (string name)\r
349                 {\r
350                         for (int n=0; n<_allMembers.Count; n++)\r
351                                 if (((XmlTypeMapMember)_allMembers[n]).Name == name) return (XmlTypeMapMember)_allMembers[n];\r
352                         return null;\r
353                 }\r
354 \r
355                 public XmlTypeMapMemberAnyElement DefaultAnyElementMember\r
356                 {\r
357                         get { return _defaultAnyElement; }\r
358                 }\r
359 \r
360                 public XmlTypeMapMemberAnyAttribute DefaultAnyAttributeMember\r
361                 {\r
362                         get { return _defaultAnyAttribute; }\r
363                 }\r
364 \r
365                 public XmlTypeMapMemberNamespaces NamespaceDeclarations\r
366                 {\r
367                         get { return _namespaceDeclarations; }\r
368                 }\r
369 \r
370                 public ICollection AttributeMembers\r
371                 {\r
372                         get \r
373                         {\r
374                                 if (_attributeMembers == null) return null;\r
375                                 if (_attributeMembersArray != null) return _attributeMembersArray;\r
376                                 \r
377                                 _attributeMembersArray = new XmlTypeMapMemberAttribute[_attributeMembers.Count];\r
378                                 foreach (XmlTypeMapMemberAttribute mem in _attributeMembers.Values)\r
379                                         _attributeMembersArray [mem.Index] = mem;\r
380                                 return _attributeMembersArray;\r
381                         }\r
382                 }\r
383 \r
384                 public ICollection ElementMembers\r
385                 {\r
386                         get { return _elementMembers; }\r
387                 }\r
388 \r
389                 public ArrayList AllMembers\r
390                 {\r
391                         get { return _allMembers; }\r
392                 }\r
393 \r
394                 public ArrayList FlatLists\r
395                 {\r
396                         get { return _flatLists; }\r
397                 }\r
398                 \r
399                 public ArrayList MembersWithDefault\r
400                 {\r
401                         get { return _membersWithDefault; }\r
402                 }
403                 
404                 public ArrayList ListMembers\r
405                 {\r
406                         get { return _listMembers; }\r
407                 }
408 \r
409                 public XmlTypeMapMember XmlTextCollector\r
410                 {\r
411                         get { return _xmlTextCollector; }\r
412                 }\r
413                 \r
414                 public XmlTypeMapMember ReturnMember\r
415                 {\r
416                         get { return _returnMember; }\r
417                 }\r
418 \r
419                 public XmlQualifiedName SimpleContentBaseType\r
420                 {\r
421                         get\r
422                         {\r
423                                 if (!_canBeSimpleType || _elementMembers == null || _elementMembers.Count != 1) return null;\r
424                                 XmlTypeMapMemberElement member = (XmlTypeMapMemberElement) _elementMembers[0];\r
425                                 if (member.ElementInfo.Count != 1) return null;\r
426                                 XmlTypeMapElementInfo einfo = (XmlTypeMapElementInfo) member.ElementInfo[0];\r
427                                 if (!einfo.IsTextElement) return null;\r
428                                 if (member.TypeData.SchemaType == SchemaTypes.Primitive || member.TypeData.SchemaType == SchemaTypes.Enum)\r
429                                         return new XmlQualifiedName (einfo.TypeData.XmlType, einfo.DataTypeNamespace);\r
430                                 return null;\r
431                         }\r
432                 }\r
433                 \r
434                 public void SetCanBeSimpleType (bool can)\r
435                 {\r
436                         _canBeSimpleType = can;\r
437                 }\r
438 \r
439                 public bool HasSimpleContent\r
440                 {\r
441                         get\r
442                         {\r
443                                 return SimpleContentBaseType != null;\r
444                         }\r
445                 }\r
446 \r
447         }\r
448 \r
449         // Mapping info for arrays and lists\r
450 \r
451         internal class ListMap: ObjectMap\r
452         {\r
453                 XmlTypeMapElementInfoList _itemInfo;\r
454                 bool _gotNestedMapping;\r
455                 XmlTypeMapping _nestedArrayMapping;\r
456 \r
457                 public bool IsMultiArray\r
458                 {\r
459                         get\r
460                         {\r
461                                 return (NestedArrayMapping != null);\r
462                         }\r
463                 }\r
464 \r
465                 public XmlTypeMapping NestedArrayMapping\r
466                 {\r
467                         get\r
468                         {\r
469                                 if (_gotNestedMapping) return _nestedArrayMapping;\r
470                                 _gotNestedMapping = true;\r
471 \r
472                                 _nestedArrayMapping = ((XmlTypeMapElementInfo)_itemInfo[0]).MappedType;\r
473 \r
474                                 if (_nestedArrayMapping == null) return null;\r
475                                 \r
476                                 if (_nestedArrayMapping.TypeData.SchemaType != SchemaTypes.Array) {\r
477                                         _nestedArrayMapping = null; return null;\r
478                                 }\r
479 \r
480                                 foreach (XmlTypeMapElementInfo elem in _itemInfo)\r
481                                         if (elem.MappedType != _nestedArrayMapping) {\r
482                                                 _nestedArrayMapping = null;\r
483                                                 return null;\r
484                                         }\r
485 \r
486                                 return _nestedArrayMapping;\r
487                         }\r
488                 }\r
489 \r
490                 public XmlTypeMapElementInfoList ItemInfo\r
491                 {\r
492 \r
493                         get { return _itemInfo; }\r
494                         set { _itemInfo = value; }\r
495                 }\r
496 \r
497                 public XmlTypeMapElementInfo FindElement (object memberValue)\r
498                 {\r
499                         if (_itemInfo.Count == 1) \r
500                                 return (XmlTypeMapElementInfo) _itemInfo[0];\r
501                         else\r
502                         {\r
503                                 if (memberValue == null) return null;\r
504                                 Type type = memberValue.GetType();\r
505                                 foreach (XmlTypeMapElementInfo elem in _itemInfo)\r
506                                         if (elem.TypeData.Type == type) return elem;\r
507                         }\r
508                         return null;\r
509                 }       \r
510 \r
511                 public XmlTypeMapElementInfo FindElement (string elementName, string ns)\r
512                 {\r
513                         foreach (XmlTypeMapElementInfo elem in _itemInfo)\r
514                                 if (elem.ElementName == elementName && elem.Namespace == ns) return elem;\r
515                         return null;\r
516                 }\r
517                 \r
518                 public XmlTypeMapElementInfo FindTextElement ()\r
519                 {\r
520                         foreach (XmlTypeMapElementInfo elem in _itemInfo)\r
521                                 if (elem.IsTextElement) return elem;\r
522                         return null;\r
523                 }\r
524                 \r
525                 public string GetSchemaArrayName ()\r
526                 {\r
527                         XmlTypeMapElementInfo einfo = (XmlTypeMapElementInfo) _itemInfo[0];\r
528                         if (einfo.MappedType != null) return TypeTranslator.GetArrayName (einfo.MappedType.XmlType);\r
529                         else return TypeTranslator.GetArrayName (einfo.TypeData.XmlType);\r
530                 }\r
531 \r
532                 public void GetArrayType (int itemCount, out string localName, out string ns)\r
533                 {\r
534                         string arrayDim;\r
535                         if (itemCount != -1) arrayDim = "[" + itemCount + "]";\r
536                         else arrayDim = "[]";\r
537 \r
538                         XmlTypeMapElementInfo info = (XmlTypeMapElementInfo) _itemInfo[0];\r
539                         if (info.TypeData.SchemaType == SchemaTypes.Array)\r
540                         {\r
541                                 string nm;\r
542                                 ((ListMap)info.MappedType.ObjectMap).GetArrayType (-1, out nm, out ns);\r
543                                 localName = nm + arrayDim;\r
544                         }\r
545                         else \r
546                         {\r
547                                 if (info.MappedType != null)\r
548                                 {\r
549                                         localName = info.MappedType.XmlType + arrayDim;\r
550                                         ns = info.MappedType.Namespace;\r
551                                 }\r
552                                 else \r
553                                 {\r
554                                         localName = info.TypeData.XmlType + arrayDim;\r
555                                         ns = info.DataTypeNamespace;\r
556                                 }\r
557                         }\r
558                 }\r
559 \r
560                 public override bool Equals (object other)\r
561                 {\r
562                         ListMap lmap = other as ListMap;\r
563                         if (lmap == null) return false;\r
564 \r
565                         if (_itemInfo.Count != lmap._itemInfo.Count) return false;\r
566                         for (int n=0; n<_itemInfo.Count; n++)\r
567                                 if (!_itemInfo[n].Equals (lmap._itemInfo[n])) return false;\r
568                         return true;\r
569                 }\r
570 \r
571                 public override int GetHashCode ()\r
572                 {\r
573                         return base.GetHashCode ();\r
574                 }\r
575         }\r
576 \r
577         internal class EnumMap: ObjectMap\r
578         {\r
579                 EnumMapMember[] _members;\r
580                 bool _isFlags;\r
581 \r
582                 public class EnumMapMember\r
583                 {\r
584                         string _xmlName;\r
585                         string _enumName;\r
586                         string _documentation;\r
587 \r
588                         public EnumMapMember (string xmlName, string enumName)\r
589                         {\r
590                                 _xmlName = xmlName;\r
591                                 _enumName = enumName;\r
592                         }\r
593 \r
594                         public string XmlName\r
595                         {\r
596                                 get { return _xmlName; }\r
597                         }\r
598 \r
599                         public string EnumName\r
600                         {\r
601                                 get { return _enumName; }\r
602                         }\r
603 \r
604                         public string Documentation\r
605                         {\r
606                                 get { return _documentation; }\r
607                                 set { _documentation = value; }\r
608                         }\r
609                 }\r
610 \r
611                 public EnumMap (EnumMapMember[] members, bool isFlags)\r
612                 {\r
613                         _members = members;\r
614                         _isFlags = isFlags;\r
615                 }\r
616                 \r
617                 public bool IsFlags\r
618                 {\r
619                         get { return _isFlags; }\r
620                 }\r
621 \r
622                 public EnumMapMember[] Members\r
623                 {\r
624                         get { return _members; }\r
625                 }\r
626 \r
627                 public string GetXmlName (object enumValue)\r
628                 {\r
629                         string enumName = enumValue.ToString();\r
630 \r
631                         if (_isFlags && enumName.IndexOf (',') != -1)\r
632                         {\r
633                                 System.Text.StringBuilder sb = new System.Text.StringBuilder ();\r
634                                 string[] enumNames = enumValue.ToString().Split (',');\r
635                                 foreach (string name in enumNames)\r
636                                 {\r
637                                         string tname = name.Trim();\r
638                                         foreach (EnumMapMember mem in _members)\r
639                                                 if (mem.EnumName == tname) {\r
640                                                         sb.Append (mem.XmlName).Append (' ');\r
641                                                         break;\r
642                                                 }\r
643                                 }\r
644                                 sb.Remove (sb.Length-1, 1);\r
645                                 return sb.ToString ();\r
646                         }\r
647 \r
648                         foreach (EnumMapMember mem in _members)\r
649                                 if (mem.EnumName == enumName) return mem.XmlName;\r
650                         \r
651                         return Convert.ToInt64(enumValue).ToString(CultureInfo.InvariantCulture);\r
652                 }\r
653 \r
654                 public string GetEnumName (string xmlName)\r
655                 {\r
656                         if (_isFlags && xmlName.Length == 0) \r
657                                 return "0";\r
658                         \r
659                         if (_isFlags && xmlName.Trim().IndexOf (' ') != -1)\r
660                         {\r
661                                 System.Text.StringBuilder sb = new System.Text.StringBuilder ();\r
662                                 string[] enumNames = xmlName.ToString().Split (' ');\r
663                                 foreach (string name in enumNames)\r
664                                 {\r
665                                         if (name == string.Empty) continue;\r
666                                         string foundEnumValue = null;\r
667                                         foreach (EnumMapMember mem in _members)\r
668                                                 if (mem.XmlName == name) { foundEnumValue = mem.EnumName; break; }\r
669 \r
670                                         if (foundEnumValue != null) sb.Append (foundEnumValue).Append (','); \r
671                                         else return null;\r
672                                 }\r
673                                 sb.Remove (sb.Length-1, 1);\r
674                                 return sb.ToString ();\r
675                         }\r
676 \r
677                         foreach (EnumMapMember mem in _members)\r
678                                 if (mem.XmlName == xmlName) return mem.EnumName;\r
679                                 \r
680                         return null;\r
681                 }\r
682         }\r
683 }\r