• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
ChannelInputStream(Channel c, boolean isExtended)24 	ChannelInputStream(Channel c, boolean isExtended)
25 	{
26 		this.c = c;
27 		this.extendedFlag = isExtended;
28 	}
29 
30 	@Override
available()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
close()44 	public void close() throws IOException
45 	{
46 		isClosed = true;
47 	}
48 
49 	@Override
read(byte[] b, int off, int len)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
read(byte[] b)75 	public int read(byte[] b) throws IOException
76 	{
77 		return read(b, 0, b.length);
78 	}
79 
80 	@Override
read()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