/**************************************************************
 * 
 * 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_embed_XHierarchicalStorageAccess_idl__
#define __com_sun_star_embed_XHierarchicalStorageAccess_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

#ifndef __com_sun_star_io_XStream_idl__
#include <com/sun/star/io/XStream.idl>
#endif

#ifndef __com_sun_star_embed_XExtendedStorageStream_idl__
#include <com/sun/star/embed/XExtendedStorageStream.idl>
#endif

#ifndef __com_sun_star_io_IOException_idl__
#include <com/sun/star/io/IOException.idl>
#endif

#ifndef __com_sun_star_lang_IllegalArgumentException_idl__
#include <com/sun/star/lang/IllegalArgumentException.idl>
#endif

#ifndef __com_sun_star_embed_StorageWrappedTargetException_idl__
#include <com/sun/star/embed/StorageWrappedTargetException.idl>
#endif

#ifndef __com_sun_star_embed_InvalidStorageException_idl__
#include <com/sun/star/embed/InvalidStorageException.idl>
#endif

#ifndef __com_sun_star_packages_WrongPasswordException_idl__
#include <com/sun/star/packages/WrongPasswordException.idl>
#endif

#ifndef __com_sun_star_container_XNameAccess_idl__
#include <com/sun/star/container/XNameAccess.idl>
#endif

#ifndef __com_sun_star_container_NoSuchElementException_idl__
#include <com/sun/star/container/NoSuchElementException.idl>
#endif

#ifndef __com_sun_star_container_ElementExistException_idl__
#include <com/sun/star/container/ElementExistException.idl>
#endif

#ifndef __com_sun_star_packages_NoEncryptionException_idl__
#include <com/sun/star/packages/NoEncryptionException.idl>
#endif


//============================================================================

 module com {  module sun {  module star {  module embed {

//============================================================================
/** This interface allows hierarchical access to storage tree.

	<p>
	Currently only streams can be opened using this interface.
	</p>

	<p>
	The hierarchical access can not be mixed with a normal access. Thus when
	in a storage a stream with a path "a/b/c" is accessed using hierarchical
	access, another stream "a/b/d" can also be opened with hierarchical
	access ( if it is still not opened ), but the substorage "a" can not be
	opened ( it is locked by hierarchical access ).
	</p>
 */
published interface XHierarchicalStorageAccess
{
	// METHODS
	//
	// -----------------------------------------------------------------------
	/** allows to get access to a child stream of the storage, using
		hierarchical path.

		<p>
		In case the stream is open in readonly mode the
		<method scope="com::sun::star::io">XStream::getOutputStream</method>
		method will return an empty reference.
		</p>

		@param sStreamPath
			the path to the substream that should be open
	
		@param nOpenMode
			a mode the stream should be open in,
			can be a combination of <type>ElementModes</type> values

		@throws ::com::sun::star::embed::InvalidStorageException
			this storage is in invalid state for any reason
	
		@throws ::com::sun::star::lang::IllegalArgumentException
			one of provided arguments is illegal

		@throws ::com::sun::star::packages::WrongPasswordException
			the provided password is wrong

		@throws ::com::sun::star::io::IOException
			in case of io errors during stream opening

		@throws ::com::sun::star::embed::StorageWrappedTargetException
			wraps other exceptions
	 */
    XExtendedStorageStream  openStreamElementByHierarchicalName(
			[in] string sStreamPath,
			[in] long nOpenMode )
		raises( ::com::sun::star::embed::InvalidStorageException,
				::com::sun::star::lang::IllegalArgumentException,
				::com::sun::star::packages::WrongPasswordException,
				::com::sun::star::io::IOException,
				::com::sun::star::embed::StorageWrappedTargetException );

	// -----------------------------------------------------------------------
	/** allows to get access to a child encrypted stream with password using
		hierarchical path.

		<p>
		If storage does not allow any encryption this method will always throw
		<type scope="com::sun::star::packages">NoEncryptionException</type>.
		</p>
	
		<p>
		In case the stream is open in readonly mode the
		<method scope="com::sun::star::io">XStream::getOutputStream</method>
		method will return an empty reference.
		</p>

		@param sStreamPath
			the path to the substream that should be open
	
		@param nOpenMode
			a mode the stream should be open in,
			can be a combination of <type>ElementModes</type> values

		@param sPassword
			this parameter allowes to specify a reading password for the
			stream, the password must be a correct one, otherwise an
			exception will be thrown

		@throws ::com::sun::star::embed::InvalidStorageException
			this storage is in invalid state for any reason

		@throws ::com::sun::star::lang::IllegalArgumentException
			one of provided arguments is illegal

		@throws ::com::sun::star::packages::NoEncryptionException
			the stream is not encrypted

		@throws ::com::sun::star::packages::WrongPasswordException
			the provided password is wrong

		@throws ::com::sun::star::io::IOException
			in case of io errors during stream opening

		@throws ::com::sun::star::embed::StorageWrappedTargetException
			wraps other exceptions
	 */
    XExtendedStorageStream  openEncryptedStreamElementByHierarchicalName(
			[in] string sStreamName,
			[in] long nOpenMode,
			[in] string sPassword )
		raises( ::com::sun::star::embed::InvalidStorageException,
				::com::sun::star::lang::IllegalArgumentException,
				::com::sun::star::packages::NoEncryptionException,
				::com::sun::star::packages::WrongPasswordException,
				::com::sun::star::io::IOException,
				::com::sun::star::embed::StorageWrappedTargetException );

	// -----------------------------------------------------------------------
	/** removes a stream specified by hierarchical name from a storage.

		@param sElementPath
			the path to the element to remove
	
		@throws ::com::sun::star::embed::InvalidStorageException
			this storage is in invalid state for eny reason

		@throws ::com::sun::star::lang::IllegalArgumentException
			an illegal argument is provided

		@throws ::com::sun::star::container::NoSuchElementException
			there is no element with such name
		
		@throws ::com::sun::star::io::IOException
			in case of io errors during removing

		@throws ::com::sun::star::embed::StorageWrappedTargetException
			wraps other exceptions

	 */
    void removeStreamElementByHierarchicalName( [in] string sElementPath )
		raises( ::com::sun::star::embed::InvalidStorageException,
				::com::sun::star::lang::IllegalArgumentException,
				::com::sun::star::container::NoSuchElementException,
				::com::sun::star::io::IOException,
				::com::sun::star::embed::StorageWrappedTargetException );

};

//============================================================================

}; }; }; };

#endif

