148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood/*
248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Copyright (c) 2011 David Kocher. All rights reserved.
348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Please refer to the LICENSE.txt for licensing details.
448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */
548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodpackage ch.ethz.ssh2;
648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodimport java.io.BufferedInputStream;
848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodimport java.io.BufferedOutputStream;
948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodimport java.io.IOException;
1048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodimport java.io.InputStream;
1148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
1248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodimport ch.ethz.ssh2.util.StringEncoder;
1348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
1448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood/**
1548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @version $Id:$
1648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */
1748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodpublic class SCPOutputStream extends BufferedOutputStream
1848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood{
1948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
2048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private Session session;
2148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
2248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private SCPClient scp;
2348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
2448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public SCPOutputStream(SCPClient client, Session session, final String remoteFile, long length, String mode) throws IOException
2548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
2648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		super(session.getStdin(), 40000);
2748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		this.session = session;
2848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		this.scp = client;
2948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
3048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		InputStream is = new BufferedInputStream(session.getStdout(), 512);
3148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
3248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		scp.readResponse(is);
3348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
3448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		String cline = "C" + mode + " " + length + " " + remoteFile + "\n";
3548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
3648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		super.write(StringEncoder.GetBytes(cline));
3748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		this.flush();
3848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
3948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		scp.readResponse(is);
4048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
4148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
4248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	@Override
4348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public void close() throws IOException
4448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
4548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		try
4648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
4748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			this.write(0);
4848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			this.flush();
4948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
5048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			scp.readResponse(session.getStdout());
5148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
5248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			this.write(StringEncoder.GetBytes("E\n"));
5348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			this.flush();
5448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
5548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		finally
5648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
5748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			if (session != null)
5848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				session.close();
5948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
6048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
6148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood}
62