1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #include <stdio.h> 25*b1cdbd2cSJim Jagielski #include <string.h> 26*b1cdbd2cSJim Jagielski #include <dlfcn.h> 27*b1cdbd2cSJim Jagielski #include <cxxabi.h> 28*b1cdbd2cSJim Jagielski #include <hash_map> 29*b1cdbd2cSJim Jagielski 30*b1cdbd2cSJim Jagielski #include <rtl/strbuf.hxx> 31*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx> 32*b1cdbd2cSJim Jagielski #include <osl/diagnose.h> 33*b1cdbd2cSJim Jagielski #include <osl/mutex.hxx> 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/genfunc.hxx> 36*b1cdbd2cSJim Jagielski #include "com/sun/star/uno/RuntimeException.hpp" 37*b1cdbd2cSJim Jagielski #include <typelib/typedescription.hxx> 38*b1cdbd2cSJim Jagielski #include <uno/any2.h> 39*b1cdbd2cSJim Jagielski 40*b1cdbd2cSJim Jagielski #include "share.hxx" 41*b1cdbd2cSJim Jagielski 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski using namespace ::std; 44*b1cdbd2cSJim Jagielski using namespace ::osl; 45*b1cdbd2cSJim Jagielski using namespace ::rtl; 46*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno; 47*b1cdbd2cSJim Jagielski using namespace ::__cxxabiv1; 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski extern sal_Int32 * pHack; 50*b1cdbd2cSJim Jagielski extern sal_Int32 nHack; 51*b1cdbd2cSJim Jagielski 52*b1cdbd2cSJim Jagielski namespace CPPU_CURRENT_NAMESPACE 53*b1cdbd2cSJim Jagielski { dummy_can_throw_anything(char const *)54*b1cdbd2cSJim Jagielski void dummy_can_throw_anything( char const * ) 55*b1cdbd2cSJim Jagielski { 56*b1cdbd2cSJim Jagielski } 57*b1cdbd2cSJim Jagielski 58*b1cdbd2cSJim Jagielski //=================================================================== toUNOname(char const * p)59*b1cdbd2cSJim Jagielski static OUString toUNOname( char const * p ) SAL_THROW( () ) 60*b1cdbd2cSJim Jagielski { 61*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1 62*b1cdbd2cSJim Jagielski char const * start = p; 63*b1cdbd2cSJim Jagielski #endif 64*b1cdbd2cSJim Jagielski 65*b1cdbd2cSJim Jagielski // example: N3com3sun4star4lang24IllegalArgumentExceptionE 66*b1cdbd2cSJim Jagielski 67*b1cdbd2cSJim Jagielski OUStringBuffer buf( 64 ); 68*b1cdbd2cSJim Jagielski OSL_ASSERT( 'N' == *p ); 69*b1cdbd2cSJim Jagielski ++p; // skip N 70*b1cdbd2cSJim Jagielski 71*b1cdbd2cSJim Jagielski while ('E' != *p) 72*b1cdbd2cSJim Jagielski { 73*b1cdbd2cSJim Jagielski // read chars count 74*b1cdbd2cSJim Jagielski long n = (*p++ - '0'); 75*b1cdbd2cSJim Jagielski while ('0' <= *p && '9' >= *p) 76*b1cdbd2cSJim Jagielski { 77*b1cdbd2cSJim Jagielski n *= 10; 78*b1cdbd2cSJim Jagielski n += (*p++ - '0'); 79*b1cdbd2cSJim Jagielski } 80*b1cdbd2cSJim Jagielski buf.appendAscii( p, n ); 81*b1cdbd2cSJim Jagielski p += n; 82*b1cdbd2cSJim Jagielski if ('E' != *p) 83*b1cdbd2cSJim Jagielski buf.append( (sal_Unicode)'.' ); 84*b1cdbd2cSJim Jagielski } 85*b1cdbd2cSJim Jagielski 86*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1 87*b1cdbd2cSJim Jagielski OUString ret( buf.makeStringAndClear() ); 88*b1cdbd2cSJim Jagielski OString c_ret( OUStringToOString( ret, RTL_TEXTENCODING_ASCII_US ) ); 89*b1cdbd2cSJim Jagielski fprintf( stderr, "> toUNOname(): %s => %s\n", start, c_ret.getStr() ); 90*b1cdbd2cSJim Jagielski return ret; 91*b1cdbd2cSJim Jagielski #else 92*b1cdbd2cSJim Jagielski return buf.makeStringAndClear(); 93*b1cdbd2cSJim Jagielski #endif 94*b1cdbd2cSJim Jagielski } 95*b1cdbd2cSJim Jagielski 96*b1cdbd2cSJim Jagielski //===================================================================== 97*b1cdbd2cSJim Jagielski class RTTI 98*b1cdbd2cSJim Jagielski { 99*b1cdbd2cSJim Jagielski typedef hash_map< OUString, type_info *, OUStringHash > t_rtti_map; 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski Mutex m_mutex; 102*b1cdbd2cSJim Jagielski t_rtti_map m_rttis; 103*b1cdbd2cSJim Jagielski t_rtti_map m_generatedRttis; 104*b1cdbd2cSJim Jagielski 105*b1cdbd2cSJim Jagielski void * m_hApp; 106*b1cdbd2cSJim Jagielski 107*b1cdbd2cSJim Jagielski public: 108*b1cdbd2cSJim Jagielski RTTI() SAL_THROW( () ); 109*b1cdbd2cSJim Jagielski ~RTTI() SAL_THROW( () ); 110*b1cdbd2cSJim Jagielski 111*b1cdbd2cSJim Jagielski type_info * getRTTI(typelib_CompoundTypeDescription *) SAL_THROW( () ); 112*b1cdbd2cSJim Jagielski }; 113*b1cdbd2cSJim Jagielski //____________________________________________________________________ RTTI()114*b1cdbd2cSJim Jagielski RTTI::RTTI() SAL_THROW( () ) 115*b1cdbd2cSJim Jagielski : m_hApp( dlopen( 0, RTLD_LAZY ) ) 116*b1cdbd2cSJim Jagielski { 117*b1cdbd2cSJim Jagielski } 118*b1cdbd2cSJim Jagielski //____________________________________________________________________ ~RTTI()119*b1cdbd2cSJim Jagielski RTTI::~RTTI() SAL_THROW( () ) 120*b1cdbd2cSJim Jagielski { 121*b1cdbd2cSJim Jagielski dlclose( m_hApp ); 122*b1cdbd2cSJim Jagielski } 123*b1cdbd2cSJim Jagielski 124*b1cdbd2cSJim Jagielski //____________________________________________________________________ getRTTI(typelib_CompoundTypeDescription * pTypeDescr)125*b1cdbd2cSJim Jagielski type_info * RTTI::getRTTI( typelib_CompoundTypeDescription *pTypeDescr ) SAL_THROW( () ) 126*b1cdbd2cSJim Jagielski { 127*b1cdbd2cSJim Jagielski type_info * rtti; 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski OUString const & unoName = *(OUString const *)&pTypeDescr->aBase.pTypeName; 130*b1cdbd2cSJim Jagielski 131*b1cdbd2cSJim Jagielski MutexGuard guard( m_mutex ); 132*b1cdbd2cSJim Jagielski t_rtti_map::const_iterator iRttiFind( m_rttis.find( unoName ) ); 133*b1cdbd2cSJim Jagielski if (iRttiFind == m_rttis.end()) 134*b1cdbd2cSJim Jagielski { 135*b1cdbd2cSJim Jagielski // RTTI symbol 136*b1cdbd2cSJim Jagielski OStringBuffer buf( 64 ); 137*b1cdbd2cSJim Jagielski buf.append( RTL_CONSTASCII_STRINGPARAM("_ZTIN") ); 138*b1cdbd2cSJim Jagielski sal_Int32 index = 0; 139*b1cdbd2cSJim Jagielski do 140*b1cdbd2cSJim Jagielski { 141*b1cdbd2cSJim Jagielski OUString token( unoName.getToken( 0, '.', index ) ); 142*b1cdbd2cSJim Jagielski buf.append( token.getLength() ); 143*b1cdbd2cSJim Jagielski OString c_token( OUStringToOString( token, RTL_TEXTENCODING_ASCII_US ) ); 144*b1cdbd2cSJim Jagielski buf.append( c_token ); 145*b1cdbd2cSJim Jagielski } 146*b1cdbd2cSJim Jagielski while (index >= 0); 147*b1cdbd2cSJim Jagielski buf.append( 'E' ); 148*b1cdbd2cSJim Jagielski 149*b1cdbd2cSJim Jagielski OString symName( buf.makeStringAndClear() ); 150*b1cdbd2cSJim Jagielski rtti = (type_info *)dlsym( m_hApp, symName.getStr() ); 151*b1cdbd2cSJim Jagielski 152*b1cdbd2cSJim Jagielski if (rtti) 153*b1cdbd2cSJim Jagielski { 154*b1cdbd2cSJim Jagielski pair< t_rtti_map::iterator, bool > insertion( 155*b1cdbd2cSJim Jagielski m_rttis.insert( t_rtti_map::value_type( unoName, rtti ) ) ); 156*b1cdbd2cSJim Jagielski OSL_ENSURE( insertion.second, "### inserting new rtti failed?!" ); 157*b1cdbd2cSJim Jagielski } 158*b1cdbd2cSJim Jagielski else 159*b1cdbd2cSJim Jagielski { 160*b1cdbd2cSJim Jagielski // try to lookup the symbol in the generated rtti map 161*b1cdbd2cSJim Jagielski t_rtti_map::const_iterator iFind( m_generatedRttis.find( unoName ) ); 162*b1cdbd2cSJim Jagielski if (iFind == m_generatedRttis.end()) 163*b1cdbd2cSJim Jagielski { 164*b1cdbd2cSJim Jagielski // we must generate it ! 165*b1cdbd2cSJim Jagielski // symbol and rtti-name is nearly identical, 166*b1cdbd2cSJim Jagielski // the symbol is prefixed with _ZTI 167*b1cdbd2cSJim Jagielski char const * rttiName = symName.getStr() +4; 168*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1 169*b1cdbd2cSJim Jagielski fprintf( stderr,"generated rtti for %s\n", rttiName ); 170*b1cdbd2cSJim Jagielski #endif 171*b1cdbd2cSJim Jagielski if (pTypeDescr->pBaseTypeDescription) 172*b1cdbd2cSJim Jagielski { 173*b1cdbd2cSJim Jagielski // ensure availability of base 174*b1cdbd2cSJim Jagielski type_info * base_rtti = getRTTI( 175*b1cdbd2cSJim Jagielski (typelib_CompoundTypeDescription *)pTypeDescr->pBaseTypeDescription ); 176*b1cdbd2cSJim Jagielski rtti = new __si_class_type_info( 177*b1cdbd2cSJim Jagielski strdup( rttiName ), (__class_type_info *)base_rtti ); 178*b1cdbd2cSJim Jagielski } 179*b1cdbd2cSJim Jagielski else 180*b1cdbd2cSJim Jagielski { 181*b1cdbd2cSJim Jagielski // this class has no base class 182*b1cdbd2cSJim Jagielski rtti = new __class_type_info( strdup( rttiName ) ); 183*b1cdbd2cSJim Jagielski } 184*b1cdbd2cSJim Jagielski 185*b1cdbd2cSJim Jagielski pair< t_rtti_map::iterator, bool > insertion( 186*b1cdbd2cSJim Jagielski m_generatedRttis.insert( t_rtti_map::value_type( unoName, rtti ) ) ); 187*b1cdbd2cSJim Jagielski OSL_ENSURE( insertion.second, "### inserting new generated rtti failed?!" ); 188*b1cdbd2cSJim Jagielski } 189*b1cdbd2cSJim Jagielski else // taking already generated rtti 190*b1cdbd2cSJim Jagielski { 191*b1cdbd2cSJim Jagielski rtti = iFind->second; 192*b1cdbd2cSJim Jagielski } 193*b1cdbd2cSJim Jagielski } 194*b1cdbd2cSJim Jagielski } 195*b1cdbd2cSJim Jagielski else 196*b1cdbd2cSJim Jagielski { 197*b1cdbd2cSJim Jagielski rtti = iRttiFind->second; 198*b1cdbd2cSJim Jagielski } 199*b1cdbd2cSJim Jagielski 200*b1cdbd2cSJim Jagielski return rtti; 201*b1cdbd2cSJim Jagielski } 202*b1cdbd2cSJim Jagielski 203*b1cdbd2cSJim Jagielski //------------------------------------------------------------------ deleteException(void * pExc)204*b1cdbd2cSJim Jagielski static void deleteException( void * pExc ) 205*b1cdbd2cSJim Jagielski { 206*b1cdbd2cSJim Jagielski __cxa_exception const * header = ((__cxa_exception const *)pExc - 1); 207*b1cdbd2cSJim Jagielski typelib_TypeDescription * pTD = 0; 208*b1cdbd2cSJim Jagielski OUString unoName( toUNOname( header->exceptionType->name() ) ); 209*b1cdbd2cSJim Jagielski ::typelib_typedescription_getByName( &pTD, unoName.pData ); 210*b1cdbd2cSJim Jagielski OSL_ENSURE( pTD, "### unknown exception type! leaving out destruction => leaking!!!" ); 211*b1cdbd2cSJim Jagielski if (pTD) 212*b1cdbd2cSJim Jagielski { 213*b1cdbd2cSJim Jagielski ::uno_destructData( pExc, pTD, cpp_release ); 214*b1cdbd2cSJim Jagielski ::typelib_typedescription_release( pTD ); 215*b1cdbd2cSJim Jagielski } 216*b1cdbd2cSJim Jagielski } 217*b1cdbd2cSJim Jagielski 218*b1cdbd2cSJim Jagielski //================================================================== raiseException(uno_Any * pUnoExc,uno_Mapping * pUno2Cpp)219*b1cdbd2cSJim Jagielski void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp ) 220*b1cdbd2cSJim Jagielski { 221*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1 222*b1cdbd2cSJim Jagielski OString cstr( 223*b1cdbd2cSJim Jagielski OUStringToOString( 224*b1cdbd2cSJim Jagielski *reinterpret_cast< OUString const * >( &pUnoExc->pType->pTypeName ), 225*b1cdbd2cSJim Jagielski RTL_TEXTENCODING_ASCII_US ) ); 226*b1cdbd2cSJim Jagielski fprintf( stderr, "> uno exception occured: %s\n", cstr.getStr() ); 227*b1cdbd2cSJim Jagielski #endif 228*b1cdbd2cSJim Jagielski void * pCppExc; 229*b1cdbd2cSJim Jagielski type_info * rtti; 230*b1cdbd2cSJim Jagielski 231*b1cdbd2cSJim Jagielski { 232*b1cdbd2cSJim Jagielski // construct cpp exception object 233*b1cdbd2cSJim Jagielski typelib_TypeDescription * pTypeDescr = 0; 234*b1cdbd2cSJim Jagielski TYPELIB_DANGER_GET( &pTypeDescr, pUnoExc->pType ); 235*b1cdbd2cSJim Jagielski OSL_ASSERT( pTypeDescr ); 236*b1cdbd2cSJim Jagielski if (! pTypeDescr) 237*b1cdbd2cSJim Jagielski { 238*b1cdbd2cSJim Jagielski throw RuntimeException( 239*b1cdbd2cSJim Jagielski OUString( RTL_CONSTASCII_USTRINGPARAM("cannot get typedescription for type ") ) + 240*b1cdbd2cSJim Jagielski *reinterpret_cast< OUString const * >( &pUnoExc->pType->pTypeName ), 241*b1cdbd2cSJim Jagielski Reference< XInterface >() ); 242*b1cdbd2cSJim Jagielski } 243*b1cdbd2cSJim Jagielski 244*b1cdbd2cSJim Jagielski pCppExc = __cxa_allocate_exception( pTypeDescr->nSize ); 245*b1cdbd2cSJim Jagielski ::uno_copyAndConvertData( pCppExc, pUnoExc->pData, pTypeDescr, pUno2Cpp ); 246*b1cdbd2cSJim Jagielski 247*b1cdbd2cSJim Jagielski // destruct uno exception 248*b1cdbd2cSJim Jagielski ::uno_any_destruct( pUnoExc, 0 ); 249*b1cdbd2cSJim Jagielski // avoiding locked counts 250*b1cdbd2cSJim Jagielski static RTTI * s_rtti = 0; 251*b1cdbd2cSJim Jagielski if (! s_rtti) 252*b1cdbd2cSJim Jagielski { 253*b1cdbd2cSJim Jagielski MutexGuard guard( Mutex::getGlobalMutex() ); 254*b1cdbd2cSJim Jagielski if (! s_rtti) 255*b1cdbd2cSJim Jagielski { 256*b1cdbd2cSJim Jagielski #ifdef LEAK_STATIC_DATA 257*b1cdbd2cSJim Jagielski s_rtti = new RTTI(); 258*b1cdbd2cSJim Jagielski #else 259*b1cdbd2cSJim Jagielski static RTTI rtti_data; 260*b1cdbd2cSJim Jagielski s_rtti = &rtti_data; 261*b1cdbd2cSJim Jagielski #endif 262*b1cdbd2cSJim Jagielski } 263*b1cdbd2cSJim Jagielski } 264*b1cdbd2cSJim Jagielski rtti = (type_info *)s_rtti->getRTTI( (typelib_CompoundTypeDescription *) pTypeDescr ); 265*b1cdbd2cSJim Jagielski TYPELIB_DANGER_RELEASE( pTypeDescr ); 266*b1cdbd2cSJim Jagielski OSL_ENSURE( rtti, "### no rtti for throwing exception!" ); 267*b1cdbd2cSJim Jagielski if (! rtti) 268*b1cdbd2cSJim Jagielski { 269*b1cdbd2cSJim Jagielski throw RuntimeException( 270*b1cdbd2cSJim Jagielski OUString( RTL_CONSTASCII_USTRINGPARAM("no rtti for type ") ) + 271*b1cdbd2cSJim Jagielski *reinterpret_cast< OUString const * >( &pUnoExc->pType->pTypeName ), 272*b1cdbd2cSJim Jagielski Reference< XInterface >() ); 273*b1cdbd2cSJim Jagielski } 274*b1cdbd2cSJim Jagielski } 275*b1cdbd2cSJim Jagielski 276*b1cdbd2cSJim Jagielski 277*b1cdbd2cSJim Jagielski __cxa_throw( pCppExc, rtti, deleteException ); 278*b1cdbd2cSJim Jagielski } 279*b1cdbd2cSJim Jagielski getAdjustedPtr(__cxa_exception * header)280*b1cdbd2cSJim Jagielski static void* getAdjustedPtr(__cxa_exception* header) 281*b1cdbd2cSJim Jagielski { 282*b1cdbd2cSJim Jagielski return header->adjustedPtr; 283*b1cdbd2cSJim Jagielski } 284*b1cdbd2cSJim Jagielski 285*b1cdbd2cSJim Jagielski //=================================================================== fillUnoException(__cxa_exception * header,uno_Any * pUnoExc,uno_Mapping * pCpp2Uno)286*b1cdbd2cSJim Jagielski void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno ) 287*b1cdbd2cSJim Jagielski { 288*b1cdbd2cSJim Jagielski if (! header) 289*b1cdbd2cSJim Jagielski { 290*b1cdbd2cSJim Jagielski RuntimeException aRE( 291*b1cdbd2cSJim Jagielski OUString( RTL_CONSTASCII_USTRINGPARAM("no exception header!") ), 292*b1cdbd2cSJim Jagielski Reference< XInterface >() ); 293*b1cdbd2cSJim Jagielski Type const & rType = ::getCppuType( &aRE ); 294*b1cdbd2cSJim Jagielski uno_type_any_constructAndConvert( pUnoExc, &aRE, rType.getTypeLibType(), pCpp2Uno ); 295*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0 296*b1cdbd2cSJim Jagielski OString cstr( OUStringToOString( aRE.Message, RTL_TEXTENCODING_ASCII_US ) ); 297*b1cdbd2cSJim Jagielski OSL_ENSURE( 0, cstr.getStr() ); 298*b1cdbd2cSJim Jagielski #endif 299*b1cdbd2cSJim Jagielski return; 300*b1cdbd2cSJim Jagielski } 301*b1cdbd2cSJim Jagielski 302*b1cdbd2cSJim Jagielski typelib_TypeDescription * pExcTypeDescr = 0; 303*b1cdbd2cSJim Jagielski OUString unoName( toUNOname( header->exceptionType->name() ) ); 304*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1 305*b1cdbd2cSJim Jagielski OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) ); 306*b1cdbd2cSJim Jagielski fprintf( stderr, "> c++ exception occured: %s\n", cstr_unoName.getStr() ); 307*b1cdbd2cSJim Jagielski #endif 308*b1cdbd2cSJim Jagielski typelib_typedescription_getByName( &pExcTypeDescr, unoName.pData ); 309*b1cdbd2cSJim Jagielski if (0 == pExcTypeDescr) 310*b1cdbd2cSJim Jagielski { 311*b1cdbd2cSJim Jagielski RuntimeException aRE( 312*b1cdbd2cSJim Jagielski OUString( RTL_CONSTASCII_USTRINGPARAM("exception type not found: ") ) + unoName, 313*b1cdbd2cSJim Jagielski Reference< XInterface >() ); 314*b1cdbd2cSJim Jagielski Type const & rType = ::getCppuType( &aRE ); 315*b1cdbd2cSJim Jagielski uno_type_any_constructAndConvert( pUnoExc, &aRE, rType.getTypeLibType(), pCpp2Uno ); 316*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0 317*b1cdbd2cSJim Jagielski OString cstr( OUStringToOString( aRE.Message, RTL_TEXTENCODING_ASCII_US ) ); 318*b1cdbd2cSJim Jagielski OSL_ENSURE( 0, cstr.getStr() ); 319*b1cdbd2cSJim Jagielski #endif 320*b1cdbd2cSJim Jagielski } 321*b1cdbd2cSJim Jagielski else 322*b1cdbd2cSJim Jagielski { 323*b1cdbd2cSJim Jagielski // construct uno exception any 324*b1cdbd2cSJim Jagielski uno_any_constructAndConvert( pUnoExc, getAdjustedPtr(header), pExcTypeDescr, pCpp2Uno ); 325*b1cdbd2cSJim Jagielski typelib_typedescription_release( pExcTypeDescr ); 326*b1cdbd2cSJim Jagielski } 327*b1cdbd2cSJim Jagielski } 328*b1cdbd2cSJim Jagielski } 329*b1cdbd2cSJim Jagielski 330*b1cdbd2cSJim Jagielski /* vi:set tabstop=4 shiftwidth=4 expandtab: */ 331