TcpServerTransportSink.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. //
  2. // System.Runtime.Remoting.Channels.Tcp.TcpServerTransportSink.cs
  3. //
  4. // Author: Rodrigo Moya ([email protected])
  5. // Lluis Sanchez Gual ([email protected])
  6. //
  7. // 2002 (C) Copyright, Ximian, Inc.
  8. //
  9. using System;
  10. using System.Collections;
  11. using System.Runtime.Remoting.Messaging;
  12. using System.IO;
  13. namespace System.Runtime.Remoting.Channels.Tcp
  14. {
  15. public class TcpServerTransportSink : IServerChannelSink, IChannelSinkBase
  16. {
  17. IServerChannelSink next_sink;
  18. public TcpServerTransportSink (IServerChannelSink next)
  19. {
  20. next_sink = next;
  21. }
  22. public IServerChannelSink NextChannelSink
  23. {
  24. get
  25. {
  26. return next_sink;
  27. }
  28. }
  29. public IDictionary Properties
  30. {
  31. get
  32. {
  33. if (next_sink != null) return next_sink.Properties;
  34. else return null;
  35. }
  36. }
  37. public void AsyncProcessResponse (IServerResponseChannelSinkStack sinkStack, object state,
  38. IMessage msg, ITransportHeaders headers, Stream responseStream)
  39. {
  40. ClientConnection connection = (ClientConnection)state;
  41. TcpMessageIO.SendMessageStream (connection.Stream, responseStream, headers, connection.Buffer);
  42. }
  43. public Stream GetResponseStream (IServerResponseChannelSinkStack sinkStack, object state,
  44. IMessage msg, ITransportHeaders headers)
  45. {
  46. return null;
  47. }
  48. public ServerProcessing ProcessMessage (IServerChannelSinkStack sinkStack,
  49. IMessage requestMsg,
  50. ITransportHeaders requestHeaders,
  51. Stream requestStream,
  52. out IMessage responseMsg,
  53. out ITransportHeaders responseHeaders,
  54. out Stream responseStream)
  55. {
  56. // this is the first sink, and TcpServerChannel does not call it.
  57. throw new NotSupportedException ();
  58. }
  59. internal void InternalProcessMessage (ClientConnection connection)
  60. {
  61. // Reads the headers and the request stream
  62. Stream requestStream;
  63. ITransportHeaders requestHeaders;
  64. requestStream = TcpMessageIO.ReceiveMessageStream (connection.Stream, out requestHeaders, connection.Buffer);
  65. // Pushes the connection object together with the sink. This information
  66. // will be used for sending the response in an async call.
  67. ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();
  68. sinkStack.Push(this, connection);
  69. ITransportHeaders responseHeaders;
  70. Stream responseStream;
  71. IMessage responseMsg;
  72. ServerProcessing proc = next_sink.ProcessMessage(sinkStack, null, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);
  73. switch (proc)
  74. {
  75. case ServerProcessing.Complete:
  76. TcpMessageIO.SendMessageStream (connection.Stream, responseStream, responseHeaders, connection.Buffer);
  77. break;
  78. case ServerProcessing.Async:
  79. case ServerProcessing.OneWay:
  80. break;
  81. }
  82. }
  83. }
  84. }