if(new File(localFile).isDirectory()){
prefix = localFile + File.separator;
}
JSch jsch = new JSch();
Session session = jsch.getSession(userName, hostName, hostPort);
session.setUserInfo(userInfo);
logger.debug("A iniciar sess�o...");
session.connect();
// exec 'scp -f rfile' remotely
String command = "scp -f "+remoteFile;
Channel channel = session.openChannel("exec");
((ChannelExec)channel).setCommand(command);
// get I/O streams for remote scp
OutputStream out = channel.getOutputStream();
InputStream in = channel.getInputStream();
logger.debug("A abrir canal...");
channel.connect();
byte[] buf = new byte[1024];
// send '\0'
buf[0] = 0;
out.write(buf, 0, 1);
out.flush();
while(true) {
int c = checkAck(in, logger);
if(c != 'C'){
break;
}
// read '0644 '
in.read(buf, 0, 5);
long filesize = 0L;
while(true) {
if(in.read(buf, 0, 1) < 0){
logger.error("Erro: read bytes count < 0");
_error = true;
break;
}
if(buf[0] == ' ') {
break;
}
filesize = filesize * 10L + (long)(buf[0] - '0');
}
String file = null;
for(int i = 0; ; i++){
in.read(buf, i, 1);
if(buf[i] == (byte)0x0a){
file = new String(buf, 0, i);
break;
}
}
logger.debug("filesize=" + filesize+", file=" + file);
// send '\0'
buf[0] = 0;
out.write(buf, 0, 1);
out.flush();
// read a content of localFile
fos = new FileOutputStream(prefix == null ? localFile : prefix + file);
int foo;
while(true) {
if(buf.length < filesize) {
foo = buf.length;
} else {
foo = (int)filesize;
}
foo = in.read(buf, 0, foo);
if(foo < 0) {
logger.error("Erro: read bytes count < 0");
_error = true;
break;
}
fos.write(buf, 0, foo);
filesize -= foo;
if(filesize == 0L) {
break;
}
}
fos.close();
fos = null;
if(checkAck(in, logger) != 0) {
logger.error("Erro ao finalizar ficheiro");
_error = true;
}
// send '\0'
buf[0] = 0;
out.write(buf, 0, 1);
out.flush();
}
logger.debug("A terminar sess�o...");
session.disconnect();
} catch(Exception e) {
logger.error(e);
try{
if(fos != null) {
fos.close();