16d1ed1ddSHerbert Dürr /**************************************************************
26d1ed1ddSHerbert Dürr *
36d1ed1ddSHerbert Dürr * Licensed to the Apache Software Foundation (ASF) under one
46d1ed1ddSHerbert Dürr * or more contributor license agreements. See the NOTICE file
56d1ed1ddSHerbert Dürr * distributed with this work for additional information
66d1ed1ddSHerbert Dürr * regarding copyright ownership. The ASF licenses this file
76d1ed1ddSHerbert Dürr * to you under the Apache License, Version 2.0 (the
86d1ed1ddSHerbert Dürr * "License"); you may not use this file except in compliance
96d1ed1ddSHerbert Dürr * with the License. You may obtain a copy of the License at
106d1ed1ddSHerbert Dürr *
116d1ed1ddSHerbert Dürr * http://www.apache.org/licenses/LICENSE-2.0
126d1ed1ddSHerbert Dürr *
136d1ed1ddSHerbert Dürr * Unless required by applicable law or agreed to in writing,
146d1ed1ddSHerbert Dürr * software distributed under the License is distributed on an
156d1ed1ddSHerbert Dürr * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
166d1ed1ddSHerbert Dürr * KIND, either express or implied. See the License for the
176d1ed1ddSHerbert Dürr * specific language governing permissions and limitations
186d1ed1ddSHerbert Dürr * under the License.
196d1ed1ddSHerbert Dürr *
206d1ed1ddSHerbert Dürr *************************************************************/
216d1ed1ddSHerbert Dürr
226d1ed1ddSHerbert Dürr
236d1ed1ddSHerbert Dürr
246d1ed1ddSHerbert Dürr // MARKER(update_precomp.py): autogen include statement, do not remove
256d1ed1ddSHerbert Dürr #include "precompiled_bridges.hxx"
266d1ed1ddSHerbert Dürr
276d1ed1ddSHerbert Dürr #if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6))
286d1ed1ddSHerbert Dürr #include <exception>
296d1ed1ddSHerbert Dürr #endif
306d1ed1ddSHerbert Dürr
316d1ed1ddSHerbert Dürr #include <stdio.h>
326d1ed1ddSHerbert Dürr #include <string.h>
336d1ed1ddSHerbert Dürr #include <dlfcn.h>
346d1ed1ddSHerbert Dürr #include <cxxabi.h>
356d1ed1ddSHerbert Dürr #include <hash_map>
366d1ed1ddSHerbert Dürr #include <sys/param.h>
376d1ed1ddSHerbert Dürr
386d1ed1ddSHerbert Dürr #include <rtl/strbuf.hxx>
396d1ed1ddSHerbert Dürr #include <rtl/ustrbuf.hxx>
406d1ed1ddSHerbert Dürr #include <osl/diagnose.h>
416d1ed1ddSHerbert Dürr #include <osl/mutex.hxx>
426d1ed1ddSHerbert Dürr
436d1ed1ddSHerbert Dürr #include <com/sun/star/uno/genfunc.hxx>
446d1ed1ddSHerbert Dürr #include "com/sun/star/uno/RuntimeException.hpp"
456d1ed1ddSHerbert Dürr #include <typelib/typedescription.hxx>
466d1ed1ddSHerbert Dürr #include <uno/any2.h>
476d1ed1ddSHerbert Dürr
486d1ed1ddSHerbert Dürr #include "share.hxx"
496d1ed1ddSHerbert Dürr
506d1ed1ddSHerbert Dürr
516d1ed1ddSHerbert Dürr using namespace ::std;
526d1ed1ddSHerbert Dürr using namespace ::osl;
536d1ed1ddSHerbert Dürr using namespace ::rtl;
546d1ed1ddSHerbert Dürr using namespace ::com::sun::star::uno;
556d1ed1ddSHerbert Dürr using namespace ::__cxxabiv1;
566d1ed1ddSHerbert Dürr
576d1ed1ddSHerbert Dürr
586d1ed1ddSHerbert Dürr namespace CPPU_CURRENT_NAMESPACE
596d1ed1ddSHerbert Dürr {
606d1ed1ddSHerbert Dürr
dummy_can_throw_anything(char const *)616d1ed1ddSHerbert Dürr void dummy_can_throw_anything( char const * )
626d1ed1ddSHerbert Dürr {
636d1ed1ddSHerbert Dürr }
646d1ed1ddSHerbert Dürr
656d1ed1ddSHerbert Dürr //==================================================================================================
toUNOname(char const * p)666d1ed1ddSHerbert Dürr static OUString toUNOname( char const * p ) SAL_THROW( () )
676d1ed1ddSHerbert Dürr {
686d1ed1ddSHerbert Dürr #if OSL_DEBUG_LEVEL > 1
696d1ed1ddSHerbert Dürr char const * start = p;
706d1ed1ddSHerbert Dürr #endif
716d1ed1ddSHerbert Dürr
726d1ed1ddSHerbert Dürr // example: N3com3sun4star4lang24IllegalArgumentExceptionE
736d1ed1ddSHerbert Dürr
746d1ed1ddSHerbert Dürr OUStringBuffer buf( 64 );
756d1ed1ddSHerbert Dürr OSL_ASSERT( 'N' == *p );
766d1ed1ddSHerbert Dürr ++p; // skip N
776d1ed1ddSHerbert Dürr
786d1ed1ddSHerbert Dürr while ('E' != *p)
796d1ed1ddSHerbert Dürr {
806d1ed1ddSHerbert Dürr // read chars count
816d1ed1ddSHerbert Dürr long n = (*p++ - '0');
826d1ed1ddSHerbert Dürr while ('0' <= *p && '9' >= *p)
836d1ed1ddSHerbert Dürr {
846d1ed1ddSHerbert Dürr n *= 10;
856d1ed1ddSHerbert Dürr n += (*p++ - '0');
866d1ed1ddSHerbert Dürr }
876d1ed1ddSHerbert Dürr buf.appendAscii( p, n );
886d1ed1ddSHerbert Dürr p += n;
896d1ed1ddSHerbert Dürr if ('E' != *p)
906d1ed1ddSHerbert Dürr buf.append( (sal_Unicode)'.' );
916d1ed1ddSHerbert Dürr }
926d1ed1ddSHerbert Dürr
936d1ed1ddSHerbert Dürr #if OSL_DEBUG_LEVEL > 1
946d1ed1ddSHerbert Dürr OUString ret( buf.makeStringAndClear() );
956d1ed1ddSHerbert Dürr OString c_ret( OUStringToOString( ret, RTL_TEXTENCODING_ASCII_US ) );
966d1ed1ddSHerbert Dürr fprintf( stderr, "> toUNOname(): %s => %s\n", start, c_ret.getStr() );
976d1ed1ddSHerbert Dürr return ret;
986d1ed1ddSHerbert Dürr #else
996d1ed1ddSHerbert Dürr return buf.makeStringAndClear();
1006d1ed1ddSHerbert Dürr #endif
1016d1ed1ddSHerbert Dürr }
1026d1ed1ddSHerbert Dürr
1036d1ed1ddSHerbert Dürr //==================================================================================================
1046d1ed1ddSHerbert Dürr class RTTI
1056d1ed1ddSHerbert Dürr {
1066d1ed1ddSHerbert Dürr typedef hash_map< OUString, type_info *, OUStringHash > t_rtti_map;
1076d1ed1ddSHerbert Dürr
1086d1ed1ddSHerbert Dürr Mutex m_mutex;
1096d1ed1ddSHerbert Dürr t_rtti_map m_rttis;
1106d1ed1ddSHerbert Dürr t_rtti_map m_generatedRttis;
1116d1ed1ddSHerbert Dürr
1126d1ed1ddSHerbert Dürr void * m_hApp;
1136d1ed1ddSHerbert Dürr
1146d1ed1ddSHerbert Dürr public:
1156d1ed1ddSHerbert Dürr RTTI() SAL_THROW( () );
1166d1ed1ddSHerbert Dürr ~RTTI() SAL_THROW( () );
1176d1ed1ddSHerbert Dürr
1186d1ed1ddSHerbert Dürr type_info * getRTTI( typelib_CompoundTypeDescription * ) SAL_THROW( () );
1196d1ed1ddSHerbert Dürr };
1206d1ed1ddSHerbert Dürr
1216d1ed1ddSHerbert Dürr //__________________________________________________________________________________________________
RTTI()1226d1ed1ddSHerbert Dürr RTTI::RTTI() SAL_THROW( () )
1236d1ed1ddSHerbert Dürr : m_hApp( dlopen( 0, RTLD_LAZY ) )
1246d1ed1ddSHerbert Dürr {
1256d1ed1ddSHerbert Dürr }
1266d1ed1ddSHerbert Dürr
1276d1ed1ddSHerbert Dürr //__________________________________________________________________________________________________
~RTTI()1286d1ed1ddSHerbert Dürr RTTI::~RTTI() SAL_THROW( () )
1296d1ed1ddSHerbert Dürr {
1306d1ed1ddSHerbert Dürr dlclose( m_hApp );
1316d1ed1ddSHerbert Dürr }
1326d1ed1ddSHerbert Dürr
1336d1ed1ddSHerbert Dürr //__________________________________________________________________________________________________
getRTTI(typelib_CompoundTypeDescription * pTypeDescr)1346d1ed1ddSHerbert Dürr type_info * RTTI::getRTTI( typelib_CompoundTypeDescription *pTypeDescr ) SAL_THROW( () )
1356d1ed1ddSHerbert Dürr {
1366d1ed1ddSHerbert Dürr type_info * rtti;
1376d1ed1ddSHerbert Dürr
1386d1ed1ddSHerbert Dürr OUString const & unoName = *(OUString const *)&pTypeDescr->aBase.pTypeName;
1396d1ed1ddSHerbert Dürr
1406d1ed1ddSHerbert Dürr MutexGuard guard( m_mutex );
1416d1ed1ddSHerbert Dürr t_rtti_map::const_iterator iFind( m_rttis.find( unoName ) );
1426d1ed1ddSHerbert Dürr if (iFind == m_rttis.end())
1436d1ed1ddSHerbert Dürr {
144*67a794bcSJim Jagielski // RTTI symbol
1456d1ed1ddSHerbert Dürr OStringBuffer buf( 64 );
1466d1ed1ddSHerbert Dürr buf.append( RTL_CONSTASCII_STRINGPARAM("_ZTIN") );
1476d1ed1ddSHerbert Dürr sal_Int32 index = 0;
1486d1ed1ddSHerbert Dürr do
1496d1ed1ddSHerbert Dürr {
1506d1ed1ddSHerbert Dürr OUString token( unoName.getToken( 0, '.', index ) );
1516d1ed1ddSHerbert Dürr buf.append( token.getLength() );
1526d1ed1ddSHerbert Dürr OString c_token( OUStringToOString( token, RTL_TEXTENCODING_ASCII_US ) );
1536d1ed1ddSHerbert Dürr buf.append( c_token );
1546d1ed1ddSHerbert Dürr }
1556d1ed1ddSHerbert Dürr while (index >= 0);
1566d1ed1ddSHerbert Dürr buf.append( 'E' );
1576d1ed1ddSHerbert Dürr
1586d1ed1ddSHerbert Dürr OString symName( buf.makeStringAndClear() );
159*67a794bcSJim Jagielski rtti = static_cast<std::type_info *>(dlsym( m_hApp, symName.getStr() ));
1606d1ed1ddSHerbert Dürr
1616d1ed1ddSHerbert Dürr if (rtti)
1626d1ed1ddSHerbert Dürr {
1636d1ed1ddSHerbert Dürr pair< t_rtti_map::iterator, bool > insertion(
1646d1ed1ddSHerbert Dürr m_rttis.insert( t_rtti_map::value_type( unoName, rtti ) ) );
1656d1ed1ddSHerbert Dürr OSL_ENSURE( insertion.second, "### inserting new rtti failed?!" );
1666d1ed1ddSHerbert Dürr }
1676d1ed1ddSHerbert Dürr else
1686d1ed1ddSHerbert Dürr {
1696d1ed1ddSHerbert Dürr // try to lookup the symbol in the generated rtti map
1706d1ed1ddSHerbert Dürr t_rtti_map::const_iterator iFind2( m_generatedRttis.find( unoName ) );
1716d1ed1ddSHerbert Dürr if (iFind2 == m_generatedRttis.end())
1726d1ed1ddSHerbert Dürr {
1736d1ed1ddSHerbert Dürr // we must generate it !
1746d1ed1ddSHerbert Dürr // symbol and rtti-name is nearly identical,
1756d1ed1ddSHerbert Dürr // the symbol is prefixed with _ZTI
1766d1ed1ddSHerbert Dürr char const * rttiName = symName.getStr() +4;
177*67a794bcSJim Jagielski #if OSL_DEBUG_LEVEL > 1
1786d1ed1ddSHerbert Dürr fprintf( stderr,"generated rtti for %s\n", rttiName );
179fd233926SHerbert Dürr const OString aCUnoName = OUStringToOString( unoName, RTL_TEXTENCODING_UTF8);
180eafa8e05SHerbert Dürr OSL_TRACE( "TypeInfo for \"%s\" not found and cannot be generated.\n", aCUnoName.getStr());
1816d1ed1ddSHerbert Dürr #endif
182*67a794bcSJim Jagielski #if 0
1836d1ed1ddSHerbert Dürr if (pTypeDescr->pBaseTypeDescription)
1846d1ed1ddSHerbert Dürr {
1856d1ed1ddSHerbert Dürr // ensure availability of base
1866d1ed1ddSHerbert Dürr type_info * base_rtti = getRTTI(
1876d1ed1ddSHerbert Dürr (typelib_CompoundTypeDescription *)pTypeDescr->pBaseTypeDescription );
1886d1ed1ddSHerbert Dürr rtti = new __si_class_type_info(
1896d1ed1ddSHerbert Dürr strdup( rttiName ), (__class_type_info *)base_rtti );
1906d1ed1ddSHerbert Dürr }
1916d1ed1ddSHerbert Dürr else
1926d1ed1ddSHerbert Dürr {
1936d1ed1ddSHerbert Dürr // this class has no base class
1946d1ed1ddSHerbert Dürr rtti = new __class_type_info( strdup( rttiName ) );
1956d1ed1ddSHerbert Dürr }
196fd233926SHerbert Dürr #else
197fd233926SHerbert Dürr rtti = NULL;
198fd233926SHerbert Dürr #endif
199fd233926SHerbert Dürr bool bOK = m_generatedRttis.insert( t_rtti_map::value_type( unoName, rtti )).second;
200fd233926SHerbert Dürr OSL_ENSURE( bOK, "### inserting new generated rtti failed?!" );
2016d1ed1ddSHerbert Dürr }
2026d1ed1ddSHerbert Dürr else // taking already generated rtti
2036d1ed1ddSHerbert Dürr {
2046d1ed1ddSHerbert Dürr rtti = iFind2->second;
2056d1ed1ddSHerbert Dürr }
2066d1ed1ddSHerbert Dürr }
2076d1ed1ddSHerbert Dürr }
2086d1ed1ddSHerbert Dürr else
2096d1ed1ddSHerbert Dürr {
2106d1ed1ddSHerbert Dürr rtti = iFind->second;
2116d1ed1ddSHerbert Dürr }
2126d1ed1ddSHerbert Dürr
2136d1ed1ddSHerbert Dürr return rtti;
2146d1ed1ddSHerbert Dürr }
2156d1ed1ddSHerbert Dürr
2166d1ed1ddSHerbert Dürr //--------------------------------------------------------------------------------------------------
deleteException(void * pExc)2176d1ed1ddSHerbert Dürr static void deleteException( void * pExc )
2186d1ed1ddSHerbert Dürr {
219*67a794bcSJim Jagielski __cxa_exception const * header = static_cast<__cxa_exception const *>(pExc) - 1;
220fd233926SHerbert Dürr if( !header->exceptionType) // TODO: remove this when getRTTI() always returns non-NULL
221fd233926SHerbert Dürr return; // NOTE: leak for now
2226d1ed1ddSHerbert Dürr typelib_TypeDescription * pTD = 0;
2236d1ed1ddSHerbert Dürr OUString unoName( toUNOname( header->exceptionType->name() ) );
2246d1ed1ddSHerbert Dürr ::typelib_typedescription_getByName( &pTD, unoName.pData );
2256d1ed1ddSHerbert Dürr OSL_ENSURE( pTD, "### unknown exception type! leaving out destruction => leaking!!!" );
2266d1ed1ddSHerbert Dürr if (pTD)
2276d1ed1ddSHerbert Dürr {
2286d1ed1ddSHerbert Dürr ::uno_destructData( pExc, pTD, cpp_release );
2296d1ed1ddSHerbert Dürr ::typelib_typedescription_release( pTD );
2306d1ed1ddSHerbert Dürr }
2316d1ed1ddSHerbert Dürr }
2326d1ed1ddSHerbert Dürr
2336d1ed1ddSHerbert Dürr //==================================================================================================
raiseException(uno_Any * pUnoExc,uno_Mapping * pUno2Cpp)2346d1ed1ddSHerbert Dürr void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
2356d1ed1ddSHerbert Dürr {
2366d1ed1ddSHerbert Dürr #if OSL_DEBUG_LEVEL > 1
2376d1ed1ddSHerbert Dürr OString cstr(
2386d1ed1ddSHerbert Dürr OUStringToOString(
2396d1ed1ddSHerbert Dürr *reinterpret_cast< OUString const * >( &pUnoExc->pType->pTypeName ),
2406d1ed1ddSHerbert Dürr RTL_TEXTENCODING_ASCII_US ) );
241*67a794bcSJim Jagielski fprintf( stderr, "> uno exception occurred: %s\n", cstr.getStr() );
2426d1ed1ddSHerbert Dürr #endif
2436d1ed1ddSHerbert Dürr void * pCppExc;
2446d1ed1ddSHerbert Dürr type_info * rtti;
2456d1ed1ddSHerbert Dürr
2466d1ed1ddSHerbert Dürr {
2476d1ed1ddSHerbert Dürr // construct cpp exception object
2486d1ed1ddSHerbert Dürr typelib_TypeDescription * pTypeDescr = 0;
2496d1ed1ddSHerbert Dürr TYPELIB_DANGER_GET( &pTypeDescr, pUnoExc->pType );
2506d1ed1ddSHerbert Dürr OSL_ASSERT( pTypeDescr );
2516d1ed1ddSHerbert Dürr if (! pTypeDescr)
2526d1ed1ddSHerbert Dürr {
2536d1ed1ddSHerbert Dürr throw RuntimeException(
2546d1ed1ddSHerbert Dürr OUString( RTL_CONSTASCII_USTRINGPARAM("cannot get typedescription for type ") ) +
2556d1ed1ddSHerbert Dürr *reinterpret_cast< OUString const * >( &pUnoExc->pType->pTypeName ),
2566d1ed1ddSHerbert Dürr Reference< XInterface >() );
2576d1ed1ddSHerbert Dürr }
2586d1ed1ddSHerbert Dürr
2596d1ed1ddSHerbert Dürr pCppExc = __cxa_allocate_exception( pTypeDescr->nSize );
2606d1ed1ddSHerbert Dürr ::uno_copyAndConvertData( pCppExc, pUnoExc->pData, pTypeDescr, pUno2Cpp );
2616d1ed1ddSHerbert Dürr
2626d1ed1ddSHerbert Dürr // destruct uno exception
2636d1ed1ddSHerbert Dürr ::uno_any_destruct( pUnoExc, 0 );
2646d1ed1ddSHerbert Dürr // avoiding locked counts
2656d1ed1ddSHerbert Dürr static RTTI * s_rtti = 0;
2666d1ed1ddSHerbert Dürr if (! s_rtti)
2676d1ed1ddSHerbert Dürr {
2686d1ed1ddSHerbert Dürr MutexGuard guard( Mutex::getGlobalMutex() );
2696d1ed1ddSHerbert Dürr if (! s_rtti)
2706d1ed1ddSHerbert Dürr {
2716d1ed1ddSHerbert Dürr #ifdef LEAK_STATIC_DATA
2726d1ed1ddSHerbert Dürr s_rtti = new RTTI();
2736d1ed1ddSHerbert Dürr #else
2746d1ed1ddSHerbert Dürr static RTTI rtti_data;
2756d1ed1ddSHerbert Dürr s_rtti = &rtti_data;
2766d1ed1ddSHerbert Dürr #endif
2776d1ed1ddSHerbert Dürr }
2786d1ed1ddSHerbert Dürr }
2796d1ed1ddSHerbert Dürr rtti = (type_info *)s_rtti->getRTTI( (typelib_CompoundTypeDescription *) pTypeDescr );
2806d1ed1ddSHerbert Dürr TYPELIB_DANGER_RELEASE( pTypeDescr );
2816d1ed1ddSHerbert Dürr OSL_ENSURE( rtti, "### no rtti for throwing exception!" );
2826d1ed1ddSHerbert Dürr if (! rtti)
2836d1ed1ddSHerbert Dürr {
2846d1ed1ddSHerbert Dürr throw RuntimeException(
2856d1ed1ddSHerbert Dürr OUString( RTL_CONSTASCII_USTRINGPARAM("no rtti for type ") ) +
2866d1ed1ddSHerbert Dürr *reinterpret_cast< OUString const * >( &pUnoExc->pType->pTypeName ),
2876d1ed1ddSHerbert Dürr Reference< XInterface >() );
2886d1ed1ddSHerbert Dürr }
2896d1ed1ddSHerbert Dürr }
2906d1ed1ddSHerbert Dürr
2916d1ed1ddSHerbert Dürr __cxa_throw( pCppExc, rtti, deleteException );
2926d1ed1ddSHerbert Dürr }
2936d1ed1ddSHerbert Dürr
2946d1ed1ddSHerbert Dürr //==================================================================================================
fillUnoException(__cxa_exception * header,uno_Any * pUnoExc,uno_Mapping * pCpp2Uno)2956d1ed1ddSHerbert Dürr void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno )
2966d1ed1ddSHerbert Dürr {
2976d1ed1ddSHerbert Dürr if (! header)
2986d1ed1ddSHerbert Dürr {
2996d1ed1ddSHerbert Dürr RuntimeException aRE(
3006d1ed1ddSHerbert Dürr OUString( RTL_CONSTASCII_USTRINGPARAM("no exception header!") ),
3016d1ed1ddSHerbert Dürr Reference< XInterface >() );
3026d1ed1ddSHerbert Dürr Type const & rType = ::getCppuType( &aRE );
3036d1ed1ddSHerbert Dürr uno_type_any_constructAndConvert( pUnoExc, &aRE, rType.getTypeLibType(), pCpp2Uno );
3046d1ed1ddSHerbert Dürr #if OSL_DEBUG_LEVEL > 0
3056d1ed1ddSHerbert Dürr OString cstr( OUStringToOString( aRE.Message, RTL_TEXTENCODING_ASCII_US ) );
3066d1ed1ddSHerbert Dürr OSL_ENSURE( 0, cstr.getStr() );
3076d1ed1ddSHerbert Dürr #endif
3086d1ed1ddSHerbert Dürr return;
3096d1ed1ddSHerbert Dürr }
3106d1ed1ddSHerbert Dürr
311*67a794bcSJim Jagielski /*
312*67a794bcSJim Jagielski * Handle the case where we are built on llvm 10 (or later) but are running
313*67a794bcSJim Jagielski * on an earlier version (eg, community builds). In this situation the
314*67a794bcSJim Jagielski * reserved ptr doesn't exist in the struct returned and so the offsets
315*67a794bcSJim Jagielski * that header uses are wrong. This assumes that reserved isn't used
316*67a794bcSJim Jagielski * and that referenceCount is always >0 in the cases we handle
317*67a794bcSJim Jagielski */
318*67a794bcSJim Jagielski {
319*67a794bcSJim Jagielski // Does this look like the newer struct __cxa_exception?
320*67a794bcSJim Jagielski // That is, is the 1st element NULL (*reserved)?
321*67a794bcSJim Jagielski if (*reinterpret_cast<void **>(header) == NULL) {
322*67a794bcSJim Jagielski // Yes. So we move up a slot to offset
323*67a794bcSJim Jagielski header = reinterpret_cast<__cxa_exception *>(reinterpret_cast<void **>(header) + 1);
324*67a794bcSJim Jagielski }
325*67a794bcSJim Jagielski }
326*67a794bcSJim Jagielski
3276d1ed1ddSHerbert Dürr typelib_TypeDescription * pExcTypeDescr = 0;
3286d1ed1ddSHerbert Dürr OUString unoName( toUNOname( header->exceptionType->name() ) );
3296d1ed1ddSHerbert Dürr #if OSL_DEBUG_LEVEL > 1
3306d1ed1ddSHerbert Dürr OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) );
331*67a794bcSJim Jagielski fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() );
3326d1ed1ddSHerbert Dürr #endif
3336d1ed1ddSHerbert Dürr typelib_typedescription_getByName( &pExcTypeDescr, unoName.pData );
3346d1ed1ddSHerbert Dürr if (0 == pExcTypeDescr)
3356d1ed1ddSHerbert Dürr {
3366d1ed1ddSHerbert Dürr RuntimeException aRE(
3376d1ed1ddSHerbert Dürr OUString( RTL_CONSTASCII_USTRINGPARAM("exception type not found: ") ) + unoName,
3386d1ed1ddSHerbert Dürr Reference< XInterface >() );
3396d1ed1ddSHerbert Dürr Type const & rType = ::getCppuType( &aRE );
3406d1ed1ddSHerbert Dürr uno_type_any_constructAndConvert( pUnoExc, &aRE, rType.getTypeLibType(), pCpp2Uno );
3416d1ed1ddSHerbert Dürr #if OSL_DEBUG_LEVEL > 0
3426d1ed1ddSHerbert Dürr OString cstr( OUStringToOString( aRE.Message, RTL_TEXTENCODING_ASCII_US ) );
3436d1ed1ddSHerbert Dürr OSL_ENSURE( 0, cstr.getStr() );
3446d1ed1ddSHerbert Dürr #endif
3456d1ed1ddSHerbert Dürr }
3466d1ed1ddSHerbert Dürr else
3476d1ed1ddSHerbert Dürr {
3486d1ed1ddSHerbert Dürr // construct uno exception any
3496d1ed1ddSHerbert Dürr uno_any_constructAndConvert( pUnoExc, header->adjustedPtr, pExcTypeDescr, pCpp2Uno );
3506d1ed1ddSHerbert Dürr typelib_typedescription_release( pExcTypeDescr );
3516d1ed1ddSHerbert Dürr }
3526d1ed1ddSHerbert Dürr }
3536d1ed1ddSHerbert Dürr
3546d1ed1ddSHerbert Dürr }
3556d1ed1ddSHerbert Dürr
356