/**************************************************************
 * 
 * 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_task_XPasswordContainer_idl__
#define __com_sun_star_task_XPasswordContainer_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

#ifndef __com_sun_star_task_UrlRecord_idl__
#include <com/sun/star/task/UrlRecord.idl>
#endif

#ifndef __com_sun_star_task_XInteractionHandler_idl__
#include <com/sun/star/task/XInteractionHandler.idl>
#endif


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

module com { module sun { module star { module task {

//=============================================================================
/** Allows to save passwords with URL-pattern, to use them later.
*/
published interface XPasswordContainer : com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------
	/** Save passwords in to the container.

		@param Url        URL-pattern, that will be used later to retrieve 
		passwords. 

		@param UseName    The username.

		@param Passwords  The password-list.

		@param Handler    The handler to get superpassword to en/decript passwords


	*/
	void   add( [in] string Url, [in] string UserName, [in] sequence<string> Passwords, [in] XInteractionHandler Handler );

	//-------------------------------------------------------------------------
	/** Save passwords in to the container, and store them in the file.

		@param Url        URL-pattern, that will be used later to retrieve 
						  passwords. 

		@param UseName    The username.

		@param Passwords  The password-list.

		@param Handler    The handler to get superpassword to en/decript passwords


	*/
	void   addPersistent( [in] string Url, [in] string UserName, [in] sequence<string> Passwords, [in] XInteractionHandler Handler );

	//-------------------------------------------------------------------------
	/** Find users with passwords for the url pattern.

		@param Url     URL-pattern to retrieve password for.
 
		@param Handler    The handler to get superpassword to en/decript passwords
		
		@returns       Best matched url-pattern with user-records list.
	*/
	UrlRecord find( [in] string Url, [in] XInteractionHandler Handler );
	
	//-------------------------------------------------------------------------
	/** Find passwords for the url pattern and username.

		@param Url      URL-pattern to retrieve passwords for.

		@param UserName Username to retrieve passwords for.

		@param Handler    The handler to get superpassword to en/decript passwords

		@returns        Best matched url-pattern for the username.
	*/
	UrlRecord findForName( [in] string Url, [in] string UserName , [in] XInteractionHandler Handler );
		
	//-------------------------------------------------------------------------
	/** Remove passwords for the url pattern and username.

		@param Url      URL-pattern to remove passwords for.

		@param UserName Username to remove passwords for.
		
	*/
	void remove( [in] string Url, [in] string UserName );


	//-------------------------------------------------------------------------
	/** Remove passwords for the url pattern and username from the file.

		@param Url      URL-pattern to remove passwords for.

		@param UserName Username to remove passwords for.
		
	*/
	void removePersistent( [in] string Url, [in] string UserName );

	//-------------------------------------------------------------------------
	/** Clean the file.
	*/
	void removeAllPersistent();

	//-------------------------------------------------------------------------
	/** Get all records from the file.

		@returns        List of url-records.
	*/
	sequence<UrlRecord> getAllPersistent( [in] XInteractionHandler Handler );
	
};

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

}; }; }; };

#endif
