Copied remotely
[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 using System.CodeDom.Compiler;\r
34 using System.Collections;\r
35 \r
36 namespace System.Xml.Serialization \r
37 {\r
38         public class SoapCodeExporter\r
39 #if NET_2_0\r
40                 : CodeExporter\r
41 #endif\r
42         {\r
43                 #region Fields\r
44 \r
45                 CodeNamespace codeNamespace;\r
46                 CodeCompileUnit codeCompileUnit;\r
47 #if !NET_2_0\r
48                 SoapMapCodeGenerator codeGenerator;\r
49 #endif\r
50 \r
51                 #endregion\r
52 \r
53                 #region Constructors\r
54 \r
55                 public SoapCodeExporter (CodeNamespace codeNamespace): this (codeNamespace, null)\r
56                 {\r
57                 }\r
58 \r
59                 public SoapCodeExporter (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit)\r
60                 {\r
61                         this.codeCompileUnit = codeCompileUnit;\r
62                         this.codeNamespace = codeNamespace;\r
63                         \r
64                         codeGenerator = new SoapMapCodeGenerator (codeNamespace, codeCompileUnit);\r
65                 }\r
66 \r
67 #if NET_2_0\r
68 \r
69                 public SoapCodeExporter (CodeNamespace codeNamespace, \r
70                                                                 CodeCompileUnit codeCompileUnit, \r
71                                                                 CodeGenerationOptions options)\r
72                 : this (codeNamespace, codeCompileUnit, null, options, null)\r
73                 {\r
74                 }\r
75                 \r
76                 public SoapCodeExporter (CodeNamespace codeNamespace, \r
77                                                                 CodeCompileUnit codeCompileUnit, \r
78                                                                 CodeGenerationOptions options, \r
79                                                                 Hashtable mappings)\r
80                 : this (codeNamespace, codeCompileUnit, null, options, mappings)\r
81                 {\r
82                         \r
83                 }\r
84                 \r
85                 [MonoTODO ("mappings?")]\r
86                 public SoapCodeExporter (CodeNamespace codeNamespace, \r
87                                                                 CodeCompileUnit codeCompileUnit, \r
88                                                                 ICodeGenerator codeGen, \r
89                                                                 CodeGenerationOptions options, \r
90                                                                 Hashtable mappings)\r
91                 {\r
92                         this.codeCompileUnit = codeCompileUnit;\r
93                         this.codeNamespace = codeNamespace;\r
94                         \r
95                         codeGenerator = new SoapMapCodeGenerator (codeNamespace, codeCompileUnit, codeGen, options, mappings);\r
96                 }\r
97 \r
98 #endif\r
99 \r
100 #endregion // Constructors\r
101 \r
102                 #region Properties\r
103 \r
104 #if !NET_2_0\r
105                 public CodeAttributeDeclarationCollection IncludeMetadata {\r
106                         get { return codeGenerator.IncludeMetadata; }\r
107                 }\r
108 #endif\r
109                 \r
110                 #endregion // Properties\r
111 \r
112                 #region Methods\r
113 \r
114                 public void AddMappingMetadata (CodeAttributeDeclarationCollection metadata, XmlMemberMapping member)\r
115                 {\r
116                         AddMappingMetadata (metadata, member, false);\r
117                 }\r
118 \r
119                 public void AddMappingMetadata (CodeAttributeDeclarationCollection metadata, XmlMemberMapping member, bool forceUseMemberName)\r
120                 {\r
121                         TypeData memType = member.TypeMapMember.TypeData;\r
122                         \r
123                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapElement");\r
124                         if (forceUseMemberName || (member.ElementName != member.MemberName))\r
125                                 att.Arguments.Add (new CodeAttributeArgument (new CodePrimitiveExpression(member.ElementName)));\r
126                         if (!TypeTranslator.IsDefaultPrimitiveTpeData (memType))\r
127                                 att.Arguments.Add (new CodeAttributeArgument ("DataType", new CodePrimitiveExpression(member.TypeName)));\r
128                                 \r
129                         if (att.Arguments.Count > 0) \r
130                                 metadata.Add (att);\r
131                 }\r
132 \r
133                 public void ExportMembersMapping (XmlMembersMapping xmlMembersMapping)\r
134                 {\r
135                         codeGenerator.ExportMembersMapping (xmlMembersMapping);\r
136                 }\r
137 \r
138                 public void ExportTypeMapping (XmlTypeMapping xmlTypeMapping)\r
139                 {\r
140                         codeGenerator.ExportTypeMapping (xmlTypeMapping);\r
141                 }\r
142 \r
143 \r
144                 #endregion // Methods\r
145         }\r
146 \r
147         class SoapMapCodeGenerator : MapCodeGenerator\r
148         {\r
149                 public SoapMapCodeGenerator (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit)\r
150                 : base (codeNamespace, codeCompileUnit)\r
151                 {\r
152                         includeArrayTypes = true;\r
153                 }\r
154 \r
155                 public SoapMapCodeGenerator (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit, ICodeGenerator codeGen, CodeGenerationOptions options, Hashtable mappings)\r
156                 : base (codeNamespace, codeCompileUnit, codeGen, options, mappings)\r
157                 {\r
158                 }\r
159                 \r
160                 protected override void GenerateClass (XmlTypeMapping map, CodeTypeDeclaration codeClass)\r
161                 {\r
162                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapType");\r
163                         if (map.XmlType != map.TypeData.TypeName) att.Arguments.Add (GetArg (map.XmlType));\r
164                         if (map.XmlTypeNamespace != "") att.Arguments.Add (GetArg ("Namespace", map.XmlTypeNamespace));\r
165                         AddCustomAttribute (codeClass, att, false);\r
166                 }\r
167                 \r
168                 protected override void GenerateClassInclude (CodeAttributeDeclarationCollection attributes, XmlTypeMapping map)\r
169                 {\r
170                         CodeAttributeDeclaration iatt = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapInclude");\r
171                         iatt.Arguments.Add (new CodeAttributeArgument (new CodeTypeOfExpression(map.TypeData.FullTypeName)));\r
172                         attributes.Add (iatt);\r
173                 }\r
174         \r
175                 protected override void GenerateAttributeMember (CodeAttributeDeclarationCollection attributes, XmlTypeMapMemberAttribute attinfo, string defaultNamespace, bool forceUseMemberName)\r
176                 {\r
177                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapAttribute");\r
178                         if (attinfo.Name != attinfo.AttributeName) att.Arguments.Add (GetArg (attinfo.AttributeName));\r
179                         if (attinfo.Namespace != defaultNamespace) att.Arguments.Add (GetArg ("Namespace", attinfo.Namespace));\r
180                         if (!TypeTranslator.IsDefaultPrimitiveTpeData(attinfo.TypeData)) att.Arguments.Add (GetArg ("DataType",attinfo.TypeData.XmlType));\r
181                         attributes.Add (att);\r
182                 }\r
183                 \r
184                 protected override void GenerateElementInfoMember (CodeAttributeDeclarationCollection attributes, XmlTypeMapMemberElement member, XmlTypeMapElementInfo einfo, TypeData defaultType, string defaultNamespace, bool addAlwaysAttr, bool forceUseMemberName)\r
185                 {\r
186                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapElement");\r
187                         if (forceUseMemberName || einfo.ElementName != member.Name) att.Arguments.Add (GetArg (einfo.ElementName));\r
188 //                      if (einfo.IsNullable) att.Arguments.Add (GetArg ("IsNullable", true));  MS seems to ignore this\r
189                         if (!TypeTranslator.IsDefaultPrimitiveTpeData(einfo.TypeData)) att.Arguments.Add (GetArg ("DataType",einfo.TypeData.XmlType));\r
190                         if (addAlwaysAttr || att.Arguments.Count > 0) attributes.Add (att);\r
191                 }\r
192                 \r
193                 protected override void GenerateEnum (XmlTypeMapping map, CodeTypeDeclaration codeEnum)\r
194                 {\r
195                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapType");\r
196                         if (map.XmlType != map.TypeData.TypeName) att.Arguments.Add (GetArg (map.XmlType));\r
197                         if (map.XmlTypeNamespace != "") att.Arguments.Add (GetArg ("Namespace", map.XmlTypeNamespace));\r
198                         AddCustomAttribute (codeEnum, att, false);\r
199                 }               \r
200                 \r
201                 protected override void GenerateEnumItem (CodeMemberField codeField, EnumMap.EnumMapMember emem)\r
202                 {\r
203                         if (emem.EnumName != emem.XmlName)\r
204                         {\r
205                                 CodeAttributeDeclaration xatt = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapEnum");\r
206                                 xatt.Arguments.Add (GetArg ("Name", emem.XmlName));\r
207                                 AddCustomAttribute (codeField, xatt, true);\r
208                         }\r
209                 }               \r
210                 \r
211                 protected override void GenerateSpecifierMember (CodeTypeMember codeField)\r
212                 {\r
213                         AddCustomAttribute (codeField, "System.Xml.Serialization.SoapIgnore");\r
214                 }\r
215         }\r
216 }