/************************************************************** * * 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 #include #include #include #include #include #include #include #include #include #include //......................................................................... 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 sal_Bool tryCompare(const void* _pData, const Any& _rValue, sal_Bool& _bIdentical, TYPE& _rOut) { sal_Bool bSuccess = _rValue >>= _rOut; _bIdentical = bSuccess && (_rOut == *reinterpret_cast(_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(pData)->getValueType(), reinterpret_cast(pData)->getValue(), *reinterpret_cast(_rValue.getValue())); else bRes = compare_impl( reinterpret_cast(pData)->getValueType(), reinterpret_cast(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(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(NULL))) { FontDescriptor aTemp; bConversionSuccess = _rValue >>= aTemp; if (bConversionSuccess) { bRes = *(FontDescriptor*)pData == aTemp; } else bRes = sal_False; break; } if (isA(_rType, static_cast(NULL))) { Date aDummy; bConversionSuccess = tryCompare(pData, _rValue, bRes, aDummy); break; } if (isA(_rType, static_cast(NULL))) { Time aDummy; bConversionSuccess = tryCompare(pData, _rValue, bRes, aDummy); break; } if (isA(_rType, static_cast(NULL))) { DateTime aDummy; bConversionSuccess = tryCompare(pData, _rValue, bRes, aDummy); break; } break; case TypeClass_SEQUENCE: if (isA(_rType, static_cast< Sequence* >(NULL))) { Sequence aTemp; bConversionSuccess = _rValue >>= aTemp; if (bConversionSuccess) { const Sequence& rLeftSeq = *reinterpret_cast*>(pData); const Sequence& rRightSeq = aTemp; bRes = rLeftSeq.getLength() == rRightSeq.getLength() && memcmp(rLeftSeq.getConstArray(), rRightSeq.getConstArray(), rLeftSeq.getLength()) == 0; } } else if (isA(_rType, static_cast< Sequence* >(NULL))) { Sequence aTemp; bConversionSuccess = _rValue >>= aTemp; if (bConversionSuccess) { const Sequence& rLeftSeq = *reinterpret_cast*>(pData); const Sequence& rRightSeq = aTemp; bRes = rLeftSeq.getLength() == rRightSeq.getLength() && memcmp(rLeftSeq.getConstArray(), rRightSeq.getConstArray(), rLeftSeq.getLength()) == 0; } } else if (isA(_rType, static_cast< Sequence* >(NULL))) { Sequence aTemp; bConversionSuccess = _rValue >>= aTemp; if (bConversionSuccess) { const Sequence& rLeftSeq = *reinterpret_cast*>(pData); const Sequence& 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* >(NULL))) { Sequence aTemp; bConversionSuccess = _rValue >>= aTemp; if (bConversionSuccess) { const Sequence& rLeftSeq = *reinterpret_cast*>(pData); const Sequence& 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* >(NULL))) { Sequence aTemp; bConversionSuccess = _rValue >>= aTemp; if (bConversionSuccess) { const Sequence& rLeftSeq = *reinterpret_cast*>(pData); const Sequence& 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* >(NULL))) { Sequence aTemp; bConversionSuccess = _rValue >>= aTemp; if (bConversionSuccess) { const Sequence& rLeftSeq = *reinterpret_cast*>(pData); const Sequence& 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*>(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 //.........................................................................