1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.transport.socket.nio.support;
21
22 import org.apache.mina.common.ByteBuffer;
23 import org.apache.mina.common.IoFilterChain;
24 import org.apache.mina.common.IoSession;
25 import org.apache.mina.common.IoFilter.WriteRequest;
26 import org.apache.mina.common.support.AbstractIoFilterChain;
27 import org.apache.mina.util.Queue;
28
29
30
31
32
33
34 class DatagramFilterChain extends AbstractIoFilterChain {
35
36 DatagramFilterChain(IoSession parent) {
37 super(parent);
38 }
39
40 protected void doWrite(IoSession session, WriteRequest writeRequest) {
41 DatagramSessionImpl s = (DatagramSessionImpl) session;
42 Queue writeRequestQueue = s.getWriteRequestQueue();
43
44
45
46 ByteBuffer buffer = (ByteBuffer) writeRequest.getMessage();
47 buffer.mark();
48
49 int remaining = buffer.remaining();
50 if (remaining == 0) {
51 s.increaseScheduledWriteRequests();
52 } else {
53 s.increaseScheduledWriteBytes(buffer.remaining());
54 }
55
56 synchronized (writeRequestQueue) {
57 writeRequestQueue.push(writeRequest);
58 }
59
60 if (session.getTrafficMask().isWritable()) {
61 s.getManagerDelegate().flushSession(s);
62 }
63 }
64
65 protected void doClose(IoSession session) {
66 DatagramSessionImpl s = (DatagramSessionImpl) session;
67 DatagramService manager = s.getManagerDelegate();
68 if (manager instanceof DatagramConnectorDelegate) {
69 ((DatagramConnectorDelegate) manager).closeSession(s);
70 } else {
71 ((DatagramAcceptorDelegate) manager).getListeners()
72 .fireSessionDestroyed(session);
73 session.getCloseFuture().setClosed();
74 }
75 }
76 }