/**************************************************************
 *
 * 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_svx.hxx"
#include <svx/dbaobjectex.hxx>
#include <osl/diagnose.h>
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
#include <com/sun/star/sdb/XSQLQueryComposerFactory.hpp>
#include <com/sun/star/sdb/XSQLQueryComposerFactory.hpp>
#ifndef _SVX_FMPROP_HRC
#include "fmprop.hrc"
#endif
#include <comphelper/extract.hxx>
#include <sot/formats.hxx>
#include <sot/exchange.hxx>
#include <comphelper/propertysetinfo.hxx>
#ifndef _SVX_FMPROP_HRC
#include "fmprop.hrc"
#endif

//........................................................................
namespace svx
{
//........................................................................

	using namespace ::com::sun::star::uno;
	using namespace ::com::sun::star::beans;
	using namespace ::com::sun::star::sdb;
	using namespace ::com::sun::star::sdbc;
	using namespace ::com::sun::star::lang;
	using namespace ::com::sun::star::ucb;
	using namespace ::com::sun::star::sdbcx;
	using namespace ::com::sun::star::container;
	using namespace ::com::sun::star::datatransfer;
	using namespace ::comphelper;

	//====================================================================
	//= OComponentTransferable
	//====================================================================
	//--------------------------------------------------------------------
	OComponentTransferable::OComponentTransferable(const ::rtl::OUString& _rDatasourceOrLocation
			,const Reference< XContent>& _xContent)
	{
		m_aDescriptor.setDataSource(_rDatasourceOrLocation);
		m_aDescriptor[daComponent] <<= _xContent;
	}


	//--------------------------------------------------------------------
	sal_uInt32 OComponentTransferable::getDescriptorFormatId(sal_Bool _bExtractForm)
	{
		static sal_uInt32 s_nReportFormat = (sal_uInt32)-1;
		static sal_uInt32 s_nFormFormat = (sal_uInt32)-1;
		if ( _bExtractForm && (sal_uInt32)-1 == s_nFormFormat )
		{
			s_nFormFormat = SotExchange::RegisterFormatName(String::CreateFromAscii("application/x-openoffice;windows_formatname=\"dbaccess.FormComponentDescriptorTransfer\"" ));
			OSL_ENSURE((sal_uInt32)-1 != s_nFormFormat, "OComponentTransferable::getDescriptorFormatId: bad exchange id!");
		}
		else if ( !_bExtractForm && (sal_uInt32)-1 == s_nReportFormat)
		{
			s_nReportFormat = SotExchange::RegisterFormatName(String::CreateFromAscii("application/x-openoffice;windows_formatname=\"dbaccess.ReportComponentDescriptorTransfer\""));
			OSL_ENSURE((sal_uInt32)-1 != s_nReportFormat, "OComponentTransferable::getDescriptorFormatId: bad exchange id!");
		}
		return _bExtractForm ? s_nFormFormat : s_nReportFormat;
	}

	//--------------------------------------------------------------------
	void OComponentTransferable::AddSupportedFormats()
	{
		sal_Bool bForm = sal_True;
		try
		{
			Reference<XPropertySet> xProp;
			m_aDescriptor[daComponent] >>= xProp;
			if ( xProp.is() )
				xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IsForm"))) >>= bForm;
		}
		catch(Exception)
		{}
		AddFormat(getDescriptorFormatId(bForm));
	}

	//--------------------------------------------------------------------
	sal_Bool OComponentTransferable::GetData( const DataFlavor& _rFlavor )
	{
		const sal_uInt32 nFormatId = SotExchange::GetFormat(_rFlavor);
		if ( nFormatId == getDescriptorFormatId(sal_True) || nFormatId == getDescriptorFormatId(sal_False) )
			return SetAny( makeAny( m_aDescriptor.createPropertyValueSequence() ), _rFlavor );

		return sal_False;
	}

	//--------------------------------------------------------------------
	sal_Bool OComponentTransferable::canExtractComponentDescriptor(const DataFlavorExVector& _rFlavors,sal_Bool _bForm )
	{
		DataFlavorExVector::const_iterator aEnd = _rFlavors.end();
		for (	DataFlavorExVector::const_iterator aCheck = _rFlavors.begin();
				aCheck != aEnd;
				++aCheck
			)
		{
			if ( getDescriptorFormatId(_bForm) == aCheck->mnSotId )
				return sal_True;
		}

		return sal_False;
	}

	//--------------------------------------------------------------------
	ODataAccessDescriptor OComponentTransferable::extractComponentDescriptor(const TransferableDataHelper& _rData)
	{
		sal_Bool bForm = _rData.HasFormat(getDescriptorFormatId(sal_True));
		if ( bForm || _rData.HasFormat(getDescriptorFormatId(sal_False)) )
		{
			// the object has a real descriptor object (not just the old compatible format)

			// extract the any from the transferable
			DataFlavor aFlavor;
#if OSL_DEBUG_LEVEL > 0
			sal_Bool bSuccess =
#endif
			SotExchange::GetFormatDataFlavor(getDescriptorFormatId(bForm), aFlavor);
			OSL_ENSURE(bSuccess, "OComponentTransferable::extractColumnDescriptor: invalid data format (no flavor)!");

			Any aDescriptor = _rData.GetAny(aFlavor);

			// extract the property value sequence
			Sequence< PropertyValue > aDescriptorProps;
#if OSL_DEBUG_LEVEL > 0
			bSuccess =
#endif
			aDescriptor >>= aDescriptorProps;
			OSL_ENSURE(bSuccess, "OComponentTransferable::extractColumnDescriptor: invalid clipboard format!");

			// build the real descriptor
			return ODataAccessDescriptor(aDescriptorProps);
		}

		return ODataAccessDescriptor();
	}

	//--------------------------------------------------------------------
	sal_Bool OComponentTransferable::extractComponentDescriptor(const TransferableDataHelper& _rData
		,sal_Bool _bExtractForm
		, ::rtl::OUString&	_rDatasourceOrLocation
		, ::com::sun::star::uno::Reference< XContent>& _xContent)
	{
		if ( _rData.HasFormat( getDescriptorFormatId(_bExtractForm)) )
		{
			ODataAccessDescriptor aDescriptor = extractComponentDescriptor(_rData);
			_rDatasourceOrLocation = aDescriptor.getDataSource();
			aDescriptor[daComponent]			>>= _xContent;
			return sal_True;
		}

		return sal_False;
	}
//........................................................................
}	// namespace svx
//........................................................................
