/**************************************************************
 * 
 * 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_frame_XStorable_idl__
#define __com_sun_star_frame_XStorable_idl__

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

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

#ifndef __com_sun_star_beans_PropertyValue_idl__
#include <com/sun/star/beans/PropertyValue.idl>
#endif


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

 module com {  module sun {  module star {  module frame {

//=============================================================================
/** offers a simple way to store a component to an URL.

    <p>
    It is usually only useful for two cases:
	</p>
	<ol>
        <li>
            Large components which are wrapped up in UNO interfaces
            and for which distinct filters are not available separately as
            components.
        </li>
        <li>
            Very small components for which only one or very few hard
            coded file format filters make sense or even exist.
        </li>
	</ol>
 */
published interface XStorable: com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------
    /** The object may know the location because it was loaded from there,
        or because it is stored there.

        @returns
            <TRUE/> if the object knows a location where it is persistent
            <FALSE/> otherwise
	 */
	boolean hasLocation();

	//-------------------------------------------------------------------------
    /** After <member>XStorable::storeAsURL()</member> it returns the
        URL the object was stored to.

        @returns
            the URL of the resource which is represented by this object.
	 */
	string getLocation();

	//-------------------------------------------------------------------------
    /** It is not possible to call <member>XStorable::store()</member> successfully
        when the data store is read-only.

        @returns
            <TRUE/> if the data store is readonly or opened readonly
            <FALSE/> otherwise
	 */
	boolean isReadonly();

	//-------------------------------------------------------------------------
	/** stores the data to the URL from which it was loaded.

		<p>Only objects which know their locations can be stored.</p>

        @throws com::sun::star::io::IOException
            if an IO error occurred during save operation
            (may the location is unknown)

        @see XStorable::storeAsURL
        @see XStorable::storeToURL
	 */
	void store()
			raises( com::sun::star::io::IOException );

	//-------------------------------------------------------------------------
	/** stores the object's persistent data to a URL and
        makes this URL the new location of the object.

        <p>This is the normal behavior for UI's "save-as" feature.</p>

        <p>The change of the location makes it necessary to store the document in
        a format that the object can load. For this reason the implementation of
        <member>XStorable::storeAsURL()</member> will throw an exception if a pure
        export filter is used, it will accept only combined import/export filters.
        For such filters the method <member>XStorable::storeToURL()</member>
        must be used that does not change the location of the object.</p>

        @param sURL
            specifies the new location of this component

        @param lArguments
            optional parameters for saving
            (see <type scope="com::sun::star::document">MediaDescriptor</type> for further details)

        @throws com::sun::star::io::IOException
            if an IO error occurred during save operation
            (may the location is unknown)

        @see XStorable::store
        @see XStorable::storeToURL
        @see com::sun::star::document::MediaDescriptor
	 */
    void storeAsURL(
        [in] string sURL,
        [in] sequence<com::sun::star::beans::PropertyValue> lArguments )
        raises( com::sun::star::io::IOException );

	//-------------------------------------------------------------------------
	/** stores the object's persistent data to a URL and
		continues to be a representation of the old URL.

        <p>This is the normal behavior for UI's export feature.</p>

        <p>This method accepts all kinds of export filters, not only combined
        import/export filters because it implements an exporting capability, not a
        persistence capability.</p>

        @throws com::sun::star::io::IOException
            if an IO error occurred during save operation
            (may the location is unknown)

        @param lArguments
            optional parameters for saving
            (see <type scope="com::sun::star::document">MediaDescriptor</type> for further details)

        @see XStorable::store
        @see XStorable::storeAsURL
        @see com::sun::star::document::MediaDescriptor
	 */
    void storeToURL(
        [in] string sURL,
        [in] sequence<com::sun::star::beans::PropertyValue> lArguments )
        raises( com::sun::star::io::IOException );
};

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

}; }; }; };

#endif
