/**************************************************************
 * 
 * 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_XPersistentLibraryContainer_idl__
#define __com_sun_star_script_XPersistentLibraryContainer_idl__

#ifndef __com_sun_star_util_XModifiable_idl__ 
#include <com/sun/star/util/XModifiable.idl>
#endif
#ifndef __com_sun_star_script_XLibraryContainer2_idl__ 
#include <com/sun/star/script/XLibraryContainer2.idl>
#endif
#ifndef __com_sun_star_lang_WrappedTargetException_idl__ 
#include <com/sun/star/lang/WrappedTargetException.idl>
#endif

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

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

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

/** describes a container of script libraries which is persistent.

    <p>The type of persistence of the container elements is not defined here,
    but in derived interfaces or services using
    <code>XPersistentLibraryContainer</code>.</p>

    <p>The actual libraries are stored in some object - a sub folder, or a sub storage,
    for example - below the root location.</p>

    @since OOo 2.3
 */
interface XPersistentLibraryContainer
{
    interface ::com::sun::star::util::XModifiable;
    interface XLibraryContainer2;

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

        <p>The type of this location - it might be a folder in a file system,
        a storage, or anything else - is not specified here, but in derived interfaces
        or services implementing <code>XPersistentLibraryContainer</code>.</p>

        <p>All operations of the library container take place in a location below
        the root location, the so-called container location, whose
        name is exposed as <member>ContainerLocationName</member>.</p>

        @see ContainerLocationName
    */
    [attribute, readonly] any   RootLocation;

    /** denotes the name of the sub location where the container elements are
        actually stored.

        @see RootLocation
    */
    [attribute, readonly] string ContainerLocationName;

    /** stores the libraries to the current location.

        @throws ::com::sun::star::lang::WrappedTargetException
            if an error occurs during storing.

        @see RootLocation
        @see ContainerLocationName
    */
    void    storeLibraries()
        raises ( ::com::sun::star::lang::WrappedTargetException );

};

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

}; }; }; };

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

#endif

