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

//------------------------------------------------------------------------
// includes
//------------------------------------------------------------------------
#include <osl/diagnose.h>
#include "Fetc.hxx"
#include "..\misc\ImplHelper.hxx"

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

CFormatEtc::CFormatEtc(  )
{
	m_FormatEtc.cfFormat = 0;
	m_FormatEtc.ptd      = NULL;
	m_FormatEtc.dwAspect = 0;
	m_FormatEtc.lindex   = -1;
	m_FormatEtc.tymed    = TYMED_NULL;
}

//------------------------------------------------------------------------
// transfer of ownership
//------------------------------------------------------------------------

CFormatEtc::CFormatEtc( const FORMATETC& aFormatEtc )
{
	CopyFormatEtc( &m_FormatEtc, &const_cast< FORMATETC& >( aFormatEtc ) );
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

CFormatEtc::~CFormatEtc( )
{
	DeleteTargetDevice( m_FormatEtc.ptd );
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

CFormatEtc::CFormatEtc( CLIPFORMAT cf, DWORD tymed, DVTARGETDEVICE* ptd, DWORD dwAspect, LONG lindex )
{
	m_FormatEtc.cfFormat = cf;
	m_FormatEtc.ptd      = CopyTargetDevice( ptd );
	m_FormatEtc.dwAspect = dwAspect;
	m_FormatEtc.lindex   = lindex;
	m_FormatEtc.tymed    = tymed; 
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

CFormatEtc::CFormatEtc( const CFormatEtc& theOther )
{
	m_FormatEtc.cfFormat = theOther.m_FormatEtc.cfFormat;
	m_FormatEtc.ptd      = CopyTargetDevice( theOther.m_FormatEtc.ptd );
	m_FormatEtc.dwAspect = theOther.m_FormatEtc.dwAspect;
	m_FormatEtc.lindex   = theOther.m_FormatEtc.lindex;
	m_FormatEtc.tymed    = theOther.m_FormatEtc.tymed;
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

CFormatEtc& CFormatEtc::operator=( const CFormatEtc& theOther )
{
	if ( this != &theOther )
	{
		DeleteTargetDevice( m_FormatEtc.ptd );

		m_FormatEtc.cfFormat = theOther.m_FormatEtc.cfFormat;
		m_FormatEtc.ptd      = CopyTargetDevice( theOther.m_FormatEtc.ptd );
		m_FormatEtc.dwAspect = theOther.m_FormatEtc.dwAspect;
		m_FormatEtc.lindex   = theOther.m_FormatEtc.lindex;
		m_FormatEtc.tymed    = theOther.m_FormatEtc.tymed;
	}

	return *this;
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

CFormatEtc::operator FORMATETC*( )
{
	return &m_FormatEtc;
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

CFormatEtc::operator FORMATETC( )
{
	return m_FormatEtc;
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

void CFormatEtc::getFORMATETC( LPFORMATETC lpFormatEtc )
{
	OSL_ASSERT( lpFormatEtc );
	OSL_ASSERT( !IsBadWritePtr( lpFormatEtc, sizeof( FORMATETC ) ) );

	CopyFormatEtc( lpFormatEtc, &m_FormatEtc );
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

CLIPFORMAT CFormatEtc::getClipformat( ) const
{
	return m_FormatEtc.cfFormat;
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

DWORD CFormatEtc::getTymed( ) const
{
	return m_FormatEtc.tymed;
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

void CFormatEtc::getTargetDevice( DVTARGETDEVICE** lpDvTargetDevice ) const
{
	OSL_ASSERT( lpDvTargetDevice );
	OSL_ASSERT( !IsBadWritePtr( lpDvTargetDevice, sizeof( DVTARGETDEVICE ) ) );

	*lpDvTargetDevice = NULL;

	if ( m_FormatEtc.ptd )
		*lpDvTargetDevice = CopyTargetDevice( m_FormatEtc.ptd );
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

DWORD CFormatEtc::getDvAspect( ) const
{
	return m_FormatEtc.dwAspect;
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

LONG CFormatEtc::getLindex( ) const
{
	return m_FormatEtc.lindex;
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

void CFormatEtc::setClipformat( CLIPFORMAT cf )
{
	m_FormatEtc.cfFormat = cf;
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

void CFormatEtc::setTymed( DWORD tymed )
{
	m_FormatEtc.tymed = tymed;
}

//------------------------------------------------------------------------
// transfer of ownership!
//------------------------------------------------------------------------

void CFormatEtc::setTargetDevice( DVTARGETDEVICE* ptd )
{
	DeleteTargetDevice( m_FormatEtc.ptd );
	m_FormatEtc.ptd = ptd;
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

void CFormatEtc::setDvAspect( DWORD dwAspect )
{
	m_FormatEtc.dwAspect = dwAspect;
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

void CFormatEtc::setLindex( LONG lindex )
{
	m_FormatEtc.lindex = lindex;
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

sal_Int32 operator==( const CFormatEtc& lhs, const CFormatEtc& rhs )
{
	return CompareFormatEtc( &lhs.m_FormatEtc, &rhs.m_FormatEtc );
}

//------------------------------------------------------------------------
// 
//------------------------------------------------------------------------

sal_Int32 operator!=( const CFormatEtc& lhs, const CFormatEtc& rhs )
{
	return ( ( lhs == rhs ) != 1 );
}

