/**************************************************************
 *
 * 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_stoc.hxx"
#include <cppuhelper/queryinterface.hxx>
#include <uno/any2.h>

#include "base.hxx"

namespace stoc_corefl
{

#ifdef TEST_LIST_CLASSES
ClassNameList g_aClassNames;
#endif

//--------------------------------------------------------------------------------------------------
Mutex & getMutexAccess()
{
	static Mutex * s_pMutex = 0;
	if (! s_pMutex)
	{
		MutexGuard aGuard( Mutex::getGlobalMutex() );
		if (! s_pMutex)
		{
			static Mutex s_aMutex;
			s_pMutex = &s_aMutex;
		}
	}
	return *s_pMutex;
}

//__________________________________________________________________________________________________
IdlClassImpl::IdlClassImpl( IdlReflectionServiceImpl * pReflection,
							const OUString & rName, typelib_TypeClass eTypeClass,
							typelib_TypeDescription * pTypeDescr )
	: _pReflection( pReflection )
	, _aName( rName )
	, _eTypeClass( (TypeClass)eTypeClass )
	, _pTypeDescr( pTypeDescr )
{
	if (_pReflection)
		_pReflection->acquire();
	if (_pTypeDescr)
	{
		typelib_typedescription_acquire( _pTypeDescr );
		if (! _pTypeDescr->bComplete)
			typelib_typedescription_complete( &_pTypeDescr );
	}

#ifdef TEST_LIST_CLASSES
	ClassNameList::const_iterator iFind( find( g_aClassNames.begin(), g_aClassNames.end(), _aName ) );
	OSL_ENSURE( iFind == g_aClassNames.end(), "### idl class already exists!" );
	g_aClassNames.push_front( _aName );
#endif
}
//__________________________________________________________________________________________________
IdlClassImpl::~IdlClassImpl()
{
	if (_pTypeDescr)
		typelib_typedescription_release( _pTypeDescr );
	if (_pReflection)
		_pReflection->release();

#ifdef TEST_LIST_CLASSES
	ClassNameList::iterator iFind( find( g_aClassNames.begin(), g_aClassNames.end(), _aName ) );
	OSL_ENSURE( iFind != g_aClassNames.end(), "### idl class does not exist!" );
	g_aClassNames.erase( iFind );
#endif
}

// XIdlClassImpl default implementation
//__________________________________________________________________________________________________
TypeClass IdlClassImpl::getTypeClass()
	throw(::com::sun::star::uno::RuntimeException)
{
	return _eTypeClass;
}
//__________________________________________________________________________________________________
OUString IdlClassImpl::getName()
	throw(::com::sun::star::uno::RuntimeException)
{
	return _aName;
}
//__________________________________________________________________________________________________
sal_Bool IdlClassImpl::equals( const Reference< XIdlClass >& xType )
	throw(::com::sun::star::uno::RuntimeException)
{
	return (xType.is() &&
			(xType->getTypeClass() == _eTypeClass) && (xType->getName() == _aName));
}

static sal_Bool s_aAssignableFromTab[11][11] =
{
						 /* from CH,BO,BY,SH,US,LO,UL,HY,UH,FL,DO */
/* TypeClass_CHAR */			{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
/* TypeClass_BOOLEAN */			{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
/* TypeClass_BYTE */			{ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
/* TypeClass_SHORT */			{ 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0 },
/* TypeClass_UNSIGNED_SHORT */	{ 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0 },
/* TypeClass_LONG */			{ 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
/* TypeClass_UNSIGNED_LONG */	{ 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
/* TypeClass_HYPER */			{ 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
/* TypeClass_UNSIGNED_HYPER */	{ 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
/* TypeClass_FLOAT */			{ 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
/* TypeClass_DOUBLE */			{ 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
};
//__________________________________________________________________________________________________
sal_Bool IdlClassImpl::isAssignableFrom( const Reference< XIdlClass > & xType )
	throw(::com::sun::star::uno::RuntimeException)
{
	TypeClass eAssign = getTypeClass();
	if (equals( xType ) || eAssign == TypeClass_ANY) // default shot
	{
		return sal_True;
	}
	else
	{
		TypeClass eFrom	  = xType->getTypeClass();
		if (eAssign > TypeClass_VOID && eAssign < TypeClass_STRING &&
			eFrom > TypeClass_VOID && eFrom < TypeClass_STRING)
		{
			return s_aAssignableFromTab[eAssign-1][eFrom-1];
		}
	}
	return sal_False;
}
//__________________________________________________________________________________________________
void IdlClassImpl::createObject( Any & rObj )
	throw(::com::sun::star::uno::RuntimeException)
{
	rObj.clear();
	uno_any_destruct( &rObj, reinterpret_cast< uno_ReleaseFunc >(cpp_release) );
	uno_any_construct( &rObj, 0, getTypeDescr(), 0 );
}

// what TODO ????
//__________________________________________________________________________________________________
Sequence< Reference< XIdlClass > > IdlClassImpl::getClasses()
	throw(::com::sun::star::uno::RuntimeException)
{
	OSL_ENSURE( sal_False, "### unexpected use!" );
	return Sequence< Reference< XIdlClass > >();
}
//__________________________________________________________________________________________________
Reference< XIdlClass > IdlClassImpl::getClass( const OUString & )
	throw(::com::sun::star::uno::RuntimeException)
{
	OSL_ENSURE( sal_False, "### unexpected use!" );
	return Reference< XIdlClass >();
}
//__________________________________________________________________________________________________
Sequence< Reference< XIdlClass > > IdlClassImpl::getInterfaces()
	throw(::com::sun::star::uno::RuntimeException)
{
//  	OSL_ENSURE( sal_False, "### unexpected use!" );
	return Sequence< Reference< XIdlClass > >();
}

// structs, interfaces
//__________________________________________________________________________________________________
Sequence< Reference< XIdlClass > > IdlClassImpl::getSuperclasses() throw(::com::sun::star::uno::RuntimeException)
{
	return Sequence< Reference< XIdlClass > >();
}
// structs
//__________________________________________________________________________________________________
Reference< XIdlField > IdlClassImpl::getField( const OUString & )
	throw(::com::sun::star::uno::RuntimeException)
{
	return Reference< XIdlField >();
}
//__________________________________________________________________________________________________
Sequence< Reference< XIdlField > > IdlClassImpl::getFields()
	throw(::com::sun::star::uno::RuntimeException)
{
	return Sequence< Reference< XIdlField > >();
}
// interfaces
//__________________________________________________________________________________________________
Uik IdlClassImpl::getUik()
	throw(::com::sun::star::uno::RuntimeException)
{
	return Uik();
}
//__________________________________________________________________________________________________
Reference< XIdlMethod > IdlClassImpl::getMethod( const OUString & )
	throw(::com::sun::star::uno::RuntimeException)
{
	return Reference< XIdlMethod >();
}
//__________________________________________________________________________________________________
Sequence< Reference< XIdlMethod > > IdlClassImpl::getMethods()
	throw(::com::sun::star::uno::RuntimeException)
{
	return Sequence< Reference< XIdlMethod > >();
}
// array
//__________________________________________________________________________________________________
Reference< XIdlClass > IdlClassImpl::getComponentType()
	throw(::com::sun::star::uno::RuntimeException)
{
	return Reference< XIdlClass >();
}
//__________________________________________________________________________________________________
Reference< XIdlArray > IdlClassImpl::getArray()
	throw(::com::sun::star::uno::RuntimeException)
{
	return Reference< XIdlArray >();
}


//##################################################################################################
//##################################################################################################
//##################################################################################################


//__________________________________________________________________________________________________
IdlMemberImpl::IdlMemberImpl( IdlReflectionServiceImpl * pReflection, const OUString & rName,
							  typelib_TypeDescription * pTypeDescr,
							  typelib_TypeDescription * pDeclTypeDescr )
	: _pReflection( pReflection )
	, _aName( rName )
	, _pTypeDescr( pTypeDescr )
	, _pDeclTypeDescr( pDeclTypeDescr )
{
	_pReflection->acquire();
	typelib_typedescription_acquire( _pTypeDescr );
    if (! _pTypeDescr->bComplete)
        typelib_typedescription_complete( &_pTypeDescr );
	typelib_typedescription_acquire( _pDeclTypeDescr );
    if (! _pDeclTypeDescr->bComplete)
        typelib_typedescription_complete( &_pDeclTypeDescr );
}
//__________________________________________________________________________________________________
IdlMemberImpl::~IdlMemberImpl()
{
	typelib_typedescription_release( _pDeclTypeDescr );
	typelib_typedescription_release( _pTypeDescr );
	_pReflection->release();
}

// XIdlMember
//__________________________________________________________________________________________________
Reference< XIdlClass > IdlMemberImpl::getDeclaringClass()
	throw(::com::sun::star::uno::RuntimeException)
{
	if (! _xDeclClass.is())
    {
		Reference< XIdlClass > xDeclClass( getReflection()->forType( getDeclTypeDescr() ) );
		MutexGuard aGuard( getMutexAccess() );
        if (! _xDeclClass.is())
            _xDeclClass = xDeclClass;
    }
	return _xDeclClass;
}
//__________________________________________________________________________________________________
OUString IdlMemberImpl::getName()
	throw(::com::sun::star::uno::RuntimeException)
{
	return _aName;
}

}
