/**************************************************************
 * 
 * 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 seperately (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 
