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.support;
21
22 import java.io.IOException;
23 import java.io.OutputStream;
24
25 import org.apache.mina.common.ByteBuffer;
26 import org.apache.mina.common.IoSession;
27 import org.apache.mina.common.WriteFuture;
28
29
30
31
32
33
34
35
36
37 public class IoSessionOutputStream extends OutputStream {
38 private final IoSession session;
39
40 private WriteFuture lastWriteFuture;
41
42 public IoSessionOutputStream(IoSession session) {
43 this.session = session;
44 }
45
46 public void close() throws IOException {
47 try {
48 flush();
49 } finally {
50 session.close().join();
51 }
52 }
53
54 private void checkClosed() throws IOException {
55 if (!session.isConnected()) {
56 throw new IOException("The session has been closed.");
57 }
58 }
59
60 private synchronized void write(ByteBuffer buf) throws IOException {
61 checkClosed();
62 WriteFuture future = session.write(buf);
63 lastWriteFuture = future;
64 }
65
66 public void write(byte[] b, int off, int len) throws IOException {
67 write(ByteBuffer.wrap((byte[]) b.clone(), off, len));
68 }
69
70 public void write(int b) throws IOException {
71 ByteBuffer buf = ByteBuffer.allocate(1);
72 buf.put((byte) b);
73 buf.flip();
74 write(buf);
75 }
76
77 public synchronized void flush() throws IOException {
78 if (lastWriteFuture == null) {
79 return;
80 }
81
82 lastWriteFuture.join();
83 if (!lastWriteFuture.isWritten()) {
84 throw new IOException(
85 "The bytes could not be written to the session");
86 }
87 }
88 }