view 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 source


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;
        running = true;
        while (running)
        {
            msg = receive();
            auto children = new CircularList!(ChatConnectionTask);
            switch(msg.type)
            {
                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 ChatConnectionTask.StdIn:
                    char[] inbuf = (cast(char*) msg.payload)[0 .. msg.info];
                    break;
                case ChatConnectionTask.RemoteClosed:
                    break;
                default:
                    log.trace("Unknown message received");
            }
        }
    }
private
    bool running;
}

int main(char[][] args)
{
    log = Log.lookup("dreactor.chatserver");
    auto provider = new TcpProvider(new IPv4Address("localhost", 5555), true);
    auto srvtsk = new ListenerTask(provider);
    return 0;
}