/**************************************************************
 *
 * 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_XStarBasicLibraryInfo_idl__
#define __com_sun_star_script_XStarBasicLibraryInfo_idl__

#ifndef __com_sun_star_container_XNameContainer_idl__
#include <com/sun/star/container/XNameContainer.idl>
#endif

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

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

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

/** Interface representing a library and provides access to its modules

	@deprecated
 */
published interface XStarBasicLibraryInfo: com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------
	/** returns the library's name
	 */
	string getName();

	//-------------------------------------------------------------------------
	/** returns
		the module container giving access to the modules stored in the library.
		The container has to be returned in any case, no matter if the library is
		stored embedded, external, or linked.

		@see getExternalSourceURL
		@see getLinkTargetURL
	 */
	com::sun::star::container::XNameContainer getModuleContainer();

	//-------------------------------------------------------------------------
	/** returns
		the dialog container giving access to the dialogs stored in the library.
		The container has to be returned in any case, no matter if the library is
		stored embedded, external, or linked.

		@see getExternalSourceURL
		@see getLinkTargetURL
	 */
	com::sun::star::container::XNameContainer getDialogContainer();

	//-------------------------------------------------------------------------
	/** returns
		the password, if the library is protected with one,
		an empty string otherwise.
	 */
	string getPassword();

	//-------------------------------------------------------------------------
	/** returns an
		URL describing the location where the library is stored if the library
		is stored separately (for example not in the main XML file but in a
		special library format file), an empty string otherwise.
		This information can be useful to optimize the access to the library,
		e.g., for loading on demand.
	 */
	string getExternalSourceURL();

	//-------------------------------------------------------------------------
	/** returns an
		URL describing the location of the library linked to.

		<p>HINT: This method can be removed when there is a generic interface
		for linking. Then the implementation will simply support this
		"XLinked" interface and it can be checked by queryInterface().</p>
	 */
	string getLinkTargetURL();

};

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

}; }; }; };

#endif
