148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood/* 248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Copyright (c) 2006-2011 Christian Plattner. All rights reserved. 348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Please refer to the LICENSE.txt for licensing details. 448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodpackage ch.ethz.ssh2.channel; 648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodimport java.io.IOException; 848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodimport java.io.OutputStream; 948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 1048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood/** 1148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * ChannelOutputStream. 1248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * 1348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @author Christian Plattner 1448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @version 2.50, 03/15/10 1548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 1648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodpublic final class ChannelOutputStream extends OutputStream 1748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood{ 1848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood Channel c; 1948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 2048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood boolean isClosed = false; 2148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 2248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood ChannelOutputStream(Channel c) 2348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood { 2448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood this.c = c; 2548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood } 2648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 2748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood @Override 2848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public void write(int b) throws IOException 2948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood { 3048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood byte[] buff = new byte[1]; 3148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 3248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood buff[0] = (byte) b; 3348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 3448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood write(buff, 0, 1); 3548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood } 3648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 3748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood @Override 3848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public void close() throws IOException 3948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood { 4048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood if (isClosed == false) 4148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood { 4248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood isClosed = true; 4348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood c.cm.sendEOF(c); 4448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood } 4548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood } 4648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 4748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood @Override 4848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public void flush() throws IOException 4948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood { 5048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood if (isClosed) 5148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood throw new IOException("This OutputStream is closed."); 5248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 5348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood /* This is a no-op, since this stream is unbuffered */ 5448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood } 5548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 5648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood @Override 5748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public void write(byte[] b, int off, int len) throws IOException 5848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood { 5948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood if (isClosed) 6048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood throw new IOException("This OutputStream is closed."); 6148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 6248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood if (b == null) 6348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood throw new NullPointerException(); 6448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 6548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood if ((off < 0) || (len < 0) || ((off + len) > b.length) || ((off + len) < 0) || (off > b.length)) 6648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood throw new IndexOutOfBoundsException(); 6748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 6848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood if (len == 0) 6948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood return; 7048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 7148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood c.cm.sendData(c, b, off, len); 7248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood } 7348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 7448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood @Override 7548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public void write(byte[] b) throws IOException 7648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood { 7748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood write(b, 0, b.length); 7848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood } 7948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood} 80