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)