/**************************************************************
 * 
 * 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_registry_XRegistryKey_idl__
#define __com_sun_star_registry_XRegistryKey_idl__

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

#ifndef __com_sun_star_registry_InvalidRegistryException_idl__
#include <com/sun/star/registry/InvalidRegistryException.idl>
#endif

#ifndef __com_sun_star_registry_RegistryKeyType_idl__
#include <com/sun/star/registry/RegistryKeyType.idl>
#endif

#ifndef __com_sun_star_registry_RegistryValueType_idl__
#include <com/sun/star/registry/RegistryValueType.idl>
#endif

#ifndef __com_sun_star_registry_InvalidValueException_idl__
#include <com/sun/star/registry/InvalidValueException.idl>
#endif


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

module com { module sun { module star { module registry { 

//=============================================================================
/** makes structural information (except regarding tree structures)
	of a single registry key accessible.
	
	<p>This is the main interface for registry keys.<p>
	
	@see XSimpleRegistry
*/
published interface XRegistryKey: com::sun::star::uno::XInterface
{
	//---------------------------------------------------------------------
	/** This is the key of the entry relative to its parent.<p>

		<p>The access path starts with the root "/" and all parent
		entry names are delimited with slashes "/" too, like in a
		UNIX (R) file system. Slashes which are part of single names
		are represented as hexadecimals preceded with a "%" like in
		URL syntax.
	 */
	[readonly, attribute] string	KeyName;

	//-------------------------------------------------------------------------
	/** checks if the key can be overwritten.
		
		@throws InvalidRegistryException	 
		if the registry is not open.
	*/
	boolean isReadOnly()
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	/** checks if the key points to an open valid key in the data-source.
	*/
	boolean isValid();

	//-------------------------------------------------------------------------
	/** @returns
		the type of the specified key.
		
		@param rKeyName
		specifies the relative path from the current key to
		the key of the type which will be returned. 
		
		@throws InvalidRegistryException	 
		if the registry is not open.
	*/
	com::sun::star::registry::RegistryKeyType getKeyType( [in] string rKeyName )
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	/** @returns 
		the type of the key value or NOT_DEFINED if the key has no value.
		
		@throws InvalidRegistryException	 
		if the registry is not open.
	*/
	com::sun::star::registry::RegistryValueType getValueType()
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	/** @returns 
		a long value if the key contains one.
		
		@throws InvalidRegistryException	 
		if the registry is not open.
		
		@throws InvalidValueException	 
		if the value is not of type long.  
	*/
	long getLongValue()
			raises( com::sun::star::registry::InvalidRegistryException,
					com::sun::star::registry::InvalidValueException );

	//-------------------------------------------------------------------------
	/** sets a long value to the key.
		
		<p>If the key already has a value, the value will be
		overridden. 
		
		@throws InvalidRegistryException	 
		if the registry is not open.
	*/
	void setLongValue( [in] long value )
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	// DOCUMENTATION CHANGED FOR XRegistryKey::getLongListValue
	/** @returns
		a sequence of longs if the key contains a long list value.
	  	
	 	@throws InvalidRegistryException
	 	if the registry is not open.
	 	
	 	@throws InvalidValueException
	 	if the actual value is not of type long list.
	*/
	sequence<long> getLongListValue()
			raises( com::sun::star::registry::InvalidRegistryException,
					com::sun::star::registry::InvalidValueException );

	//-------------------------------------------------------------------------
	/** sets a long list value to the key.
		
		<p>If the key already has a value, the value will be
		overridden. 
		
		@throws InvalidRegistryException	 
		if the registry is not open.
	*/
	void setLongListValue( [in] sequence<long> seqValue )
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	// DOCUMENTATION CHANGED FOR XRegistryKey::getAsciiValue
	/** @returns
		an ascii string value if the key contains one.
	 
	 	@throws InvalidRegistryException
	 	if the registry is not open.

	 	@throws InvalidValueException
	 	if the actual value is not of type ascii.
	*/
	string getAsciiValue()
			raises( com::sun::star::registry::InvalidRegistryException,
					com::sun::star::registry::InvalidValueException );

	//-------------------------------------------------------------------------
	/** sets an ASCII string value to the key.
		
		<p>The high byte of the string should be NULL.  If not, there
		is no guarantee that the string will be correctly transported.
		If the key already has a value, the value will be overridden. 
		
		@throws InvalidRegistryException	 
		if the registry is not open.
	*/
	void setAsciiValue( [in] string value )
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	// DOCUMENTATION CHANGED FOR XRegistryKey::getAsciiListValue
	/** @returns
		a sequence of ascii strings if the key contains an asci list value.
	 
	 	@throws InvalidRegistryException
	 	if the registry is not open.
	 	
	 	@throws InvalidValueException
	 	if the actual value is not of type ascii list.
	*/
	sequence<string> getAsciiListValue()
			raises( com::sun::star::registry::InvalidRegistryException,
					com::sun::star::registry::InvalidValueException );

	//-------------------------------------------------------------------------
	/** sets an ASCII string list value to the key.
		
		<p>The high byte of the string should be NULL. If not, there
		is no guarantee that the string will be correctly transported.
		If the key already has a value, the value will be overridden. 
		
		@throws InvalidRegistryException	 
		if the registry is not open.
	*/
	void setAsciiListValue( [in] sequence<string> seqValue )
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	// DOCUMENTATION CHANGED FOR XRegistryKey::getStringValue
	/** @returns
		a unicode string value if the key contains one.
	 
	 	@throws InvalidRegistryException
	 	if the registry is not open.
	 	
	 	@throws InvalidValueException
	 	if the actual value is not of type string.
	*/
	string getStringValue()
			raises( com::sun::star::registry::InvalidRegistryException,
					com::sun::star::registry::InvalidValueException );

	//-------------------------------------------------------------------------
	/** sets a unicode string value to the key.
		
		<p> If the key already has a value, the value will be
		overridden. 
		
		@throws InvalidRegistryException	 
		if the registry is not open.
	*/
	void setStringValue( [in] string value )
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	// DOCUMENTATION CHANGED FOR XRegistryKey::getStringListValue
	/** @returns 
		a sequence of unicode strings if the key contains an unicode string list value.
	 
	 	@throws InvalidRegistryException
	 	if the registry is not open.
	 	
	 	@throws InvalidValueException
	 	if the actual value is not of type string list.
	*/
	sequence<string> getStringListValue()
			raises( com::sun::star::registry::InvalidRegistryException,
					com::sun::star::registry::InvalidValueException );

	//-------------------------------------------------------------------------
	/** sets a unicode string value to the key.
		
		<p>If the key already has a value, the value will be overridden. 
		
		@throws InvalidRegistryException
		if the registry is not open.
	*/
	void setStringListValue( [in] sequence<string> seqValue )
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	// DOCUMENTATION CHANGED FOR XRegistryKey::getBinaryValue
	/** @returns 
		a binary value if the key contains one.
	 
	 	@throws InvalidRegistryException
	 	if the registry is not open.
	 	
	 	@throws InvalidValueException
	 	if the actual value is not of type binary.
	*/
	sequence<byte> getBinaryValue()
			raises( com::sun::star::registry::InvalidRegistryException,
					com::sun::star::registry::InvalidValueException );

	//-------------------------------------------------------------------------
	/** sets a binary value to the key.
		
		<p>If the key already has a value, the value will be
		overridden. 
		
		@throws InvalidRegistryException	 
		if the registry is not open.
	*/
	void setBinaryValue( [in] sequence<byte> value )
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	/** opens a sub key of the key.
		
		<p>If the sub key does not exist, the function returns a
		NULL-interface. 
		
		@param aKeyName
		the relative path from the current key to the key
		which will be created. 
		
		@returns 
		a NULL interface if the key does not exist. 
		
		@throws InvalidRegistryException
		if the registry is not open.
	*/
	com::sun::star::registry::XRegistryKey openKey( [in] string aKeyName )
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	/** creates a new key in the registry.<p>
		
		<p>If the key already exists, the function will open the key.
		
		@param aKeyName
		specifies the relative path from the current key to
		the key which will be created. 
		
		@returns 
		a NULL interface if the key could not be created. 
		
		@throws InvalidRegistryException	 
		if the registry is not open, the registry is readonly
		or if the key exists and is of type LINK.
	*/
	com::sun::star::registry::XRegistryKey createKey( [in] string aKeyName )
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	/** closes a key in the registry.
		
		@throws InvalidRegistryException	 
		if the registry is not open.
	*/
	void closeKey()
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	/** deletes a key from the registry.
		
		@param aKeyName
		specifies the relative path from the current key to
		the key which will be deleted. 
		
		@throws InvalidRegistryException	 
		if the registry is not open, the registry is readonly,
		the key does not exists or if the key is of type LINK.
	*/
	void deleteKey( [in] string rKeyName )
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	// DOCUMENTATION CHANGED FOR XRegistryKey::openKeys
	/** opens all subkeys of the key. If a subkey is a link, the link will be 
		resolved and the appropriate key will be opened.
	 
	   	@returns
	   	an empty sequence if the key has no subkeys. 
	 
	   	@throws InvalidRegistryException
	   	if the registry is not open.
	*/
	sequence<com::sun::star::registry::XRegistryKey> openKeys()
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	// DOCUMENTATION CHANGED FOR XRegistryKey::getKeyNames
	/** @returns a sequence with the names of all subkeys of the key.
	  	If the key has no subkeys, the function returns an empty sequence. If a subkey is 
	   	a link, the name of the link will be returned.
	 
	 	@throws InvalidRegistryException
	 	if the registry is not open.
	 */
	sequence<string> getKeyNames()
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	/** creates a new link in the registry.
		
		@returns 
		<TRUE/> if the link was created. If the link already
		exists or the link target does not exist, the
		function returns <FALSE/>.
		
		@param aLinkName
		specifies the relative path from the current key to
		the link which will be created. 
		
		@param aLinkTarget
		specifies the full path of the key which will be
		referenced by the link. 
		
		@throws InvalidRegistryException	 
		if the registry is not open or the registry is
		readonly.
		
	*/
	boolean createLink( [in] string aLinkName,
			 [in] string aLinkTarget )
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	/** deletes a link from the registry.
		
		@param aLinkName
		specifies the relative path from the current key to
		the link which will be deleted. 
		
		@throws InvalidRegistryException	
		if the registry is not open, the registry is readonly,
		or if the link does not exist.
	*/
	void deleteLink( [in] string rLinkName )
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	// DOCUMENTATION CHANGED FOR XRegistryKey::getLinkTarget
	/** @returns
		the target (complete path of a key) of the link specified by rLinkName.
	 
	 	@param rLinKName
		specifies the relative path from the current key to 
		the link which target will be returned. 
	 
	 	@throws InvalidRegistryException
	 	if the registry is not open or the link does not exists.
	*/
	string getLinkTarget( [in] string rLinkName )
			raises( com::sun::star::registry::InvalidRegistryException );

	//-------------------------------------------------------------------------
	// DOCUMENTATION CHANGED FOR XRegistryKey::getResolvedName
	/** @returns 
		the resolved name of a key. The function resolve the complete name of the key. 
		If a link could not be resolved, the linktarget concatenated with the unresolved rest 
		of the name, will be returned. 
	 
	 	@param rKeyName
	 	specifies a relative path from the current key which will be resolved from all links. 
	 
	 	@throws InvalidRegistryException
	 	if the registry is not open or a recursion was detected. 
	*/
	string getResolvedName( [in] string aKeyName )
			raises( com::sun::star::registry::InvalidRegistryException );

};

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

}; }; }; }; 

#endif
