Package org.eclipse.ecf.internal.provider.xmpp.filetransfer

Source Code of org.eclipse.ecf.internal.provider.xmpp.filetransfer.XMPPIncomingFileTransfer

/****************************************************************************
* Copyright (c) 2004 Composent, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*    Composent, Inc. - initial API and implementation
*****************************************************************************/

package org.eclipse.ecf.internal.provider.xmpp.filetransfer;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import org.eclipse.core.runtime.IAdapterManager;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.filetransfer.IFileRangeSpecification;
import org.eclipse.ecf.filetransfer.IFileTransferListener;
import org.eclipse.ecf.filetransfer.IIncomingFileTransfer;
import org.eclipse.ecf.filetransfer.UserCancelledException;
import org.eclipse.ecf.filetransfer.events.IIncomingFileTransferReceiveDataEvent;
import org.eclipse.ecf.filetransfer.events.IIncomingFileTransferReceiveDoneEvent;
import org.eclipse.ecf.internal.provider.xmpp.Messages;
import org.eclipse.ecf.internal.provider.xmpp.XmppPlugin;

public class XMPPIncomingFileTransfer implements IIncomingFileTransfer {

  public static final int DEFAULT_BUF_LENGTH = 4096;

  protected int buff_length = DEFAULT_BUF_LENGTH;

  ID threadID = null;

  InputStream remoteFileContents = null;
  OutputStream localFileContents = null;
  IFileTransferListener listener = null;

  Exception exception;
  long bytesReceived = 0;
  long fileLength = -1;

  Job job = null;

  boolean done = false;

  String fileName;

  class FileTransferJob extends Job {

    public FileTransferJob(String name) {
      super(name);
    }

    protected IStatus run(IProgressMonitor monitor) {
      final byte[] buf = new byte[buff_length];
      final int totalWork = ((fileLength == -1) ? 100 : (int) fileLength);
      monitor.beginTask(getID().getName()
          + Messages.XMPPIncomingFileTransfer_Progress_Data,
          totalWork);
      try {
        while (!isDone()) {
          if (monitor.isCanceled())
            throw new UserCancelledException(
                Messages.XMPPIncomingFileTransfer_Exception_User_Cancelled);
          final int bytes = remoteFileContents.read(buf);
          if (bytes != -1) {
            bytesReceived += bytes;
            localFileContents.write(buf, 0, bytes);
            fireTransferReceiveDataEvent();
            monitor.worked(bytes);
          } else {
            done = true;
          }
        }
      } catch (final Exception e) {
        exception = e;
        done = true;
      } finally {
        hardClose();
        monitor.done();
        fireTransferReceiveDoneEvent();
      }
      return getFinalStatus(exception);
    }

  }

  protected IStatus getFinalStatus(Throwable exception) {
    return (exception == null) ? new Status(IStatus.OK,
        XmppPlugin.PLUGIN_ID, 0,
        Messages.XMPPIncomingFileTransfer_Status_Transfer_Completed_OK,
        null) : new Status(IStatus.ERROR, XmppPlugin.PLUGIN_ID,
        IStatus.ERROR,
        Messages.XMPPIncomingFileTransfer_Status_Transfer_Exception,
        exception);
  }

  protected void hardClose() {
    try {
      if (remoteFileContents != null) {
        remoteFileContents.close();
      }
    } catch (final IOException e) {
    }
    job = null;
    remoteFileContents = null;
    localFileContents = null;
  }

  protected void fireTransferReceiveDoneEvent() {
    if (listener != null)
      listener.handleTransferEvent(new IIncomingFileTransferReceiveDoneEvent() {

        public IIncomingFileTransfer getSource() {
          return XMPPIncomingFileTransfer.this;
        }

        public Exception getException() {
          return XMPPIncomingFileTransfer.this.getException();
        }

        public String toString() {
          final StringBuffer sb = new StringBuffer(
              "IIncomingFileTransferReceiveDoneEvent["); //$NON-NLS-1$
          sb.append("isDone=").append(done).append(";"); //$NON-NLS-1$ //$NON-NLS-2$
          sb.append("bytesReceived=").append(bytesReceived) //$NON-NLS-1$
              .append("]"); //$NON-NLS-1$
          return sb.toString();
        }
      });
  }

  protected void fireTransferReceiveDataEvent() {
    if (listener != null)
      listener.handleTransferEvent(new IIncomingFileTransferReceiveDataEvent() {
        public IIncomingFileTransfer getSource() {
          return XMPPIncomingFileTransfer.this;
        }

        public String toString() {
          final StringBuffer sb = new StringBuffer(
              "IIncomingFileTransferReceiveDataEvent["); //$NON-NLS-1$
          sb.append("isDone=").append(done).append(";"); //$NON-NLS-1$ //$NON-NLS-2$
          sb.append("bytesReceived=").append(bytesReceived) //$NON-NLS-1$
              .append(";"); //$NON-NLS-1$
          sb.append("percentComplete=").append( //$NON-NLS-1$
              getPercentComplete() * 100).append("]"); //$NON-NLS-1$
          return sb.toString();
        }
      });
  }

  /**
   * @param threadID
   * @param fileName
   * @param inputStream
   * @param outputStream
   * @param fileSize
   * @param listener
   */
  public XMPPIncomingFileTransfer(ID threadID, String fileName,
      InputStream inputStream, OutputStream outputStream, long fileSize,
      IFileTransferListener listener) {
    this.threadID = threadID;
    this.fileName = fileName;
    this.remoteFileContents = inputStream;
    this.localFileContents = outputStream;
    this.fileLength = fileSize;
    this.listener = listener;
    this.job = new FileTransferJob(threadID.getName());
    this.job.schedule();
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * org.eclipse.ecf.filetransfer.IIncomingFileTransfer#getBytesReceived()
   */
  public long getBytesReceived() {
    return bytesReceived;
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ecf.filetransfer.IIncomingFileTransfer#getListener()
   */
  public IFileTransferListener getListener() {
    return listener;
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ecf.filetransfer.IFileTransfer#cancel()
   */
  public void cancel() {
    if (job != null)
      job.cancel();
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ecf.filetransfer.IFileTransfer#getException()
   */
  public Exception getException() {
    return exception;
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ecf.filetransfer.IFileTransfer#getPercentComplete()
   */
  public double getPercentComplete() {
    return ((double) bytesReceived / (double) fileLength);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ecf.filetransfer.IFileTransfer#isDone()
   */
  public boolean isDone() {
    return done;
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
   */
  public Object getAdapter(Class adapter) {
    if (adapter == null)
      return null;
    if (adapter.isInstance(this))
      return this;
    final IAdapterManager adapterManager = XmppPlugin.getDefault()
        .getAdapterManager();
    return (adapterManager == null) ? null : adapterManager.loadAdapter(
        this, adapter.getName());
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ecf.core.identity.IIdentifiable#getID()
   */
  public ID getID() {
    return threadID;
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * org.eclipse.ecf.filetransfer.IIncomingFileTransfer#getFileRangeSpecification
   * ()
   */
  public IFileRangeSpecification getFileRangeSpecification() {
    return null;
  }

  public long getFileLength() {
    return fileLength;
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * org.eclipse.ecf.filetransfer.IIncomingFileTransfer#getRemoteFileName()
   */
  public String getRemoteFileName() {
    return fileName;
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * org.eclipse.ecf.filetransfer.IIncomingFileTransfer#getRemoteLastModified
   * ()
   */
  public Date getRemoteLastModified() {
    // Not supported
    return null;
  }
}
TOP

Related Classes of org.eclipse.ecf.internal.provider.xmpp.filetransfer.XMPPIncomingFileTransfer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.