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



//______________________________________________________________________________________________________________
//	my own include
//______________________________________________________________________________________________________________

#include "OConnectionPointHelper.hxx"

//______________________________________________________________________________________________________________
//	includes of other projects
//______________________________________________________________________________________________________________

//______________________________________________________________________________________________________________
//	include of my own project
//______________________________________________________________________________________________________________
#include "OConnectionPointContainerHelper.hxx"

//______________________________________________________________________________________________________________
//	namespaces
//______________________________________________________________________________________________________________

using namespace	::rtl					;
using namespace	::osl					;
using namespace	::cppu					;
using namespace	::com::sun::star::uno	;
using namespace	::com::sun::star::lang	;

namespace unocontrols{

//______________________________________________________________________________________________________________
//	construct/destruct
//______________________________________________________________________________________________________________

OConnectionPointHelper::OConnectionPointHelper(	Mutex&								aMutex						,
		 										OConnectionPointContainerHelper*	pContainerImplementation	,
												UNO3_TYPE				  			aType						)
	: m_aSharedMutex				( aMutex					)
	, m_oContainerWeakReference		( pContainerImplementation	)
	, m_pContainerImplementation	( pContainerImplementation	)
	, m_aInterfaceType				( aType						)
{
}

OConnectionPointHelper::~OConnectionPointHelper()
{
}

//____________________________________________________________________________________________________________
//	XInterface
//____________________________________________________________________________________________________________

Any SAL_CALL OConnectionPointHelper::queryInterface( const Type& aType ) throw( RuntimeException )
{
	// Attention:
	//	Don't use mutex or guard in this method!!! Is a method of XInterface.

	// Ask for my own supported interfaces ...
	Any aReturn	( ::cppu::queryInterface(	aType										,
									   		static_cast< XConnectionPoint*	> ( this )
										)
				);

	// If searched interface not supported by this class ...
	if ( aReturn.hasValue() == sal_False )
	{
		// ... ask baseclasses.
		aReturn = OWeakObject::queryInterface( aType );
	}

	return aReturn ;
}

//____________________________________________________________________________________________________________
//	XInterface
//____________________________________________________________________________________________________________

void SAL_CALL OConnectionPointHelper::acquire() throw()
{
	// Attention:
	//	Don't use mutex or guard in this method!!! Is a method of XInterface.

	// Forward to baseclass
	OWeakObject::acquire();
}

//____________________________________________________________________________________________________________
//	XInterface
//____________________________________________________________________________________________________________

void SAL_CALL OConnectionPointHelper::release() throw()
{
	// Attention:
	//	Don't use mutex or guard in this method!!! Is a method of XInterface.

	// Forward to baseclass
	OWeakObject::release();
}

//______________________________________________________________________________________________________________
//	XConnectionPoint
//______________________________________________________________________________________________________________

Type SAL_CALL OConnectionPointHelper::getConnectionType() throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aSharedMutex );

	// Set default return value, if method failed.
	if ( impl_LockContainer() == sal_False )
	{
		// Container not exist! Its an runtime error.
		throw RuntimeException();
	}

	// If container reference valid, return right type of supported interfaces of THIS connectionpoint.
	Type aReturnType = m_aInterfaceType ;
	// Don't forget this!
	impl_UnlockContainer();

	return aReturnType;
}

//______________________________________________________________________________________________________________
//	XConnectionPoint
//______________________________________________________________________________________________________________

Reference< XConnectionPointContainer > SAL_CALL OConnectionPointHelper::getConnectionPointContainer() throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aSharedMutex );
	// Convert weakreference to correct uno3-reference and return value. It can be NULL, if container destroyed!
	return Reference< XConnectionPointContainer >( m_oContainerWeakReference.get(), UNO_QUERY );
}

//______________________________________________________________________________________________________________
//	XConnectionPoint
//______________________________________________________________________________________________________________

void SAL_CALL OConnectionPointHelper::advise( const Reference< XInterface >& xListener ) throw(	ListenerExistException		,
																								InvalidListenerException	,
																								RuntimeException			)
{
	// Ready for multithreading
	MutexGuard aGuard( m_aSharedMutex );

	// If type of listener not the same for this special container ...
	Any aCheckType = xListener->queryInterface( m_aInterfaceType );
	if ( aCheckType.hasValue() )
	{
		// ... throw an exception.
		throw InvalidListenerException();
	}

	// ListenerExistException is obsolete!?
	// Its the same container for XConnectionPointContainer and XConnectionPoint. But only here we must control, if a listener already exist!?
	// You can add a listener more then one time at XConnectionPointContainer, but here only one ...

	// Operation is permitted only, if reference to container is valid!
	if ( impl_LockContainer() == sal_False )
	{
		// Container not exist! Its an runtime error.
		throw RuntimeException();
	}
	// Forward it to OConnectionPointHelperContainer!
	m_pContainerImplementation->advise( m_aInterfaceType, xListener );
	// Don't forget this!
	impl_UnlockContainer();
}

//______________________________________________________________________________________________________________
//	XConnectionPoint
//______________________________________________________________________________________________________________

void SAL_CALL OConnectionPointHelper::unadvise( const Reference< XInterface >& xListener ) throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aSharedMutex );
	// Operation is permitted only, if reference to container is valid!
	if ( impl_LockContainer() == sal_False )
	{
		// Container not exist! Its an runtime error.
		throw RuntimeException();

	}
	// Forward it to OConnectionPointHelperContainer!
	m_pContainerImplementation->unadvise( m_aInterfaceType, xListener );
	// Don't forget this!
	impl_UnlockContainer();
}

//______________________________________________________________________________________________________________
//	XConnectionPoint
//______________________________________________________________________________________________________________

Sequence< Reference< XInterface > > SAL_CALL OConnectionPointHelper::getConnections() throw( RuntimeException )
{
	// Ready for multithreading
	MutexGuard aGuard( m_aSharedMutex );
	// Operation is permitted only, if reference to container is valid!
	if ( impl_LockContainer() == sal_False )
	{
		// Container not exist! Its an runtime error.
		throw RuntimeException();
	}
	// Set default return value, if method failed.
	Sequence< Reference< XInterface > > seqReturnConnections = Sequence< Reference< XInterface > >();
	// Get reference to private member of OConnectionPointHelperContainer!
	OMultiTypeInterfaceContainerHelper&	aSharedContainer = m_pContainerImplementation->impl_getMultiTypeContainer();
	// Get pointer to specialized container which hold all interfaces of searched type.
	OInterfaceContainerHelper* pSpecialContainer = aSharedContainer.getContainer( m_aInterfaceType );
	// Get elements of searched type, if somelse exist.
	if ( pSpecialContainer != NULL )
	{
		seqReturnConnections = pSpecialContainer->getElements();
	}
	// Don't forget this!
	impl_UnlockContainer();

	return seqReturnConnections;
}

//______________________________________________________________________________________________________________
//	private method
//______________________________________________________________________________________________________________

sal_Bool OConnectionPointHelper::impl_LockContainer()
{
	// Convert weakreference to hard uno3-reference and return state.
	// If this reference different from NULL, there exist a hard reference to container. Container-instance can't be destroyed.
	// Don't forget to "unlock" this reference!
	m_xLock = m_oContainerWeakReference.get();
	return m_xLock.is();
}

//______________________________________________________________________________________________________________
//	private method
//______________________________________________________________________________________________________________

void OConnectionPointHelper::impl_UnlockContainer()
{
	// Free hard uno3-reference to container.
	// see also "impl_LockContainer()"
	m_xLock = Reference< XInterface >();
}

}	// namespace unocontrols
