* XmlSerializationReader.cs: Support schamea instance namespaces other than
[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 \r
11 using System.CodeDom;\r
12 \r
13 namespace System.Xml.Serialization {\r
14         public class SoapCodeExporter {\r
15 \r
16                 #region Fields\r
17 \r
18                 CodeNamespace codeNamespace;\r
19                 CodeCompileUnit codeCompileUnit;\r
20                 SoapMapCodeGenerator codeGenerator;\r
21 \r
22                 #endregion\r
23 \r
24                 #region Constructors\r
25 \r
26                 public SoapCodeExporter (CodeNamespace codeNamespace): this (codeNamespace, null)\r
27                 {\r
28                 }\r
29 \r
30                 public SoapCodeExporter (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit)\r
31                 {\r
32                         this.codeCompileUnit = codeCompileUnit;\r
33                         this.codeNamespace = codeNamespace;\r
34                         \r
35                         codeGenerator = new SoapMapCodeGenerator (codeNamespace, codeCompileUnit);\r
36                 }\r
37 \r
38                 #endregion // Constructors\r
39 \r
40                 #region Properties\r
41 \r
42                 public CodeAttributeDeclarationCollection IncludeMetadata {\r
43                         get { return codeGenerator.IncludeMetadata; }\r
44                 }\r
45                 \r
46                 #endregion // Properties\r
47 \r
48                 #region Methods\r
49 \r
50                 public void AddMappingMetadata (CodeAttributeDeclarationCollection metadata, XmlMemberMapping member)\r
51                 {\r
52                         AddMappingMetadata (metadata, member, false);\r
53                 }\r
54 \r
55                 public void AddMappingMetadata (CodeAttributeDeclarationCollection metadata, XmlMemberMapping member, bool forceUseMemberName)\r
56                 {\r
57                         TypeData memType = member.TypeMapMember.TypeData;\r
58                         \r
59                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapElement");\r
60                         if (forceUseMemberName || (member.ElementName != member.MemberName))\r
61                                 att.Arguments.Add (new CodeAttributeArgument (new CodePrimitiveExpression(member.ElementName)));\r
62                         if (!TypeTranslator.IsDefaultPrimitiveTpeData (memType))\r
63                                 att.Arguments.Add (new CodeAttributeArgument ("DataType", new CodePrimitiveExpression(member.TypeName)));\r
64                                 \r
65                         if (att.Arguments.Count > 0) \r
66                                 metadata.Add (att);\r
67                 }\r
68 \r
69                 public void ExportMembersMapping (XmlMembersMapping xmlMembersMapping)\r
70                 {\r
71                         codeGenerator.ExportMembersMapping (xmlMembersMapping);\r
72                 }\r
73 \r
74                 public void ExportTypeMapping (XmlTypeMapping xmlTypeMapping)\r
75                 {\r
76                         codeGenerator.ExportTypeMapping (xmlTypeMapping);\r
77                 }\r
78 \r
79 \r
80                 #endregion // Methods\r
81         }\r
82 \r
83         class SoapMapCodeGenerator : MapCodeGenerator\r
84         {\r
85                 public SoapMapCodeGenerator (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit)\r
86                 : base (codeNamespace, codeCompileUnit)\r
87                 {\r
88                 }\r
89 \r
90                 protected override void GenerateClass (XmlTypeMapping map, CodeTypeDeclaration codeClass)\r
91                 {\r
92                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapType");\r
93                         if (map.XmlType != map.TypeData.TypeName) att.Arguments.Add (GetArg (map.XmlType));\r
94                         if (map.XmlTypeNamespace != "") att.Arguments.Add (GetArg ("Namespace", map.XmlTypeNamespace));\r
95                         AddCustomAttribute (codeClass, att, false);\r
96                 }\r
97                 \r
98                 protected override void GenerateClassInclude (CodeAttributeDeclarationCollection attributes, XmlTypeMapping map)\r
99                 {\r
100                         CodeAttributeDeclaration iatt = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapInclude");\r
101                         iatt.Arguments.Add (new CodeAttributeArgument (new CodeTypeOfExpression(map.TypeData.FullTypeName)));\r
102                         attributes.Add (iatt);\r
103                 }\r
104         \r
105                 protected override void GenerateAttributeMember (CodeAttributeDeclarationCollection attributes, XmlTypeMapMemberAttribute attinfo, string defaultNamespace, bool forceUseMemberName)\r
106                 {\r
107                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapAttribute");\r
108                         if (attinfo.Name != attinfo.AttributeName) att.Arguments.Add (GetArg (attinfo.AttributeName));\r
109                         if (attinfo.Namespace != defaultNamespace) att.Arguments.Add (GetArg ("Namespace", attinfo.Namespace));\r
110                         if (!TypeTranslator.IsDefaultPrimitiveTpeData(attinfo.TypeData)) att.Arguments.Add (GetArg ("DataType",attinfo.TypeData.XmlType));\r
111                         attributes.Add (att);\r
112                 }\r
113                 \r
114                 protected override void GenerateElementInfoMember (CodeAttributeDeclarationCollection attributes, XmlTypeMapMemberElement member, XmlTypeMapElementInfo einfo, TypeData defaultType, string defaultNamespace, bool addAlwaysAttr, bool forceUseMemberName)\r
115                 {\r
116                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapElement");\r
117                         if (forceUseMemberName || einfo.ElementName != member.Name) att.Arguments.Add (GetArg (einfo.ElementName));\r
118 //                      if (einfo.IsNullable) att.Arguments.Add (GetArg ("IsNullable", true));  MS seems to ignore this\r
119                         if (!TypeTranslator.IsDefaultPrimitiveTpeData(einfo.TypeData)) att.Arguments.Add (GetArg ("DataType",einfo.TypeData.XmlType));\r
120                         if (addAlwaysAttr || att.Arguments.Count > 0) attributes.Add (att);\r
121                 }\r
122                 \r
123                 protected override void GenerateEnum (XmlTypeMapping map, CodeTypeDeclaration codeEnum)\r
124                 {\r
125                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapType");\r
126                         if (map.XmlType != map.TypeData.TypeName) att.Arguments.Add (GetArg (map.XmlType));\r
127                         if (map.XmlTypeNamespace != "") att.Arguments.Add (GetArg ("Namespace", map.XmlTypeNamespace));\r
128                         AddCustomAttribute (codeEnum, att, false);\r
129                 }               \r
130                 \r
131                 protected override void GenerateEnumItem (CodeMemberField codeField, EnumMap.EnumMapMember emem)\r
132                 {\r
133                         if (emem.EnumName != emem.XmlName)\r
134                         {\r
135                                 CodeAttributeDeclaration xatt = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapEnum");\r
136                                 xatt.Arguments.Add (GetArg ("Name", emem.XmlName));\r
137                                 AddCustomAttribute (codeField, xatt, true);\r
138                         }\r
139                 }               \r
140                 \r
141                 protected override void GenerateSpecifierMember (CodeMemberField codeField)\r
142                 {\r
143                         AddCustomAttribute (codeField, "System.Xml.Serialization.SoapIgnore");\r
144                 }\r
145         }\r
146 }