Mercurial > projects > dreactor
diff dreactor/protocol/RawTcp.d @ 10:e75a2e506b1d
housekeeping
author | rick@minifunk |
---|---|
date | Fri, 01 Aug 2008 16:30:45 -0400 |
parents | 5412a1ff2e49 |
children | 5836613d16ac |
line wrap: on
line diff
--- a/dreactor/protocol/RawTcp.d Sat Jul 12 10:42:41 2008 -0400 +++ b/dreactor/protocol/RawTcp.d Fri Aug 01 16:30:45 2008 -0400 @@ -16,19 +16,18 @@ Basic TCP server or client routines for sending raw data. ******************************************************************************/ -class RawTCPListener : RawTCPHandler +class RawTCPListener { public - Logger log; this(Dispatcher mgr, Vat sel, IPv4Address addr) { manager = mgr; mgr.events(Event.Read); - mgr.setOutgoingHandler(&onSend); + mgr.setOutgoingHandler(&RawTCPHandler.onSend); mgr.setIncomingHandler(&onReceive); mgr.setConnectHandler(&accept); - mgr.setErrorHandler(&onError); - mgr.setDisconnectHandler(&onHangup); + mgr.setErrorHandler(&RawTCPHandler.onError); + mgr.setDisconnectHandler(&RawTCPHandler.onHangup); mgr.listen(addr); sel.addConnection(mgr); @@ -47,13 +46,7 @@ ~this() { - foreach(Dispatcher d; children) - { - (cast(AsyncSocketConduit)d.transport).shutdown(); - (cast(AsyncSocketConduit)d.transport).detach(); - } - (cast(AsyncSocketConduit)manager.transport).shutdown(); - (cast(AsyncSocketConduit)manager.transport).detach(); + close(); } int accept(Conduit cond, RegisterD reg) @@ -96,7 +89,6 @@ if (d.appendOutBuffer(outbuf)) { d.addEvent(Event.Write); - d.setOutgoingHandler(&onSend); if (!vat.addConnection(d)) { log.error("unable to register mgr"); @@ -105,7 +97,14 @@ return 0; } - public int onReceive(Dispatcher h) + /************************************************************************** + + receive + IncomingHandlerD + Default incoming data handler. Should be replaced with something useful. + + **************************************************************************/ + int onReceive(Dispatcher h) { Logger log = Log.lookup("Handlers.onReceive"); @@ -133,28 +132,43 @@ void close() { + foreach(Dispatcher d; children) + { + (cast(AsyncSocketConduit)d.transport).shutdown(); + (cast(AsyncSocketConduit)d.transport).detach(); + } + (cast(AsyncSocketConduit)manager.transport).shutdown(); + (cast(AsyncSocketConduit)manager.transport).detach(); } + + void setDataHandler(void delegate(char[], Dispatcher) h) + { + dataHandler = h; + } private - Dispatcher manager; Vat vat; CircularSeq!(Dispatcher) children; + Dispatcher manager; + Logger log; + RawTCPHandler h; + void delegate(char[], Dispatcher) dataHandler; } -class RawTCPClient : RawTCPHandler +class RawTCPClient { + public - Logger log; this(Dispatcher mgr, Vat sel, Event evts = Event.Read) { manager = mgr; manager.events(evts); connected = false; - mgr.setOutgoingHandler(&onSend); + mgr.setOutgoingHandler(&RawTCPHandler.onSend); mgr.setIncomingHandler(&onReceive); - mgr.setErrorHandler(&onError); - mgr.setDisconnectHandler(&onHangup); + mgr.setErrorHandler(&RawTCPHandler.onError); + mgr.setDisconnectHandler(&RawTCPHandler.onHangup); vat = sel; log = Log.lookup("dreactor.protocol.RawTcpClient"); } @@ -214,10 +228,48 @@ return 0; } + /************************************************************************** + + receive + IncomingHandlerD + Default incoming data handler. Should be replaced with something useful. + + **************************************************************************/ + public int onReceive(Dispatcher h) + { + Logger log = Log.lookup("Handlers.onReceive"); + + char inbuf[8192]; + int amt; + if((amt = h.transport.read(inbuf)) > 0) + { + if (dataHandler) + dataHandler(inbuf[0 .. amt], h); + else + log.info("Received {} byte Buffer: {}", amt, inbuf[0 .. amt]); + } + else + { + if (amt == 0) + { + return CLOSE; + } + log.error("Received no data, err = {}", amt); + } + return REMAIN; + } + + void setDataHandler(void delegate(char[], Dispatcher) h) + { + dataHandler = h; + } private + void delegate(char[], Dispatcher) dataHandler; Dispatcher manager; Vat vat; bool connected; + Logger log; + RawTCPHandler h; } @@ -226,94 +278,60 @@ Default Event handlers common to both listener/clients ******************************************************************************/ -class RawTCPHandler -{ -/************************************************************************** - - onSend - OutgoingHandlerD - To be registered as the response to socket writable event. - Sends data, returns amount sent. Unregisters Handler for sending - if there is no more data left to send. - -***************************************************************************/ -public int onSend(Dispatcher h) +struct RawTCPHandler { - Logger log = Log.lookup("Handlers.onSend"); - - char[] outbuf = h.nextBuffer(); - if (outbuf !is null) + /************************************************************************** + + onSend + OutgoingHandlerD + To be registered as the response to socket writable event. + Sends data, returns amount sent. Unregisters Handler for sending + if there is no more data left to send. + + ***************************************************************************/ + public static int onSend(Dispatcher h) { - int sent = h.transport.write(outbuf); - if (sent > 0) + Logger log = Log.lookup("Handlers.onSend"); + + char[] outbuf = h.nextBuffer(); + if (outbuf !is null) { - if (! h.addOffset(sent)) + int sent = h.transport.write(outbuf); + if (sent > 0) { - h.remEvent(Event.Write); - return REREGISTER; + if (! h.addOffset(sent)) + { + h.remEvent(Event.Write); + return REREGISTER; + } } - } - else if (sent == AsyncSocketConduit.Eof) - { - log.error("Select said socket was writable, but sent 0 bytes"); + else if (sent == AsyncSocketConduit.Eof) + { + log.error("Select said socket was writable, but sent 0 bytes"); + } + else + { + log.error("Socket send return ERR"); + } + return REMAIN; } else { - log.error("Socket send return ERR"); + h.remEvent(Event.Write); + return REREGISTER; } - return REMAIN; } - else - { - h.remEvent(Event.Write); - return REREGISTER; - } -} -/************************************************************************** - receive - IncomingHandlerD - Default incoming data handler. Should be replaced with something useful. - -**************************************************************************/ -public int onReceive(Dispatcher h) -{ - Logger log = Log.lookup("Handlers.onReceive"); - - char inbuf[8192]; - int amt; - if((amt = h.transport.read(inbuf)) > 0) + static int onHangup(Dispatcher d) { - if (dataHandler) - dataHandler(inbuf[0 .. amt], h); - else - log.info("Received {} byte Buffer: {}", amt, inbuf[0 .. amt]); - } - else - { - if (amt == 0) - { - return CLOSE; - } - log.error("Received no data, err = {}", amt); + return UNREGISTER; } - return REMAIN; -} -int onHangup(Dispatcher d) -{ - return UNREGISTER; -} -int onError(Dispatcher d, RegisterD unreg) -{ - return CLOSE; -} -void setDataHandler(void delegate(char[],Dispatcher) del) -{ - dataHandler = del; -} -protected - void delegate(char[], Dispatcher) dataHandler; + static int onError(Dispatcher d, RegisterD unreg) + { + return CLOSE; + } + } bool includes(Dispatcher[] haystack, Dispatcher needle)