/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_registry.hxx"

#include "regkey.hxx"

#include	<registry/registry.hxx>
#include	<rtl/alloc.h>
#include	"regimpl.hxx"
#include	"keyimpl.hxx"

using rtl::OUString;

//*********************************************************************
//	acquireKey
//
void REGISTRY_CALLTYPE acquireKey(RegKeyHandle hKey)
{
	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (pKey != 0)
	{
		ORegistry* pReg = pKey->getRegistry();
		(void) pReg->acquireKey(pKey);
	}
}


//*********************************************************************
//	releaseKey
//
void REGISTRY_CALLTYPE releaseKey(RegKeyHandle hKey)
{
	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (pKey != 0)
	{
		ORegistry* pReg = pKey->getRegistry();
		(void) pReg->releaseKey(pKey);
	}
}


//*********************************************************************
//	isKeyReadOnly
//
sal_Bool REGISTRY_CALLTYPE isKeyReadOnly(RegKeyHandle hKey)
{
	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	return (pKey != 0) ? pKey->isReadOnly() : sal_False;
}


//*********************************************************************
//	getKeyName
//
RegError REGISTRY_CALLTYPE getKeyName(RegKeyHandle hKey, rtl_uString** pKeyName)
{
	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (pKey)
	{
		rtl_uString_assign( pKeyName, pKey->getName().pData );
		return REG_NO_ERROR;
	} else
	{
		rtl_uString_new(pKeyName);
		return REG_INVALID_KEY;
	}
}


//*********************************************************************
//	createKey
//
RegError REGISTRY_CALLTYPE createKey(RegKeyHandle hKey, 
									 rtl_uString* keyName, 
									 RegKeyHandle* phNewKey)
{
	*phNewKey = 0;

	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (!pKey)
		return REG_INVALID_KEY;
		
	if (pKey->isDeleted())
		return REG_INVALID_KEY;

	if (pKey->isReadOnly())
		return REG_REGISTRY_READONLY;

	return pKey->createKey(keyName, phNewKey);
}	

//*********************************************************************
//	openKey
//
RegError REGISTRY_CALLTYPE openKey(RegKeyHandle hKey, 
								   rtl_uString* keyName, 
								   RegKeyHandle* phOpenKey)
{
	*phOpenKey = 0;

	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (!pKey)
		return REG_INVALID_KEY;
		
	if (pKey->isDeleted())
		return REG_INVALID_KEY;

	return pKey->openKey(keyName, phOpenKey);
}	

//*********************************************************************
//	openSubKeys
//
RegError REGISTRY_CALLTYPE openSubKeys(RegKeyHandle hKey, 
									   rtl_uString* keyName, 
									   RegKeyHandle** pphSubKeys, 
									   sal_uInt32* pnSubKeys)
{
	*pphSubKeys = NULL;
	*pnSubKeys = 0;

	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (!pKey)
		return REG_INVALID_KEY;
		
	if (pKey->isDeleted())
		return REG_INVALID_KEY;

	return pKey->openSubKeys(keyName, pphSubKeys, pnSubKeys);
}	

//*********************************************************************
//	closeSubKeys
//
RegError REGISTRY_CALLTYPE closeSubKeys(RegKeyHandle* phSubKeys,
										sal_uInt32 nSubKeys)
{
	if (phSubKeys == 0 || nSubKeys == 0)
		return REG_INVALID_KEY;

	ORegistry* pReg = ((ORegKey*)(phSubKeys[0]))->getRegistry();
	for (sal_uInt32 i = 0; i < nSubKeys; i++)
	{
		(void) pReg->closeKey(phSubKeys[i]);
	}
	rtl_freeMemory(phSubKeys);

	return REG_NO_ERROR;
}	

//*********************************************************************
//	deleteKey
//
RegError REGISTRY_CALLTYPE deleteKey(RegKeyHandle hKey, 
									 rtl_uString* keyName)
{
	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (!pKey)
		return REG_INVALID_KEY;

	if (pKey->isDeleted())
		return REG_INVALID_KEY;

	if (pKey->isReadOnly())
		return REG_REGISTRY_READONLY;

	return pKey->deleteKey(keyName);
}	

//*********************************************************************
//	closeKey
//
RegError REGISTRY_CALLTYPE closeKey(RegKeyHandle hKey)
{
	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (!pKey)
		return REG_INVALID_KEY;

	return pKey->closeKey(hKey);
}	

//*********************************************************************
//	setValue
//
RegError REGISTRY_CALLTYPE setValue(RegKeyHandle hKey, 
								   	rtl_uString* keyName, 
								   	RegValueType valueType, 
								   	RegValue pData, 
								   	sal_uInt32 valueSize)
{
	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (!pKey)
		return REG_INVALID_KEY;

	if (pKey->isDeleted())
		return REG_INVALID_KEY;

	if (pKey->isReadOnly())
		return REG_REGISTRY_READONLY;		

	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
	if (keyName->length)
	{
		ORegKey* pSubKey = 0;
		RegError _ret1 = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
		if (_ret1 != REG_NO_ERROR)
			return _ret1;

        _ret1 = pSubKey->setValue(valueName, valueType, pData, valueSize);
		if (_ret1 != REG_NO_ERROR)
		{
            RegError _ret2 = pKey->closeKey(pSubKey);
			if (_ret2)
				return _ret2;
			else
				return _ret1;
		}
		
		return pKey->closeKey(pSubKey);
	}

	return pKey->setValue(valueName, valueType, pData, valueSize);
}	

//*********************************************************************
//	setLongValueList
//
RegError REGISTRY_CALLTYPE setLongListValue(RegKeyHandle hKey, 
						   		 	  		rtl_uString* keyName, 
				   			 		  		sal_Int32* pValueList, 
				   			 		  		sal_uInt32 len)
{
	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (!pKey)
		return REG_INVALID_KEY;

	if (pKey->isDeleted())
		return REG_INVALID_KEY;

	if (pKey->isReadOnly())
		return REG_REGISTRY_READONLY;

	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
	if (keyName->length)
	{
		ORegKey* pSubKey = 0;
		RegError _ret1 = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
		if (_ret1 != REG_NO_ERROR)
			return _ret1;

        _ret1 = pSubKey->setLongListValue(valueName, pValueList, len);
		if (_ret1 != REG_NO_ERROR)
		{
            RegError _ret2 = pKey->closeKey(pSubKey);
			if (_ret2 != REG_NO_ERROR)
				return _ret2;
			else
				return _ret1;
		}
		
		return pKey->closeKey(pSubKey);
	}

	return pKey->setLongListValue(valueName, pValueList, len);
}	

//*********************************************************************
//	setStringValueList
//
RegError REGISTRY_CALLTYPE setStringListValue(RegKeyHandle hKey, 
						   		 	  		 rtl_uString* keyName, 
				   			 		  		 sal_Char** pValueList, 
				   			 		  		 sal_uInt32 len)
{
	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (!pKey)
		return REG_INVALID_KEY;

	if (pKey->isDeleted())
		return REG_INVALID_KEY;

	if (pKey->isReadOnly())
		return REG_REGISTRY_READONLY;

	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
	if (keyName->length)
	{
		ORegKey* pSubKey = 0;
		RegError _ret1 = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
		if (_ret1 != REG_NO_ERROR)
			return _ret1;

        _ret1 = pSubKey->setStringListValue(valueName, pValueList, len);
		if (_ret1 != REG_NO_ERROR)
		{
            RegError _ret2 = pKey->closeKey(pSubKey);
			if (_ret2 != REG_NO_ERROR)
				return _ret2;
			else
				return _ret1;
		}
		
		return pKey->closeKey(pSubKey);
	}

	return pKey->setStringListValue(valueName, pValueList, len);
}	

//*********************************************************************
//	setUnicodeValueList
//
RegError REGISTRY_CALLTYPE setUnicodeListValue(RegKeyHandle hKey, 
						   		 	  		   rtl_uString* keyName, 
				   			 		  		   sal_Unicode** pValueList, 
				   			 		  		   sal_uInt32 len)
{
	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (!pKey)
		return REG_INVALID_KEY;

	if (pKey->isDeleted())
		return REG_INVALID_KEY;

	if (pKey->isReadOnly())
		return REG_REGISTRY_READONLY;

	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
	if (keyName->length)
	{
		ORegKey* pSubKey = 0;
		RegError _ret1 = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
		if (_ret1 != REG_NO_ERROR)
			return _ret1;

        _ret1 = pSubKey->setUnicodeListValue(valueName, pValueList, len);
		if (_ret1 != REG_NO_ERROR)
		{
            RegError _ret2 = pKey->closeKey(pSubKey);
			if (_ret2 != REG_NO_ERROR)
				return _ret2;
			else
				return _ret1;
		}
		
		return pKey->closeKey(pSubKey);
	}

	return pKey->setUnicodeListValue(valueName, pValueList, len);
}	

//*********************************************************************
//	getValueInfo
//
RegError REGISTRY_CALLTYPE getValueInfo(RegKeyHandle hKey, 
										rtl_uString* keyName, 
										RegValueType* pValueType, 
										sal_uInt32* pValueSize)
{
	*pValueType = RG_VALUETYPE_NOT_DEFINED;
	*pValueSize = 0;
	
	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (!pKey)
		return REG_INVALID_KEY;

	if (pKey->isDeleted())
		return REG_INVALID_KEY;

	RegValueType valueType;
	sal_uInt32   valueSize;

	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
	if (keyName->length)
	{
		ORegKey* pSubKey = 0;
		RegError _ret = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
		if (_ret != REG_NO_ERROR)
			return _ret;
		
		if (pSubKey->getValueInfo(valueName, &valueType, &valueSize) != REG_NO_ERROR)
		{
            (void) pKey->releaseKey(pSubKey);
			return REG_INVALID_VALUE;
		}
		
		*pValueType = valueType;
		*pValueSize = valueSize;

		return pKey->releaseKey(pSubKey);
	}


	if (pKey->getValueInfo(valueName, &valueType, &valueSize) != REG_NO_ERROR)
	{
		return REG_INVALID_VALUE;
	}

	*pValueType = valueType;
	*pValueSize = valueSize;
		
	return REG_NO_ERROR;
}	

//*********************************************************************
//	getValueInfo
//
RegError REGISTRY_CALLTYPE getValue(RegKeyHandle hKey, 
									rtl_uString* keyName, 
									RegValue pValue)
{
	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (!pKey)
		return REG_INVALID_KEY;

	if (pKey->isDeleted())
		return REG_INVALID_KEY;

	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
	if (keyName->length)
	{
		ORegKey* pSubKey = 0;
		RegError _ret1 = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
		if (_ret1 != REG_NO_ERROR)
			return _ret1;

        _ret1 = pSubKey->getValue(valueName, pValue);
		if (_ret1 != REG_NO_ERROR)
		{
            (void) pKey->releaseKey(pSubKey);
			return _ret1;
		}
		
		return pKey->releaseKey(pSubKey);
	}

	return pKey->getValue(valueName, pValue);
}	

//*********************************************************************
//	getLongValueList
//
RegError REGISTRY_CALLTYPE getLongListValue(RegKeyHandle hKey, 
											rtl_uString* keyName,
											sal_Int32** pValueList, 
											sal_uInt32* pLen)
{
	OSL_PRECOND((pValueList != 0) && (pLen != 0), "registry::getLongListValue(): invalid parameter");
	*pValueList = 0, *pLen = 0;

	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (!pKey)
		return REG_INVALID_KEY;

	if (pKey->isDeleted())
		return REG_INVALID_KEY;

	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
	if (keyName->length)
	{
		ORegKey* pSubKey = 0;
		RegError _ret1 = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
		if (_ret1 != REG_NO_ERROR)
			return _ret1;

        _ret1 = pSubKey->getLongListValue(valueName, pValueList, pLen);
		if (_ret1 != REG_NO_ERROR)
		{
            (void) pKey->releaseKey(pSubKey);
			return _ret1;
		}
		
		return pKey->releaseKey(pSubKey);
	}

	return pKey->getLongListValue(valueName, pValueList, pLen);
}	

//*********************************************************************
//	getStringValueList
//
RegError REGISTRY_CALLTYPE getStringListValue(RegKeyHandle hKey, 
											  rtl_uString* keyName,
											  sal_Char*** pValueList, 
											  sal_uInt32* pLen)
{
	OSL_PRECOND((pValueList != 0) && (pLen != 0), "registry::getStringListValue(): invalid parameter");
	*pValueList = 0, *pLen = 0;

	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (!pKey)
		return REG_INVALID_KEY;

	if (pKey->isDeleted())
		return REG_INVALID_KEY;

	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
	if (keyName->length)
	{
		ORegKey* pSubKey = 0;
		RegError _ret1 = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
		if (_ret1 != REG_NO_ERROR)
			return _ret1;

        _ret1 = pSubKey->getStringListValue(valueName, pValueList, pLen);
		if (_ret1 != REG_NO_ERROR)
		{
            (void) pKey->releaseKey(pSubKey);
			return _ret1;
		}
		
		return pKey->releaseKey(pSubKey);
	}

	return pKey->getStringListValue(valueName, pValueList, pLen);
}	

//*********************************************************************
//	getUnicodeListValue
//
RegError REGISTRY_CALLTYPE getUnicodeListValue(RegKeyHandle hKey, 
											   rtl_uString* keyName,
											   sal_Unicode*** pValueList, 
											   sal_uInt32* pLen)
{
	OSL_PRECOND((pValueList != 0) && (pLen != 0), "registry::getUnicodeListValue(): invalid parameter");
	*pValueList = 0, *pLen = 0;

	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (!pKey)
		return REG_INVALID_KEY;

	if (pKey->isDeleted())
		return REG_INVALID_KEY;

	OUString valueName( RTL_CONSTASCII_USTRINGPARAM("value") );
	if (keyName->length)
	{
		ORegKey* pSubKey = 0;
		RegError _ret1 = pKey->openKey(keyName, (RegKeyHandle*)&pSubKey);
		if (_ret1 != REG_NO_ERROR)
			return _ret1;

        _ret1 = pSubKey->getUnicodeListValue(valueName, pValueList, pLen);
		if (_ret1 != REG_NO_ERROR)
		{
            (void) pKey->releaseKey(pSubKey);
			return _ret1;
		}
		
		return pKey->releaseKey(pSubKey);
	}

	return pKey->getUnicodeListValue(valueName, pValueList, pLen);
}	

//*********************************************************************
//	freeValueList
//
RegError REGISTRY_CALLTYPE freeValueList(RegValueType valueType, 
					   			  		 RegValue pValueList, 
					   			  		 sal_uInt32 len)
{
	switch (valueType)
	{
		case 5:
			{
				rtl_freeMemory(pValueList);
			}
			break;
		case 6:
			{
				sal_Char** pVList = (sal_Char**)pValueList;
				for (sal_uInt32 i=0; i < len; i++)
				{
					rtl_freeMemory(pVList[i]);
				}

				rtl_freeMemory(pVList);
			}
			break;
		case 7:
			{
				sal_Unicode** pVList = (sal_Unicode**)pValueList;
				for (sal_uInt32 i=0; i < len; i++)
				{
					rtl_freeMemory(pVList[i]);
				}

				rtl_freeMemory(pVList);
			}
			break;
		default:
			return REG_INVALID_VALUE;
	}

	pValueList = NULL;
	return REG_NO_ERROR;
}

//*********************************************************************
//	createLink
//
RegError REGISTRY_CALLTYPE createLink(RegKeyHandle, rtl_uString*, rtl_uString*)
{
    return REG_INVALID_LINK; // links are no longer supported
}

//*********************************************************************
//	deleteLink
//
RegError REGISTRY_CALLTYPE deleteLink(RegKeyHandle, rtl_uString*)
{
    return REG_INVALID_LINK; // links are no longer supported
}

//*********************************************************************
//	getKeyType
//
RegError REGISTRY_CALLTYPE getKeyType(RegKeyHandle hKey,
									  rtl_uString* keyName,
					   				  RegKeyType* pKeyType)
{
	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (!pKey)
		return REG_INVALID_KEY;
		
	if (pKey->isDeleted())
		return REG_INVALID_KEY;

	return pKey->getKeyType(keyName, pKeyType);	
}	

//*********************************************************************
//	getLinkTarget
//
RegError REGISTRY_CALLTYPE getLinkTarget(
    RegKeyHandle, rtl_uString*, rtl_uString**)
{
    return REG_INVALID_LINK; // links are no longer supported
}

//*********************************************************************
//	getName
//
RegError REGISTRY_CALLTYPE getResolvedKeyName(RegKeyHandle hKey,
											  rtl_uString* keyName,
											  sal_Bool,
							  				  rtl_uString** pResolvedName)
{
	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (!pKey)
		return REG_INVALID_KEY;
		
	if (pKey->isDeleted())
		return REG_INVALID_KEY;

	OUString resolvedName;
	RegError _ret = pKey->getResolvedKeyName(keyName, resolvedName);
	if (_ret == REG_NO_ERROR)
		rtl_uString_assign(pResolvedName, resolvedName.pData);
	return _ret;
}

//*********************************************************************
//	getKeyNames
//
RegError REGISTRY_CALLTYPE getKeyNames(RegKeyHandle hKey,
									   rtl_uString* keyName,
						  			   rtl_uString*** pSubKeyNames,
						  			   sal_uInt32* pnSubKeys)
{
	ORegKey* pKey = static_cast< ORegKey* >(hKey);
	if (!pKey)
		return REG_INVALID_KEY;
		
	if (pKey->isDeleted())
		return REG_INVALID_KEY;

	return pKey->getKeyNames(keyName, pSubKeyNames, pnSubKeys);		
}	

//*********************************************************************
//	freeKeyNames
//
RegError REGISTRY_CALLTYPE freeKeyNames(rtl_uString** pKeyNames,
						  			    sal_uInt32 nKeys)
{
	for (sal_uInt32 i=0; i < nKeys; i++)
	{
		rtl_uString_release(pKeyNames[i]);
	}

	rtl_freeMemory(pKeyNames);

	return REG_NO_ERROR;		
}	

//*********************************************************************
//  C API
//

//*********************************************************************
//	reg_createKey
//
RegError REGISTRY_CALLTYPE reg_createKey(RegKeyHandle hKey, 
										 rtl_uString* keyName, 
										 RegKeyHandle* phNewKey)
{
	if (!hKey)
 		return REG_INVALID_KEY;

	return createKey(hKey, keyName, phNewKey);
}	

//*********************************************************************
//	reg_openKey
//
RegError REGISTRY_CALLTYPE reg_openKey(RegKeyHandle hKey, 
									   rtl_uString* keyName, 
									   RegKeyHandle* phOpenKey)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return openKey(hKey, keyName, phOpenKey);
}	

//*********************************************************************
//	reg_openSubKeys
//
RegError REGISTRY_CALLTYPE reg_openSubKeys(RegKeyHandle hKey, 
										   rtl_uString* keyName, 
										   RegKeyHandle** pphSubKeys, 
										   sal_uInt32* pnSubKeys)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return openSubKeys(hKey, keyName, pphSubKeys, pnSubKeys);
}	

//*********************************************************************
//	reg_closeSubKeys
//
RegError REGISTRY_CALLTYPE reg_closeSubKeys(RegKeyHandle* pphSubKeys, 
											sal_uInt32 nSubKeys)
{
	if (!pphSubKeys)
		return REG_INVALID_KEY;

	return closeSubKeys(pphSubKeys, nSubKeys);
}	

//*********************************************************************
//	reg_deleteKey
//
RegError REGISTRY_CALLTYPE reg_deleteKey(RegKeyHandle hKey, 
										 rtl_uString* keyName)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return deleteKey(hKey, keyName);
}	

//*********************************************************************
//	reg_closeKey
//
RegError REGISTRY_CALLTYPE reg_closeKey(RegKeyHandle hKey)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return closeKey(hKey);
}	


//*********************************************************************
//	reg_getKeyName
//
RegError REGISTRY_CALLTYPE reg_getKeyName(RegKeyHandle hKey, rtl_uString** pKeyName)
{
	if (hKey)
	{	
		rtl_uString_assign( pKeyName, ((ORegKey*)hKey)->getName().pData );
		return REG_NO_ERROR;
	} else
	{
		rtl_uString_new( pKeyName );
		return REG_INVALID_KEY;
	}
}

//*********************************************************************
//	reg_setValue
//
RegError REGISTRY_CALLTYPE reg_setValue(RegKeyHandle hKey, 
										rtl_uString* keyName, 
										RegValueType valueType, 
										RegValue pData, 
										sal_uInt32 valueSize)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return setValue(hKey, keyName, valueType, pData, valueSize);
}	

//*********************************************************************
//	reg_setLongListValue
//
RegError REGISTRY_CALLTYPE reg_setLongListValue(RegKeyHandle hKey, 
					   		 	  				rtl_uString* keyName, 
			   			 		  				sal_Int32* pValueList, 
			   			 		  				sal_uInt32 len)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return setLongListValue(hKey, keyName, pValueList, len);
}	

//*********************************************************************
//	reg_setStringListValue
//
RegError REGISTRY_CALLTYPE reg_setStringListValue(RegKeyHandle hKey, 
					   		 	  			  	  rtl_uString* keyName, 
			   			 		  			  	  sal_Char** pValueList, 
			   			 		  			  	  sal_uInt32 len)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return setStringListValue(hKey, keyName, pValueList, len);
}	

//*********************************************************************
//	reg_setUnicodeListValue
//
RegError REGISTRY_CALLTYPE reg_setUnicodeListValue(RegKeyHandle hKey, 
					   		 	  			   	   rtl_uString* keyName, 
			   			 		  			   	   sal_Unicode** pValueList, 
			   			 		  			   	   sal_uInt32 len)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return setUnicodeListValue(hKey, keyName, pValueList, len);
}	

//*********************************************************************
//	reg_getValueInfo
//
RegError REGISTRY_CALLTYPE reg_getValueInfo(RegKeyHandle hKey, 
											rtl_uString* keyName, 
											RegValueType* pValueType, 
											sal_uInt32* pValueSize)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return getValueInfo(hKey, keyName, pValueType, pValueSize);
}	

//*********************************************************************
//	reg_getValueInfo
//
RegError REGISTRY_CALLTYPE reg_getValue(RegKeyHandle hKey, 
										rtl_uString* keyName, 
										RegValue pData)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return getValue(hKey, keyName, pData);
}	

//*********************************************************************
//	reg_getLongListValue
//
RegError REGISTRY_CALLTYPE reg_getLongListValue(RegKeyHandle hKey, 
					   		 	  				rtl_uString* keyName, 
			   			 		  				sal_Int32** pValueList, 
			   			 		  				sal_uInt32* pLen)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return getLongListValue(hKey, keyName, pValueList, pLen);
}	

//*********************************************************************
//	reg_getStringListValue
//
RegError REGISTRY_CALLTYPE reg_getStringListValue(RegKeyHandle hKey, 
				   			  					  rtl_uString* keyName, 
				   			  					  sal_Char*** pValueList,
				   			  					  sal_uInt32* pLen)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return getStringListValue(hKey, keyName, pValueList, pLen);
}	

//*********************************************************************
//	reg_getUnicodeListValue
//
RegError REGISTRY_CALLTYPE reg_getUnicodeListValue(RegKeyHandle hKey, 
					   		 	  				   rtl_uString* keyName, 
			   			 		  				   sal_Unicode*** pValueList, 
			   			 		  				   sal_uInt32* pLen)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return getUnicodeListValue(hKey, keyName, pValueList, pLen);
}	

//*********************************************************************
//	reg_freeValueList
//
RegError REGISTRY_CALLTYPE reg_freeValueList(RegValueType valueType, 
				   			  				 RegValue pValueList, 
				   			  				 sal_uInt32 len)
{
	if (pValueList)
		return freeValueList(valueType, pValueList, len);
	else
		return REG_INVALID_VALUE;
}												 

//*********************************************************************
//	reg_createLink
//
RegError REGISTRY_CALLTYPE reg_createLink(RegKeyHandle hKey,
				  			   		      rtl_uString* linkName, 
										  rtl_uString* linkTarget)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return createLink(hKey, linkName, linkTarget);
}	

//*********************************************************************
//	reg_deleteLink
//
RegError REGISTRY_CALLTYPE reg_deleteLink(RegKeyHandle hKey,
								  		  rtl_uString* linkName)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return deleteLink(hKey, linkName);
}	

//*********************************************************************
//	reg_getKeyType
//
RegError REGISTRY_CALLTYPE reg_getKeyType(RegKeyHandle hKey,
										  rtl_uString* keyName,
					   					  RegKeyType* pKeyType)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return getKeyType(hKey, keyName, pKeyType);
}	

//*********************************************************************
//	reg_getLinkTarget
//
RegError REGISTRY_CALLTYPE reg_getLinkTarget(RegKeyHandle hKey,
											 rtl_uString* linkName,
						  					 rtl_uString** pLinkTarget)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return getLinkTarget(hKey, linkName, pLinkTarget);
}	

//*********************************************************************
//	reg_getResolvedKeyName
//
RegError REGISTRY_CALLTYPE reg_getResolvedKeyName(RegKeyHandle hKey,
											  	  rtl_uString* keyName,
											  	  sal_Bool firstLinkOnly,
							  				  	  rtl_uString** pResolvedName)
{
	if (!hKey)
		return REG_INVALID_KEY;

	return getResolvedKeyName(hKey, keyName, firstLinkOnly, pResolvedName);
}
