Home | History | Annotate | Download | only in channel
      1 /*
      2  * Copyright (c) 2006-2011 Christian Plattner. All rights reserved.
      3  * Please refer to the LICENSE.txt for licensing details.
      4  */
      5 package ch.ethz.ssh2.channel;
      6 
      7 import java.io.IOException;
      8 import java.io.InputStream;
      9 
     10 /**
     11  * ChannelInputStream.
     12  *
     13  * @author Christian Plattner
     14  * @version 2.50, 03/15/10
     15  */
     16 public final class ChannelInputStream extends InputStream
     17 {
     18 	Channel c;
     19 
     20 	boolean isClosed = false;
     21 	boolean isEOF = false;
     22 	boolean extendedFlag = false;
     23 
     24 	ChannelInputStream(Channel c, boolean isExtended)
     25 	{
     26 		this.c = c;
     27 		this.extendedFlag = isExtended;
     28 	}
     29 
     30 	@Override
     31 	public int available() throws IOException
     32 	{
     33 		if (isEOF)
     34 			return 0;
     35 
     36 		int avail = c.cm.getAvailable(c, extendedFlag);
     37 
     38 		/* We must not return -1 on EOF */
     39 
     40 		return (avail > 0) ? avail : 0;
     41 	}
     42 
     43 	@Override
     44 	public void close() throws IOException
     45 	{
     46 		isClosed = true;
     47 	}
     48 
     49 	@Override
     50 	public int read(byte[] b, int off, int len) throws IOException
     51 	{
     52 		if (b == null)
     53 			throw new NullPointerException();
     54 
     55 		if ((off < 0) || (len < 0) || ((off + len) > b.length) || ((off + len) < 0) || (off > b.length))
     56 			throw new IndexOutOfBoundsException();
     57 
     58 		if (len == 0)
     59 			return 0;
     60 
     61 		if (isEOF)
     62 			return -1;
     63 
     64 		int ret = c.cm.getChannelData(c, extendedFlag, b, off, len);
     65 
     66 		if (ret == -1)
     67 		{
     68 			isEOF = true;
     69 		}
     70 
     71 		return ret;
     72 	}
     73 
     74 	@Override
     75 	public int read(byte[] b) throws IOException
     76 	{
     77 		return read(b, 0, b.length);
     78 	}
     79 
     80 	@Override
     81 	public int read() throws IOException
     82 	{
     83 		/* Yes, this stream is pure and unbuffered, a single byte read() is slow */
     84 
     85 		final byte b[] = new byte[1];
     86 
     87 		int ret = read(b, 0, 1);
     88 
     89 		if (ret != 1)
     90 			return -1;
     91 
     92 		return b[0] & 0xff;
     93 	}
     94 }
     95