/*
  * (non-Javadoc)
  *
  * @see
  * org.eclipse.ecf.provider.filetransfer.outgoing.AbstractOutgoingFileTransfer
  * #hardClose()
  */
 protected void hardClose() {
   try {
     if (remoteFileContents != null && scpUtil != null) {
       scpUtil.sendZeroToStream(responseStream);
       scpUtil.dispose();
       scpUtil = null;
       remoteFileContents = null;
       responseStream = null;
     }
   } catch (final IOException e) {
     exception = e;
   } finally {
     super.hardClose();
     channel = null;
     username = null;
   }
 }
  /*
   * (non-Javadoc)
   *
   * @see
   * org.eclipse.ecf.provider.filetransfer.outgoing.AbstractOutgoingFileTransfer
   * #openStreams()
   */
  protected void openStreams() throws IncomingFileTransferException {
    try {
      // Set input stream from local file
      final URL url = getRemoteFileURL();
      this.username = url.getUserInfo();

      scpUtil = new ScpUtil(this);
      final Session s = scpUtil.getSession();
      s.connect();

      final String command = SCP_COMMAND + scpUtil.trimTargetFile(url.getPath());
      channel = s.openChannel(SCP_EXEC);
      ((ChannelExec) channel).setCommand(command);
      channel.connect();

      final InputStream ins = channel.getInputStream();
      responseStream = channel.getOutputStream();
      scpUtil.sendZeroToStream(responseStream);

      final int c = checkAck(ins);
      if (c != 'C') throw new IOException(Messages.ScpRetrieveFileTransfer_EXCEPTION_SCP_PROTOCOL);
      // read '0644 '
      final byte[] buf = new byte[1024];
      ins.read(buf, 0, 5);

      setFileLength(readFileSize(ins, buf));
      readFileName(ins, buf);
      // set input stream for reading rest of file
      remoteFileContents = ins;

      scpUtil.sendZeroToStream(responseStream);

      fireReceiveStartEvent();
    } catch (final Exception e) {
      channel = null;
      username = null;
      throw new IncomingFileTransferException(
          NLS.bind(
              Messages.ScpRetrieveFileTransfer_EXCEPTION_CONNECTING, getRemoteFileURL().toString()),
          e);
    }
  }
 /*
  * (non-Javadoc)
  *
  * @see
  * org.eclipse.ecf.provider.filetransfer.retrieve.AbstractRetrieveFileTransfer
  * #handleReceivedData(byte[], int, double,
  * org.eclipse.core.runtime.IProgressMonitor)
  */
 protected void handleReceivedData(byte[] buf, int bytes, double factor, IProgressMonitor monitor)
     throws IOException {
   if (bytes == -1) {
     done = true;
   } else {
     int fileBytes = bytes;
     if ((bytesReceived + bytes) > fileLength) {
       fileBytes = (int) (fileLength - bytesReceived);
     }
     bytesReceived += fileBytes;
     localFileContents.write(buf, 0, fileBytes);
     fireTransferReceiveDataEvent();
     monitor.worked((int) Math.round(factor * fileBytes));
     if (fileBytes != bytes) {
       scpUtil.checkAck(buf[fileBytes], remoteFileContents);
       done = true;
     }
   }
 }