/**************************************************************
 *
 * 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_cppu.hxx"

#include "copy.hxx"
#include "destr.hxx"

using namespace cppu;


extern "C"
{
//##################################################################################################
void SAL_CALL uno_type_any_assign(
	uno_Any * pDest, void * pSource,
	typelib_TypeDescriptionReference * pType,
	uno_AcquireFunc acquire, uno_ReleaseFunc release )
	SAL_THROW_EXTERN_C()
{
	_destructAny( pDest, release );
	if (pType)
	{
		_copyConstructAny( pDest, pSource, pType, 0, acquire, 0 );
	}
	else
	{
		CONSTRUCT_EMPTY_ANY( pDest );
	}
}
//##################################################################################################
void SAL_CALL uno_any_assign(
	uno_Any * pDest, void * pSource,
	typelib_TypeDescription * pTypeDescr,
	uno_AcquireFunc acquire, uno_ReleaseFunc release )
	SAL_THROW_EXTERN_C()
{
	_destructAny( pDest, release );
	if (pTypeDescr)
	{
		_copyConstructAny( pDest, pSource, pTypeDescr->pWeakRef, pTypeDescr, acquire, 0 );
	}
	else
	{
		CONSTRUCT_EMPTY_ANY( pDest );
	}
}
//##################################################################################################
void SAL_CALL uno_type_any_construct(
	uno_Any * pDest, void * pSource,
	typelib_TypeDescriptionReference * pType,
	uno_AcquireFunc acquire )
	SAL_THROW_EXTERN_C()
{
	if (pType)
	{
		_copyConstructAny( pDest, pSource, pType, 0, acquire, 0 );
	}
	else
	{
		CONSTRUCT_EMPTY_ANY( pDest );
	}
}
//##################################################################################################
void SAL_CALL uno_any_construct(
	uno_Any * pDest, void * pSource,
	typelib_TypeDescription * pTypeDescr,
	uno_AcquireFunc acquire )
	SAL_THROW_EXTERN_C()
{
	if (pTypeDescr)
	{
		_copyConstructAny( pDest, pSource, pTypeDescr->pWeakRef, pTypeDescr, acquire, 0 );
	}
	else
	{
		CONSTRUCT_EMPTY_ANY( pDest );
	}
}
//##################################################################################################
void SAL_CALL uno_type_any_constructAndConvert(
	uno_Any * pDest, void * pSource,
	typelib_TypeDescriptionReference * pType,
	uno_Mapping * mapping )
	SAL_THROW_EXTERN_C()
{
	if (pType)
	{
		_copyConstructAny( pDest, pSource, pType, 0, 0, mapping );
	}
	else
	{
		CONSTRUCT_EMPTY_ANY( pDest );
	}
}
//##################################################################################################
void SAL_CALL uno_any_constructAndConvert(
	uno_Any * pDest, void * pSource,
	typelib_TypeDescription * pTypeDescr,
	uno_Mapping * mapping )
	SAL_THROW_EXTERN_C()
{
	if (pTypeDescr)
	{
		_copyConstructAny( pDest, pSource, pTypeDescr->pWeakRef, pTypeDescr, 0, mapping );
	}
	else
	{
		CONSTRUCT_EMPTY_ANY( pDest );
	}
}
//##################################################################################################
void SAL_CALL uno_any_destruct( uno_Any * pValue, uno_ReleaseFunc release )
	SAL_THROW_EXTERN_C()
{
	_destructAny( pValue, release );
}
//##################################################################################################
void SAL_CALL uno_any_clear( uno_Any * pValue, uno_ReleaseFunc release )
	SAL_THROW_EXTERN_C()
{
	_destructAny( pValue, release );
    CONSTRUCT_EMPTY_ANY( pValue );
}
}
