blob: 3fc77a8978dfe6502244ff4c7a92cf088647a1e8 [file] [log] [blame]
/*
* 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:$
*/
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 read = super.read();
if (read < 0)
{
throw new IOException("Remote scp terminated connection unexpectedly");
}
remaining -= read;
return read;
}
@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();
}
}
}
}