1 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 36 public class IoSessionOutputStream extends OutputStream { 37 private final IoSession session; 38 39 private WriteFuture lastWriteFuture; 40 41 public IoSessionOutputStream(IoSession session) { 42 this.session = session; 43 } 44 45 @Override 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 lastWriteFuture = session.write(buf); 63 } 64 65 @Override 66 public void write(byte[] b, int off, int len) throws IOException { 67 write(ByteBuffer.wrap(b.clone(), off, len)); 68 } 69 70 @Override 71 public void write(int b) throws IOException { 72 ByteBuffer buf = ByteBuffer.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.join(); 85 if (!lastWriteFuture.isWritten()) { 86 throw new IOException ( 87 "The bytes could not be written to the session"); 88 } 89 } 90 } 91 | Popular Tags |