2 // System.Runtime.Remoting.Channels.Tcp.TcpServerTransportSink.cs
4 // Author: Rodrigo Moya (rodrigo@ximian.com)
5 // Lluis Sanchez Gual (lsg@ctv.es)
7 // 2002 (C) Copyright, Ximian, Inc.
11 using System.Collections;
\r
12 using System.Runtime.Remoting.Messaging;
\r
15 namespace System.Runtime.Remoting.Channels.Tcp
\r
17 public class TcpServerTransportSink : IServerChannelSink, IChannelSinkBase
19 IServerChannelSink next_sink;
21 public TcpServerTransportSink (IServerChannelSink next)
26 public IServerChannelSink NextChannelSink
\r
34 public IDictionary Properties
\r
38 if (next_sink != null) return next_sink.Properties;
43 public void AsyncProcessResponse (IServerResponseChannelSinkStack sinkStack, object state,
44 IMessage msg, ITransportHeaders headers, Stream responseStream)
46 ClientConnection connection = (ClientConnection)state;
47 TcpMessageIO.SendMessageStream (connection.Stream, responseStream, headers, connection.Buffer);
\r
50 public Stream GetResponseStream (IServerResponseChannelSinkStack sinkStack, object state,
51 IMessage msg, ITransportHeaders headers)
56 public ServerProcessing ProcessMessage (IServerChannelSinkStack sinkStack,
58 ITransportHeaders requestHeaders,
60 out IMessage responseMsg,
61 out ITransportHeaders responseHeaders,
62 out Stream responseStream)
64 // this is the first sink, and TcpServerChannel does not call it.
65 throw new NotSupportedException ();
68 internal void InternalProcessMessage (ClientConnection connection)
70 // Reads the headers and the request stream
73 ITransportHeaders requestHeaders;
\r
75 requestStream = TcpMessageIO.ReceiveMessageStream (connection.Stream, out requestHeaders, connection.Buffer);
\r
77 // Pushes the connection object together with the sink. This information
\r
78 // will be used for sending the response in an async call.
\r
80 ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();
\r
81 sinkStack.Push(this, connection);
\r
83 ITransportHeaders responseHeaders;
\r
84 Stream responseStream;
\r
85 IMessage responseMsg;
\r
87 ServerProcessing proc = next_sink.ProcessMessage(sinkStack, null, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);
\r
91 case ServerProcessing.Complete:
\r
92 TcpMessageIO.SendMessageStream (connection.Stream, responseStream, responseHeaders, connection.Buffer);
\r
95 case ServerProcessing.Async:
\r
96 case ServerProcessing.OneWay:
\r