Mercurial > 510Connectbot
diff app/src/main/java/ch/ethz/ssh2/SCPInputStream.java @ 438:d29cce60f393
migrate from Eclipse to Android Studio
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Thu, 03 Dec 2015 11:23:55 -0800 |
parents | src/ch/ethz/ssh2/SCPInputStream.java@071eccdff8ea |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/src/main/java/ch/ethz/ssh2/SCPInputStream.java Thu Dec 03 11:23:55 2015 -0800 @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2011 David Kocher. All rights reserved. + * Please refer to the LICENSE.txt for licensing details. + */ +package ch.ethz.ssh2; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +/** + * @version $Id: SCPInputStream.java 151 2014-04-28 10:03:39Z dkocher@sudo.ch $ + */ +public class SCPInputStream extends BufferedInputStream { + private Session session; + + /** + * Bytes remaining to be read from the stream + */ + private long remaining; + + public SCPInputStream(SCPClient client, Session session) throws IOException { + super(session.getStdout()); + this.session = session; + OutputStream os = new BufferedOutputStream(session.getStdin(), 512); + os.write(0x0); + os.flush(); + final SCPClient.LenNamePair lnp; + + while (true) { + int c = session.getStdout().read(); + + if (c < 0) { + throw new IOException("Remote scp terminated unexpectedly."); + } + + String line = client.receiveLine(session.getStdout()); + + if (c == 'T') { + /* Ignore modification times */ + continue; + } + + if ((c == 1) || (c == 2)) { + throw new IOException("Remote SCP error: " + line); + } + + if (c == 'C') { + lnp = client.parseCLine(line); + break; + } + + throw new IOException("Remote SCP error: " + ((char) c) + line); + } + + os.write(0x0); + os.flush(); + this.remaining = lnp.length; + } + + @Override + public int read() throws IOException { + if (!(remaining > 0)) { + return -1; + } + + int b = super.read(); + + if (b < 0) { + throw new IOException("Remote scp terminated connection unexpectedly"); + } + + remaining -= 1; + return b; + } + + @Override + public int read(byte b[], int off, int len) throws IOException { + if (!(remaining > 0)) { + return -1; + } + + int trans = (int) remaining; + + if (remaining > len) { + trans = len; + } + + int read = super.read(b, off, trans); + + if (read < 0) { + throw new IOException("Remote scp terminated connection unexpectedly"); + } + + remaining -= read; + return read; + } + + @Override + public void close() throws IOException { + try { + session.getStdin().write(0x0); + session.getStdin().flush(); + } + finally { + if (session != null) { + session.close(); + } + } + } +}