SimpleServerTransportSink.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. //
  2. // System.Runtime.Remoting.Channels.Simple.SimpleServerTransportSink.cs
  3. //
  4. // Author: Dietmar Maurer ([email protected])
  5. //
  6. // 2002 (C) Copyright, Ximian, Inc.
  7. //
  8. using System.Collections;
  9. using System.Runtime.Remoting.Messaging;
  10. using System.Text.RegularExpressions;
  11. using System.Net.Sockets;
  12. using System.Net;
  13. using System.Threading;
  14. using System.IO;
  15. namespace System.Runtime.Remoting.Channels.Simple
  16. {
  17. internal class SimpleServerTransportSink : IServerChannelSink, IChannelSinkBase
  18. {
  19. IServerChannelSink next_sink;
  20. public SimpleServerTransportSink (IServerChannelSink next)
  21. {
  22. next_sink = next;
  23. }
  24. public IServerChannelSink NextChannelSink {
  25. get {
  26. return next_sink;
  27. }
  28. }
  29. [MonoTODO]
  30. public IDictionary Properties {
  31. get {
  32. throw new NotImplementedException ();
  33. }
  34. }
  35. [MonoTODO]
  36. public void AsyncProcessResponse (IServerResponseChannelSinkStack sinkStack, object state,
  37. IMessage msg, ITransportHeaders headers, Stream stream)
  38. {
  39. throw new NotImplementedException ();
  40. }
  41. [MonoTODO]
  42. public Stream GetResponseStream (IServerResponseChannelSinkStack sinkStack, object state,
  43. IMessage msg, ITransportHeaders headers)
  44. {
  45. throw new NotImplementedException ();
  46. }
  47. public ServerProcessing ProcessMessage (IServerChannelSinkStack sinkStack,
  48. IMessage requestMsg,
  49. ITransportHeaders requestHeaders,
  50. Stream requestStream,
  51. out IMessage responseMsg,
  52. out ITransportHeaders responseHeaders,
  53. out Stream responseStream)
  54. {
  55. // this is the first sink, and SimpleServerChannel does not call it.
  56. throw new NotSupportedException ();
  57. }
  58. internal void InternalProcessMessage (Stream network_stream)
  59. {
  60. try {
  61. string uri;
  62. SimpleMessageFormat.MessageType msg_type;
  63. MemoryStream msg_stream;
  64. msg_stream = SimpleMessageFormat.ReceiveMessageStream (network_stream,
  65. out msg_type, out uri);
  66. if (msg_type != SimpleMessageFormat.MessageType.Request)
  67. throw new RemotingException ("received wrong message type");
  68. TransportHeaders headers = new TransportHeaders ();
  69. headers ["_requestUri"] = uri;
  70. IMessage resp_message;
  71. ITransportHeaders resp_headers;
  72. Stream resp_stream;
  73. ServerProcessing res = next_sink.ProcessMessage (null, null, headers, msg_stream,
  74. out resp_message, out resp_headers,
  75. out resp_stream);
  76. switch (res) {
  77. case ServerProcessing.Complete:
  78. Exception e = ((IMethodReturnMessage)resp_message).Exception;
  79. if (e != null) {
  80. // we handle exceptions in the transport channel
  81. SimpleMessageFormat.SendExceptionMessage (network_stream, e.ToString ());
  82. } else {
  83. // send the response
  84. SimpleMessageFormat.SendMessageStream (network_stream,
  85. (MemoryStream)resp_stream,
  86. SimpleMessageFormat.MessageType.Response,
  87. null);
  88. }
  89. break;
  90. case ServerProcessing.Async:
  91. case ServerProcessing.OneWay:
  92. throw new NotImplementedException ();
  93. }
  94. } catch (Exception e) {
  95. SimpleMessageFormat.SendExceptionMessage (network_stream, e.ToString ());
  96. }
  97. }
  98. }
  99. }