package org.eclipse.update.core;

/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */

import java.io.InputStream;
import org.eclipse.core.runtime.CoreException;

/**
 * A PluginContainer manages plug-in archives.
 * A feature and a site are plugin container as they both
 * logically or physically manage the archives that contain
 * plug-ins.
 * 
 */
//FIXME: javadoc

public interface IPluginContainer {
	/**
	 * Returns an array of plug-ins managed by the container
	 * 
	 * @return the accessible plug-ins. Returns an empty array
	 * if there are no plug-ins.
	 */
	IPluginEntry [] getPluginEntries()  ;
	
	/**
	 * Returns the number of managed plug-ins
	 * @return the number of plug-ins
	 */
	int getPluginEntryCount() ;
	
	/**
	 * Size of the archives in Kilo-Bytes
	 * @return the size of the archive to be downloaded
	 */
	int getDownloadSize(IPluginEntry entry) ;
	
	/**
	 * Size of the plug-in in KiloBytes
	 * @return the size of the plug-in when installed
	 */
	int getInstallSize(IPluginEntry entry) ;

	/**
	 * Adds a pluginEntry to the list of managed pluginEntry
	 * 
	 * @param entry the plugin entry
	 */	
	void addPluginEntry(IPluginEntry pluginEntry);
	
	/**
	 * Create a file in a plugin 
	 * 
	 * @param entry the plugin entry
	 * @param name the file to be created in the plugin
	 * @param inStream the content of the remote file to be transfered in the new file
	 */
	void store(IPluginEntry entry, String name, InputStream inStream) throws CoreException;
	
}

