Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpServerChannel.cs')
-rw-r--r--mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpServerChannel.cs173
1 files changed, 90 insertions, 83 deletions
diff --git a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpServerChannel.cs b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpServerChannel.cs
index 2f3a0ee7598..7b491bdf3ec 100644
--- a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpServerChannel.cs
+++ b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpServerChannel.cs
@@ -2,6 +2,7 @@
// System.Runtime.Remoting.Channels.Tcp.TcpServerChannel.cs
//
// Author: Rodrigo Moya (rodrigo@ximian.com)
+// Lluis Sanchez Gual (lsg@ctv.es)
//
// 2002 (C) Copyright, Ximian, Inc.
//
@@ -13,63 +14,10 @@ using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.IO;
+using System.Runtime.Remoting.Channels.Simple;
namespace System.Runtime.Remoting.Channels.Tcp
{
- public class TcpServerTransportSink : IServerChannelSink, IChannelSinkBase
- {
- IServerChannelSink next_sink;
-
- public TcpServerTransportSink (IServerChannelSink next)
- {
- next_sink = next;
- }
-
- public IServerChannelSink NextChannelSink {
- get {
- return next_sink;
- }
- }
-
- [MonoTODO]
- public IDictionary Properties {
- get {
- throw new NotImplementedException ();
- }
- }
-
- [MonoTODO]
- public void AsyncProcessResponse (IServerResponseChannelSinkStack sinkStack, object state,
- IMessage msg, ITransportHeaders headers, Stream stream)
- {
- throw new NotImplementedException ();
- }
-
- [MonoTODO]
- public Stream GetResponseStream (IServerResponseChannelSinkStack sinkStack, object state,
- IMessage msg, ITransportHeaders headers)
- {
- throw new NotImplementedException ();
- }
-
- public ServerProcessing ProcessMessage (IServerChannelSinkStack sinkStack,
- IMessage requestMsg,
- ITransportHeaders requestHeaders,
- Stream requestStream,
- out IMessage responseMsg,
- out ITransportHeaders responseHeaders,
- out Stream responseStream)
- {
- // this is the first sink, and TcpServerChannel does not call it.
- throw new NotSupportedException ();
- }
-
- internal void InternalProcessMessage (Stream requestStream)
- {
- Console.WriteLine ("ProcessMessageInternal");
- }
- }
-
public class TcpServerChannel : IChannelReceiver, IChannel
{
int port = 0;
@@ -81,11 +29,12 @@ namespace System.Runtime.Remoting.Channels.Tcp
TcpServerTransportSink sink;
ChannelDataStore channel_data;
- void Init (IServerChannelSinkProvider provider) {
- if (provider == null) {
- provider = new BinaryServerFormatterSinkProvider ();
+ void Init (IServerChannelSinkProvider serverSinkProvider)
+ {
+ if (serverSinkProvider == null) {
+ // FIXME: change soap for binary
+ serverSinkProvider = new SimpleServerFormatterSinkProvider ();
}
- IServerChannelSink next_sink = provider.CreateSink (this);
host = Dns.GetHostByName(Dns.GetHostName()).HostName;
@@ -95,9 +44,20 @@ namespace System.Runtime.Remoting.Channels.Tcp
uris = new String [1];
uris [0] = GetChannelUri ();
}
-
- channel_data = new ChannelDataStore (uris);;
+ // Gets channel data from the chain of channel providers
+
+ channel_data = new ChannelDataStore (uris);
+ IServerChannelSinkProvider provider = serverSinkProvider;
+ while (provider != null)
+ {
+ provider.GetChannelData(channel_data);
+ provider = provider.Next;
+ }
+
+ // Creates the sink chain that will process all incoming messages
+
+ IServerChannelSink next_sink = ChannelServices.CreateServerChannelSinkChain (serverSinkProvider, this);
sink = new TcpServerTransportSink (next_sink);
listener = new TcpListener (port);
@@ -113,21 +73,21 @@ namespace System.Runtime.Remoting.Channels.Tcp
public TcpServerChannel (IDictionary properties,
IServerChannelSinkProvider serverSinkProvider)
{
- port = (int)properties ["port"];
+ port = Int32.Parse ((string)properties ["port"]);
Init (serverSinkProvider);
}
public TcpServerChannel (string name, int port,
IServerChannelSinkProvider serverSinkProvider)
{
- name = name;
+ this.name = name;
this.port = port;
Init (serverSinkProvider);
}
public TcpServerChannel (string name, int port)
{
- name = name;
+ this.name = name;
this.port = port;
Init (null);
}
@@ -158,35 +118,32 @@ namespace System.Runtime.Remoting.Channels.Tcp
return "tcp://" + host + ":" + port;
}
- public string[] GetUrlsForUri (string uri)
- {
- string [] result = new String [1];
-
- if (uri.IndexOf ('/') != 0)
- result [0] = GetChannelUri () + "/" + uri;
- else
- result [0] = GetChannelUri () + uri;
-
- return result;
- }
+ public string[] GetUrlsForUri (string uri)
+ {
+ if (!uri.StartsWith ("/")) uri = "/" + uri;
+
+ string [] chnl_uris = channel_data.ChannelUris;
+ string [] result = new String [chnl_uris.Length];
+
+ for (int i = 0; i < chnl_uris.Length; i++)
+ result [i] = chnl_uris [i] + uri;
+
+ return result;
+ }
public string Parse (string url, out string objectURI)
{
- int port;
-
- string host = TcpChannel.ParseTcpURL (url, out objectURI, out port);
-
- return "tcp://" + host + ":" + port;
+ return TcpChannel.ParseChannelUrl (url, out objectURI);
}
void WaitForConnections ()
{
- while (true) {
+ while (true)
+ {
TcpClient client = listener.AcceptTcpClient ();
- sink.InternalProcessMessage (client.GetStream ());
-
- client.Close ();
+ ClientConnection reader = new ClientConnection (client, sink);
+ ThreadPool.QueueUserWorkItem ( new WaitCallback( reader.ProcessMessages));
}
}
@@ -201,6 +158,7 @@ namespace System.Runtime.Remoting.Channels.Tcp
}
server_thread = new Thread (new ThreadStart (WaitForConnections));
+ server_thread.IsBackground = true;
server_thread.Start ();
}
}
@@ -214,4 +172,53 @@ namespace System.Runtime.Remoting.Channels.Tcp
}
}
}
+
+ class ClientConnection
+ {
+ TcpClient _client;
+ TcpServerTransportSink _sink;
+ Stream _stream;
+
+ byte[] _buffer = new byte[TcpMessageIO.DefaultStreamBufferSize];
+
+ public ClientConnection (TcpClient client, TcpServerTransportSink sink)
+ {
+ _client = client;
+ _sink = sink;
+ }
+
+ public Stream Stream
+ {
+ get { return _stream; }
+ }
+
+ public byte[] Buffer
+ {
+ get { return _buffer; }
+ }
+
+ public void ProcessMessages(object data)
+ {
+ _stream = _client.GetStream();
+
+ bool end = false;
+ while (!end)
+ {
+ MessageType type = TcpMessageIO.ReceiveMessageType (_stream);
+
+ switch (type)
+ {
+ case MessageType.MethodMessage:
+ _sink.InternalProcessMessage (this);
+ break;
+
+ case MessageType.CancelSignal:
+ end = true;
+ break;
+ }
+ }
+
+ _stream.Close();
+ }
+ }
}