/*******************************************************************************
 * Copyright (c) 2004 Composent, Inc. 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.filetransfer;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.ecf.core.identity.IIdentifiable;
import org.eclipse.ecf.filetransfer.events.IFileTransferEvent;

/**
 * File transfer super interface. This interface provides the abstract file
 * transfer semantics for both {@link IOutgoingFileTransfer} and
 * {@link IIncomingFileTransfer} transfer sub interfaces.
 */
public interface IFileTransfer extends IAdaptable, IIdentifiable {
	/**
	 * Cancel this file transfer. If file transfer has already been completed,
	 * then this method has no effect. If the file transfer has not been
	 * completed then calling this method will result in an
	 * {@link IFileTransferEvent} being delivered to the
	 * {@link IFileTransferListener} indicating that transfer is done ({@link #isDone()}
	 * returns true), and some exception will be made available
	 * 
	 */
	public void cancel();

	/**
	 * Get the percent complete for this file transfer. The returned value will
	 * be either -1.0, meaning that the underlying provider does not support
	 * reporting percent complete for this file transfer, or a value between 0
	 * and 1 reflecting the percent complete for this file transfer. If 0.0 no
	 * data has been sent, if 1.0, the file transfer is 100 percent complete.
	 * 
	 * The value returned from this method should <b>not</b> be used to
	 * determine whether the transfer has completed, as it may not show
	 * completion in the event of an transfer failure. Note that the
	 * {@link #isDone()} method should be consulted to determine if the file
	 * transfer has completed (with or without error).
	 * 
	 * @return double percent complete. Returns -1.0 if the underlying provider
	 *         does not support reporting percentage complete, or between 0 and
	 *         1 to indicate actual percent complete for this file transfer
	 */
	public double getPercentComplete();

	/**
	 * Get any exception associated with this file transfer. The value returned
	 * from this method is valid only if {@link #isDone()} method returns true.
	 * If the file transfer completed successfully, {@link #isDone()} will
	 * return true, and this method will return null. If the file transfer
	 * completed unsuccessfully (some exception occurred), then
	 * {@link #isDone()} will return true, and this method will return a
	 * non-null Exception instance that occurred.
	 * <p></p>
	 * If the the file transfer was canceled by the user, then the exception 
	 * returned will be an instance of {@link UserCancelledException}.  
	 * 
	 * @return Exception associated with this file transfer. <code>null</code>
	 *         if transfer completed successfully, non-null if transfer
	 *         completed with some exception. Only valid <b>after</b>
	 *         {@link #isDone()} returns true.
	 */
	public Exception getException();

	/**
	 * Return true if this file transfer is done, false if not yet completed.
	 * The file transfer can be completed successfully, or an exception can
	 * occur and the file transfer will have failed. In either case of
	 * successful or unsuccessful transfer, this method will return true when
	 * the file transfer is complete. To determine whether the transfer
	 * completed <b>successfully</b>, it is necessary to also consult the
	 * {@link #getException()} method.
	 * 
	 * @return boolean true if file transfer is done, false if file transfer is
	 *         still in progress.
	 */
	public boolean isDone();

	/**
	 * Return resulting file length (in bytes) for this file transfer instance.  If the length is not known,
	 * -1 will be returned.  Note that if a {@link IFileRangeSpecification} is provided that the returned
	 * file length is the expected file length of just the range retrieved (and not the entire file).
	 *
	 * @since 2.0
	 */
	public long getFileLength();

}
