2004-04-22 Sebastien Pouliot <sebastien@ximian.com>
[mono.git] / mcs / class / System.Web.Services / System.Web.Services.Protocols / XmlReturnReader.cs
index adf27eafa98c1b18787a1a2e8d8b3e3237ba7670..71cd0f2cb6e14b5507c4f0405148adb79d27a819 100644 (file)
@@ -9,11 +9,14 @@
 \r
 using System.IO;\r
 using System.Net;\r
+using System.Xml.Serialization;\r
 using System.Web.Services;\r
 \r
 namespace System.Web.Services.Protocols {\r
        public class XmlReturnReader : MimeReturnReader {\r
 \r
+               XmlSerializer serializer;\r
+               \r
                #region Constructors\r
 \r
                public XmlReturnReader () \r
@@ -24,30 +27,49 @@ namespace System.Web.Services.Protocols {
 \r
                #region Methods\r
 \r
-               [MonoTODO]\r
                public override object GetInitializer (LogicalMethodInfo methodInfo)\r
                {\r
-                       throw new NotImplementedException ();\r
+                       LogicalTypeInfo sti = TypeStubManager.GetLogicalTypeInfo (methodInfo.DeclaringType);\r
+                       return new XmlSerializer (methodInfo.ReturnType, sti.GetWebServiceLiteralNamespace (sti.WebServiceNamespace));\r
                }\r
 \r
-               [MonoTODO]\r
                public override object[] GetInitializers (LogicalMethodInfo[] methodInfos)\r
                {\r
-                       throw new NotImplementedException ();\r
+                       XmlReflectionImporter importer = new XmlReflectionImporter ();\r
+                       XmlMapping[] sers = new XmlMapping [methodInfos.Length];\r
+                       for (int n=0; n<sers.Length; n++)\r
+                       {\r
+                               LogicalMethodInfo metinfo = methodInfos[n];\r
+                               if (metinfo.IsVoid) \r
+                                       sers[n] = null;\r
+                               else\r
+                               {\r
+                                       LogicalTypeInfo sti = TypeStubManager.GetLogicalTypeInfo (metinfo.DeclaringType);\r
+                                       sers[n] = importer.ImportTypeMapping (methodInfos[n].ReturnType, sti.GetWebServiceLiteralNamespace (sti.WebServiceNamespace));\r
+                               }\r
+                       }\r
+                       return XmlSerializer.FromMappings (sers);\r
                }\r
-\r
-               [MonoTODO]\r
+               \r
                public override void Initialize (object o)\r
                {\r
-                       throw new NotImplementedException ();\r
+                       serializer = (XmlSerializer)o;\r
                }\r
 \r
-               [MonoTODO]\r
                public override object Read (WebResponse response, Stream responseStream)\r
                {\r
-                       throw new NotImplementedException ();\r
+                       object result = null;\r
+                       if (serializer != null)\r
+                       {\r
+                               if (response.ContentType.IndexOf ("text/xml") == -1)\r
+                                       throw new InvalidOperationException ("Result was not XML");\r
+                               \r
+                               result = serializer.Deserialize (responseStream);\r
+                       }\r
+                       responseStream.Close ();\r
+                       return result;\r
                }\r
 \r
                #endregion // Methods\r
        }\r
-}\r
+}