/**************************************************************
 * 
 * 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_script_XStorageBasedLibraryContainer_idl__
#define __com_sun_star_script_XStorageBasedLibraryContainer_idl__

#ifndef __com_sun_star_embed_XStorage_idl__
#include <com/sun/star/embed/XStorage.idl>
#endif
#ifndef __com_sun_star_script_XPersistentLibraryContainer_idl__
#include <com/sun/star/script/XPersistentLibraryContainer.idl>
#endif

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

module com { module sun { module star { module script { 

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

/** is the interface for an <type>XLibraryContainer</type> which can be made
    persistent in an <type scope="com::sun::star::embed">XStorage</type>.

    <p>A persistent library container is associated with a root storage. The
    container is responsible for a particular sub storage of the root storage,
    the container storage.</p>

    @since OOo 2.3
 */
interface XStorageBasedLibraryContainer
{
    interface XPersistentLibraryContainer;

    /** denotes the root storage associated with the container.

        <p>Effectively, this attribute is a typed version of
        <member>XPersistentLibraryContainer::RootLocation</member>, it's guaranteed
        that at every time, <code>XPersistentLibraryContainer::RootLocation</code> and
        <code>RootStorage</code> have the same value.</p>

        <p>You should only <em>set</em> this attribute to a new value if you previously
        called storeLibrariesToStorage with the same storage. Setting this attribute
        to a storage into which the container has not been stored previously might
        result in unexpected behaviour.</p>
    */
    [attribute] ::com::sun::star::embed::XStorage RootStorage
    {
        set raises ( ::com::sun::star::lang::IllegalArgumentException );
    };

    /** stores the libraries to a storage other than the current container storage

        <p>Note that the library continer is not automatically associated with the
        new root storage. Instead, you need to manually set the <type>RootStroage</type>
        attribute afterwards. This separation allows for Save-To as well Save-As
        operations.</p>

        @param RootStorage
            denotes the root storage into which the libraries should be written, which
            must not be <NULL/>.<br/>
            Note that the actual libraries are written into a sub storage of this
            root storage, as usual.

        @throws ::com::sun::star::lang::IllegalArgumentException
            if the <code>RootStorage</code> parameter is <NULL/>, or equals
            <member>RootStorage</member>.

        @throws ::com::sun::star::lang::WrappedTargetException
            if an error occurs during storing.
    */
    void    storeLibrariesToStorage( [in] ::com::sun::star::embed::XStorage RootStorage )
        raises ( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException );
};

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

}; }; }; };

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

#endif
