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

#include <cacheddynamicresultsetstub.hxx>
#include <com/sun/star/sdbc/XResultSet.hpp>
#include <cachedcontentresultsetstub.hxx>
#include <com/sun/star/ucb/ContentResultSetCapability.hpp>
#include <com/sun/star/ucb/XSortedDynamicResultSetFactory.hpp>
#include <osl/diagnose.h>

using namespace com::sun::star::lang;
using namespace com::sun::star::sdbc;
using namespace com::sun::star::ucb;
using namespace com::sun::star::uno;
using namespace rtl;

CachedDynamicResultSetStub::CachedDynamicResultSetStub(
		Reference< XDynamicResultSet > xOrigin
		, const Reference< XMultiServiceFactory > & xSMgr )
		: DynamicResultSetWrapper( xOrigin, xSMgr )
{
	OSL_ENSURE( m_xSMgr.is(), "need Multiservicefactory to create stub" );
	impl_init();
}

CachedDynamicResultSetStub::~CachedDynamicResultSetStub()
{
	impl_deinit();
}

//virtual
void SAL_CALL CachedDynamicResultSetStub
	::impl_InitResultSetOne( const Reference< XResultSet >& xResultSet )
{
	DynamicResultSetWrapper::impl_InitResultSetOne( xResultSet );
	OSL_ENSURE( m_xSourceResultOne.is(), "need source resultset" );

	Reference< XResultSet > xStub(
		new CachedContentResultSetStub( m_xSourceResultOne ) );

	osl::Guard< osl::Mutex > aGuard( m_aMutex );
	m_xMyResultOne = xStub;
}

//virtual
void SAL_CALL CachedDynamicResultSetStub
	::impl_InitResultSetTwo( const Reference< XResultSet >& xResultSet )
{
	DynamicResultSetWrapper::impl_InitResultSetTwo( xResultSet );
	OSL_ENSURE( m_xSourceResultTwo.is(), "need source resultset" );

	Reference< XResultSet > xStub(
		new CachedContentResultSetStub( m_xSourceResultTwo ) );

	osl::Guard< osl::Mutex > aGuard( m_aMutex );
	m_xMyResultTwo = xStub;
}

//--------------------------------------------------------------------------
// XInterface methods.
//--------------------------------------------------------------------------
XINTERFACE_COMMON_IMPL( CachedDynamicResultSetStub )

Any SAL_CALL CachedDynamicResultSetStub
	::queryInterface( const Type&  rType )
	throw ( RuntimeException )
{
	//list all interfaces inclusive baseclasses of interfaces

	Any aRet = DynamicResultSetWrapper::queryInterface( rType );
	if( aRet.hasValue() )
		return aRet;

	aRet = cppu::queryInterface( rType,
				static_cast< XTypeProvider* >( this )
				, static_cast< XServiceInfo* >( this )
				);
	return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
}

//--------------------------------------------------------------------------
// XTypeProvider methods.
//--------------------------------------------------------------------------
//list all interfaces exclusive baseclasses
XTYPEPROVIDER_IMPL_5( CachedDynamicResultSetStub
					, XTypeProvider
					, XServiceInfo
					, XDynamicResultSet
					, XDynamicResultSetListener
					, XSourceInitialization
					);

//--------------------------------------------------------------------------
// XServiceInfo methods.
//--------------------------------------------------------------------------

XSERVICEINFO_NOFACTORY_IMPL_1( CachedDynamicResultSetStub,
			 		   OUString::createFromAscii(
						"com.sun.star.comp.ucb.CachedDynamicResultSetStub" ),
			 		   OUString::createFromAscii(
						CACHED_DRS_STUB_SERVICE_NAME ) );

//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
// class CachedDynamicResultSetStubFactory
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------

CachedDynamicResultSetStubFactory::CachedDynamicResultSetStubFactory(
		const Reference< XMultiServiceFactory > & rSMgr )
{
	m_xSMgr = rSMgr;
}

CachedDynamicResultSetStubFactory::~CachedDynamicResultSetStubFactory()
{
}

//--------------------------------------------------------------------------
// CachedDynamicResultSetStubFactory XInterface methods.
//--------------------------------------------------------------------------

XINTERFACE_IMPL_3( CachedDynamicResultSetStubFactory,
				   XTypeProvider,
				   XServiceInfo,
				   XCachedDynamicResultSetStubFactory );

//--------------------------------------------------------------------------
// CachedDynamicResultSetStubFactory XTypeProvider methods.
//--------------------------------------------------------------------------

XTYPEPROVIDER_IMPL_3( CachedDynamicResultSetStubFactory,
					  XTypeProvider,
				   	  XServiceInfo,
					  XCachedDynamicResultSetStubFactory );

//--------------------------------------------------------------------------
// CachedDynamicResultSetStubFactory XServiceInfo methods.
//--------------------------------------------------------------------------

XSERVICEINFO_IMPL_1( CachedDynamicResultSetStubFactory,
 		   		 OUString::createFromAscii(
				 	"com.sun.star.comp.ucb.CachedDynamicResultSetStubFactory" ),
 		   		 OUString::createFromAscii(
				 	CACHED_DRS_STUB_FACTORY_NAME ) );

//--------------------------------------------------------------------------
// Service factory implementation.
//--------------------------------------------------------------------------

ONE_INSTANCE_SERVICE_FACTORY_IMPL( CachedDynamicResultSetStubFactory );

//--------------------------------------------------------------------------
// CachedDynamicResultSetStubFactory XCachedDynamicResultSetStubFactory methods.
//--------------------------------------------------------------------------

//virtual
Reference< XDynamicResultSet > SAL_CALL CachedDynamicResultSetStubFactory
	::createCachedDynamicResultSetStub(
			const Reference< XDynamicResultSet > & Source )
			throw( RuntimeException )
{
	Reference< XDynamicResultSet > xRet;
	xRet = new CachedDynamicResultSetStub( Source, m_xSMgr );
	return xRet;
}

//virtual
void SAL_CALL CachedDynamicResultSetStubFactory
	::connectToCache(
			  const Reference< XDynamicResultSet > & Source
			, const Reference< XDynamicResultSet > & TargetCache
			, const Sequence< NumberedSortingInfo > & SortingInfo
			, const Reference< XAnyCompareFactory > & CompareFactory
			)
			throw (  ListenerAlreadySetException
			, AlreadyInitializedException
			, RuntimeException )
{
	OSL_ENSURE( Source.is(), "a Source is needed" );
	OSL_ENSURE( TargetCache.is(), "a TargetCache is needed" );

	Reference< XDynamicResultSet > xSource( Source );
	if( SortingInfo.getLength() &&
		!( xSource->getCapabilities() & ContentResultSetCapability::SORTED )
		)
	{
		Reference< XSortedDynamicResultSetFactory > xSortFactory;
		try
		{
			xSortFactory = Reference< XSortedDynamicResultSetFactory >(
				m_xSMgr->createInstance( OUString::createFromAscii(
					"com.sun.star.ucb.SortedDynamicResultSetFactory" ) ),
				UNO_QUERY );
		}
		catch ( Exception const & )
		{
		}

		if( xSortFactory.is() )
		{
			Reference< XDynamicResultSet > xSorted(
				xSortFactory->createSortedDynamicResultSet(
					Source, SortingInfo, CompareFactory ) );
			if( xSorted.is() )
				xSource = xSorted;
		}
	}

	Reference< XDynamicResultSet > xStub(
		new CachedDynamicResultSetStub( xSource, m_xSMgr ) );

	Reference< XSourceInitialization > xTarget( TargetCache, UNO_QUERY );
	OSL_ENSURE( xTarget.is(), "Target must have interface XSourceInitialization" );

	xTarget->setSource( xStub );
}

