X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem.Runtime.Remoting%2FSystem.Runtime.Remoting.Channels.Tcp%2FTcpChannel.cs;h=de8d9a692fcb357239ea3b46c9c8d9c29fed43a1;hb=fc4b07f20f9e79fe99d4b520bb5ff8b5e80b10f6;hp=d9cc4e4466737b49495aca35af720425012cc26e;hpb=7ff8f29ff29fa3f08ef305ac43ef079097323286;p=mono.git diff --git a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpChannel.cs b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpChannel.cs index d9cc4e44667..de8d9a692fc 100644 --- a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpChannel.cs +++ b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpChannel.cs @@ -36,36 +36,37 @@ namespace System.Runtime.Remoting.Channels.Tcp { public class TcpChannel : IChannelReceiver, IChannel, IChannelSender { - private TcpClientChannel _clientChannel; - private TcpServerChannel _serverChannel = null; - private string _name = "tcp"; + private TcpClientChannel _clientChannel; + private TcpServerChannel _serverChannel = null; + private string _name = "tcp"; private int _priority = 1; - public TcpChannel (): this (0) + public TcpChannel () { + Init (new Hashtable(), null, null); } public TcpChannel (int port) { - Hashtable ht = new Hashtable(); - ht["port"] = port.ToString(); - Init(ht, null, null); + Hashtable ht = new Hashtable(); + ht["port"] = port.ToString(); + Init(ht, null, null); } - void Init (IDictionary properties, IClientChannelSinkProvider clientSink, IServerChannelSinkProvider serverSink) - { - _clientChannel = new TcpClientChannel (properties,clientSink); + void Init (IDictionary properties, IClientChannelSinkProvider clientSink, IServerChannelSinkProvider serverSink) + { + _clientChannel = new TcpClientChannel (properties,clientSink); + + if(properties["port"] != null) + _serverChannel = new TcpServerChannel(properties, serverSink); - if(properties["port"] != null) - _serverChannel = new TcpServerChannel(properties, serverSink); - object val = properties ["name"]; if (val != null) _name = val as string; val = properties ["priority"]; if (val != null) _priority = Convert.ToInt32 (val); - } - + } + public TcpChannel (IDictionary properties, IClientChannelSinkProvider clientSinkProvider, @@ -74,46 +75,46 @@ namespace System.Runtime.Remoting.Channels.Tcp Init (properties, clientSinkProvider, serverSinkProvider); } - public IMessageSink CreateMessageSink(string url, object remoteChannelData, out string objectURI) - { - return _clientChannel.CreateMessageSink(url, remoteChannelData, out objectURI); - } - - public string ChannelName - { - get { return _name; } - } - - public int ChannelPriority - { - get { return _priority; } - } - - public void StartListening (object data) - { - if (_serverChannel != null) _serverChannel.StartListening (data); - } - - public void StopListening (object data) - { - if (_serverChannel != null) _serverChannel.StopListening(data); - TcpConnectionPool.Shutdown (); - } - - public string[] GetUrlsForUri (string uri) - { - if (_serverChannel != null) return _serverChannel.GetUrlsForUri(uri); - else return null; - } - - public object ChannelData - { - get - { - if (_serverChannel != null) return _serverChannel.ChannelData; - else return null; - } - } + public IMessageSink CreateMessageSink(string url, object remoteChannelData, out string objectURI) + { + return _clientChannel.CreateMessageSink(url, remoteChannelData, out objectURI); + } + + public string ChannelName + { + get { return _name; } + } + + public int ChannelPriority + { + get { return _priority; } + } + + public void StartListening (object data) + { + if (_serverChannel != null) _serverChannel.StartListening (data); + } + + public void StopListening (object data) + { + if (_serverChannel != null) _serverChannel.StopListening(data); + TcpConnectionPool.Shutdown (); + } + + public string[] GetUrlsForUri (string uri) + { + if (_serverChannel != null) return _serverChannel.GetUrlsForUri(uri); + else return null; + } + + public object ChannelData + { + get + { + if (_serverChannel != null) return _serverChannel.ChannelData; + else return null; + } + } public string Parse (string url, out string objectURI) { @@ -140,17 +141,26 @@ namespace System.Runtime.Remoting.Channels.Tcp objectURI = null; port = 0; - Match m = Regex.Match (url, "tcp://([^:]+):([0-9]+)/?(.*)"); + if (!url.StartsWith ("tcp://")) return null; + int colon = url.IndexOf (':', 6); + if (colon == -1) return null; + string host = url.Substring (6, colon - 6); - if (!m.Success) - return null; + int slash = url.IndexOf ('/', colon + 1); + if (slash == -1) slash = url.Length; + string port_str = url.Substring (colon + 1, slash - colon - 1); - string host = m.Groups[1].Value; - string port_str = m.Groups[2].Value; - objectURI = m.Groups[3].Value; - port = Convert.ToInt32 (port_str); + if (slash < url.Length) + objectURI = url.Substring (slash + 1); + + try { + port = Convert.ToInt32 (port_str); + } catch { + return null; + } - if (objectURI == string.Empty) objectURI = null; + if (objectURI == string.Empty) + objectURI = null; return host; }