This commit was manufactured by cvs2svn to create branch 'mono-1-0'.
[mono.git] / mcs / class / System.XML / System.Xml.Serialization / SoapCodeExporter.cs
1 // \r
2 // System.Xml.Serialization.SoapCodeExporter \r
3 //\r
4 // Author:\r
5 //   Tim Coleman (tim@timcoleman.com)\r
6 //   Lluis Sanchez Gual (lluis@ximian.com)\r
7 //\r
8 // Copyright (C) Tim Coleman, 2002\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.CodeDom;\r
33 \r
34 namespace System.Xml.Serialization {\r
35         public class SoapCodeExporter {\r
36 \r
37                 #region Fields\r
38 \r
39                 CodeNamespace codeNamespace;\r
40                 CodeCompileUnit codeCompileUnit;\r
41                 SoapMapCodeGenerator codeGenerator;\r
42 \r
43                 #endregion\r
44 \r
45                 #region Constructors\r
46 \r
47                 public SoapCodeExporter (CodeNamespace codeNamespace): this (codeNamespace, null)\r
48                 {\r
49                 }\r
50 \r
51                 public SoapCodeExporter (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit)\r
52                 {\r
53                         this.codeCompileUnit = codeCompileUnit;\r
54                         this.codeNamespace = codeNamespace;\r
55                         \r
56                         codeGenerator = new SoapMapCodeGenerator (codeNamespace, codeCompileUnit);\r
57                 }\r
58 \r
59                 #endregion // Constructors\r
60 \r
61                 #region Properties\r
62 \r
63                 public CodeAttributeDeclarationCollection IncludeMetadata {\r
64                         get { return codeGenerator.IncludeMetadata; }\r
65                 }\r
66                 \r
67                 #endregion // Properties\r
68 \r
69                 #region Methods\r
70 \r
71                 public void AddMappingMetadata (CodeAttributeDeclarationCollection metadata, XmlMemberMapping member)\r
72                 {\r
73                         AddMappingMetadata (metadata, member, false);\r
74                 }\r
75 \r
76                 public void AddMappingMetadata (CodeAttributeDeclarationCollection metadata, XmlMemberMapping member, bool forceUseMemberName)\r
77                 {\r
78                         TypeData memType = member.TypeMapMember.TypeData;\r
79                         \r
80                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapElement");\r
81                         if (forceUseMemberName || (member.ElementName != member.MemberName))\r
82                                 att.Arguments.Add (new CodeAttributeArgument (new CodePrimitiveExpression(member.ElementName)));\r
83                         if (!TypeTranslator.IsDefaultPrimitiveTpeData (memType))\r
84                                 att.Arguments.Add (new CodeAttributeArgument ("DataType", new CodePrimitiveExpression(member.TypeName)));\r
85                                 \r
86                         if (att.Arguments.Count > 0) \r
87                                 metadata.Add (att);\r
88                 }\r
89 \r
90                 public void ExportMembersMapping (XmlMembersMapping xmlMembersMapping)\r
91                 {\r
92                         codeGenerator.ExportMembersMapping (xmlMembersMapping);\r
93                 }\r
94 \r
95                 public void ExportTypeMapping (XmlTypeMapping xmlTypeMapping)\r
96                 {\r
97                         codeGenerator.ExportTypeMapping (xmlTypeMapping);\r
98                 }\r
99 \r
100 \r
101                 #endregion // Methods\r
102         }\r
103 \r
104         class SoapMapCodeGenerator : MapCodeGenerator\r
105         {\r
106                 public SoapMapCodeGenerator (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit)\r
107                 : base (codeNamespace, codeCompileUnit)\r
108                 {\r
109                         includeArrayTypes = true;\r
110                 }\r
111 \r
112                 protected override void GenerateClass (XmlTypeMapping map, CodeTypeDeclaration codeClass)\r
113                 {\r
114                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapType");\r
115                         if (map.XmlType != map.TypeData.TypeName) att.Arguments.Add (GetArg (map.XmlType));\r
116                         if (map.XmlTypeNamespace != "") att.Arguments.Add (GetArg ("Namespace", map.XmlTypeNamespace));\r
117                         AddCustomAttribute (codeClass, att, false);\r
118                 }\r
119                 \r
120                 protected override void GenerateClassInclude (CodeAttributeDeclarationCollection attributes, XmlTypeMapping map)\r
121                 {\r
122                         CodeAttributeDeclaration iatt = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapInclude");\r
123                         iatt.Arguments.Add (new CodeAttributeArgument (new CodeTypeOfExpression(map.TypeData.FullTypeName)));\r
124                         attributes.Add (iatt);\r
125                 }\r
126         \r
127                 protected override void GenerateAttributeMember (CodeAttributeDeclarationCollection attributes, XmlTypeMapMemberAttribute attinfo, string defaultNamespace, bool forceUseMemberName)\r
128                 {\r
129                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapAttribute");\r
130                         if (attinfo.Name != attinfo.AttributeName) att.Arguments.Add (GetArg (attinfo.AttributeName));\r
131                         if (attinfo.Namespace != defaultNamespace) att.Arguments.Add (GetArg ("Namespace", attinfo.Namespace));\r
132                         if (!TypeTranslator.IsDefaultPrimitiveTpeData(attinfo.TypeData)) att.Arguments.Add (GetArg ("DataType",attinfo.TypeData.XmlType));\r
133                         attributes.Add (att);\r
134                 }\r
135                 \r
136                 protected override void GenerateElementInfoMember (CodeAttributeDeclarationCollection attributes, XmlTypeMapMemberElement member, XmlTypeMapElementInfo einfo, TypeData defaultType, string defaultNamespace, bool addAlwaysAttr, bool forceUseMemberName)\r
137                 {\r
138                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapElement");\r
139                         if (forceUseMemberName || einfo.ElementName != member.Name) att.Arguments.Add (GetArg (einfo.ElementName));\r
140 //                      if (einfo.IsNullable) att.Arguments.Add (GetArg ("IsNullable", true));  MS seems to ignore this\r
141                         if (!TypeTranslator.IsDefaultPrimitiveTpeData(einfo.TypeData)) att.Arguments.Add (GetArg ("DataType",einfo.TypeData.XmlType));\r
142                         if (addAlwaysAttr || att.Arguments.Count > 0) attributes.Add (att);\r
143                 }\r
144                 \r
145                 protected override void GenerateEnum (XmlTypeMapping map, CodeTypeDeclaration codeEnum)\r
146                 {\r
147                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapType");\r
148                         if (map.XmlType != map.TypeData.TypeName) att.Arguments.Add (GetArg (map.XmlType));\r
149                         if (map.XmlTypeNamespace != "") att.Arguments.Add (GetArg ("Namespace", map.XmlTypeNamespace));\r
150                         AddCustomAttribute (codeEnum, att, false);\r
151                 }               \r
152                 \r
153                 protected override void GenerateEnumItem (CodeMemberField codeField, EnumMap.EnumMapMember emem)\r
154                 {\r
155                         if (emem.EnumName != emem.XmlName)\r
156                         {\r
157                                 CodeAttributeDeclaration xatt = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapEnum");\r
158                                 xatt.Arguments.Add (GetArg ("Name", emem.XmlName));\r
159                                 AddCustomAttribute (codeField, xatt, true);\r
160                         }\r
161                 }               \r
162                 \r
163                 protected override void GenerateSpecifierMember (CodeMemberField codeField)\r
164                 {\r
165                         AddCustomAttribute (codeField, "System.Xml.Serialization.SoapIgnore");\r
166                 }\r
167         }\r
168 }