1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.handler.stream;
21
22 import java.io.IOException;
23 import java.io.OutputStream;
24
25 import org.apache.mina.core.buffer.IoBuffer;
26 import org.apache.mina.core.future.WriteFuture;
27 import org.apache.mina.core.session.IoSession;
28
29
30
31
32
33
34
35 class IoSessionOutputStream extends OutputStream {
36 private final IoSession session;
37
38 private WriteFuture lastWriteFuture;
39
40 public IoSessionOutputStream(IoSession session) {
41 this.session = session;
42 }
43
44 @Override
45 public void close() throws IOException {
46 try {
47 flush();
48 } finally {
49 session.close(true).awaitUninterruptibly();
50 }
51 }
52
53 private void checkClosed() throws IOException {
54 if (!session.isConnected()) {
55 throw new IOException("The session has been closed.");
56 }
57 }
58
59 private synchronized void write(IoBuffer buf) throws IOException {
60 checkClosed();
61 WriteFuture future = session.write(buf);
62 lastWriteFuture = future;
63 }
64
65 @Override
66 public void write(byte[] b, int off, int len) throws IOException {
67 write(IoBuffer.wrap(b.clone(), off, len));
68 }
69
70 @Override
71 public void write(int b) throws IOException {
72 IoBuffer buf = IoBuffer.allocate(1);
73 buf.put((byte) b);
74 buf.flip();
75 write(buf);
76 }
77
78 @Override
79 public synchronized void flush() throws IOException {
80 if (lastWriteFuture == null) {
81 return;
82 }
83
84 lastWriteFuture.awaitUninterruptibly();
85 if (!lastWriteFuture.isWritten()) {
86 throw new IOException(
87 "The bytes could not be written to the session");
88 }
89 }
90 }