SoapCodeExporter.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. //
  2. // System.Xml.Serialization.SoapCodeExporter
  3. //
  4. // Author:
  5. // Tim Coleman ([email protected])
  6. // Lluis Sanchez Gual ([email protected])
  7. //
  8. // Copyright (C) Tim Coleman, 2002
  9. //
  10. using System.CodeDom;
  11. namespace System.Xml.Serialization {
  12. public class SoapCodeExporter {
  13. #region Fields
  14. CodeNamespace codeNamespace;
  15. CodeCompileUnit codeCompileUnit;
  16. CodeAttributeDeclarationCollection includeMetadata;
  17. SoapMapCodeGenerator codeGenerator;
  18. #endregion
  19. #region Constructors
  20. public SoapCodeExporter (CodeNamespace codeNamespace): this (codeNamespace, null)
  21. {
  22. }
  23. public SoapCodeExporter (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit)
  24. {
  25. includeMetadata = new CodeAttributeDeclarationCollection ();
  26. this.codeCompileUnit = codeCompileUnit;
  27. this.codeNamespace = codeNamespace;
  28. codeGenerator = new SoapMapCodeGenerator (codeNamespace, codeCompileUnit);
  29. }
  30. #endregion // Constructors
  31. #region Properties
  32. public CodeAttributeDeclarationCollection IncludeMetadata {
  33. get { return includeMetadata; }
  34. }
  35. #endregion // Properties
  36. #region Methods
  37. public void AddMappingMetadata (CodeAttributeDeclarationCollection metadata, XmlMemberMapping member)
  38. {
  39. AddMappingMetadata (metadata, member, false);
  40. }
  41. public void AddMappingMetadata (CodeAttributeDeclarationCollection metadata, XmlMemberMapping member, bool forceUseMemberName)
  42. {
  43. TypeData memType = member.TypeMapMember.TypeData;
  44. CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapElement");
  45. if (forceUseMemberName || (member.ElementName != member.MemberName))
  46. att.Arguments.Add (new CodeAttributeArgument (new CodePrimitiveExpression(member.ElementName)));
  47. if (!TypeTranslator.IsDefaultPrimitiveTpeData (memType))
  48. att.Arguments.Add (new CodeAttributeArgument ("DataType", new CodePrimitiveExpression(member.TypeName)));
  49. if (att.Arguments.Count > 0)
  50. metadata.Add (att);
  51. }
  52. public void ExportMembersMapping (XmlMembersMapping xmlMembersMapping)
  53. {
  54. codeGenerator.ExportMembersMapping (xmlMembersMapping);
  55. }
  56. public void ExportTypeMapping (XmlTypeMapping xmlTypeMapping)
  57. {
  58. codeGenerator.ExportTypeMapping (xmlTypeMapping);
  59. }
  60. #endregion // Methods
  61. }
  62. class SoapMapCodeGenerator : MapCodeGenerator
  63. {
  64. public SoapMapCodeGenerator (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit)
  65. : base (codeNamespace, codeCompileUnit)
  66. {
  67. }
  68. protected override void GenerateClass (XmlTypeMapping map, CodeTypeDeclaration codeClass)
  69. {
  70. CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapType");
  71. if (map.XmlType != map.TypeData.TypeName) att.Arguments.Add (GetArg (map.XmlType));
  72. if (map.XmlTypeNamespace != "") att.Arguments.Add (GetArg ("Namespace", map.XmlTypeNamespace));
  73. AddCustomAttribute (codeClass, att, false);
  74. }
  75. protected override void GenerateClassInclude (CodeTypeDeclaration codeClass, XmlTypeMapping map)
  76. {
  77. CodeAttributeDeclaration iatt = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapInclude");
  78. iatt.Arguments.Add (new CodeAttributeArgument (new CodeTypeOfExpression(map.TypeData.FullTypeName)));
  79. AddCustomAttribute (codeClass, iatt, true);
  80. }
  81. protected override void GenerateDefaultAttribute (CodeMemberField codeField, object defaultValue)
  82. {
  83. AddCustomAttribute (codeField, "System.ComponentModel.DefaultValue", GetArg (defaultValue));
  84. codeField.InitExpression = new CodePrimitiveExpression (defaultValue);
  85. }
  86. protected override void GenerateAttributeMember (CodeMemberField codeField, XmlTypeMapMemberAttribute attinfo, string defaultNamespace)
  87. {
  88. CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapAttribute");
  89. if (attinfo.Name != attinfo.AttributeName) att.Arguments.Add (GetArg (attinfo.AttributeName));
  90. if (attinfo.Namespace != defaultNamespace) att.Arguments.Add (GetArg ("Namespace", attinfo.Namespace));
  91. if (!TypeTranslator.IsDefaultPrimitiveTpeData(attinfo.TypeData)) att.Arguments.Add (GetArg ("DataType",attinfo.TypeData.XmlType));
  92. AddCustomAttribute (codeField, att, true);
  93. }
  94. protected override void GenerateElementInfoMember (CodeMemberField codeField, XmlTypeMapMemberElement member, XmlTypeMapElementInfo einfo, TypeData defaultType, string defaultNamespace, bool addAlwaysAttr)
  95. {
  96. CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapElement");
  97. if (einfo.ElementName != member.Name) att.Arguments.Add (GetArg (einfo.ElementName));
  98. // if (einfo.IsNullable) att.Arguments.Add (GetArg ("IsNullable", true)); MS seems to ignore this
  99. if (!TypeTranslator.IsDefaultPrimitiveTpeData(einfo.TypeData)) att.Arguments.Add (GetArg ("DataType",einfo.TypeData.XmlType));
  100. AddCustomAttribute (codeField, att, addAlwaysAttr);
  101. }
  102. protected override void GenerateEnum (XmlTypeMapping map, CodeTypeDeclaration codeEnum)
  103. {
  104. CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapType");
  105. if (map.ElementName != map.TypeData.TypeName) att.Arguments.Add (GetArg (map.ElementName));
  106. if (map.Namespace != "") att.Arguments.Add (GetArg ("Namespace", map.Namespace));
  107. AddCustomAttribute (codeEnum, att, false);
  108. }
  109. protected override void GenerateEnumItem (CodeMemberField codeField, EnumMap.EnumMapMember emem)
  110. {
  111. if (emem.EnumName != emem.XmlName)
  112. {
  113. CodeAttributeDeclaration xatt = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapEnum");
  114. xatt.Arguments.Add (GetArg ("Name", emem.XmlName));
  115. AddCustomAttribute (codeField, xatt, true);
  116. }
  117. }
  118. }
  119. }