/**************************************************************
 * 
 * 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_XLibraryAccess_idl__ 
#define __com_sun_star_script_XLibraryAccess_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
 
//============================================================================= 
 
 module com {  module sun {  module star {  module script {  
 
//============================================================================= 
/** provides access to additional scripting code.
	
	<p>This code is organized in modules and these modules contain 
	the functions. It is possible to get just the code from a function, 
	but you can also get the whole code of a module with all functions in it.</p>
	@deprecated
 */
published interface XLibraryAccess: com::sun::star::uno::XInterface
{ 
	//------------------------------------------------------------------------- 
	/** returns <TRUE/>, if the function is accessible through this library; 
		otherwise it returns <FALSE/>. 
				 
				@param aFunctionName  
				the fully qualified name of a funtion. 
				(e.g., "UtilLibrary.ModuleDate.FunctionCurrentDate")
	 */
	boolean isFunction( [in] string aFunctionName ); 
 
	//------------------------------------------------------------------------- 
	/** returns <TRUE/> if a fully qualified function name begins with this name. 
				 
				@param aPathName	 
				a part of a function name (e.g., "UtilLibrary").
	 */
	boolean isValidPath( [in] string aPathName ); 
 
	//------------------------------------------------------------------------- 
	/** Return all module names which contain code. 
		 e.g., { "UtilLibrary.ModuleDate", "UtilLibrary.Output", ... }
	 */
	sequence<string> getModuleNames(); 
 
	//------------------------------------------------------------------------- 
	/** get the source code of a module.
	 */
	string getModuleSource( [in] string aModulName ); 
 
	//------------------------------------------------------------------------- 
	/** Get the hole compiled code of a module. 
		
		@param ModuleName the full qualified name of a module. 
							(e.g., "UtilLibrary.ModuleDate") 
		@return			an empty sequence, if this module is not found or the 
							code is not compiled.
	 */
	sequence<byte> getModuleCode( [in] string aModuleName ); 
 
	//------------------------------------------------------------------------- 
	/** get the source code of a function.
	 */
	string getFunctionSource( [in] string aFunctionName ); 
 
	//------------------------------------------------------------------------- 
	/** Get the compiled code of a function. 
		
		@param FunctionName the full qualified name of a function. 
							(e.g., "UtilLibrary.ModuleDate.Function.CurrentDate") 
		@return			an empty sequence, if this function is not found.
	 */
	sequence<byte> getFunctionCode( [in] string FunctionName ); 
 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
