package com.trilead.ssh2.channel; import java.io.IOException; import java.io.InputStream; /** * ChannelInputStream. * * @author Christian Plattner, plattner@trilead.com * @version $Id: ChannelInputStream.java,v 1.1 2007/10/15 12:49:56 cplattne Exp $ */ public final class ChannelInputStream extends InputStream { Channel c; boolean isClosed = false; boolean isEOF = false; boolean extendedFlag = false; ChannelInputStream(Channel c, boolean isExtended) { this.c = c; this.extendedFlag = isExtended; } public int available() throws IOException { if (isEOF) return 0; int avail = c.cm.getAvailable(c, extendedFlag); /* We must not return -1 on EOF */ return (avail > 0) ? avail : 0; } public void close() throws IOException { isClosed = true; } public int read(byte[] b, int off, int len) throws IOException { if (b == null) throw new NullPointerException(); if ((off < 0) || (len < 0) || ((off + len) > b.length) || ((off + len) < 0) || (off > b.length)) throw new IndexOutOfBoundsException(); if (len == 0) return 0; if (isEOF) return -1; int ret = c.cm.getChannelData(c, extendedFlag, b, off, len); if (ret == -1) { isEOF = true; } return ret; } public int read(byte[] b) throws IOException { return read(b, 0, b.length); } public int read() throws IOException { /* Yes, this stream is pure and unbuffered, a single byte read() is slow */ final byte b[] = new byte[1]; int ret = read(b, 0, 1); if (ret != 1) return -1; return b[0] & 0xff; } }