diff --git a/src/main/java/net/schmizz/sshj/xfer/scp/SCPDownloadClient.java b/src/main/java/net/schmizz/sshj/xfer/scp/SCPDownloadClient.java index fd1b8873..a4ef197b 100644 --- a/src/main/java/net/schmizz/sshj/xfer/scp/SCPDownloadClient.java +++ b/src/main/java/net/schmizz/sshj/xfer/scp/SCPDownloadClient.java @@ -23,10 +23,8 @@ import java.util.List; import net.schmizz.sshj.common.IOUtils; import net.schmizz.sshj.common.SSHException; -import net.schmizz.sshj.connection.channel.direct.SessionFactory; import net.schmizz.sshj.xfer.FileTransferUtil; import net.schmizz.sshj.xfer.ModeSetter; -import net.schmizz.sshj.xfer.TransferListener; import net.schmizz.sshj.xfer.scp.SCPEngine.Arg; /** Support for uploading files over a connected link using SCP. */ @@ -38,8 +36,8 @@ public final class SCPDownloadClient { private SCPEngine engine; - SCPDownloadClient(SessionFactory host, TransferListener listener, ModeSetter modeSetter) { - engine = new SCPEngine(host, listener); + SCPDownloadClient(SCPEngine engine, ModeSetter modeSetter) { + this.engine = engine; this.modeSetter = modeSetter; } @@ -52,7 +50,7 @@ public final class SCPDownloadClient { } finally { engine.exit(); } - return engine.exitStatus; + return engine.getExitStatus(); } public boolean getRecursive() { @@ -171,7 +169,7 @@ public final class SCPDownloadClient { engine.signal("Remote can start transfer"); final FileOutputStream fos = new FileOutputStream(f); try { - engine.transfer(engine.scp.getInputStream(), fos, engine.scp.getLocalMaxPacketSize(), length); + engine.transfertFromRemote(length, fos); } finally { IOUtils.closeQuietly(fos); } diff --git a/src/main/java/net/schmizz/sshj/xfer/scp/SCPEngine.java b/src/main/java/net/schmizz/sshj/xfer/scp/SCPEngine.java index a2ca68cf..73514b69 100644 --- a/src/main/java/net/schmizz/sshj/xfer/scp/SCPEngine.java +++ b/src/main/java/net/schmizz/sshj/xfer/scp/SCPEngine.java @@ -15,6 +15,7 @@ */ package net.schmizz.sshj.xfer.scp; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -53,17 +54,16 @@ class SCPEngine { } } - static final String SCP_COMMAND = "scp"; + private static final String SCP_COMMAND = "scp"; + private static final char LF = '\n'; - static final char LF = '\n'; + private final Logger log = LoggerFactory.getLogger(getClass()); - final Logger log = LoggerFactory.getLogger(getClass()); - - final SessionFactory host; + private final SessionFactory host; private final TransferListener listener; - Command scp; - int exitStatus; + private Command scp; + private int exitStatus; SCPEngine(SessionFactory host, TransferListener listener) { this.host = host; @@ -161,8 +161,18 @@ class SCPEngine { scp.getOutputStream().write(0); scp.getOutputStream().flush(); } + + void transfertToRemote(LocalFile f, final InputStream src) + throws IOException { + transfer(src, scp.getOutputStream(), scp.getRemoteMaxPacketSize(), f.length()); + } + + void transfertFromRemote(final long length, final FileOutputStream fos) + throws IOException { + transfer(scp.getInputStream(), fos, scp.getLocalMaxPacketSize(), length); + } - void transfer(InputStream in, OutputStream out, int bufSize, long len) + private void transfer(InputStream in, OutputStream out, int bufSize, long len) throws IOException { final byte[] buf = new byte[bufSize]; long count = 0; diff --git a/src/main/java/net/schmizz/sshj/xfer/scp/SCPFileTransfer.java b/src/main/java/net/schmizz/sshj/xfer/scp/SCPFileTransfer.java index 7329989f..00144eea 100644 --- a/src/main/java/net/schmizz/sshj/xfer/scp/SCPFileTransfer.java +++ b/src/main/java/net/schmizz/sshj/xfer/scp/SCPFileTransfer.java @@ -34,11 +34,15 @@ public class SCPFileTransfer } public SCPDownloadClient newSCPDownloadClient() { - return new SCPDownloadClient(sessionFactory, getTransferListener(), getModeSetter()); + return new SCPDownloadClient(getSCPEngine(), getModeSetter()); } public SCPUploadClient newSCPUploadClient() { - return new SCPUploadClient(sessionFactory, getTransferListener(), getModeGetter()); + return new SCPUploadClient(getSCPEngine(), getModeGetter()); + } + + private SCPEngine getSCPEngine() { + return new SCPEngine(sessionFactory, getTransferListener()); } @Override diff --git a/src/main/java/net/schmizz/sshj/xfer/scp/SCPUploadClient.java b/src/main/java/net/schmizz/sshj/xfer/scp/SCPUploadClient.java index eda0cc60..6f09c483 100644 --- a/src/main/java/net/schmizz/sshj/xfer/scp/SCPUploadClient.java +++ b/src/main/java/net/schmizz/sshj/xfer/scp/SCPUploadClient.java @@ -15,7 +15,6 @@ */ package net.schmizz.sshj.xfer.scp; -import java.io.FileFilter; import java.io.IOException; import java.io.InputStream; import java.util.LinkedList; @@ -23,10 +22,8 @@ import java.util.List; import net.schmizz.sshj.common.IOUtils; import net.schmizz.sshj.common.SSHException; -import net.schmizz.sshj.connection.channel.direct.SessionFactory; import net.schmizz.sshj.xfer.LocalFile; import net.schmizz.sshj.xfer.ModeGetter; -import net.schmizz.sshj.xfer.TransferListener; import net.schmizz.sshj.xfer.scp.SCPEngine.Arg; /** Support for uploading files over a connected link using SCP. */ @@ -36,8 +33,8 @@ public final class SCPUploadClient { private SCPEngine engine; - SCPUploadClient(SessionFactory host, TransferListener listener, ModeGetter modeGetter) { - engine = new SCPEngine(host, listener); + SCPUploadClient(SCPEngine engine, ModeGetter modeGetter) { + this.engine = engine; this.modeGetter = modeGetter; } @@ -50,10 +47,7 @@ public final class SCPUploadClient { } finally { engine.exit(); } - return engine.exitStatus; - } - - public void setFileFilter(FileFilter fileFilter) { + return engine.getExitStatus(); } private synchronized void startCopy(LocalFile sourceFile, String targetPath) @@ -102,7 +96,7 @@ public final class SCPUploadClient { final InputStream src = f.stream(); try { engine.sendMessage("C0" + getPermString(f) + " " + f.length() + " " + f.getName()); - engine.transfer(src, engine.scp.getOutputStream(), engine.scp.getRemoteMaxPacketSize(), f.length()); + engine.transfertToRemote(f, src); engine.signal("Transfer done"); engine.check("Remote agrees transfer done"); } finally {