/*******************************************************************************
 * Copyright (c) 2008 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
 *               Cloudsmith, Inc. - additional API and implementation
 ******************************************************************************/
package org.eclipse.ecf.filetransfer.events;

import java.io.*;
import java.util.Map;
import org.eclipse.ecf.filetransfer.*;
import org.eclipse.ecf.filetransfer.identity.IFileID;

/**
 * Event sent to {@link IFileTransferListener} associated with
 * {@link IIncomingFileTransfer} instances when file transfer is resumed.
 * 
 */
public interface IIncomingFileTransferReceiveResumedEvent extends IIncomingFileTransferEvent {

	/**
	 * Get IFileID for incoming file
	 * 
	 * @return IFileID for this file transfer event. Will not be
	 *         <code>null</code>.
	 */
	public IFileID getFileID();

	/**
	 * Get incoming file transfer object by specifying a local File instance to
	 * save the received contents to.
	 * 
	 * @param localFileToSave
	 *            the file on the local file system to receive and save the
	 *            remote file. Must not be <code>null</code>.
	 * @param append
	 *            if <code>true</code>, and data received is appended to the
	 *            given localFileToSave. If <code>false</code>, data are written
	 *            to the beginning of the given localFileToSave, and any
	 *            existing contents are overwritten.
	 * @return IIncomingFileTransfer the incoming file transfer object. Will not
	 *         be <code>null</code>.
	 * @throws IOException
	 *             if localFileToSave cannot be opened for writing.
	 * @since 2.0
	 */
	public IIncomingFileTransfer receive(File localFileToSave, boolean append) throws IOException;

	/**
	 * Just like {@link #receive(File,boolean)} but this method also give the
	 * caller a chance to provide a factory that creates the job that will
	 * perform the actual file transfer. The intended use for this is when the
	 * user of the framework needs more elaborate control over such jobs such as
	 * waiting for a group of parallel file transfers to complete. Such
	 * functionality can for instance exploit the Eclipse runtime concept of Job
	 * families.
	 * 
	 * @param localFileToSave
	 *            the file on the local file system to receive and save the
	 *            remote file. Must not be <code>null</code>.
	 * @param append
	 *            if <code>true</code>, and data received is appended to the
	 *            given localFileToSave. If <code>false</code>, data are written
	 *            to the beginning of the given localFileToSave, and any
	 *            existing contents are overwritten.
	 * @param fileTransferJob
	 *            A subclass of {@link FileTransferJob} to use to run the actual
	 *            transfer. If <code>null</code>, provider will create default
	 *            implementation. NOTE: the given job should *not* be
	 *            scheduled/started prior to being provided as parameter to this
	 *            method.
	 * @return IIncomingFileTransfer the incoming file transfer object. NOTE:
	 *         the caller is responsible for calling
	 *         {@link OutputStream#close()} on the OutputStream provided. If the
	 *         stream provided is buffered, then
	 *         {@link BufferedOutputStream#flush()} should be called to
	 *         guarantee that the data received is actually written to the given
	 *         OutputStream.
	 * @throws IOException
	 *             if streamToStore cannot be opened for writing.
	 * @since 2.0
	 */
	public IIncomingFileTransfer receive(File localFileToSave, FileTransferJob fileTransferJob, boolean append) throws IOException;

	/**
	 * Get incoming file transfer by specifying an OutputStream instance to save
	 * the received contents to. NOTE: the caller is responsible for calling
	 * {@link OutputStream#close()} on the OutputStream provided. If the stream
	 * provided is buffered, then {@link BufferedOutputStream#flush()} should be
	 * called to guaranteed that the data received is actually written to the
	 * given OutputStream.
	 * 
	 * @param streamToStore
	 *            the output stream to store the incoming file. Must not be
	 *            <code>null</code>.
	 * @return IIncomingFileTransfer the incoming file transfer object. NOTE:
	 *         the caller is responsible for calling
	 *         {@link OutputStream#close()} on the OutputStream provided. If the
	 *         stream provided is buffered, then
	 *         {@link BufferedOutputStream#flush()} should be called to
	 *         guarantee that the data received is actually written to the given
	 *         OutputStream.
	 * @throws IOException
	 *             if streamToStore cannot be opened for writing
	 */
	public IIncomingFileTransfer receive(OutputStream streamToStore) throws IOException;

	/**
	 * Just like {@link #receive(OutputStream)} but this method also give the
	 * caller a chance to provide a factory that creates the job that will
	 * perform the actual file transfer. The intended use for this is when the
	 * user of the framework needs more elaborate control over such jobs such as
	 * waiting for a group of parallel file transfers to complete. Such
	 * functionality can for instance exploit the Eclipse runtime concept of Job
	 * families.
	 * 
	 * @param streamToStore
	 *            the output stream to store the incoming file. Must not be
	 *            <code>null</code>.
	 * @param fileTransferJob
	 *            A subclass of {@link FileTransferJob} to use to run the actual
	 *            transfer. If <code>null</code>, provider will create default
	 *            implementation. NOTE: the given job should *not* be
	 *            scheduled/started prior to being provided as a parameter to
	 *            this method.
	 * @return IIncomingFileTransfer the incoming file transfer object. NOTE:
	 *         the caller is responsible for calling
	 *         {@link OutputStream#close()} on the OutputStream provided. If the
	 *         stream provided is buffered, then
	 *         {@link BufferedOutputStream#flush()} should be called to
	 *         guarantee that the data received is actually written to the given
	 *         OutputStream.
	 * @throws IOException
	 *             if streamToStore cannot be opened for writing
	 */
	public IIncomingFileTransfer receive(OutputStream streamToStore, FileTransferJob fileTransferJob) throws IOException;

	/**
	 * Cancel incoming file transfer
	 */
	public void cancel();

	/**
	 * Get response headers.
	 * @return Map of response headers.  <code>null</code> if no headers available.
	 * @since 4.0
	 */
	public Map getResponseHeaders();
}
