New test.
[mono.git] / mcs / class / System.Runtime.Remoting / System.Runtime.Remoting.Channels.Tcp / TcpServerChannel.cs
index cbbb0f2836b955528356246ab9658081b053d104..300954769ed8d3d11ccbeaf0f8d816e32c297989 100644 (file)
@@ -46,7 +46,7 @@ namespace System.Runtime.Remoting.Channels.Tcp
                string host = null;
                int priority = 1;
                bool supressChannelData = false;
-               bool useIpAddress = false;
+               bool useIpAddress = true;
                
                IPAddress bindAddress = IPAddress.Any;
                Thread server_thread = null;
@@ -56,9 +56,13 @@ namespace System.Runtime.Remoting.Channels.Tcp
                
                RemotingThreadPool threadPool;
                
+#if TARGET_JVM
+               private volatile bool stopped = false;
+#endif
+
                void Init (IServerChannelSinkProvider serverSinkProvider) 
                {
-                       if (serverSinkProvider == null) \r
+                       if (serverSinkProvider == null) 
                        {
                                serverSinkProvider = new BinaryServerFormatterSinkProvider ();
                        }
@@ -80,16 +84,16 @@ namespace System.Runtime.Remoting.Channels.Tcp
                        // Gets channel data from the chain of channel providers
 
                        channel_data = new ChannelDataStore (null);
-                       IServerChannelSinkProvider provider = serverSinkProvider;\r
-                       while (provider != null)\r
-                       {\r
-                               provider.GetChannelData(channel_data);\r
-                               provider = provider.Next;\r
-                       }\r
+                       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);\r
+                       IServerChannelSink next_sink = ChannelServices.CreateServerChannelSinkChain (serverSinkProvider, this);
                        sink = new TcpServerTransportSink (next_sink);
                }
                
@@ -103,35 +107,35 @@ namespace System.Runtime.Remoting.Channels.Tcp
                                         IServerChannelSinkProvider serverSinkProvider)
                {
                        foreach(DictionaryEntry property in properties)
-                       {\r
-                               switch((string)property.Key)\r
-                               {\r
+                       {
+                               switch((string)property.Key)
+                               {
                                        case "name":
                                                name = property.Value.ToString();
                                                break;
-                                       case "port":\r
+                                       case "port":
                                                port = Convert.ToInt32(property.Value);
-                                               break;\r
-                                       case "priority":\r
+                                               break;
+                                       case "priority":
                                                priority = Convert.ToInt32(property.Value);
-                                               break;\r
-                                       case "bindTo":\r
+                                               break;
+                                       case "bindTo":
                                                bindAddress = IPAddress.Parse((string)property.Value);
-                                               break;\r
-                                       case "rejectRemoteRequests":\r
+                                               break;
+                                       case "rejectRemoteRequests":
                                                if(Convert.ToBoolean(properties["rejectRemoteRequests"]))
                                                        bindAddress = IPAddress.Loopback;
                                                break;
                                        case "supressChannelData":
                                                supressChannelData = Convert.ToBoolean (property.Value);
-                                               break;\r
+                                               break;
                                        case "useIpAddress":
                                                useIpAddress = Convert.ToBoolean (property.Value);
                                                break;
                                        case "machineName":
                                                host = property.Value as string;
                                                break;
-                               }\r
+                               }
                        }                       
                        Init (serverSinkProvider);
                }
@@ -178,18 +182,18 @@ namespace System.Runtime.Remoting.Channels.Tcp
                        return "tcp://" + host + ":" + port;
                }
                
-               public string[] GetUrlsForUri (string uri)\r
-               {\r
+               public virtual string[] GetUrlsForUri (string uri)
+               {
                        if (!uri.StartsWith ("/")) uri = "/" + uri;
-\r
-                       string [] chnl_uris = channel_data.ChannelUris;\r
-                       string [] result = new String [chnl_uris.Length];\r
-\r
-                       for (int i = 0; i < chnl_uris.Length; i++) \r
-                               result [i] = chnl_uris [i] + uri;\r
-                       \r
-                       return result;\r
-               }\r
+
+                       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)
                {
@@ -200,24 +204,40 @@ namespace System.Runtime.Remoting.Channels.Tcp
                {
                        try
                        {
-                               while (true) 
+#if !TARGET_JVM
+                               while(true)
+#else
+                               while(!stopped)
+#endif
                                {
                                        Socket socket = listener.AcceptSocket ();
                                        ClientConnection reader = new ClientConnection (this, socket, sink);
                                        try {
                                                if (!threadPool.RunThread (new ThreadStart (reader.ProcessMessages)))
                                                        socket.Close ();
-                                       } catch {}
+                                       } catch (Exception e) 
+                                       {
+#if DEBUG
+                                               Console.WriteLine("Exception caught in TcpServerChannel.WaitForConnections during start process message: {0} {1}", e.GetType(), e.Message);
+#endif
+                                       }
                                }
                        }
-                       catch
-                       {}
+                       catch (Exception e) 
+                       {
+#if DEBUG
+                               Console.WriteLine("Exception caught in TcpServerChannel.WaitForConnections, stop channel's thread : {0} {1}", e.GetType(), e.Message);
+#endif
+                       }
                }
 
                public void StartListening (object data)
                {
+#if TARGET_JVM
+                       stopped = false;
+#endif 
                        listener = new TcpListener (bindAddress, port);
-                       if (server_thread == null) \r
+                       if (server_thread == null) 
                        {
                                threadPool = RemotingThreadPool.GetSharedPool ();
                                listener.Start ();
@@ -238,12 +258,20 @@ namespace System.Runtime.Remoting.Channels.Tcp
 
                public void StopListening (object data)
                {
+#if TARGET_JVM
+                       stopped = true;
+#endif 
                        if (server_thread == null) return;
                        
+#if !TARGET_JVM
                        server_thread.Abort ();
-                       server_thread = null;
+#else
+                       server_thread.Interrupt ();
+#endif
                        listener.Stop ();
                        threadPool.Free ();
+                       server_thread.Join ();
+                       server_thread = null;                   
                }
        }
 
@@ -254,21 +282,18 @@ namespace System.Runtime.Remoting.Channels.Tcp
                Socket _socket;
                TcpServerTransportSink _sink;
                Stream _stream;
-               TcpServerChannel _serverChannel;
 
                byte[] _buffer = new byte[TcpMessageIO.DefaultStreamBufferSize];
 
                public ClientConnection (TcpServerChannel serverChannel, Socket socket, TcpServerTransportSink sink)
                {
-                       _serverChannel = serverChannel;
                        _socket = socket;
                        _sink = sink;
                        _id = _count++;
                }
 
-               public Stream Stream
-               {
-                       get { return _stream; }
+               public Socket Socket {
+                       get { return _socket; }
                }
 
                public byte[] Buffer
@@ -292,7 +317,7 @@ namespace System.Runtime.Remoting.Channels.Tcp
                                        switch (type)
                                        {
                                                case MessageStatus.MethodMessage:
-                                                       _sink.InternalProcessMessage (this);
+                                                       _sink.InternalProcessMessage (this, _stream);
                                                        break;
 
                                                case MessageStatus.Unknown:
@@ -305,7 +330,9 @@ namespace System.Runtime.Remoting.Channels.Tcp
                        }
                        catch (Exception ex)
                        {
-//                             Console.WriteLine (ex);
+#if DEBUG
+                               Console.WriteLine ("The exception was caught during TcpServerChannel.ProcessMessages: {0}, {1}", ex.GetType(), ex.Message);
+#endif
                        }
                        finally
                        {