* SoapMessageFormater.cs: In BuildSoapMessageFromMethodResponse, add the
[mono.git] / mcs / class / System.Runtime.Remoting / System.Runtime.Remoting.Channels / BinaryClientFormatterSink.cs
index 22c6e353adabec13431487335ed3059e8a68e155..c730155f31932951da0aa5fd30b867c3efd75506 100644 (file)
@@ -8,6 +8,27 @@
 // 2002 (C) Copyright, Ximian, Inc.
 //
 
+//
+// 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.
+//
+
 using System.Collections;
 using System.IO;
 using System.Runtime.Remoting.Messaging;
@@ -19,30 +40,24 @@ namespace System.Runtime.Remoting.Channels
        public class BinaryClientFormatterSink : IClientFormatterSink,
                IMessageSink, IClientChannelSink, IChannelSinkBase
        {
-               static BinaryFormatter _serializationFormatter;
-               static BinaryFormatter _deserializationFormatter;
-
-               IClientChannelSink nextInChain;
+               BinaryCore _binaryCore = BinaryCore.DefaultInstance;
+               IClientChannelSink _nextInChain;
 
-               static BinaryClientFormatterSink ()
+               public BinaryClientFormatterSink (IClientChannelSink nextSink)
                {
-                       RemotingSurrogateSelector surrogateSelector = new RemotingSurrogateSelector ();
-                       StreamingContext context = new StreamingContext(StreamingContextStates.Remoting, null);
-
-                       _serializationFormatter = new BinaryFormatter (surrogateSelector, context);
-                       _deserializationFormatter = new BinaryFormatter (null, context);
+                       _nextInChain = nextSink;
                }
 
-               
-               public BinaryClientFormatterSink (IClientChannelSink nextSink)
+               internal BinaryCore BinaryCore
                {
-                       nextInChain = nextSink;
+                       get { return _binaryCore; }
+                       set { _binaryCore = value; }
                }
 
                public IClientChannelSink NextChannelSink
                {
                        get {
-                               return nextInChain;
+                               return _nextInChain;
                        }
                }
 
@@ -76,7 +91,7 @@ namespace System.Runtime.Remoting.Channels
                                                  ITransportHeaders headers,
                                                  Stream stream)
                {
-                       IMessage replyMessage = (IMessage)_deserializationFormatter.DeserializeMethodResponse (stream, null, (IMethodCallMessage)state);
+                       IMessage replyMessage = (IMessage)_binaryCore.Deserializer.DeserializeMethodResponse (stream, null, (IMethodCallMessage)state);
                        sinkStack.DispatchReplyMessage (replyMessage);
                }
 
@@ -102,18 +117,16 @@ namespace System.Runtime.Remoting.Channels
                        IMessageSink replySink)
                {
                        ITransportHeaders transportHeaders = new TransportHeaders();
-                       transportHeaders[CommonTransportKeys.RequestUri] = ((IMethodCallMessage)msg).Uri;
-
-                       Stream stream = nextInChain.GetRequestStream(msg, transportHeaders);
+                       Stream stream = _nextInChain.GetRequestStream(msg, transportHeaders);
                        if (stream == null) stream = new MemoryStream ();
 
-                       _serializationFormatter.Serialize (stream, msg, null);
+                       _binaryCore.Serializer.Serialize (stream, msg, null);
                        if (stream is MemoryStream) stream.Position = 0;
 
                        ClientChannelSinkStack stack = new ClientChannelSinkStack(replySink);
                        stack.Push (this, msg);
 
-                       nextInChain.AsyncProcessRequest (stack, msg, transportHeaders, stream);
+                       _nextInChain.AsyncProcessRequest (stack, msg, transportHeaders, stream);
 
                        // FIXME: No idea about how to implement IMessageCtrl
                        return null;    \r
@@ -125,24 +138,25 @@ namespace System.Runtime.Remoting.Channels
 
                                ITransportHeaders call_headers = new TransportHeaders();
                                call_headers[CommonTransportKeys.RequestUri] = ((IMethodCallMessage)msg).Uri;
+                               call_headers["Content-Type"] = "application/octet-stream";
 
-                               Stream call_stream = nextInChain.GetRequestStream(msg, call_headers);
+                               Stream call_stream = _nextInChain.GetRequestStream(msg, call_headers);
                                if (call_stream == null) call_stream = new MemoryStream ();
 
                                // Serialize msg to the stream
 
-                               _serializationFormatter.Serialize (call_stream, msg, null);
+                               _binaryCore.Serializer.Serialize (call_stream, msg, null);
                                if (call_stream is MemoryStream) call_stream.Position = 0;
 
                                Stream response_stream;
                                ITransportHeaders response_headers;
 
-                               nextInChain.ProcessMessage (msg, call_headers, call_stream, out response_headers,
+                               _nextInChain.ProcessMessage (msg, call_headers, call_stream, out response_headers,
                                                            out response_stream);
 
                                // Deserialize response_stream
 
-                               return (IMessage) _deserializationFormatter.DeserializeMethodResponse (response_stream, null, (IMethodCallMessage)msg);
+                               return (IMessage) _binaryCore.Deserializer.DeserializeMethodResponse (response_stream, null, (IMethodCallMessage)msg);
                                
                        } catch (Exception e) {
                                 return new ReturnMessage (e, (IMethodCallMessage)msg);