blob: cf095efbfb4423a1acb18c1ede5e4e6142fd24d7 [file] [log] [blame]
/**************************************************************
*
* 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_comphelper.hxx"
#include <comphelper/types.hxx>
#include <comphelper/extract.hxx>
#include <com/sun/star/util/Date.hpp>
#include <com/sun/star/util/Time.hpp>
#include <com/sun/star/util/DateTime.hpp>
#include <com/sun/star/awt/FontUnderline.hpp>
#include <com/sun/star/awt/FontStrikeout.hpp>
#include <com/sun/star/awt/FontDescriptor.hpp>
#include <osl/diagnose.h>
#include <typelib/typedescription.hxx>
#include <memory.h>
//.........................................................................
namespace comphelper
{
//.........................................................................
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::awt;
using namespace ::com::sun::star::util;
using namespace ::com::sun::star::lang;
//-------------------------------------------------------------------------
sal_Bool operator ==(const DateTime& _rLeft, const DateTime& _rRight)
{
return ( _rLeft.HundredthSeconds == _rRight.HundredthSeconds) &&
( _rLeft.Seconds == _rRight.Seconds) &&
( _rLeft.Minutes == _rRight.Minutes) &&
( _rLeft.Hours == _rRight.Hours) &&
( _rLeft.Day == _rRight.Day) &&
( _rLeft.Month == _rRight.Month) &&
( _rLeft.Year == _rRight.Year) ;
}
//-------------------------------------------------------------------------
sal_Bool operator ==(const Date& _rLeft, const Date& _rRight)
{
return ( _rLeft.Day == _rRight.Day) &&
( _rLeft.Month == _rRight.Month) &&
( _rLeft.Year == _rRight.Year) ;
}
//-------------------------------------------------------------------------
sal_Bool operator ==(const Time& _rLeft, const Time& _rRight)
{
return ( _rLeft.HundredthSeconds == _rRight.HundredthSeconds) &&
( _rLeft.Seconds == _rRight.Seconds) &&
( _rLeft.Minutes == _rRight.Minutes) &&
( _rLeft.Hours == _rRight.Hours) ;
}
//------------------------------------------------------------------------------
sal_Int32 getINT32(const Any& _rAny)
{
sal_Int32 nReturn = 0;
OSL_VERIFY( _rAny >>= nReturn );
return nReturn;
}
//------------------------------------------------------------------------------
sal_Int16 getINT16(const Any& _rAny)
{
sal_Int16 nReturn = 0;
OSL_VERIFY( _rAny >>= nReturn );
return nReturn;
}
//------------------------------------------------------------------------------
double getDouble(const Any& _rAny)
{
double nReturn = 0.0;
OSL_VERIFY( _rAny >>= nReturn );
return nReturn;
}
//------------------------------------------------------------------------------
float getFloat(const Any& _rAny)
{
float nReturn = 0.0;
OSL_VERIFY( _rAny >>= nReturn );
return nReturn;
}
//------------------------------------------------------------------------------
::rtl::OUString getString(const Any& _rAny)
{
::rtl::OUString nReturn;
OSL_VERIFY( _rAny >>= nReturn );
return nReturn;
}
//------------------------------------------------------------------------------
sal_Bool getBOOL(const Any& _rAny)
{
sal_Bool nReturn = sal_False;
if (_rAny.getValueType() == ::getCppuBooleanType())
nReturn = *(sal_Bool*)_rAny.getValue();
else
OSL_ENSURE(sal_False, "comphelper::getBOOL : invalid argument !");
return nReturn;
}
//------------------------------------------------------------------------------
sal_Int32 getEnumAsINT32(const Any& _rAny) throw(IllegalArgumentException)
{
sal_Int32 nReturn = 0;
if (! ::cppu::enum2int(nReturn,_rAny) )
throw IllegalArgumentException();
return nReturn;
}
//------------------------------------------------------------------------------
FontDescriptor getDefaultFont()
{
FontDescriptor aReturn;
aReturn.Slant = FontSlant_DONTKNOW;
aReturn.Underline = FontUnderline::DONTKNOW;
aReturn.Strikeout = FontStrikeout::DONTKNOW;
return aReturn;
}
//------------------------------------------------------------------------------
sal_Bool isAssignableFrom(const Type& _rAssignable, const Type& _rFrom)
{
// getthe type lib descriptions
typelib_TypeDescription* pAssignable = NULL;
_rAssignable.getDescription(&pAssignable);
typelib_TypeDescription* pFrom = NULL;
_rFrom.getDescription(&pFrom);
// and ask the type lib
return typelib_typedescription_isAssignableFrom(pAssignable, pFrom);
}
//------------------------------------------------------------------
template<class TYPE>
sal_Bool tryCompare(const void* _pData, const Any& _rValue, sal_Bool& _bIdentical, TYPE& _rOut)
{
sal_Bool bSuccess = _rValue >>= _rOut;
_bIdentical = bSuccess && (_rOut == *reinterpret_cast<const TYPE*>(_pData));
return bSuccess;
}
//------------------------------------------------------------------
sal_Bool tryCompare(const void* _pData, const Any& _rValue, sal_Bool& _bIdentical, sal_Unicode& _rOut)
{
sal_Bool bSuccess = ( _rValue.getValueTypeClass() == TypeClass_CHAR );
if ( bSuccess )
_rOut = *static_cast< const sal_Unicode* >( _rValue.getValue() );
_bIdentical = bSuccess && ( _rOut == *static_cast< const sal_Unicode* >( _pData ) );
return bSuccess;
}
//------------------------------------------------------------------
sal_Bool compare_impl(const Type& _rType, const void* pData, const Any& _rValue)
{
sal_Bool bRes = sal_True;
if (_rType.getTypeClass() == TypeClass_ANY)
{
// beides AnyWerte
if (_rValue.getValueType().getTypeClass() == TypeClass_ANY)
bRes = compare_impl(
reinterpret_cast<const Any*>(pData)->getValueType(),
reinterpret_cast<const Any*>(pData)->getValue(),
*reinterpret_cast<const Any*>(_rValue.getValue()));
else
bRes = compare_impl(
reinterpret_cast<const Any*>(pData)->getValueType(),
reinterpret_cast<const Any*>(pData)->getValue(),
_rValue);
}
else if ( (_rType.getTypeClass() == TypeClass_VOID)
|| (_rValue.getValueType().getTypeClass() == TypeClass_VOID)
)
{
bRes = _rType.getTypeClass() == _rValue.getValueType().getTypeClass();
}
else
{
sal_Bool bConversionSuccess = sal_False;
switch (_rType.getTypeClass())
{
case TypeClass_VOID:
bConversionSuccess = sal_True;
bRes = _rValue.getValueType().getTypeClass() == TypeClass_VOID;
break;
case TypeClass_BOOLEAN:
{
sal_Bool aDummy;
bConversionSuccess = tryCompare(pData, _rValue, bRes, aDummy);
break;
}
case TypeClass_CHAR:
{
sal_Unicode aDummy(0);
bConversionSuccess = tryCompare(pData, _rValue, bRes, aDummy);
break;
}
case TypeClass_STRING:
{
::rtl::OUString aDummy;
bConversionSuccess = tryCompare(pData, _rValue, bRes, aDummy);
break;
}
case TypeClass_FLOAT:
{
float aDummy;
bConversionSuccess = tryCompare(pData, _rValue, bRes, aDummy);
break;
}
case TypeClass_DOUBLE:
{
double aDummy;
bConversionSuccess = tryCompare(pData, _rValue, bRes, aDummy);
break;
}
case TypeClass_BYTE:
{
sal_Int8 aDummy;
bConversionSuccess = tryCompare(pData, _rValue, bRes, aDummy);
break;
}
case TypeClass_SHORT:
{
sal_Int16 aDummy;
bConversionSuccess = tryCompare(pData, _rValue, bRes, aDummy);
break;
}
case TypeClass_ENUM:
{
sal_Int32 nAsInt32 = 0;
bConversionSuccess = ::cppu::enum2int(nAsInt32, _rValue);
bRes = bConversionSuccess && (nAsInt32== *reinterpret_cast<const sal_Int32*>(pData));
break;
}
case TypeClass_LONG:
{
sal_Int32 aDummy;
bConversionSuccess = tryCompare(pData, _rValue, bRes, aDummy);
break;
}
case TypeClass_UNSIGNED_SHORT:
{
sal_uInt16 aDummy;
bConversionSuccess = tryCompare(pData, _rValue, bRes, aDummy);
break;
}
case TypeClass_UNSIGNED_LONG:
{
sal_uInt32 aDummy;
bConversionSuccess = tryCompare(pData, _rValue, bRes, aDummy);
break;
}
case TypeClass_INTERFACE:
{
InterfaceRef aDummy;
bConversionSuccess = tryCompare(pData, _rValue, bRes, aDummy);
break;
}
case TypeClass_STRUCT:
if (isA(_rType, static_cast<FontDescriptor*>(NULL)))
{
FontDescriptor aTemp;
bConversionSuccess = _rValue >>= aTemp;
if (bConversionSuccess)
{
bRes = *(FontDescriptor*)pData == aTemp;
}
else
bRes = sal_False;
break;
}
if (isA(_rType, static_cast<Date*>(NULL)))
{
Date aDummy;
bConversionSuccess = tryCompare(pData, _rValue, bRes, aDummy);
break;
}
if (isA(_rType, static_cast<Time*>(NULL)))
{
Time aDummy;
bConversionSuccess = tryCompare(pData, _rValue, bRes, aDummy);
break;
}
if (isA(_rType, static_cast<DateTime*>(NULL)))
{
DateTime aDummy;
bConversionSuccess = tryCompare(pData, _rValue, bRes, aDummy);
break;
}
break;
case TypeClass_SEQUENCE:
if (isA(_rType, static_cast< Sequence<sal_Int8>* >(NULL)))
{
Sequence<sal_Int8> aTemp;
bConversionSuccess = _rValue >>= aTemp;
if (bConversionSuccess)
{
const Sequence<sal_Int8>& rLeftSeq = *reinterpret_cast<const Sequence<sal_Int8>*>(pData);
const Sequence<sal_Int8>& rRightSeq = aTemp;
bRes = rLeftSeq.getLength() == rRightSeq.getLength() &&
memcmp(rLeftSeq.getConstArray(), rRightSeq.getConstArray(), rLeftSeq.getLength()) == 0;
}
}
else if (isA(_rType, static_cast< Sequence<sal_uInt8>* >(NULL)))
{
Sequence<sal_uInt8> aTemp;
bConversionSuccess = _rValue >>= aTemp;
if (bConversionSuccess)
{
const Sequence<sal_uInt8>& rLeftSeq = *reinterpret_cast<const Sequence<sal_uInt8>*>(pData);
const Sequence<sal_uInt8>& rRightSeq = aTemp;
bRes = rLeftSeq.getLength() == rRightSeq.getLength() &&
memcmp(rLeftSeq.getConstArray(), rRightSeq.getConstArray(), rLeftSeq.getLength()) == 0;
}
}
else if (isA(_rType, static_cast< Sequence<sal_Int16>* >(NULL)))
{
Sequence<sal_Int16> aTemp;
bConversionSuccess = _rValue >>= aTemp;
if (bConversionSuccess)
{
const Sequence<sal_Int16>& rLeftSeq = *reinterpret_cast<const Sequence<sal_Int16>*>(pData);
const Sequence<sal_Int16>& rRightSeq = aTemp;
bRes = rLeftSeq.getLength() == rRightSeq.getLength() &&
memcmp(rLeftSeq.getConstArray(), rRightSeq.getConstArray(), rLeftSeq.getLength()*sizeof(sal_Int16)) == 0;
}
}
else if (isA(_rType, static_cast< Sequence<sal_uInt16>* >(NULL)))
{
Sequence<sal_uInt16> aTemp;
bConversionSuccess = _rValue >>= aTemp;
if (bConversionSuccess)
{
const Sequence<sal_uInt16>& rLeftSeq = *reinterpret_cast<const Sequence<sal_uInt16>*>(pData);
const Sequence<sal_uInt16>& rRightSeq = aTemp;
bRes = rLeftSeq.getLength() == rRightSeq.getLength() &&
memcmp(rLeftSeq.getConstArray(), rRightSeq.getConstArray(), rLeftSeq.getLength()*sizeof(sal_uInt16)) == 0;
}
}
else if (isA(_rType, static_cast< Sequence<sal_Int32>* >(NULL)))
{
Sequence<sal_Int32> aTemp;
bConversionSuccess = _rValue >>= aTemp;
if (bConversionSuccess)
{
const Sequence<sal_Int32>& rLeftSeq = *reinterpret_cast<const Sequence<sal_Int32>*>(pData);
const Sequence<sal_Int32>& rRightSeq = aTemp;
bRes = rLeftSeq.getLength() == rRightSeq.getLength() &&
memcmp(rLeftSeq.getConstArray(), rRightSeq.getConstArray(), rLeftSeq.getLength()*sizeof(sal_Int32)) == 0;
}
}
else if (isA(_rType, static_cast< Sequence<sal_uInt32>* >(NULL)))
{
Sequence<sal_uInt32> aTemp;
bConversionSuccess = _rValue >>= aTemp;
if (bConversionSuccess)
{
const Sequence<sal_uInt32>& rLeftSeq = *reinterpret_cast<const Sequence<sal_uInt32>*>(pData);
const Sequence<sal_uInt32>& rRightSeq = aTemp;
bRes = rLeftSeq.getLength() == rRightSeq.getLength() &&
memcmp(rLeftSeq.getConstArray(), rRightSeq.getConstArray(), rLeftSeq.getLength()*sizeof(sal_uInt32)) == 0;
}
}
else if (isA(_rType, static_cast< Sequence< ::rtl::OUString >* >(NULL)))
{
Sequence< ::rtl::OUString > aTemp;
bConversionSuccess = _rValue >>= aTemp;
if (bConversionSuccess)
{
const Sequence< ::rtl::OUString >& rLeftSeq = *reinterpret_cast<const Sequence< ::rtl::OUString>*>(pData);
const Sequence< ::rtl::OUString >& rRightSeq = aTemp;
sal_Int32 nSeqLen = rLeftSeq.getLength();
bRes = ( nSeqLen == rRightSeq.getLength() );
for ( sal_Int32 n = 0; bRes && ( n < nSeqLen ); n++ )
{
const ::rtl::OUString& rS1 = rLeftSeq.getConstArray()[n];
const ::rtl::OUString& rS2 = rRightSeq.getConstArray()[n];
bRes = ( rS1 == rS2 );
}
}
}
break;
default:
bRes = sal_False;
}
bRes = bRes && bConversionSuccess;
}
return bRes;
}
//------------------------------------------------------------------------------
sal_Bool compare(const Any& rLeft, const Any& rRight)
{
return compare_impl(rLeft.getValueType(), rLeft.getValue(), rRight);
}
//-------------------------------------------------------------------------
sal_Bool operator ==(const FontDescriptor& _rLeft, const FontDescriptor& _rRight)
{
return ( _rLeft.Name.equals( _rRight.Name ) ) &&
( _rLeft.Height == _rRight.Height ) &&
( _rLeft.Width == _rRight.Width ) &&
( _rLeft.StyleName.equals( _rRight.StyleName ) ) &&
( _rLeft.Family == _rRight.Family ) &&
( _rLeft.CharSet == _rRight.CharSet ) &&
( _rLeft.Pitch == _rRight.Pitch ) &&
( _rLeft.CharacterWidth == _rRight.CharacterWidth ) &&
( _rLeft.Weight == _rRight.Weight ) &&
( _rLeft.Slant == _rRight.Slant ) &&
( _rLeft.Underline == _rRight.Underline ) &&
( _rLeft.Strikeout == _rRight.Strikeout ) &&
( _rLeft.Orientation == _rRight.Orientation ) &&
( _rLeft.Kerning == _rRight.Kerning ) &&
( _rLeft.WordLineMode == _rRight.WordLineMode ) &&
( _rLeft.Type == _rRight.Type ) ;
}
//-------------------------------------------------------------------------
Type getSequenceElementType(const Type& _rSequenceType)
{
OSL_ENSURE(_rSequenceType.getTypeClass() == TypeClass_SEQUENCE,
"getSequenceElementType: must be called with a sequence type!");
if (!(_rSequenceType.getTypeClass() == TypeClass_SEQUENCE))
return Type();
TypeDescription aTD(_rSequenceType);
typelib_IndirectTypeDescription* pSequenceTD =
reinterpret_cast< typelib_IndirectTypeDescription* >(aTD.get());
OSL_ASSERT(pSequenceTD);
OSL_ASSERT(pSequenceTD->pType);
if (pSequenceTD && pSequenceTD->pType)
return Type(pSequenceTD->pType);
return Type();
}
//.........................................................................
} // namespace comphelper
//.........................................................................