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

#include "prim.hxx"
#include "destr.hxx"
#include "constr.hxx"
#include "copy.hxx"


namespace cppu
{

//##################################################################################################
//#### assignment ##################################################################################
//##################################################################################################


//--------------------------------------------------------------------------------------------------
inline void _assignInterface(
	void ** ppDest, void * pSource,
	uno_AcquireFunc acquire, uno_ReleaseFunc release )
	SAL_THROW( () )
{
    _acquire( pSource, acquire );
    void * const pToBeReleased = *ppDest;
	*ppDest = pSource;
    _release( pToBeReleased, release );
}
//--------------------------------------------------------------------------------------------------
inline void * _queryInterface(
	void * pSource,
	typelib_TypeDescriptionReference * pDestType,
	uno_QueryInterfaceFunc queryInterface )
	SAL_THROW( () )
{
	if (pSource)
	{
		if (0 == queryInterface)
            queryInterface = binuno_queryInterface;
        pSource = (*queryInterface)( pSource, pDestType );
	}
    return pSource;
}
//==================================================================================================
sal_Bool assignStruct(
	void * pDest, void * pSource,
	typelib_CompoundTypeDescription * pTypeDescr,
	uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
	SAL_THROW( () );
//--------------------------------------------------------------------------------------------------
inline sal_Bool _assignStruct(
	void * pDest, void * pSource,
	typelib_CompoundTypeDescription * pTypeDescr,
	uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
	SAL_THROW( () )
{
	if (pTypeDescr->pBaseTypeDescription)
	{
		// copy base value
		if (! assignStruct( pDest, pSource, pTypeDescr->pBaseTypeDescription,
							queryInterface, acquire, release ))
		{
			return sal_False;
		}
	}
	// then copy members
	typelib_TypeDescriptionReference ** ppTypeRefs = pTypeDescr->ppTypeRefs;
	sal_Int32 * pMemberOffsets = pTypeDescr->pMemberOffsets;
	sal_Int32 nDescr = pTypeDescr->nMembers;
	while (nDescr--)
	{
		if (! ::uno_type_assignData( (char *)pDest + pMemberOffsets[nDescr],
									 ppTypeRefs[nDescr],
									 (char *)pSource + pMemberOffsets[nDescr],
									 ppTypeRefs[nDescr],
									 queryInterface, acquire, release ))
		{
			return sal_False;
		}
	}
	return sal_True;
}
//--------------------------------------------------------------------------------------------------
inline sal_Bool _assignArray(
	void * pDest, void * pSource,
	typelib_ArrayTypeDescription * pTypeDescr,
	uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
{
	typelib_TypeDescriptionReference * pElementTypeRef =
        ((typelib_IndirectTypeDescription *)pTypeDescr)->pType;
	typelib_TypeDescription * pElementTypeDescr = NULL;
	TYPELIB_DANGER_GET( &pElementTypeDescr, pElementTypeRef );
	sal_Int32 nTotalElements = pTypeDescr->nTotalElements;
	sal_Int32 nElementSize = pElementTypeDescr->nSize;
	sal_Int32 i;
	sal_Bool bRet = sal_False;

	switch ( pElementTypeRef->eTypeClass )
	{
	case typelib_TypeClass_CHAR:
	case typelib_TypeClass_BOOLEAN:
	case typelib_TypeClass_BYTE:
	case typelib_TypeClass_SHORT:
	case typelib_TypeClass_UNSIGNED_SHORT:
	case typelib_TypeClass_LONG:
	case typelib_TypeClass_UNSIGNED_LONG:
	case typelib_TypeClass_HYPER:
	case typelib_TypeClass_UNSIGNED_HYPER:
	case typelib_TypeClass_FLOAT:
	case typelib_TypeClass_DOUBLE:
		for (i=0; i < nTotalElements; i++)
		{
			::rtl_copyMemory((sal_Char *)pDest + i * nElementSize,
							 (sal_Char *)pSource + i * nElementSize,
							 nElementSize);
		}
		bRet = sal_True;
		break;
	case typelib_TypeClass_STRING:
		for (i=0; i < nTotalElements; i++)
		{
			::rtl_uString_assign( (rtl_uString **)pDest + i,
								  ((rtl_uString **)pSource)[i] );
		}
		bRet = sal_True;
		break;
	case typelib_TypeClass_TYPE:
		for (i=0; i < nTotalElements; i++)
		{
            typelib_TypeDescriptionReference ** pp = (typelib_TypeDescriptionReference **)pDest + i;
			::typelib_typedescriptionreference_release( *pp );
            *pp = *((typelib_TypeDescriptionReference **)pSource + i);
			TYPE_ACQUIRE( *pp );
		}
		bRet = sal_True;
		break;
	case typelib_TypeClass_ANY:
		for (i=0; i < nTotalElements; i++)
		{
			_destructAny( (uno_Any *)pDest + i, release );
			_copyConstructAny( (uno_Any *)pDest + i, (uno_Any *)pSource + i,
                               pElementTypeRef, pElementTypeDescr, acquire, 0 );
		}
		bRet = sal_True;
		break;
	case typelib_TypeClass_ENUM:
		for (i=0; i < nTotalElements; i++)
		{
			*((sal_Int32 *)pDest + i) = *((sal_Int32 *)pSource + i);
		}
		bRet = sal_True;
		break;
	case typelib_TypeClass_STRUCT:
	case typelib_TypeClass_EXCEPTION:
		for (i=0; i < nTotalElements; i++)
		{
			bRet = _assignStruct( (sal_Char *)pDest + i * nElementSize,
                                  (sal_Char *)pSource + i * nElementSize,
                                  (typelib_CompoundTypeDescription *)pElementTypeDescr,
                                  queryInterface, acquire, release );
			if (! bRet)
				break;
		}
		bRet = sal_True;
		break;
	case typelib_TypeClass_UNION:
		for (i=0; i < nTotalElements; i++)
		{
			_destructUnion( (sal_Char*)pDest + i * nElementSize, pElementTypeDescr, release );
			_copyConstructUnion( (sal_Char*)pDest + i * nElementSize,
                                 (sal_Char*)pSource + i * nElementSize,
                                 pElementTypeDescr, acquire, 0 );
		}
		bRet = sal_True;
		break;
	case typelib_TypeClass_SEQUENCE:
		for (i=0; i < nTotalElements; i++)
		{
			::osl_incrementInterlockedCount(
                &(*((uno_Sequence **)pSource + i))->nRefCount );
			idestructSequence(
                *((uno_Sequence **)pDest + i),
                pElementTypeRef, pElementTypeDescr, release );
			*((uno_Sequence **)pDest + i) = *((uno_Sequence **)pSource + i);
		}
		bRet = sal_True;
		break;
	case typelib_TypeClass_INTERFACE:
		for (i=0; i < nTotalElements; i++)
		{
			_assignInterface(
                (void **)((sal_Char*)pDest + i * nElementSize),
                *(void **)((sal_Char*)pSource + i * nElementSize),
                acquire, release );
		}
		bRet = sal_True;
		break;
    default:
        OSL_ASSERT(false);
        break;
	}

	TYPELIB_DANGER_RELEASE( pElementTypeDescr );
	return bRet;
}
//--------------------------------------------------------------------------------------------------
inline sal_Bool _assignData(
	void * pDest,
	typelib_TypeDescriptionReference * pDestType, typelib_TypeDescription * pDestTypeDescr,
	void * pSource,
	typelib_TypeDescriptionReference * pSourceType, typelib_TypeDescription * pSourceTypeDescr,
	uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
	SAL_THROW( () )
{
	if (pDest == pSource)
		return _type_equals( pDestType, pSourceType );

	if (! pSource)
	{
		_destructData( pDest, pDestType, pDestTypeDescr, release );
		_defaultConstructData( pDest, pDestType, pDestTypeDescr );
		return sal_True;
	}
	while (typelib_TypeClass_ANY == pSourceType->eTypeClass)
	{
		pSourceTypeDescr = 0;
		pSourceType = ((uno_Any *)pSource)->pType;
		pSource = ((uno_Any *)pSource)->pData;
		if (pDest == pSource)
			return sal_True;
	}

	switch (pDestType->eTypeClass)
	{
	case typelib_TypeClass_VOID:
		return pSourceType->eTypeClass == typelib_TypeClass_VOID;
	case typelib_TypeClass_CHAR:
		switch (pSourceType->eTypeClass)
		{
		case typelib_TypeClass_CHAR:
			*(sal_Unicode *)pDest = *(sal_Unicode *)pSource;
			return sal_True;
        default:
            return sal_False;
		}
	case typelib_TypeClass_BOOLEAN:
		switch (pSourceType->eTypeClass)
		{
		case typelib_TypeClass_BOOLEAN:
			*(sal_Bool *)pDest = (*(sal_Bool *)pSource != sal_False);
			return sal_True;
        default:
            return sal_False;
		}
	case typelib_TypeClass_BYTE:
		switch (pSourceType->eTypeClass)
		{
		case typelib_TypeClass_BYTE:
			*(sal_Int8 *)pDest = *(sal_Int8 *)pSource;
			return sal_True;
        default:
            return sal_False;
		}
	case typelib_TypeClass_SHORT:
		switch (pSourceType->eTypeClass)
		{
		case typelib_TypeClass_BYTE:
			*(sal_Int16 *)pDest = *(sal_Int8 *)pSource;
			return sal_True;
		case typelib_TypeClass_SHORT:
		case typelib_TypeClass_UNSIGNED_SHORT:
			*(sal_Int16 *)pDest = *(sal_Int16 *)pSource;
			return sal_True;
        default:
            return sal_False;
		}
	case typelib_TypeClass_UNSIGNED_SHORT:
		switch (pSourceType->eTypeClass)
		{
		case typelib_TypeClass_BYTE:
			*(sal_uInt16 *)pDest = *(sal_Int8 *)pSource;
			return sal_True;
		case typelib_TypeClass_SHORT:
		case typelib_TypeClass_UNSIGNED_SHORT:
			*(sal_uInt16 *)pDest = *(sal_uInt16 *)pSource;
			return sal_True;
        default:
            return sal_False;
		}
	case typelib_TypeClass_LONG:
		switch (pSourceType->eTypeClass)
		{
		case typelib_TypeClass_BYTE:
			*(sal_Int32 *)pDest = *(sal_Int8 *)pSource;
			return sal_True;
		case typelib_TypeClass_SHORT:
			*(sal_Int32 *)pDest = *(sal_Int16 *)pSource;
			return sal_True;
		case typelib_TypeClass_UNSIGNED_SHORT:
			*(sal_Int32 *)pDest = *(sal_uInt16 *)pSource;
			return sal_True;
		case typelib_TypeClass_LONG:
		case typelib_TypeClass_UNSIGNED_LONG:
			*(sal_Int32 *)pDest = *(sal_Int32 *)pSource;
			return sal_True;
        default:
            return sal_False;
		}
	case typelib_TypeClass_UNSIGNED_LONG:
		switch (pSourceType->eTypeClass)
		{
		case typelib_TypeClass_BYTE:
			*(sal_uInt32 *)pDest = *(sal_Int8 *)pSource;
			return sal_True;
		case typelib_TypeClass_SHORT:
			*(sal_uInt32 *)pDest = *(sal_Int16 *)pSource;
			return sal_True;
		case typelib_TypeClass_UNSIGNED_SHORT:
			*(sal_uInt32 *)pDest = *(sal_uInt16 *)pSource;
			return sal_True;
		case typelib_TypeClass_LONG:
		case typelib_TypeClass_UNSIGNED_LONG:
			*(sal_uInt32 *)pDest = *(sal_uInt32 *)pSource;
			return sal_True;
        default:
            return sal_False;
		}
	case typelib_TypeClass_HYPER:
		switch (pSourceType->eTypeClass)
		{
		case typelib_TypeClass_BYTE:
			*(sal_Int64 *)pDest = *(sal_Int8 *)pSource;
			return sal_True;
		case typelib_TypeClass_SHORT:
			*(sal_Int64 *)pDest = *(sal_Int16 *)pSource;
			return sal_True;
		case typelib_TypeClass_UNSIGNED_SHORT:
			*(sal_Int64 *)pDest = *(sal_uInt16 *)pSource;
			return sal_True;
		case typelib_TypeClass_LONG:
			*(sal_Int64 *)pDest = *(sal_Int32 *)pSource;
			return sal_True;
		case typelib_TypeClass_UNSIGNED_LONG:
			*(sal_Int64 *)pDest = *(sal_uInt32 *)pSource;
			return sal_True;
		case typelib_TypeClass_HYPER:
		case typelib_TypeClass_UNSIGNED_HYPER:
			*(sal_Int64 *)pDest = *(sal_Int64 *)pSource;
			return sal_True;
        default:
            return sal_False;
		}
	case typelib_TypeClass_UNSIGNED_HYPER:
		switch (pSourceType->eTypeClass)
		{
		case typelib_TypeClass_BYTE:
			*(sal_uInt64 *)pDest = *(sal_Int8 *)pSource;
			return sal_True;
		case typelib_TypeClass_SHORT:
			*(sal_uInt64 *)pDest = *(sal_Int16 *)pSource;
			return sal_True;
		case typelib_TypeClass_UNSIGNED_SHORT:
			*(sal_uInt64 *)pDest = *(sal_uInt16 *)pSource;
			return sal_True;
		case typelib_TypeClass_LONG:
			*(sal_uInt64 *)pDest = *(sal_Int32 *)pSource;
			return sal_True;
		case typelib_TypeClass_UNSIGNED_LONG:
			*(sal_uInt64 *)pDest = *(sal_uInt32 *)pSource;
			return sal_True;
		case typelib_TypeClass_HYPER:
		case typelib_TypeClass_UNSIGNED_HYPER:
			*(sal_uInt64 *)pDest = *(sal_uInt64 *)pSource;
			return sal_True;
        default:
            return sal_False;
		}
	case typelib_TypeClass_FLOAT:
		switch (pSourceType->eTypeClass)
		{
		case typelib_TypeClass_BYTE:
			*(float *)pDest = *(sal_Int8 *)pSource;
			return sal_True;
		case typelib_TypeClass_SHORT:
			*(float *)pDest = *(sal_Int16 *)pSource;
			return sal_True;
		case typelib_TypeClass_UNSIGNED_SHORT:
			*(float *)pDest = *(sal_uInt16 *)pSource;
			return sal_True;
		case typelib_TypeClass_FLOAT:
			*(float *)pDest = *(float *)pSource;
			return sal_True;
        default:
            return sal_False;
		}
	case typelib_TypeClass_DOUBLE:
		switch (pSourceType->eTypeClass)
		{
		case typelib_TypeClass_BYTE:
			*(double *)pDest = *(sal_Int8 *)pSource;
			return sal_True;
		case typelib_TypeClass_SHORT:
			*(double *)pDest = *(sal_Int16 *)pSource;
			return sal_True;
		case typelib_TypeClass_UNSIGNED_SHORT:
			*(double *)pDest = *(sal_uInt16 *)pSource;
			return sal_True;
		case typelib_TypeClass_LONG:
			*(double *)pDest = *(sal_Int32 *)pSource;
			return sal_True;
		case typelib_TypeClass_UNSIGNED_LONG:
			*(double *)pDest = *(sal_uInt32 *)pSource;
			return sal_True;
		case typelib_TypeClass_FLOAT:
			*(double *)pDest = *(float *)pSource;
			return sal_True;
		case typelib_TypeClass_DOUBLE:
			*(double *)pDest = *(double *)pSource;
			return sal_True;
        default:
            return sal_False;
		}
	case typelib_TypeClass_STRING:
		switch (pSourceType->eTypeClass)
		{
		case typelib_TypeClass_STRING:
			::rtl_uString_assign( (rtl_uString **)pDest, *(rtl_uString **)pSource );
			return sal_True;
        default:
            return sal_False;
		}
	case typelib_TypeClass_TYPE:
		switch (pSourceType->eTypeClass)
		{
		case typelib_TypeClass_TYPE:
        {
            typelib_TypeDescriptionReference ** pp = (typelib_TypeDescriptionReference **)pDest;
			::typelib_typedescriptionreference_release( *pp );
            *pp = *(typelib_TypeDescriptionReference **)pSource;
            TYPE_ACQUIRE( *pp );
			return sal_True;
        }
        default:
            return sal_False;
		}
	case typelib_TypeClass_ANY:
		_destructAny( (uno_Any *)pDest, release );
		_copyConstructAny( (uno_Any *)pDest, pSource, pSourceType, pSourceTypeDescr, acquire, 0 );
		return sal_True;
	case typelib_TypeClass_ENUM:
		if (_type_equals( pDestType, pSourceType ))
		{
			*(sal_Int32 *)pDest = *(sal_Int32 *)pSource;
			return sal_True;
		}
		return sal_False;
	case typelib_TypeClass_STRUCT:
	case typelib_TypeClass_EXCEPTION:
		if (typelib_TypeClass_STRUCT == pSourceType->eTypeClass ||
			typelib_TypeClass_EXCEPTION == pSourceType->eTypeClass)
		{
			sal_Bool bRet = sal_False;
			if (pSourceTypeDescr)
			{
				typelib_CompoundTypeDescription * pTypeDescr =
					(typelib_CompoundTypeDescription *)pSourceTypeDescr;
				while (pTypeDescr &&
                       !_type_equals(
                           ((typelib_TypeDescription *)pTypeDescr)->pWeakRef, pDestType ))
                {
					pTypeDescr = pTypeDescr->pBaseTypeDescription;
                }
				if (pTypeDescr)
                {
					bRet = _assignStruct(
                        pDest, pSource, pTypeDescr, queryInterface, acquire, release );
                }
			}
			else
			{
				TYPELIB_DANGER_GET( &pSourceTypeDescr, pSourceType );
				typelib_CompoundTypeDescription * pTypeDescr =
					(typelib_CompoundTypeDescription *)pSourceTypeDescr;
				while (pTypeDescr &&
                       !_type_equals(
                           ((typelib_TypeDescription *)pTypeDescr)->pWeakRef, pDestType ))
                {
					pTypeDescr = pTypeDescr->pBaseTypeDescription;
                }
				if (pTypeDescr)
                {
					bRet = _assignStruct(
                        pDest, pSource, pTypeDescr, queryInterface, acquire, release );
                }
				TYPELIB_DANGER_RELEASE( pSourceTypeDescr );
			}
			return bRet;
		}
		return sal_False;
	case typelib_TypeClass_ARRAY:
		{
			sal_Bool bRet = sal_False;
			if (pSourceTypeDescr)
			{
				typelib_ArrayTypeDescription * pTypeDescr =
                    (typelib_ArrayTypeDescription *)pSourceTypeDescr;
				bRet = _assignArray( pDest, pSource, pTypeDescr, queryInterface, acquire, release );
			}
			else
			{
				TYPELIB_DANGER_GET( &pSourceTypeDescr, pSourceType );
				typelib_ArrayTypeDescription * pTypeDescr =
					(typelib_ArrayTypeDescription *)pSourceTypeDescr;
				if ( pTypeDescr )
                {
					bRet = _assignArray(
                        pDest, pSource, pTypeDescr, queryInterface, acquire, release );
                }
				TYPELIB_DANGER_RELEASE( pSourceTypeDescr );
			}
			return bRet;
		}
	case typelib_TypeClass_UNION:
		if (_type_equals( pDestType, pSourceType ))
		{
			if (pDestTypeDescr)
			{
				_destructUnion( pDest, pDestTypeDescr, release );
				_copyConstructUnion( pDest, pSource, pDestTypeDescr, acquire, 0 );
			}
			else
			{
				TYPELIB_DANGER_GET( &pDestTypeDescr, pDestType );
				_destructUnion( pDest, pDestTypeDescr, release );
				_copyConstructUnion( pDest, pSource, pDestTypeDescr, acquire, 0 );
				TYPELIB_DANGER_RELEASE( pDestTypeDescr );
			}
			return sal_True;
		}
		return sal_False;
	case typelib_TypeClass_SEQUENCE:
		if (typelib_TypeClass_SEQUENCE != pSourceType->eTypeClass)
			return sal_False;
        // self assignment:
		if (*(uno_Sequence **)pSource == *(uno_Sequence **)pDest)
			return sal_True;
		if (_type_equals( pDestType, pSourceType ))
		{
			::osl_incrementInterlockedCount(
                &(*(uno_Sequence **)pSource)->nRefCount );
			idestructSequence(
                *(uno_Sequence **)pDest, pDestType, pDestTypeDescr, release );
			*(uno_Sequence **)pDest = *(uno_Sequence **)pSource;
			return sal_True;
		}
		return sal_False;
	case typelib_TypeClass_INTERFACE:
		if (typelib_TypeClass_INTERFACE != pSourceType->eTypeClass)
			return sal_False;
		if (_type_equals( pDestType, pSourceType ))
		{
			_assignInterface( (void **)pDest, *(void **)pSource, acquire, release );
			return sal_True;
		}
        else if (*static_cast< void ** >(pSource) == 0)
        {
            // A null reference of any interface type can be converted to a null
            // reference of any other interface type:
            void * const pToBeReleased = *static_cast< void ** >(pDest);
            *static_cast< void ** >(pDest) = 0;
            _release( pToBeReleased, release );
            return true;
        }
		else
		{
			if (pSourceTypeDescr)
			{
				typelib_TypeDescription * pTD = pSourceTypeDescr;
				while (pTD && !_type_equals( pTD->pWeakRef, pDestType ))
                {
					pTD = (typelib_TypeDescription *)
                        ((typelib_InterfaceTypeDescription *)pTD)->pBaseTypeDescription;
                }
				if (pTD) // is base of dest
				{
					_assignInterface( (void **)pDest, *(void **)pSource, acquire, release );
                    return true;
				}
            }

            // query for interface:
            void * pQueried = _queryInterface( *static_cast<void **>(pSource),
                                               pDestType, queryInterface );
            if (pQueried != 0) {
                void * const pToBeReleased = *static_cast<void **>(pDest);
                *static_cast<void **>(pDest) = pQueried;
                _release( pToBeReleased, release );
            }
            return (pQueried != 0);
		}
    default:
        OSL_ASSERT(false);
        return sal_False;
	}
}

}

#endif
