New test.
[mono.git] / mcs / class / System.Web.Services / System.Web.Services.Protocols / SoapMessage.cs
index 51e160068eee3eb16538349f62c1c457be50b3d0..8fc0f04e2889b793da84a85e8c1808ef0a6f7885 100644 (file)
@@ -3,12 +3,31 @@
 //\r
 // Author:\r
 //   Tim Coleman (tim@timcoleman.com)\r
+//   Lluis Sanchez Gual (lluis@ximian.com)\r
 //\r
 // Copyright (C) Tim Coleman, 2002\r
 //\r
-// TODO:\r
-//    Need to set the stream variable from the outside, or the constructor.\r
-//\r
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
 \r
 using System.IO;\r
 using System.Web.Services;\r
@@ -19,24 +38,52 @@ namespace System.Web.Services.Protocols {
                #region Fields\r
 \r
                string content_type = "text/xml";\r
+               string content_encoding;\r
                SoapException exception = null;\r
-               SoapHeaderCollection headers = null;\r
+               SoapHeaderCollection headers;\r
                SoapMessageStage stage;\r
                Stream stream;\r
+               object[] inParameters;\r
+               object[] outParameters;\r
                \r
+#if NET_2_0\r
+               SoapProtocolVersion soapVersion;\r
+#endif\r
+\r
                #endregion // Fields\r
 \r
                #region Constructors\r
 \r
                internal SoapMessage ()\r
                {\r
+                       headers = new SoapHeaderCollection ();\r
+               }\r
+\r
+               internal SoapMessage (Stream stream, SoapException exception)\r
+               {\r
+                       this.exception = exception;\r
+                       this.stream = stream;\r
+                       headers = new SoapHeaderCollection ();\r
                }\r
 \r
                #endregion\r
 \r
                #region Properties\r
 \r
-               public abstract string Action {\r
+               internal object[] InParameters \r
+               {\r
+                       get { return inParameters; }\r
+                       set { inParameters = value; }\r
+               }\r
+\r
+               internal object[] OutParameters \r
+               {\r
+                       get { return outParameters; }\r
+                       set { outParameters = value; }\r
+               }\r
+\r
+               public abstract string Action \r
+               {\r
                        get;\r
                }\r
 \r
@@ -47,6 +94,9 @@ namespace System.Web.Services.Protocols {
 \r
                public SoapException Exception {\r
                        get { return exception; }\r
+#if NET_2_0\r
+                       set { exception = value; }\r
+#endif\r
                }\r
 \r
                public SoapHeaderCollection Headers {\r
@@ -79,6 +129,35 @@ namespace System.Web.Services.Protocols {
                public abstract string Url {\r
                        get;\r
                }\r
+               \r
+#if NET_1_1\r
+               public string ContentEncoding\r
+               {\r
+                       get { return content_encoding; }\r
+                       set { content_encoding = value; }\r
+               }\r
+#else\r
+               internal string ContentEncoding\r
+               {\r
+                       get { return content_encoding; }\r
+                       set { content_encoding = value; }\r
+               }\r
+#endif\r
+\r
+#if NET_2_0\r
+               [System.Runtime.InteropServices.ComVisible(false)]\r
+               public virtual SoapProtocolVersion SoapVersion {\r
+                       get { return soapVersion; }\r
+               }\r
+#endif\r
\r
+               internal Stream InternalStream \r
+               { \r
+                       // for getter use public stream property\r
+                       set {\r
+                               stream = value;\r
+                       }\r
+               }\r
 \r
                #endregion Properties\r
 \r
@@ -93,24 +172,72 @@ namespace System.Web.Services.Protocols {
                                throw new InvalidOperationException ("The current SoapMessageStage is not the asserted stage or stages.");\r
                }\r
 \r
-               [MonoTODO]\r
                public object GetInParameterValue (int index) \r
                {\r
-                       throw new NotImplementedException ();\r
+                       return inParameters [index];\r
                }\r
 \r
-               [MonoTODO]\r
                public object GetOutParameterValue (int index) \r
                {\r
-                       throw new NotImplementedException ();\r
+                       if (MethodInfo.IsVoid) return outParameters [index];\r
+                       else return outParameters [index + 1];\r
                }\r
 \r
-               [MonoTODO]\r
                public object GetReturnValue ()\r
                {\r
-                       throw new NotImplementedException ();\r
+                       if (!MethodInfo.IsVoid && exception == null) return outParameters [0];\r
+                       else return null;\r
+               }\r
+\r
+               internal void SetHeaders (SoapHeaderCollection headers)\r
+               {\r
+                       this.headers = headers;\r
+               }\r
+\r
+               internal void SetException (SoapException ex)\r
+               {\r
+                       exception = ex;\r
+               }\r
+\r
+               internal void CollectHeaders (object target, HeaderInfo[] headers, SoapHeaderDirection direction)\r
+               {\r
+                       Headers.Clear ();\r
+                       foreach (HeaderInfo hi in headers) \r
+                       {\r
+                               if ((hi.Direction & direction) != 0 && !hi.IsUnknownHeader) \r
+                               {\r
+                                       SoapHeader headerVal = hi.GetHeaderValue (target) as SoapHeader;\r
+                                       if (headerVal != null)\r
+                                               Headers.Add (headerVal);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               internal void UpdateHeaderValues (object target, HeaderInfo[] headersInfo)\r
+               {\r
+                       foreach (SoapHeader header in Headers)\r
+                       {\r
+                               HeaderInfo hinfo = FindHeader (headersInfo, header.GetType ());\r
+                               if (hinfo != null) {\r
+                                       hinfo.SetHeaderValue (target, header);
+                                       header.DidUnderstand = !hinfo.IsUnknownHeader;
+                               }\r
+                       }\r
+               }\r
+\r
+               HeaderInfo FindHeader (HeaderInfo[] headersInfo, Type headerType)\r
+               {
+                       HeaderInfo unknownHeaderInfo = null;
+               \r
+                       foreach (HeaderInfo headerInfo in headersInfo) {
+                               if (headerInfo.HeaderType == headerType)
+                                       return headerInfo;
+                               else if (headerInfo.IsUnknownHeader) 
+                                       unknownHeaderInfo = headerInfo;
+                       }
+                       return unknownHeaderInfo;
                }\r
 \r
                #endregion // Methods\r
        }\r
-}\r
+}