/**************************************************************
 * 
 * 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_XLibraryContainerPassword_idl__ 
#define __com_sun_star_script_XLibraryContainerPassword_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
#ifndef __com_sun_star_lang_IllegalArgumentException_idl__ 
#include <com/sun/star/lang/IllegalArgumentException.idl> 
#endif 
 
#ifndef __com_sun_star_container_NoSuchElementException_idl__ 
#include <com/sun/star/container/NoSuchElementException.idl> 
#endif 
 

//============================================================================= 
 
 module com {  module sun {  module star {  module script {  
 
//============================================================================= 
 
/** 
	Extension of XLibraryContainer to provide password functionality.
	This interface should be implemented together with XLibraryContainer2
	</p>
 */
published interface XLibraryContainerPassword:  com::sun::star::uno::XInterface
{ 
	/** 
		Returns true if the accessed library item is protected
		by a password.

		If a library with the this name doesn't exist a 
		com::sun::star::container::NoSuchElementException is thrown.
	 */
	boolean isLibraryPasswordProtected( [in] string Name )
			raises( com::sun::star::container::NoSuchElementException ); 

	/** 
		Returns true if the accessed library item is protected by a 
		password (see isLibraryPasswordProtected) and the password 
		was already verified with verifyLibraryPassword or if an 
		initial password was set with changeLibraryPassword.

		If a library with the this name doesn't exist a
		com::sun::star::container::NoSuchElementException is thrown.

		If the library exists but isn't password protected a
		com::sun::star::lang::IllegalArgumentException is thrown.
	 */
	boolean isLibraryPasswordVerified( [in] string Name )
			raises( com::sun::star::lang::IllegalArgumentException, 
					com::sun::star::container::NoSuchElementException );

	/** 
		Verifies the library's password. If the correct password
		was passed, the method returns true and further calls to
		isLibraryPasswordVerified will also return true.

		If a library with the this name doesn't exist a
		com::sun::star::container::NoSuchElementException is thrown.

		If the library exists but isn't password protected a
		com::sun::star::lang::IllegalArgumentException is thrown.

		If the library password is already verified a
		com::sun::star::lang::IllegalArgumentException is thrown.
	 */
	boolean verifyLibraryPassword( [in] string Name, [in] string Password )
			raises( com::sun::star::lang::IllegalArgumentException, 
					com::sun::star::container::NoSuchElementException );

	/** 
		Changes the library's password. 
		
		If the library wasn't password protected before:
		The OldPassword parameter has to be an empty string. 
		Afterwards calls to isLibraryPasswordProtected and 
		isLibraryPasswordVerified for this library will 
		return true.

		If the library already was password protected:
		The OldPassword parameter has to be set to the 
		previous defined password. If then the NewPassword
		parameter is an empty string the library password
		protection will be disabled afterwards (afterwards
		calls to isLibraryPasswordProtected for this library 
		will return false). If the NewPassword parameter is
		not an empty string it will accepted as the new 
		password for the library.
		
		If a library with the this name doesn't exist but isn't
		com::sun::star::container::NoSuchElementException is thrown.

		If the library exists and is password protected and a 
		wrong OldPassword is passed to the method a
		com::sun::star::lang::IllegalArgumentException is thrown.

		If the library exists and isn't password protected and
		the OldPassword isn't an empty string or the library is
		read only a
		com::sun::star::lang::IllegalArgumentException is thrown.
	 */
	void changeLibraryPassword( [in] string Name, 
		[in] string OldPassword, [in] string NewPassword )
			raises( com::sun::star::lang::IllegalArgumentException, 
					com::sun::star::container::NoSuchElementException );

};

//============================================================================= 
 
 
}; }; }; };  
 
#endif 
