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