/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/


#ifndef __com_sun_star_packages_Package_idl__ 
#define __com_sun_star_packages_Package_idl__ 
 
#ifndef __com_sun_star_lang_XInitialization_idl__ 
#include <com/sun/star/lang/XInitialization.idl>
#endif

#ifndef __com_sun_star_container_XHierarchicalNameAccess_idl__ 
#include <com/sun/star/container/XHierarchicalNameAccess.idl>
#endif

#ifndef __com_sun_star_lang_XSingleServiceFactory_idl__
#include <com/sun/star/lang/XSingleServiceFactory.idl>
#endif

#ifndef __com_sun_star_util_XChangesBatch_idl__ 
#include <com/sun/star/util/XChangesBatch.idl>
#endif


//============================================================================= 
 
module com {  module sun {  module star {  module packages {  
 
//============================================================================= 
/**	The <type>Package</type> is a service that provides access to a set of
	files and folders contained within a Package. One instance of the 
	Package service exists for each Package file to be manipulated.

	Each instance is created with an argument which specifies the URL of 
	the Package file to which the user requires access. If the instance is
	created without arguments, it must be initialised with the 
	<type scope="com::sun::star::lang">XInitialization</type> service methods 
	before it is a valid instance of the service.
*/
published service Package
{
	/**
	A Package can be initialised with one of the following:
	
	1. A file URL referring to a package.
	2. An XInputStream referring to a package (it must also
	   support an XSeekable interface).
	3. An XStream referring to a package. The XInputStream must support
	   an XSeekable interface, and the XOutputStream must support an
	   XTruncate interface.

	It will throw a css::uno::Exception if initialised with bad data or 
	if the package has an invalid format (for example, a corrupt central d
	irectory record if the file is a ZIP file).
	*/
	interface com::sun::star::lang::XInitialization;
	/**
	This interface is used to get access to any entry within the package
	For example:
		getByHierarchicalName ("folder/subfolder/file1.txt");
	This will return a PackageStream which refers to the specified stream.
	This is also used to get access to a particular folder within the
	Package. For example:
		getByHierarchicalName ("folder/subfolder/");
	This will return a PackageFolder which describes the contents of the specified
	folder.

	Calls to methods of XHierarchicalNameAccess must NOT have a leading slash.
	*/
	interface com::sun::star::container::XHierarchicalNameAccess;
	/**
	This interface is used to create new PackageStream or PackageFolder
	implementation objects for addition to the Package.

	createInstance - creates a new stream implementation object (when first
	created, the new object is not part of the Package). It must be added
	to the PackageFolder in which it will reside using the methods in the
	PackageFolder service.

	createInstanceWithArguments - This accepts one boolean value as an
	argument. If it set to true, a PackageFolder implementation is created,
	if it is set to false, a PackageStream implementation is created.

	Creating and inserting a new stream would be done as follows:

		1. xNewStream = package->createInstanceWithArguments( false );
		2. xDataStream = new MyStreamImpl(). (wherever the data comes from)
		3. xNewStream->setInputStream( xDataStream );
		4. parentFolder->insertByName( "image.png", xNewStream );
	
	Replacing an existing stream would be very similar, except that the
	call ->insertByName would be replaced by ->replaceByName.
	*/
	interface com::sun::star::lang::XSingleServiceFactory;
	/**
	This interface is used to commit any changes to the Package. A new
	Package file will be written with any new or changed streams/folders and
	omitting any PackageStream or PackageFolder that has been removed.
	*/
	interface com::sun::star::util::XChangesBatch;
};
}; }; }; };
 
#endif 
