annotate dreactor/protocol/Raw.d @ 0:7a315154bf5e

Initial commit
author rick@minifunk
date Sun, 08 Jun 2008 01:45:38 -0400
parents
children b5c7dc3922c6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
1 module dreactor.protocol.Raw;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
2
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
3 import tango.io.Conduit;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
4 import tango.io.selector.model.ISelector;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
5 import dreactor.core.AsyncConduit;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
6 import dreactor.core.SelectLoop;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
7 import dreactor.core.ConnectionHandler;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
8 import tango.util.collection.CircularSeq;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
9 import tango.util.log.Log;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
10 import tango.util.log.Configurator;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
11
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
12 Logger log = Log.getLogger("dreactor.core.SelectLoop");
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
13
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
14 /******************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
15
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
16 Basic TCP server or client routines for sending raw data.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
17
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
18 ******************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
19 class RawListener
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
20 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
21 public
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
22
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
23 this(ConnectionHandler mgr, SelectLoop sel)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
24 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
25 manager = mgr;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
26 mgr.events(Event.Read);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
27 sel.addConnection(mgr);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
28 select = sel;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
29 children = CircularSeq!(ConnectionHandler);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
30 Configurator();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
31 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
32
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
33 int accept(Conduit cond)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
34 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
35 AsyncConduit newcond = new AsyncConduit;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
36 cond.socket().accept(newcond.socket);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
37 ConnectionHandler h = ConnectionHandler.New(manager);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
38 mgr.events(Event.Read);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
39 select.addConnection(mgr);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
40 children.append(mgr);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
41 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
42
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
43 bool broadcast(char[] outbuf)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
44 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
45 foreach(ConnectionHandler h; children)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
46 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
47 if (h.appendBuffer(outbuf))
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
48 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
49 h.addEvent(Event.Write);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
50 select.addConnection(h);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
51 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
52 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
53 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
54
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
55 void close()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
56 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
57
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
58 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
59
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
60 /**************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
61
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
62 send
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
63 OutgoingHandlerD
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
64 To be registered as the response to socket writable event.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
65 Sends data, returns amount sent. Unregisters Handler for sending
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
66 if there is no more data left to send.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
67
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
68 ***************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
69 int send(ConnectionHandler h, RegisterD reg)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
70 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
71 char[] outbuf = h.nextBuffer();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
72 if (!outbuf is null)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
73 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
74 int sent = h.transport.write(outbuf);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
75 if (sent > 0)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
76 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
77 if (! h.addOffset(sent))
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
78 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
79 h.removeEvent(Event.write);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
80 reg(h);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
81 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
82 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
83 else if (sent == EOF)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
84 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
85 // EAGAIN ? probably shouldn't have happened.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
86 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
87 else
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
88 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
89 log.error("Socket send return ERR");
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
90 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
91 return sent;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
92 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
93 return 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
94 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
95
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
96 /**************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
97
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
98 receive
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
99 IncomingHandlerD
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
100 Default incoming data handler. Should be replaced with something useful.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
101
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
102 **************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
103 int receive(ConnectionHandler h, RegisterD reg)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
104 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
105 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
106
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
107 private
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
108 ConnectionHandler manager;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
109 SelectLoop select;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
110 CircularSeq!(ConnectionHandler) children;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
111 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
112
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
113 class RawClient
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
114 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
115 ConnectionHandler manager;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
116 SelectLoop select;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
117
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
118 this(ConnectionHandler mgr, SelectLoop sel)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
119 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
120 manager = mgr;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
121 mgr.events(Event.Read);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
122 sel.addConnection(mgr);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
123 select = sel;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
124 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
125 }