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=be93aecdd404349bd9c7ca31dc8332e4cff0a078;hb=c1d81649cc1d16ee47bd6fb951e220d8aba6a1d0;hp=de8d9a692fcb357239ea3b46c9c8d9c29fed43a1;hpb=b5cfba1835f2ba823796f825410e0062b7e4c9a3;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 de8d9a692fc..be93aecdd40 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 @@ -37,34 +37,38 @@ namespace System.Runtime.Remoting.Channels.Tcp public class TcpChannel : IChannelReceiver, IChannel, IChannelSender { private TcpClientChannel _clientChannel; - private TcpServerChannel _serverChannel = null; + private TcpServerChannel _serverChannel; private string _name = "tcp"; private int _priority = 1; public TcpChannel () - { + { Init (new Hashtable(), null, null); } public TcpChannel (int port) { Hashtable ht = new Hashtable(); - ht["port"] = port.ToString(); - Init(ht, null, null); + ht ["port"] = port.ToString(); + Init (ht, null, null); } void Init (IDictionary properties, IClientChannelSinkProvider clientSink, IServerChannelSinkProvider serverSink) { _clientChannel = new TcpClientChannel (properties,clientSink); - if(properties["port"] != null) - _serverChannel = new TcpServerChannel(properties, serverSink); + if (properties != null) { + if(properties["port"] != null) + _serverChannel = new TcpServerChannel(properties, serverSink); - object val = properties ["name"]; - if (val != null) _name = val as string; + object val = properties ["name"]; + if (val != null) + _name = val as string; - val = properties ["priority"]; - if (val != null) _priority = Convert.ToInt32 (val); + val = properties ["priority"]; + if (val != null) + _priority = Convert.ToInt32 (val); + } } @@ -77,42 +81,43 @@ namespace System.Runtime.Remoting.Channels.Tcp public IMessageSink CreateMessageSink(string url, object remoteChannelData, out string objectURI) { - return _clientChannel.CreateMessageSink(url, remoteChannelData, out objectURI); + return _clientChannel.CreateMessageSink(url, + remoteChannelData, out objectURI); } - public string ChannelName - { + public string ChannelName { get { return _name; } } - public int ChannelPriority - { + public int ChannelPriority { get { return _priority; } } public void StartListening (object data) { - if (_serverChannel != null) _serverChannel.StartListening (data); + if (_serverChannel != null) + _serverChannel.StartListening (data); } public void StopListening (object data) { - if (_serverChannel != null) _serverChannel.StopListening(data); + if (_serverChannel != null) + _serverChannel.StopListening(data); TcpConnectionPool.Shutdown (); } - public string[] GetUrlsForUri (string uri) + public string [] GetUrlsForUri (string objectURI) { - if (_serverChannel != null) return _serverChannel.GetUrlsForUri(uri); - else return null; + if (_serverChannel != null) + return _serverChannel.GetUrlsForUri (objectURI); + return null; } - public object ChannelData - { - get - { - if (_serverChannel != null) return _serverChannel.ChannelData; - else return null; + public object ChannelData { + get { + if (_serverChannel != null) + return _serverChannel.ChannelData; + return null; } } @@ -123,46 +128,66 @@ namespace System.Runtime.Remoting.Channels.Tcp internal static string ParseChannelUrl (string url, out string objectURI) { - if (url == null) throw new ArgumentNullException ("url"); + if (url == null) + throw new ArgumentNullException ("url"); - int port; + string host, port; - string host = ParseTcpURL (url, out objectURI, out port); - if (host != null) - return "tcp://" + host + ":" + port; - else - return null; + return ParseTcpURL (url, out host, out port, out objectURI); } - internal static string ParseTcpURL (string url, out string objectURI, out int port) + internal static string ParseTcpURL (string url, out string host, out string port, out string objectURI) { // format: "tcp://host:port/path/to/object" - objectURI = null; - port = 0; + host = null; + port = null; - if (!url.StartsWith ("tcp://")) return null; - int colon = url.IndexOf (':', 6); - if (colon == -1) return null; - string host = url.Substring (6, colon - 6); - - int slash = url.IndexOf ('/', colon + 1); - if (slash == -1) slash = url.Length; - string port_str = url.Substring (colon + 1, slash - colon - 1); + // url needs to be at least "tcp:" + if (url.Length < 4 || url[3] != ':' || + (url[0] != 'T' && url[0] != 't') || + (url[1] != 'C' && url[1] != 'c') || + (url[2] != 'P' && url[2] != 'p')) + return null; - if (slash < url.Length) - objectURI = url.Substring (slash + 1); - - try { - port = Convert.ToInt32 (port_str); - } catch { + // "tcp:" is acceptable + if (url.Length == 4) + return url; + + // must be of the form "tcp://" + if (url.Length <= 5 || url[4] != '/' || url[5] != '/') return null; + + // "tcp://" is acceptable + if (url.Length == 6) + return url; + + int i; + for (i = 6; i < url.Length; i++) { + if (url[i] == ':' || url[i] == '/') + break; } - - if (objectURI == string.Empty) - objectURI = null; + + host = url.Substring (6, i - 6); + + if (i + 1 < url.Length && url[i] == ':') { + int start = i + 1; - return host; + for (i++; i < url.Length; i++) { + if (url[i] == '/') + break; + } + + if (i > start) + port = url.Substring (start, i - start); + } + + if (i >= url.Length || url[i] != '/') + return url; + + objectURI = url.Substring (i); + + return url.Substring (0, i); } } }