/**************************************************************
 * 
 * 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_mozilla_XProfileDiscover_idl__ 
#define __com_sun_star_mozilla_XProfileDiscover_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
#ifndef __com_sun_star_mozilla_MozillaProductType_idl__ 
#include <com/sun/star/mozilla/MozillaProductType.idl>
#endif 
 
 
 module com {  module sun {  module star {  module mozilla { 
 
 
 
/** is the interface used to list and get information for Mozilla/Thunderbird profiles
	
	
	@see com::sun::star::mozilla::XProfileManager
	@see com::sun::star::mozilla::MozillaBootstrap
 */
published interface XProfileDiscover: com::sun::star::uno::XInterface
{ 
	 
	/** attempts to get the profiles count.

		@param product
			is the product name to get profiles count.Currently support "Mozilla" and "Thunderbird". 
		@returns 
			the profiles count of selected product.

	 */
	long getProfileCount( [in]MozillaProductType product);

	/** attempts to get the profile list for the given product.

		@param product
			is the product name to get profile list.Currently support "Mozilla" and "Thunderbird". 
		@param list
			is a list of all profile of the given product.
		@returns 
			the profile count for the given product.

	 */
	long getProfileList( [in]MozillaProductType product,[out] sequence<string> list);

	/** attempts to get the default profile name for the given product.

		@param product
			is the product name to get default profile.Currently support "Mozilla" and "Thunderbird". 
		@returns 
			the default profile name for the given product.

	 */
	string getDefaultProfile( [in]MozillaProductType product);

 
	/** attempts to get the full path for the given profile.

		@param product
			is the product name to get profile path.Currently support "Mozilla" and "Thunderbird". 
		@param profileName
			the profile name to get full path.
		@returns 
			the full path of the given profile.

	 */
	string getProfilePath( [in]MozillaProductType product,[in]string profileName);

	/** attempts to get whether profile is locked by other applications.

		@param product
			is the product name to get profile path.Currently support "Mozilla" and "Thunderbird". 
		@param profileName
			the profile name to check.
		@returns 
			true is the given profile is locked.

	 */
	boolean isProfileLocked( [in]MozillaProductType product,[in]string profileName);

	/** return true if the given profile exists

		@param product
			is the product name to get profile path.Currently support "Mozilla" and "Thunderbird". 
		@param profileName
			the profile name to check.
		@returns 
			whether given profile exists

	 */
	boolean getProfileExists( [in]MozillaProductType product,[in]string profileName);

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