/**************************************************************
 * 
 * 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_StorageStream_idl__
#define __com_sun_star_embed_StorageStream_idl__

#ifndef __com_sun_star_embed_XEncryptionProtectedSource_idl__ 
#include <com/sun/star/embed/XEncryptionProtectedSource.idl>
#endif

#ifndef __com_sun_star_lang_XComponent_idl__ 
#include <com/sun/star/lang/XComponent.idl>
#endif

#ifndef __com_sun_star_beans_XPropertySet_idl__ 
#include <com/sun/star/beans/XPropertySet.idl>
#endif

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

#ifndef __com_sun_star_io_XSeekable_idl__ 
#include <com/sun/star/io/XSeekable.idl>
#endif



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

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

//============================================================================
/**  This is a service that represents a stream that can be provided by
	<type>XStorage</type>::openStreamElement() call implemented by
	<type>Storage</type> service.

	<p>
	In case a stream is open with readwrite access only one instance
	of the stream can exist.
	</p>
 */
published service StorageStream
{
	// -----------------------------------------------------------------------
	/** allows to get access to <type scope="com::sun::star::io">XInputStream</type>
		and <type scope="com::sun::star::io">XOutputStream</type>
		implementations.

		<p>
		In case the storage stream is open readonly the returned reference 
		to <type scope="com::sun::star::io">XOutputStream</type> will be
		empty.
		</p>
	*/
	interface ::com::sun::star::io::XStream;

	// -----------------------------------------------------------------------
	/** allows to control object lifetime.

		<p>
		A storage stream is created by a storage and has a restrictions
		depending on the mode the stream is opened in.
		</p>

		<p>
		In case a stream is opened with read-write access only one instance of
		the stream can exist. It means that the stream can not be reopened
		even for readonly access until the readwrite instance is disposed.
		From the other side it is possible to open multiple streams for
		readonly access. But because of the rule mentioned above it will not
		be possible to open the stream for read-write access until all the
		readonly instances are disposed.
		</p>

		<p>
		The stream must be disposed by
		<member scope="com::sun::star::lang">XComponent::dispose()</member>
		call or by explicit closing of input and output ( if provided )
		streams implementations with
		<member scope="com::sun::star::io">XInputStream::closeInput()</member>
		and 
		<member scope="com::sun::star::io">XOutputStream::closeOutput()</member>
		calls.
		</p>

		<p>
		When a stream is disposed all the changes that were done for it are
		automatically flashed, so that they becomes visible from parent
		storage. It is also possible to flash the stream explicitly.
		</p>

		<p>
		In case parent storage is disposed the stream is disposed
		automatically.
		</p>

		<p>
		In case a stream is disposed any call to it's methods should result in
		<type scope="com::sun::star::lang">DisposedException</type>.
		</p>
	 */
	interface ::com::sun::star::lang::XComponent;

	// -----------------------------------------------------------------------
	/** allows to get access to stream properties.
	 */
	interface ::com::sun::star::beans::XPropertySet;
	
	// -----------------------------------------------------------------------
	/** allows to seek to a specified position within the stream.
		
		<p>
		This interface must be supported in case either seekable readonly
		or read-write access is requested.
		</p>
	 */
	[optional]
	interface ::com::sun::star::io::XSeekable;

	// -----------------------------------------------------------------------
	/** allows to set password to the stream.
	
		<p>
		This interface must be supported by a stream with readwrite access
		to allow to set a password that should be used next time the
		stream is stored. 
		</p>

		<p>
		If the password is set or changed by this interface and the
		stream is closed the new password should be used to get access to the
		stream next time.
		</p>
	 */
	[optional]
	interface ::com::sun::star::embed::XEncryptionProtectedSource;

	// -----------------------------------------------------------------------
	/** allows to get and set media type of the stream.
	 */
	[property] string MediaType;

	// -----------------------------------------------------------------------
	/** specifies if the stream should be compressed next time it is stored.
	 */
	[property] boolean IsCompressed;

	// -----------------------------------------------------------------------
	/** allows to detect if the stream is encrypted.

		<p>
		The property value <TRUE/> means that the stream is currently encrypted.
		<FALSE/> - the stream is not encrypted.
		</p>

		<p>
		If somebody sets a password explicitly by using
		<type>XEncryptionProtectedSource</type> interface the value is
		automatically set to <TRUE/>. If the interface is used to remove
		the encryption - the value is automatically set to <FALSE/>.
		</p>

	 */
	[property, readonly] boolean IsEncrypted;

	// -----------------------------------------------------------------------
	/** specifies whether the stream will become encrypted next time the
		common storage password holder is committed.

		<p>
		The property value <TRUE/> means that the stream will become encrypted
		after the closest storage in the parent hierarchy, that has common
		storage password, is committed.
		<FALSE/> - the stream will not react to commit of such a storage.
		</p>

		<p>
		In case stream is not encrypted and the property is set to <TRUE/>,
		the stream will stay nonencrypted until the closest storage
		in the parent hierarchy, that has common storage password, is committed.
		On the commit the stream will be encrypted with the common storage
		password. If there is no such storage in the hierarchy the stream
		will not be encrypted at all.
		Thus this property must be set very carefully.
		</p>

		<p>
		If somebody sets a password explicitly by using
		<type>XEncryptionProtectedSource</type> interface the value is
		automatically set to <FALSE/> and the stream becomes encrypted
		with specified password immediately.
		</p>

		<p>
		In case stream is encrypted one and the value is set to <TRUE/>
		the stream becomes nonencrypted until the common storage password
		holder is committed. The data about previously set password ( if any )
		will be removed and the stream can be accessed as nonencrypted stream.
		</p>
	 */
	[property] boolean UseCommonStoragePasswordEncryption;

	// -----------------------------------------------------------------------
	/** allows to detect size of the stream in bytes.
	 */
	[property, readonly] long Size;
};

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

}; }; }; };

#endif

