diff test/chatserver.d @ 13:8c9b1276f623 default tip

bug fixes
author rick@minifunk
date Sat, 20 Sep 2008 18:33:11 -0400
parents d6a3cfe7c3de
children
line wrap: on
line diff
--- a/test/chatserver.d	Wed Aug 27 00:47:33 2008 -0400
+++ b/test/chatserver.d	Sat Sep 20 18:33:11 2008 -0400
@@ -1,66 +1,102 @@
 
 module chatserver;
 
+import tango.io.Stdout;
+import tango.io.Console;
+import tango.util.container.CircularList;
+import tango.util.log.Log;
+import tango.net.Socket;
+
 import dreactor.core.Vat;
 import dreactor.core.Task;
 import dreactor.protocol.TcpProvider;
+import dreactor.transport.AsyncSocketConduit;
 
+typedef Message ChildTCPRequest;
+Logger log;
 
 class ChatConnectionTask : Task
 {
 public
+    this(TcpProvider tcpclient) 
+    {
+        super(tcpclient);
+    }
 
+    enum {
+        StdIn = 100,
+        RemoteClosed
+        }
+
+    void run()
+    {
+        running = true;
+        Message msg;
+        while (running)
+        {
+            msg = receive();
+            switch(msg.type)
+            {
+                case TcpProvider.Receive:
+                    Stdout(cast(char*) msg.payload);
+                    break;
+                case TcpProvider.SendComplete:
+                    break;
+                case TcpProvider.RemoteClosed:
+                    log.trace("--- Remote host closed connection \n");
+                    break;
+                default:
+                    log.trace("Unknown message received\n");
+            }
+        }
+    }
+
+private
+    bool running;
+}
+
+class ListenerTask : Task
+{
+    this(TcpProvider tcpclient) 
+    {
+        super(tcpclient);
+    }
     void run()
     {
         Message msg;
-        while (msg = receive())
+        running = true;
+        while (running)
         {
+            msg = receive();
+            auto children = new CircularList!(ChatConnectionTask);
             switch(msg.type)
             {
-                case TCP_PROVIDER_RECEIVE:
-                    //Stdout(cast(char[]) msg.payload);
+                case TcpProvider.NewConnection:
+                    AsyncSocketConduit cond = cast(AsyncSocketConduit) msg.payload;
+                    log.trace("new conduit : {}", cast(uint) cond);
+                    auto provider = new TcpProvider(cond);
+                    auto tsk = new ChatConnectionTask(new TcpProvider(cond));
+                    children.append(tsk);
+                    log.trace("accepted connection");
                     break;
-                case TCP_PROVIDER_SEND_COMPLETE:
+                case ChatConnectionTask.StdIn:
+                    char[] inbuf = (cast(char*) msg.payload)[0 .. msg.info];
                     break;
-                case TCP_PROVIDER_REMOTE_CLOSED:
-                    Stdout("--- Remote host closed connection \n");
+                case ChatConnectionTask.RemoteClosed:
                     break;
                 default:
-                    Stdout("Unknown message received\n");
+                    log.trace("Unknown message received");
             }
         }
-        em.stopNow();
     }
-
-    void send(char[] buf)
-    {
-        tcp.send(buf);
-    }
-
-    static CircularList!(ChatConnectionTask!(
+private
+    bool running;
 }
 
-
-int main(int argc, char[][] argv)
+int main(char[][] args)
 {
-    auto vat = new Vat;
- 
-    void listentask(Message msg)
-    {
-        switch(msg.type)
-        {
-            case TCP_PROVIDER_CONNECT:
-                AsyncSocketConduit cond = cast(AsyncSocketConduit) msg.payload;
-                auto tsk = ChatConnectionTask(new TcpProvider(cond));
-                vat.addTask(tsk);
-                break;
-            default:
-                Stdout("Unknown message received\n");
-        }
-    }
-
-
-    auto provider = new TcpProvider(new IPv4Address("localhost", 5555), vat);
-    auto srvtsk = new Task(&listentask, provider);
-    vat.addTask(task, client);
+    log = Log.lookup("dreactor.chatserver");
+    auto provider = new TcpProvider(new IPv4Address("localhost", 5555), true);
+    auto srvtsk = new ListenerTask(provider);
+    return 0;
 }