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


#if defined(_MSC_VER) && (_MSC_VER > 1310)
#pragma warning(disable : 4917 4555)
#endif

// actually this workaround should be in presys.h!
//#define UINT64 USE_WIN_UINT64
//#define INT64 USE_WIN_INT64
//#define UINT32 USE_WIN_UINT32
//#define INT32 USE_WIN_INT32

//#include <tools/presys.h>
#include "embeddoc.hxx"
//#include <tools/postsys.h>

//#undef UINT64
//#undef INT64
//#undef UINT32
//#undef INT32


#include <com/sun/star/uno/Any.h>
#include <com/sun/star/uno/Exception.hpp>
#include <com/sun/star/datatransfer/XTransferable.hpp>


#include <osl/thread.h>

using namespace ::com::sun::star;

//===============================================================================
// EmbedDocument_Impl
//===============================================================================

sal_uInt64 EmbedDocument_Impl::getMetaFileHandle_Impl( sal_Bool isEnhMeta )
{
	sal_uInt64 pResult = NULL;

	uno::Reference< datatransfer::XTransferable > xTransferable( m_pDocHolder->GetDocument(), uno::UNO_QUERY );
	if ( xTransferable.is() )
	{
		uno::Sequence< sal_Int8 > aMetaBuffer;
		datatransfer::DataFlavor aFlavor;

		if ( isEnhMeta )
		{
			aFlavor.MimeType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
												"application/x-openoffice-emf;windows_formatname=\"Image EMF\"" ) );
			aFlavor.HumanPresentableName = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Enhanced Windows MetaFile" ) );
		}
		else
		{
			aFlavor.MimeType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
												"application/x-openoffice-wmf;windows_formatname=\"Image WMF\"" ) );
			aFlavor.HumanPresentableName = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Windows GDIMetaFile" ) );
		}

		aFlavor.DataType = getCppuType( (const sal_uInt64*) 0 );

		uno::Any aAny = xTransferable->getTransferData( aFlavor );
		aAny >>= pResult;
	}

	return pResult;
}

//-------------------------------------------------------------------------------
// IDataObject

STDMETHODIMP EmbedDocument_Impl::GetData( FORMATETC * pFormatetc, STGMEDIUM * pMedium )
{
	if ( !pFormatetc )
		return DV_E_FORMATETC;

	if ( !pMedium )
		return STG_E_MEDIUMFULL;

	if ( pFormatetc->dwAspect == DVASPECT_THUMBNAIL
	  || pFormatetc->dwAspect == DVASPECT_ICON
	  || pFormatetc->dwAspect == DVASPECT_DOCPRINT )
		return DV_E_DVASPECT;

	if ( pFormatetc->cfFormat == CF_ENHMETAFILE )
	{
		if ( !( pFormatetc->tymed & TYMED_ENHMF ) )
			return DV_E_TYMED;

		HENHMETAFILE hMeta = reinterpret_cast<HENHMETAFILE>( getMetaFileHandle_Impl( sal_True ) );

		if ( hMeta )
		{
			pMedium->tymed = TYMED_ENHMF;
			pMedium->hEnhMetaFile = hMeta;
			pMedium->pUnkForRelease = NULL;

			return S_OK;
		}

		return STG_E_MEDIUMFULL;
	}
	else if ( pFormatetc->cfFormat == CF_METAFILEPICT )
	{
	  	if ( !( pFormatetc->tymed & TYMED_MFPICT ) )
			return DV_E_TYMED;

		HGLOBAL hMeta = reinterpret_cast<HGLOBAL>( getMetaFileHandle_Impl( sal_False ) );

		if ( hMeta )
		{
			pMedium->tymed = TYMED_MFPICT;
			pMedium->hMetaFilePict = hMeta;
			pMedium->pUnkForRelease = NULL;

			return S_OK;
		}

		return STG_E_MEDIUMFULL;
	}
	else
	{
		CLIPFORMAT cf_embSource = (CLIPFORMAT)RegisterClipboardFormatA( "Embed Source" );
		CLIPFORMAT cf_embObj = (CLIPFORMAT)RegisterClipboardFormatA( "Embedded Object" );
		if ( pFormatetc->cfFormat == cf_embSource || pFormatetc->cfFormat == cf_embObj )
		{
			if ( !( pFormatetc->tymed & TYMED_ISTORAGE ) )
				return DV_E_TYMED;

			CComPtr< IStorage > pNewStg;
			HRESULT hr = StgCreateDocfile( NULL, STGM_CREATE | STGM_READWRITE | STGM_DELETEONRELEASE, 0, &pNewStg );
			if ( FAILED( hr ) || !pNewStg ) return STG_E_MEDIUMFULL;

			hr = SaveTo_Impl( pNewStg );
			if ( FAILED( hr ) ) return STG_E_MEDIUMFULL;

			pMedium->tymed = TYMED_ISTORAGE;
			pMedium->pstg = pNewStg;
			pMedium->pstg->AddRef();
			pMedium->pUnkForRelease = ( IUnknown* )pNewStg;

			return S_OK;
		}
	}

	return DV_E_FORMATETC;
}

STDMETHODIMP EmbedDocument_Impl::GetDataHere( FORMATETC * pFormatetc, STGMEDIUM * pMedium )
{
	if ( !pFormatetc )
		return DV_E_FORMATETC;

	if ( !pMedium )
		return STG_E_MEDIUMFULL;

	if ( pFormatetc->dwAspect == DVASPECT_THUMBNAIL
	  || pFormatetc->dwAspect == DVASPECT_ICON
	  || pFormatetc->dwAspect == DVASPECT_DOCPRINT )
		return DV_E_DVASPECT;

	CLIPFORMAT cf_embSource = (CLIPFORMAT)RegisterClipboardFormatA( "Embed Source" );
	CLIPFORMAT cf_embObj = (CLIPFORMAT)RegisterClipboardFormatA( "Embedded Object" );

	if ( pFormatetc->cfFormat == cf_embSource || pFormatetc->cfFormat == cf_embObj )
	{
		if ( !( pFormatetc->tymed & TYMED_ISTORAGE ) )
			return DV_E_TYMED;

		if ( !pMedium->pstg ) return STG_E_MEDIUMFULL;

		HRESULT hr = SaveTo_Impl( pMedium->pstg );
		if ( FAILED( hr ) ) return STG_E_MEDIUMFULL;

		pMedium->tymed = TYMED_ISTORAGE;
		pMedium->pUnkForRelease = NULL;

		return S_OK;
	}

	return DV_E_FORMATETC;
}

STDMETHODIMP EmbedDocument_Impl::QueryGetData( FORMATETC * pFormatetc )
{
	if ( pFormatetc )
	{
		if ( pFormatetc->dwAspect == DVASPECT_THUMBNAIL
		  || pFormatetc->dwAspect == DVASPECT_ICON
		  || pFormatetc->dwAspect == DVASPECT_DOCPRINT )
			return DV_E_DVASPECT;

		if ( pFormatetc->cfFormat == CF_ENHMETAFILE )
		{
			if ( !( pFormatetc->tymed & TYMED_ENHMF ) )
				return DV_E_TYMED;

			return S_OK;
		}
		else if ( pFormatetc->cfFormat == CF_METAFILEPICT )
		{
	  		if ( !( pFormatetc->tymed & TYMED_MFPICT ) )
				return DV_E_TYMED;

			return S_OK;
		}
		else
		{
			CLIPFORMAT cf_embSource = (CLIPFORMAT)RegisterClipboardFormatA( "Embed Source" );
			CLIPFORMAT cf_embObj = (CLIPFORMAT)RegisterClipboardFormatA( "Embedded Object" );
			if ( pFormatetc->cfFormat == cf_embSource || pFormatetc->cfFormat == cf_embObj )
			{
				if ( !( pFormatetc->tymed & TYMED_ISTORAGE ) )
					return DV_E_TYMED;

				return S_OK;
			}
		}
	}

	return DV_E_FORMATETC;

}

STDMETHODIMP EmbedDocument_Impl::GetCanonicalFormatEtc( FORMATETC * pFormatetcIn, FORMATETC * pFormatetcOut )
{
	if ( !pFormatetcIn || !pFormatetcOut )
		return DV_E_FORMATETC;

	pFormatetcOut->ptd = NULL;
	pFormatetcOut->cfFormat = pFormatetcIn->cfFormat;
	pFormatetcOut->dwAspect = DVASPECT_CONTENT;

	if ( pFormatetcIn->cfFormat == CF_ENHMETAFILE )
	{
		pFormatetcOut->tymed = TYMED_ENHMF;
		return S_OK;
	}
	else if ( pFormatetcIn->cfFormat == CF_METAFILEPICT )
	{
  		pFormatetcOut->tymed = TYMED_MFPICT;
		return S_OK;
	}
	else
	{
		CLIPFORMAT cf_embSource = (CLIPFORMAT)RegisterClipboardFormatA( "Embed Source" );
		CLIPFORMAT cf_embObj = (CLIPFORMAT)RegisterClipboardFormatA( "Embedded Object" );
		if ( pFormatetcIn->cfFormat == cf_embSource || pFormatetcIn->cfFormat == cf_embObj )
		{
			pFormatetcOut->tymed = TYMED_ISTORAGE;
			return S_OK;
		}
	}

	return DV_E_FORMATETC;
}

STDMETHODIMP EmbedDocument_Impl::SetData( FORMATETC * /*pFormatetc*/, STGMEDIUM * /*pMedium*/, BOOL /*fRelease*/ )
{
	return E_NOTIMPL;
}

STDMETHODIMP EmbedDocument_Impl::EnumFormatEtc( DWORD dwDirection, IEnumFORMATETC ** /*ppFormatetc*/ )
{
	if ( dwDirection == DATADIR_GET )
		return OLE_S_USEREG;

	return E_NOTIMPL;
}

STDMETHODIMP EmbedDocument_Impl::DAdvise( FORMATETC * pFormatetc, DWORD advf, IAdviseSink * pAdvSink, DWORD * pdwConnection )
{
	if ( !m_pDAdviseHolder )
		if ( !SUCCEEDED( CreateDataAdviseHolder( &m_pDAdviseHolder ) ) || !m_pDAdviseHolder )
			return E_OUTOFMEMORY;

	return m_pDAdviseHolder->Advise( (IDataObject*)this, pFormatetc, advf, pAdvSink, pdwConnection );
}

STDMETHODIMP EmbedDocument_Impl::DUnadvise( DWORD dwConnection )
{
	if ( !m_pDAdviseHolder )
		if ( !SUCCEEDED( CreateDataAdviseHolder( &m_pDAdviseHolder ) ) || !m_pDAdviseHolder )
			return E_OUTOFMEMORY;

	return m_pDAdviseHolder->Unadvise( dwConnection );
}

STDMETHODIMP EmbedDocument_Impl::EnumDAdvise( IEnumSTATDATA ** ppenumAdvise )
{
	if ( !m_pDAdviseHolder )
		if ( !SUCCEEDED( CreateDataAdviseHolder( &m_pDAdviseHolder ) ) || !m_pDAdviseHolder )
			return E_OUTOFMEMORY;

	return m_pDAdviseHolder->EnumAdvise( ppenumAdvise );
}

// Fix strange warnings about some
// ATL::CAxHostWindow::QueryInterface|AddRef|Releae functions.
// warning C4505: 'xxx' : unreferenced local function has been removed
#if defined(_MSC_VER)
#pragma warning(disable: 4505)
#endif
