/**************************************************************
 *
 * 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_connectivity.hxx"
#include <connectivity/conncleanup.hxx>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/lang/XComponent.hpp>
#include <osl/diagnose.h>

//.........................................................................
namespace dbtools
{
//.........................................................................

	using namespace ::com::sun::star::uno;
	using namespace ::com::sun::star::beans;
	using namespace ::com::sun::star::sdbc;
	using namespace ::com::sun::star::lang;

	//=====================================================================
	static const ::rtl::OUString& getActiveConnectionPropertyName()
	{
		static const ::rtl::OUString s_sActiveConnectionPropertyName = ::rtl::OUString::createFromAscii("ActiveConnection");
		return s_sActiveConnectionPropertyName;
	}

	//=====================================================================
	//= OAutoConnectionDisposer
	//=====================================================================
	//---------------------------------------------------------------------
	OAutoConnectionDisposer::OAutoConnectionDisposer(const Reference< XRowSet >& _rxRowSet, const Reference< XConnection >& _rxConnection)
		:m_xRowSet( _rxRowSet )
		,m_bRSListening( sal_False )
		,m_bPropertyListening( sal_False )
	{
		Reference< XPropertySet > xProps(_rxRowSet, UNO_QUERY);
		OSL_ENSURE(xProps.is(), "OAutoConnectionDisposer::OAutoConnectionDisposer: invalid rowset (no XPropertySet)!");

		if (!xProps.is())
			return;

		try
		{
			xProps->setPropertyValue( getActiveConnectionPropertyName(), makeAny( _rxConnection ) );
			m_xOriginalConnection = _rxConnection;
			startPropertyListening( xProps );
		}
		catch( const Exception& )
		{
			OSL_ENSURE( sal_False, "OAutoConnectionDisposer::OAutoConnectionDisposer: caught an exception!" );
		}
	}

	//---------------------------------------------------------------------
	void OAutoConnectionDisposer::startPropertyListening( const Reference< XPropertySet >& _rxRowSet )
	{
		try
		{
			_rxRowSet->addPropertyChangeListener( getActiveConnectionPropertyName(), this );
			m_bPropertyListening = sal_True;
		}
		catch( const Exception& )
		{
			OSL_ENSURE( sal_False, "OAutoConnectionDisposer::startPropertyListening: caught an exception!" );
		}
	}

	//---------------------------------------------------------------------
	void OAutoConnectionDisposer::stopPropertyListening( const Reference< XPropertySet >& _rxEventSource )
	{
		// prevent deletion of ourself while we're herein
		Reference< XInterface > xKeepAlive(static_cast< XWeak* >(this));

		try
		{	// remove ourself as property change listener
			OSL_ENSURE( _rxEventSource.is(), "OAutoConnectionDisposer::stopPropertyListening: invalid event source (no XPropertySet)!" );
			if ( _rxEventSource.is() )
			{
				_rxEventSource->removePropertyChangeListener( getActiveConnectionPropertyName(), this );
				m_bPropertyListening = sal_False;
			}
		}
		catch( const Exception& )
		{
			OSL_ENSURE( sal_False, "OAutoConnectionDisposer::stopPropertyListening: caught an exception!" );
		}
	}

	//---------------------------------------------------------------------
	void OAutoConnectionDisposer::startRowSetListening()
	{
		OSL_ENSURE( !m_bRSListening, "OAutoConnectionDisposer::startRowSetListening: already listening!" );
		try
		{
			if ( !m_bRSListening )
				m_xRowSet->addRowSetListener( this );
		}
		catch( const Exception& )
		{
			OSL_ENSURE( sal_False, "OAutoConnectionDisposer::startRowSetListening: caught an exception!" );
		}
		m_bRSListening = sal_True;
	}

	//---------------------------------------------------------------------
	void OAutoConnectionDisposer::stopRowSetListening()
	{
		OSL_ENSURE( m_bRSListening, "OAutoConnectionDisposer::stopRowSetListening: not listening!" );
		try
		{
			m_xRowSet->removeRowSetListener( this );
		}
		catch( const Exception& )
		{
			OSL_ENSURE( sal_False, "OAutoConnectionDisposer::stopRowSetListening: caught an exception!" );
		}
		m_bRSListening = sal_False;
	}

	//---------------------------------------------------------------------
	void SAL_CALL OAutoConnectionDisposer::propertyChange( const PropertyChangeEvent& _rEvent ) throw (RuntimeException)
	{
		if ( _rEvent.PropertyName.equals( getActiveConnectionPropertyName() ) )
		{	// somebody set a new ActiveConnection

			Reference< XConnection > xNewConnection;
			_rEvent.NewValue >>= xNewConnection;

			if ( isRowSetListening() )
			{
				// we're listening at the row set, this means that the row set does not have our
				// m_xOriginalConnection as active connection anymore
				// So there are two possibilities
				// a. somebody sets a new connection which is not our original one
				// b. somebody sets a new connection, which is exactly the original one
				// a. we're not interested in a, but in b: In this case, we simply need to move to the state
				// we had originally: listen for property changes, do not listen for row set changes, and
				// do not dispose the connection until the row set does not need it anymore
				if ( xNewConnection.get() == m_xOriginalConnection.get() )
				{
					stopRowSetListening();
				}
			}
			else
			{
				// start listening at the row set. We're allowed to dispose the old connection as soon
				// as the RowSet changed

				// Unfortunately, the our database form implementations sometimes fire the change of their
				// ActiveConnection twice. This is a error in forms/source/component/DatabaseForm.cxx, but
				// changing this would require incompatible changes we can't do for a while.
				// So for the moment, we have to live with it here.
				//
				// The only scenario where this doubled notification causes problems is when the connection
				// of the form is reset to the one we're responsible for (m_xOriginalConnection), so we
				// check this here.
				//
				// Yes, this is a HACK :(
				//
				// 94407 - 08.11.2001 - fs@openoffice.org
				if ( xNewConnection.get() != m_xOriginalConnection.get() )
				{
#if OSL_DEBUG_LEVEL > 0
					Reference< XConnection > xOldConnection;
					_rEvent.OldValue >>= xOldConnection;
					OSL_ENSURE( xOldConnection.get() == m_xOriginalConnection.get(), "OAutoConnectionDisposer::propertyChange: unexpected (original) property value!" );
#endif
					startRowSetListening();
				}
			}
		}
	}

	//---------------------------------------------------------------------
	void SAL_CALL OAutoConnectionDisposer::disposing( const EventObject& _rSource ) throw (RuntimeException)
	{
		// the rowset is being disposed, and nobody has set a new ActiveConnection in the meantime
		if ( isRowSetListening() )
			stopRowSetListening();

		clearConnection();

		if ( isPropertyListening() )
			stopPropertyListening( Reference< XPropertySet >( _rSource.Source, UNO_QUERY ) );
	}
	//---------------------------------------------------------------------
	void OAutoConnectionDisposer::clearConnection()
	{
		try
		{
			// dispose the old connection
			Reference< XComponent > xComp(m_xOriginalConnection, UNO_QUERY);
			if (xComp.is())
				xComp->dispose();
			m_xOriginalConnection.clear();
		}
		catch(Exception&)
		{
			OSL_ENSURE(sal_False, "OAutoConnectionDisposer::clearConnection: caught an exception!");
		}
	}
	//---------------------------------------------------------------------
	void SAL_CALL OAutoConnectionDisposer::cursorMoved( const ::com::sun::star::lang::EventObject& /*event*/ ) throw (::com::sun::star::uno::RuntimeException)
	{
	}
	//---------------------------------------------------------------------
	void SAL_CALL OAutoConnectionDisposer::rowChanged( const ::com::sun::star::lang::EventObject& /*event*/ ) throw (::com::sun::star::uno::RuntimeException)
	{
	}
	//---------------------------------------------------------------------
	void SAL_CALL OAutoConnectionDisposer::rowSetChanged( const ::com::sun::star::lang::EventObject& /*event*/ ) throw (::com::sun::star::uno::RuntimeException)
	{
		stopRowSetListening();
		clearConnection();

	}
	//---------------------------------------------------------------------

//.........................................................................
}	// namespace dbtools
//.........................................................................
