Merge pull request #409 from Alkarex/patch-1
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel.Description / DataContractSerializerMessageContractImporter.cs
index 5b4b839bbc8525cb9681ff2d8c3f41e521564e47..7b0db9e30855801faecf1c33673bd4e66a691516 100644 (file)
@@ -88,6 +88,8 @@ namespace System.ServiceModel.Description
 
        abstract class MessageContractImporterInternal : IWsdlImportExtension
        {
+               protected abstract void Init (WsdlImporter importer);
+
                public void ImportContract (WsdlImporter importer,
                        WsdlContractConversionContext context)
                {
@@ -98,6 +100,8 @@ namespace System.ServiceModel.Description
                        if (this.importer != null || this.context != null)
                                throw new SystemException ("INTERNAL ERROR: unexpected recursion of ImportContract method call");
 
+                       Init (importer);
+
                        schema_set_in_use = new XmlSchemaSet ();
                        schema_set_in_use.Add (importer.XmlSchemas);
                        foreach (WSDL wsdl in importer.WsdlDocuments)
@@ -187,8 +191,17 @@ namespace System.ServiceModel.Description
                bool IsOperationImported (PortType pt, Operation op)
                {
                        foreach (OperationMessage opmsg in op.Messages) {
-                               var parts = context.GetMessageDescription (opmsg).Body.Parts;
-                               foreach (var part in parts)
+
+                               var opdsc = context.GetMessageDescription (opmsg);
+
+                               var parts = opdsc.Body.Parts;
+                               var ret = opdsc.Body.ReturnValue;
+
+                               if ((ret != null) &&
+                                   (ret.DataContractImporter != null || ret.XmlSerializationImporter != null))
+                                       return true;
+
+                               foreach (var part in opdsc.Body.Parts)
                                        if (part.DataContractImporter != null || part.XmlSerializationImporter != null)
                                                return true;
                        }
@@ -228,8 +241,14 @@ namespace System.ServiceModel.Description
 
        class DataContractMessageContractImporterInternal : MessageContractImporterInternal
        {
-               XsdDataContractImporter dc_importer = new XsdDataContractImporter ();
+               XsdDataContractImporter dc_importer;
                
+               protected override void Init (WsdlImporter importer)
+               {
+                       if (dc_importer == null)
+                               dc_importer = importer.GetState<XsdDataContractImporter> ();
+               }
+
                protected override void ImportPartsBySchemaElement (QName qname, List<MessagePartDescription> parts, Message msg, MessagePart part)
                {
                        XmlSchemaElement element = (XmlSchemaElement) schema_set_in_use.GlobalElements [qname];
@@ -316,7 +335,7 @@ namespace System.ServiceModel.Description
 
        class XmlSerializerMessageContractImporterInternal : MessageContractImporterInternal
        {
-               CodeCompileUnit ccu = new CodeCompileUnit ();
+               CodeCompileUnit ccu;
                XmlSchemaSet schema_set_cache;
                XmlSchemaImporter schema_importer;
                XmlCodeExporter code_exporter;
@@ -324,6 +343,12 @@ namespace System.ServiceModel.Description
                public CodeCompileUnit CodeCompileUnit {
                        get { return ccu; }
                }
+
+               protected override void Init (WsdlImporter importer)
+               {
+                       if (ccu == null)
+                               ccu = importer.GetState<CodeCompileUnit> ();
+               }
                
                protected override void ImportPartsBySchemaElement (QName qname, List<MessagePartDescription> parts, Message msg, MessagePart msgPart)
                {