| File: | bridges/source/jni_uno/jni_bridge.cxx |
| Location: | line 479, column 14 |
| Description: | Dereference of null pointer (loaded from variable 'ppMapping') |
| 1 | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ | |||||
| 2 | /************************************************************************* | |||||
| 3 | * | |||||
| 4 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |||||
| 5 | * | |||||
| 6 | * Copyright 2000, 2010 Oracle and/or its affiliates. | |||||
| 7 | * | |||||
| 8 | * OpenOffice.org - a multi-platform office productivity suite | |||||
| 9 | * | |||||
| 10 | * This file is part of OpenOffice.org. | |||||
| 11 | * | |||||
| 12 | * OpenOffice.org is free software: you can redistribute it and/or modify | |||||
| 13 | * it under the terms of the GNU Lesser General Public License version 3 | |||||
| 14 | * only, as published by the Free Software Foundation. | |||||
| 15 | * | |||||
| 16 | * OpenOffice.org is distributed in the hope that it will be useful, | |||||
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| 19 | * GNU Lesser General Public License version 3 for more details | |||||
| 20 | * (a copy is included in the LICENSE file that accompanied this code). | |||||
| 21 | * | |||||
| 22 | * You should have received a copy of the GNU Lesser General Public License | |||||
| 23 | * version 3 along with OpenOffice.org. If not, see | |||||
| 24 | * <http://www.openoffice.org/license.html> | |||||
| 25 | * for a copy of the LGPLv3 License. | |||||
| 26 | * | |||||
| 27 | ************************************************************************/ | |||||
| 28 | ||||||
| 29 | ||||||
| 30 | #include "jni_bridge.h" | |||||
| 31 | ||||||
| 32 | #include "jvmaccess/unovirtualmachine.hxx" | |||||
| 33 | #include "rtl/ref.hxx" | |||||
| 34 | #include "rtl/unload.h" | |||||
| 35 | #include "rtl/strbuf.hxx" | |||||
| 36 | #include "uno/lbnames.h" | |||||
| 37 | ||||||
| 38 | ||||||
| 39 | using namespace ::std; | |||||
| 40 | using namespace ::rtl; | |||||
| 41 | using namespace ::osl; | |||||
| 42 | using namespace ::jni_uno; | |||||
| 43 | ||||||
| 44 | namespace | |||||
| 45 | { | |||||
| 46 | extern "C" | |||||
| 47 | { | |||||
| 48 | ||||||
| 49 | //------------------------------------------------------------------------------ | |||||
| 50 | void SAL_CALL Mapping_acquire( uno_Mapping * mapping ) | |||||
| 51 | SAL_THROW_EXTERN_C()throw () | |||||
| 52 | { | |||||
| 53 | Mapping const * that = static_cast< Mapping const * >( mapping ); | |||||
| 54 | that->m_bridge->acquire(); | |||||
| 55 | } | |||||
| 56 | ||||||
| 57 | //------------------------------------------------------------------------------ | |||||
| 58 | void SAL_CALL Mapping_release( uno_Mapping * mapping ) | |||||
| 59 | SAL_THROW_EXTERN_C()throw () | |||||
| 60 | { | |||||
| 61 | Mapping const * that = static_cast< Mapping const * >( mapping ); | |||||
| 62 | that->m_bridge->release(); | |||||
| 63 | } | |||||
| 64 | ||||||
| 65 | //------------------------------------------------------------------------------ | |||||
| 66 | void SAL_CALL Mapping_map_to_uno( | |||||
| 67 | uno_Mapping * mapping, void ** ppOut, | |||||
| 68 | void * pIn, typelib_InterfaceTypeDescription * td ) | |||||
| 69 | SAL_THROW_EXTERN_C()throw () | |||||
| 70 | { | |||||
| 71 | uno_Interface ** ppUnoI = (uno_Interface **)ppOut; | |||||
| 72 | jobject javaI = (jobject) pIn; | |||||
| 73 | ||||||
| 74 | OSL_ASSERT( sizeof (void *) == sizeof (jobject) )do { if (true && (!(sizeof (void *) == sizeof (jobject )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "74" ": "), "OSL_ASSERT: %s", "sizeof (void *) == sizeof (jobject)" ); } } while (false); | |||||
| 75 | OSL_ENSURE( ppUnoI && td, "### null ptr!" )do { if (true && (!(ppUnoI && td))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "75" ": "), "%s", "### null ptr!"); } } while (false); | |||||
| 76 | ||||||
| 77 | if (0 == javaI) | |||||
| 78 | { | |||||
| 79 | if (0 != *ppUnoI) | |||||
| 80 | { | |||||
| 81 | uno_Interface * p = *(uno_Interface **)ppUnoI; | |||||
| 82 | (*p->release)( p ); | |||||
| 83 | *ppUnoI = 0; | |||||
| 84 | } | |||||
| 85 | } | |||||
| 86 | else | |||||
| 87 | { | |||||
| 88 | try | |||||
| 89 | { | |||||
| 90 | Bridge const * bridge = | |||||
| 91 | static_cast< Mapping const * >( mapping )->m_bridge; | |||||
| 92 | JNI_guarded_context jni( | |||||
| 93 | bridge->m_jni_info, | |||||
| 94 | reinterpret_cast< ::jvmaccess::UnoVirtualMachine * >( | |||||
| 95 | bridge->m_java_env->pContext ) ); | |||||
| 96 | ||||||
| 97 | JNI_interface_type_info const * info = | |||||
| 98 | static_cast< JNI_interface_type_info const * >( | |||||
| 99 | bridge->m_jni_info->get_type_info( | |||||
| 100 | jni, (typelib_TypeDescription *)td ) ); | |||||
| 101 | uno_Interface * pUnoI = bridge->map_to_uno( jni, javaI, info ); | |||||
| 102 | if (0 != *ppUnoI) | |||||
| 103 | { | |||||
| 104 | uno_Interface * p = *(uno_Interface **)ppUnoI; | |||||
| 105 | (*p->release)( p ); | |||||
| 106 | } | |||||
| 107 | *ppUnoI = pUnoI; | |||||
| 108 | } | |||||
| 109 | catch (const BridgeRuntimeError & err) | |||||
| 110 | { | |||||
| 111 | #if OSL_DEBUG_LEVEL1 > 0 | |||||
| 112 | OString cstr_msg( | |||||
| 113 | OUStringToOString( | |||||
| 114 | OUSTR("[jni_uno bridge error] ")::rtl::OUString( (&("[jni_uno bridge error] ")[0]), ((sal_Int32 )((sizeof ("[jni_uno bridge error] ") / sizeof (("[jni_uno bridge error] " )[0]))-1)), (((rtl_TextEncoding) 11)) ) + err.m_message, | |||||
| 115 | RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11)) ) ); | |||||
| 116 | OSL_FAIL( cstr_msg.getStr() )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "116" ": "), "%s", cstr_msg.getStr()); } } while (false); | |||||
| 117 | #else | |||||
| 118 | (void) err; // unused | |||||
| 119 | #endif | |||||
| 120 | } | |||||
| 121 | catch (const ::jvmaccess::VirtualMachine::AttachGuard::CreationException &) | |||||
| 122 | { | |||||
| 123 | OSL_FAIL(do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "125" ": "), "%s", "[jni_uno bridge error] attaching current thread " "to java failed!"); } } while (false) | |||||
| 124 | "[jni_uno bridge error] attaching current thread "do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "125" ": "), "%s", "[jni_uno bridge error] attaching current thread " "to java failed!"); } } while (false) | |||||
| 125 | "to java failed!" )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "125" ": "), "%s", "[jni_uno bridge error] attaching current thread " "to java failed!"); } } while (false); | |||||
| 126 | } | |||||
| 127 | } | |||||
| 128 | } | |||||
| 129 | ||||||
| 130 | //------------------------------------------------------------------------------ | |||||
| 131 | void SAL_CALL Mapping_map_to_java( | |||||
| 132 | uno_Mapping * mapping, void ** ppOut, | |||||
| 133 | void * pIn, typelib_InterfaceTypeDescription * td ) | |||||
| 134 | SAL_THROW_EXTERN_C()throw () | |||||
| 135 | { | |||||
| 136 | jobject * ppJavaI = (jobject *) ppOut; | |||||
| 137 | uno_Interface * pUnoI = (uno_Interface *)pIn; | |||||
| 138 | ||||||
| 139 | OSL_ASSERT( sizeof (void *) == sizeof (jobject) )do { if (true && (!(sizeof (void *) == sizeof (jobject )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "139" ": "), "OSL_ASSERT: %s", "sizeof (void *) == sizeof (jobject)" ); } } while (false); | |||||
| 140 | OSL_ENSURE( ppJavaI && td, "### null ptr!" )do { if (true && (!(ppJavaI && td))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "140" ": "), "%s", "### null ptr!"); } } while (false); | |||||
| 141 | ||||||
| 142 | try | |||||
| 143 | { | |||||
| 144 | if (0 == pUnoI) | |||||
| 145 | { | |||||
| 146 | if (0 != *ppJavaI) | |||||
| 147 | { | |||||
| 148 | Bridge const * bridge = | |||||
| 149 | static_cast< Mapping const * >( mapping )->m_bridge; | |||||
| 150 | JNI_guarded_context jni( | |||||
| 151 | bridge->m_jni_info, | |||||
| 152 | reinterpret_cast< ::jvmaccess::UnoVirtualMachine * >( | |||||
| 153 | bridge->m_java_env->pContext ) ); | |||||
| 154 | jni->DeleteGlobalRef( *ppJavaI ); | |||||
| 155 | *ppJavaI = 0; | |||||
| 156 | } | |||||
| 157 | } | |||||
| 158 | else | |||||
| 159 | { | |||||
| 160 | Bridge const * bridge = | |||||
| 161 | static_cast< Mapping const * >( mapping )->m_bridge; | |||||
| 162 | JNI_guarded_context jni( | |||||
| 163 | bridge->m_jni_info, | |||||
| 164 | reinterpret_cast< ::jvmaccess::UnoVirtualMachine * >( | |||||
| 165 | bridge->m_java_env->pContext ) ); | |||||
| 166 | ||||||
| 167 | JNI_interface_type_info const * info = | |||||
| 168 | static_cast< JNI_interface_type_info const * >( | |||||
| 169 | bridge->m_jni_info->get_type_info( | |||||
| 170 | jni, (typelib_TypeDescription *)td ) ); | |||||
| 171 | jobject jlocal = bridge->map_to_java( jni, pUnoI, info ); | |||||
| 172 | if (0 != *ppJavaI) | |||||
| 173 | jni->DeleteGlobalRef( *ppJavaI ); | |||||
| 174 | *ppJavaI = jni->NewGlobalRef( jlocal ); | |||||
| 175 | jni->DeleteLocalRef( jlocal ); | |||||
| 176 | } | |||||
| 177 | } | |||||
| 178 | catch (const BridgeRuntimeError & err) | |||||
| 179 | { | |||||
| 180 | #if OSL_DEBUG_LEVEL1 > 0 | |||||
| 181 | OString cstr_msg( | |||||
| 182 | OUStringToOString( | |||||
| 183 | OUSTR("[jni_uno bridge error] ")::rtl::OUString( (&("[jni_uno bridge error] ")[0]), ((sal_Int32 )((sizeof ("[jni_uno bridge error] ") / sizeof (("[jni_uno bridge error] " )[0]))-1)), (((rtl_TextEncoding) 11)) ) + err.m_message, | |||||
| 184 | RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11)) ) ); | |||||
| 185 | OSL_FAIL( cstr_msg.getStr() )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "185" ": "), "%s", cstr_msg.getStr()); } } while (false); | |||||
| 186 | #else | |||||
| 187 | (void) err; // unused | |||||
| 188 | #endif | |||||
| 189 | } | |||||
| 190 | catch (const ::jvmaccess::VirtualMachine::AttachGuard::CreationException &) | |||||
| 191 | { | |||||
| 192 | OSL_FAIL(do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "193" ": "), "%s", "[jni_uno bridge error] attaching current thread to java failed!" ); } } while (false) | |||||
| 193 | "[jni_uno bridge error] attaching current thread to java failed!" )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "193" ": "), "%s", "[jni_uno bridge error] attaching current thread to java failed!" ); } } while (false); | |||||
| 194 | } | |||||
| 195 | } | |||||
| 196 | ||||||
| 197 | //______________________________________________________________________________ | |||||
| 198 | void SAL_CALL Bridge_free( uno_Mapping * mapping ) | |||||
| 199 | SAL_THROW_EXTERN_C()throw () | |||||
| 200 | { | |||||
| 201 | Mapping * that = static_cast< Mapping * >( mapping ); | |||||
| 202 | delete that->m_bridge; | |||||
| 203 | } | |||||
| 204 | ||||||
| 205 | } | |||||
| 206 | ||||||
| 207 | rtl_StandardModuleCount g_moduleCount = MODULE_COUNT_INIT{ {rtl_moduleCount_acquire,rtl_moduleCount_release}, rtl_moduleCount_canUnload , 0, {0, 0}}; | |||||
| 208 | ||||||
| 209 | } | |||||
| 210 | ||||||
| 211 | namespace jni_uno | |||||
| 212 | { | |||||
| 213 | ||||||
| 214 | //______________________________________________________________________________ | |||||
| 215 | void Bridge::acquire() const SAL_THROW(()) | |||||
| 216 | { | |||||
| 217 | if (1 == osl_incrementInterlockedCount( &m_ref )) | |||||
| 218 | { | |||||
| 219 | if (m_registered_java2uno) | |||||
| 220 | { | |||||
| 221 | uno_Mapping * mapping = const_cast< Mapping * >( &m_java2uno ); | |||||
| 222 | uno_registerMapping( | |||||
| 223 | &mapping, Bridge_free, | |||||
| 224 | m_java_env, (uno_Environment *)m_uno_env, 0 ); | |||||
| 225 | } | |||||
| 226 | else | |||||
| 227 | { | |||||
| 228 | uno_Mapping * mapping = const_cast< Mapping * >( &m_uno2java ); | |||||
| 229 | uno_registerMapping( | |||||
| 230 | &mapping, Bridge_free, | |||||
| 231 | (uno_Environment *)m_uno_env, m_java_env, 0 ); | |||||
| 232 | } | |||||
| 233 | } | |||||
| 234 | } | |||||
| 235 | ||||||
| 236 | //______________________________________________________________________________ | |||||
| 237 | void Bridge::release() const SAL_THROW(()) | |||||
| 238 | { | |||||
| 239 | if (! osl_decrementInterlockedCount( &m_ref )) | |||||
| 240 | { | |||||
| 241 | uno_revokeMapping( | |||||
| 242 | m_registered_java2uno | |||||
| 243 | ? const_cast< Mapping * >( &m_java2uno ) | |||||
| 244 | : const_cast< Mapping * >( &m_uno2java ) ); | |||||
| 245 | } | |||||
| 246 | } | |||||
| 247 | ||||||
| 248 | //______________________________________________________________________________ | |||||
| 249 | Bridge::Bridge( | |||||
| 250 | uno_Environment * java_env, uno_ExtEnvironment * uno_env, | |||||
| 251 | bool registered_java2uno ) | |||||
| 252 | : m_ref( 1 ), | |||||
| 253 | m_uno_env( uno_env ), | |||||
| 254 | m_java_env( java_env ), | |||||
| 255 | m_registered_java2uno( registered_java2uno ) | |||||
| 256 | { | |||||
| 257 | // bootstrapping bridge jni_info | |||||
| 258 | m_jni_info = JNI_info::get_jni_info( | |||||
| 259 | reinterpret_cast< ::jvmaccess::UnoVirtualMachine * >( | |||||
| 260 | m_java_env->pContext ) ); | |||||
| 261 | ||||||
| 262 | OSL_ASSERT( 0 != m_java_env && 0 != m_uno_env )do { if (true && (!(0 != m_java_env && 0 != m_uno_env ))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "262" ": "), "OSL_ASSERT: %s", "0 != m_java_env && 0 != m_uno_env" ); } } while (false); | |||||
| 263 | (*((uno_Environment *)m_uno_env)->acquire)( (uno_Environment *)m_uno_env ); | |||||
| 264 | (*m_java_env->acquire)( m_java_env ); | |||||
| 265 | ||||||
| 266 | // java2uno | |||||
| 267 | m_java2uno.acquire = Mapping_acquire; | |||||
| 268 | m_java2uno.release = Mapping_release; | |||||
| 269 | m_java2uno.mapInterface = Mapping_map_to_uno; | |||||
| 270 | m_java2uno.m_bridge = this; | |||||
| 271 | // uno2java | |||||
| 272 | m_uno2java.acquire = Mapping_acquire; | |||||
| 273 | m_uno2java.release = Mapping_release; | |||||
| 274 | m_uno2java.mapInterface = Mapping_map_to_java; | |||||
| 275 | m_uno2java.m_bridge = this; | |||||
| 276 | ||||||
| 277 | (*g_moduleCount.modCnt.acquire)( &g_moduleCount.modCnt ); | |||||
| 278 | } | |||||
| 279 | ||||||
| 280 | //______________________________________________________________________________ | |||||
| 281 | Bridge::~Bridge() SAL_THROW(()) | |||||
| 282 | { | |||||
| 283 | (*m_java_env->release)( m_java_env ); | |||||
| 284 | (*((uno_Environment *)m_uno_env)->release)( (uno_Environment *)m_uno_env ); | |||||
| 285 | ||||||
| 286 | (*g_moduleCount.modCnt.release)( &g_moduleCount.modCnt ); | |||||
| 287 | } | |||||
| 288 | ||||||
| 289 | ||||||
| 290 | //______________________________________________________________________________ | |||||
| 291 | void JNI_context::java_exc_occurred() const | |||||
| 292 | { | |||||
| 293 | // !don't rely on JNI_info! | |||||
| 294 | ||||||
| 295 | JLocalAutoRef jo_exc( *this, m_env->ExceptionOccurred() ); | |||||
| 296 | m_env->ExceptionClear(); | |||||
| 297 | OSL_ASSERT( jo_exc.is() )do { if (true && (!(jo_exc.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "297" ": "), "OSL_ASSERT: %s", "jo_exc.is()"); } } while (false); | |||||
| 298 | if (! jo_exc.is()) | |||||
| 299 | { | |||||
| 300 | throw BridgeRuntimeError( | |||||
| 301 | OUSTR("java exception occurred, but not available!?")::rtl::OUString( (&("java exception occurred, but not available!?" )[0]), ((sal_Int32)((sizeof ("java exception occurred, but not available!?" ) / sizeof (("java exception occurred, but not available!?")[ 0]))-1)), (((rtl_TextEncoding) 11)) ) + | |||||
| 302 | get_stack_trace() ); | |||||
| 303 | } | |||||
| 304 | ||||||
| 305 | // call toString(); don't rely on m_jni_info | |||||
| 306 | jclass jo_class = m_env->FindClass( "java/lang/Object" ); | |||||
| 307 | if (JNI_FALSE0 != m_env->ExceptionCheck()) | |||||
| 308 | { | |||||
| 309 | m_env->ExceptionClear(); | |||||
| 310 | throw BridgeRuntimeError( | |||||
| 311 | OUSTR("cannot get class java.lang.Object!")::rtl::OUString( (&("cannot get class java.lang.Object!") [0]), ((sal_Int32)((sizeof ("cannot get class java.lang.Object!" ) / sizeof (("cannot get class java.lang.Object!")[0]))-1)), ( ((rtl_TextEncoding) 11)) ) + get_stack_trace() ); | |||||
| 312 | } | |||||
| 313 | JLocalAutoRef jo_Object( *this, jo_class ); | |||||
| 314 | // method Object.toString() | |||||
| 315 | jmethodID method_Object_toString = m_env->GetMethodID( | |||||
| 316 | (jclass) jo_Object.get(), "toString", "()Ljava/lang/String;" ); | |||||
| 317 | if (JNI_FALSE0 != m_env->ExceptionCheck()) | |||||
| 318 | { | |||||
| 319 | m_env->ExceptionClear(); | |||||
| 320 | throw BridgeRuntimeError( | |||||
| 321 | OUSTR("cannot get method id of java.lang.Object.toString()!")::rtl::OUString( (&("cannot get method id of java.lang.Object.toString()!" )[0]), ((sal_Int32)((sizeof ("cannot get method id of java.lang.Object.toString()!" ) / sizeof (("cannot get method id of java.lang.Object.toString()!" )[0]))-1)), (((rtl_TextEncoding) 11)) ) + | |||||
| 322 | get_stack_trace() ); | |||||
| 323 | } | |||||
| 324 | OSL_ASSERT( 0 != method_Object_toString )do { if (true && (!(0 != method_Object_toString))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "324" ": "), "OSL_ASSERT: %s", "0 != method_Object_toString" ); } } while (false); | |||||
| 325 | ||||||
| 326 | JLocalAutoRef jo_descr( | |||||
| 327 | *this, m_env->CallObjectMethodA( | |||||
| 328 | jo_exc.get(), method_Object_toString, 0 ) ); | |||||
| 329 | if (m_env->ExceptionCheck()) // no chance at all | |||||
| 330 | { | |||||
| 331 | m_env->ExceptionClear(); | |||||
| 332 | throw BridgeRuntimeError( | |||||
| 333 | OUSTR("error examining java exception object!")::rtl::OUString( (&("error examining java exception object!" )[0]), ((sal_Int32)((sizeof ("error examining java exception object!" ) / sizeof (("error examining java exception object!")[0]))-1 )), (((rtl_TextEncoding) 11)) ) + | |||||
| 334 | get_stack_trace() ); | |||||
| 335 | } | |||||
| 336 | ||||||
| 337 | jsize len = m_env->GetStringLength( (jstring) jo_descr.get() ); | |||||
| 338 | SAL_WNODEPRECATED_DECLARATIONS_PUSH | |||||
| 339 | auto_ptr< rtl_mem > ustr_mem( | |||||
| 340 | rtl_mem::allocate( | |||||
| 341 | sizeof (rtl_uString) + (len * sizeof (sal_Unicode)) ) ); | |||||
| 342 | SAL_WNODEPRECATED_DECLARATIONS_POP | |||||
| 343 | rtl_uString * ustr = (rtl_uString *)ustr_mem.get(); | |||||
| 344 | m_env->GetStringRegion( (jstring) jo_descr.get(), 0, len, ustr->buffer ); | |||||
| 345 | if (m_env->ExceptionCheck()) | |||||
| 346 | { | |||||
| 347 | m_env->ExceptionClear(); | |||||
| 348 | throw BridgeRuntimeError( | |||||
| 349 | OUSTR("invalid java string object!")::rtl::OUString( (&("invalid java string object!")[0]), ( (sal_Int32)((sizeof ("invalid java string object!") / sizeof ( ("invalid java string object!")[0]))-1)), (((rtl_TextEncoding ) 11)) ) + get_stack_trace() ); | |||||
| 350 | } | |||||
| 351 | ustr->refCount = 1; | |||||
| 352 | ustr->length = len; | |||||
| 353 | ustr->buffer[ len ] = '\0'; | |||||
| 354 | OUString message( (rtl_uString *)ustr_mem.release(), SAL_NO_ACQUIRE ); | |||||
| 355 | ||||||
| 356 | throw BridgeRuntimeError( message + get_stack_trace( jo_exc.get() ) ); | |||||
| 357 | } | |||||
| 358 | ||||||
| 359 | //______________________________________________________________________________ | |||||
| 360 | void JNI_context::getClassForName( | |||||
| 361 | jclass * classClass, jmethodID * methodForName) const | |||||
| 362 | { | |||||
| 363 | jclass c = m_env->FindClass("java/lang/Class"); | |||||
| 364 | if (c != 0) { | |||||
| 365 | *methodForName = m_env->GetStaticMethodID( | |||||
| 366 | c, "forName", | |||||
| 367 | "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;"); | |||||
| 368 | } | |||||
| 369 | *classClass = c; | |||||
| 370 | } | |||||
| 371 | ||||||
| 372 | //______________________________________________________________________________ | |||||
| 373 | jclass JNI_context::findClass( | |||||
| 374 | char const * name, jclass classClass, jmethodID methodForName, | |||||
| 375 | bool inException) const | |||||
| 376 | { | |||||
| 377 | jclass c = 0; | |||||
| 378 | JLocalAutoRef s(*this, m_env->NewStringUTF(name)); | |||||
| 379 | if (s.is()) { | |||||
| 380 | jvalue a[3]; | |||||
| 381 | a[0].l = s.get(); | |||||
| 382 | a[1].z = JNI_FALSE0; | |||||
| 383 | a[2].l = m_class_loader; | |||||
| 384 | c = static_cast< jclass >( | |||||
| 385 | m_env->CallStaticObjectMethodA(classClass, methodForName, a)); | |||||
| 386 | } | |||||
| 387 | if (!inException) { | |||||
| 388 | ensure_no_exception(); | |||||
| 389 | } | |||||
| 390 | return c; | |||||
| 391 | } | |||||
| 392 | ||||||
| 393 | //______________________________________________________________________________ | |||||
| 394 | OUString JNI_context::get_stack_trace( jobject jo_exc ) const | |||||
| 395 | { | |||||
| 396 | JLocalAutoRef jo_JNI_proxy( | |||||
| 397 | *this, | |||||
| 398 | find_class( *this, "com.sun.star.bridges.jni_uno.JNI_proxy", true ) ); | |||||
| 399 | if (assert_no_exception()) | |||||
| 400 | { | |||||
| 401 | // static method JNI_proxy.get_stack_trace() | |||||
| 402 | jmethodID method = m_env->GetStaticMethodID( | |||||
| 403 | (jclass) jo_JNI_proxy.get(), "get_stack_trace", | |||||
| 404 | "(Ljava/lang/Throwable;)Ljava/lang/String;" ); | |||||
| 405 | if (assert_no_exception() && (0 != method)) | |||||
| 406 | { | |||||
| 407 | jvalue arg; | |||||
| 408 | arg.l = jo_exc; | |||||
| 409 | JLocalAutoRef jo_stack_trace( | |||||
| 410 | *this, m_env->CallStaticObjectMethodA( | |||||
| 411 | (jclass) jo_JNI_proxy.get(), method, &arg ) ); | |||||
| 412 | if (assert_no_exception()) | |||||
| 413 | { | |||||
| 414 | jsize len = | |||||
| 415 | m_env->GetStringLength( (jstring) jo_stack_trace.get() ); | |||||
| 416 | SAL_WNODEPRECATED_DECLARATIONS_PUSH | |||||
| 417 | auto_ptr< rtl_mem > ustr_mem( | |||||
| 418 | rtl_mem::allocate( | |||||
| 419 | sizeof (rtl_uString) + (len * sizeof (sal_Unicode)) ) ); | |||||
| 420 | SAL_WNODEPRECATED_DECLARATIONS_POP | |||||
| 421 | rtl_uString * ustr = (rtl_uString *)ustr_mem.get(); | |||||
| 422 | m_env->GetStringRegion( | |||||
| 423 | (jstring) jo_stack_trace.get(), 0, len, ustr->buffer ); | |||||
| 424 | if (assert_no_exception()) | |||||
| 425 | { | |||||
| 426 | ustr->refCount = 1; | |||||
| 427 | ustr->length = len; | |||||
| 428 | ustr->buffer[ len ] = '\0'; | |||||
| 429 | return OUString( | |||||
| 430 | (rtl_uString *)ustr_mem.release(), SAL_NO_ACQUIRE ); | |||||
| 431 | } | |||||
| 432 | } | |||||
| 433 | } | |||||
| 434 | } | |||||
| 435 | return OUString(); | |||||
| 436 | } | |||||
| 437 | ||||||
| 438 | } | |||||
| 439 | ||||||
| 440 | using namespace ::jni_uno; | |||||
| 441 | ||||||
| 442 | extern "C" | |||||
| 443 | { | |||||
| 444 | namespace | |||||
| 445 | { | |||||
| 446 | ||||||
| 447 | //------------------------------------------------------------------------------ | |||||
| 448 | void SAL_CALL java_env_disposing( uno_Environment * java_env ) | |||||
| 449 | SAL_THROW_EXTERN_C()throw () | |||||
| 450 | { | |||||
| 451 | ::jvmaccess::UnoVirtualMachine * machine = | |||||
| 452 | reinterpret_cast< ::jvmaccess::UnoVirtualMachine * >( | |||||
| 453 | java_env->pContext ); | |||||
| 454 | java_env->pContext = 0; | |||||
| 455 | machine->release(); | |||||
| 456 | } | |||||
| 457 | } | |||||
| 458 | ||||||
| 459 | //------------------------------------------------------------------------------ | |||||
| 460 | void SAL_CALL uno_initEnvironment( uno_Environment * java_env ) | |||||
| 461 | SAL_THROW_EXTERN_C()throw () | |||||
| 462 | { | |||||
| 463 | java_env->environmentDisposing = java_env_disposing; | |||||
| 464 | java_env->pExtEnv = 0; // no extended support | |||||
| 465 | OSL_ASSERT( 0 != java_env->pContext )do { if (true && (!(0 != java_env->pContext))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "465" ": "), "OSL_ASSERT: %s", "0 != java_env->pContext" ); } } while (false); | |||||
| 466 | ||||||
| 467 | ::jvmaccess::UnoVirtualMachine * machine = | |||||
| 468 | reinterpret_cast< ::jvmaccess::UnoVirtualMachine * >( | |||||
| 469 | java_env->pContext ); | |||||
| 470 | machine->acquire(); | |||||
| 471 | } | |||||
| 472 | ||||||
| 473 | //------------------------------------------------------------------------------ | |||||
| 474 | void SAL_CALL uno_ext_getMapping( | |||||
| 475 | uno_Mapping ** ppMapping, uno_Environment * pFrom, uno_Environment * pTo ) | |||||
| 476 | SAL_THROW_EXTERN_C()throw () | |||||
| 477 | { | |||||
| 478 | OSL_ASSERT( 0 != ppMapping && 0 != pFrom && 0 != pTo )do { if (true && (!(0 != ppMapping && 0 != pFrom && 0 != pTo))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "478" ": "), "OSL_ASSERT: %s", "0 != ppMapping && 0 != pFrom && 0 != pTo" ); } } while (false); | |||||
| ||||||
| 479 | if (0 != *ppMapping) | |||||
| ||||||
| 480 | { | |||||
| 481 | (*(*ppMapping)->release)( *ppMapping ); | |||||
| 482 | *ppMapping = 0; | |||||
| 483 | } | |||||
| 484 | ||||||
| 485 | OSL_ASSERT( JNI_FALSE == sal_False )do { if (true && (!(0 == ((sal_Bool)0)))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "485" ": "), "OSL_ASSERT: %s", "JNI_FALSE == sal_False") ; } } while (false); | |||||
| 486 | OSL_ASSERT( JNI_TRUE == sal_True )do { if (true && (!(1 == ((sal_Bool)1)))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "486" ": "), "OSL_ASSERT: %s", "JNI_TRUE == sal_True"); } } while (false); | |||||
| 487 | OSL_ASSERT( sizeof (jboolean) == sizeof (sal_Bool) )do { if (true && (!(sizeof (jboolean) == sizeof (sal_Bool )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "487" ": "), "OSL_ASSERT: %s", "sizeof (jboolean) == sizeof (sal_Bool)" ); } } while (false); | |||||
| 488 | OSL_ASSERT( sizeof (jchar) == sizeof (sal_Unicode) )do { if (true && (!(sizeof (jchar) == sizeof (sal_Unicode )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "488" ": "), "OSL_ASSERT: %s", "sizeof (jchar) == sizeof (sal_Unicode)" ); } } while (false); | |||||
| 489 | OSL_ASSERT( sizeof (jdouble) == sizeof (double) )do { if (true && (!(sizeof (jdouble) == sizeof (double )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "489" ": "), "OSL_ASSERT: %s", "sizeof (jdouble) == sizeof (double)" ); } } while (false); | |||||
| 490 | OSL_ASSERT( sizeof (jfloat) == sizeof (float) )do { if (true && (!(sizeof (jfloat) == sizeof (float) ))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "490" ": "), "OSL_ASSERT: %s", "sizeof (jfloat) == sizeof (float)" ); } } while (false); | |||||
| 491 | OSL_ASSERT( sizeof (jbyte) == sizeof (sal_Int8) )do { if (true && (!(sizeof (jbyte) == sizeof (sal_Int8 )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "491" ": "), "OSL_ASSERT: %s", "sizeof (jbyte) == sizeof (sal_Int8)" ); } } while (false); | |||||
| 492 | OSL_ASSERT( sizeof (jshort) == sizeof (sal_Int16) )do { if (true && (!(sizeof (jshort) == sizeof (sal_Int16 )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "492" ": "), "OSL_ASSERT: %s", "sizeof (jshort) == sizeof (sal_Int16)" ); } } while (false); | |||||
| 493 | OSL_ASSERT( sizeof (jint) == sizeof (sal_Int32) )do { if (true && (!(sizeof (jint) == sizeof (sal_Int32 )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "493" ": "), "OSL_ASSERT: %s", "sizeof (jint) == sizeof (sal_Int32)" ); } } while (false); | |||||
| 494 | OSL_ASSERT( sizeof (jlong) == sizeof (sal_Int64) )do { if (true && (!(sizeof (jlong) == sizeof (sal_Int64 )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "494" ": "), "OSL_ASSERT: %s", "sizeof (jlong) == sizeof (sal_Int64)" ); } } while (false); | |||||
| 495 | if ((JNI_FALSE0 == sal_False((sal_Bool)0)) && | |||||
| 496 | (JNI_TRUE1 == sal_True((sal_Bool)1)) && | |||||
| 497 | (sizeof (jboolean) == sizeof (sal_Bool)) && | |||||
| 498 | (sizeof (jchar) == sizeof (sal_Unicode)) && | |||||
| 499 | (sizeof (jdouble) == sizeof (double)) && | |||||
| 500 | (sizeof (jfloat) == sizeof (float)) && | |||||
| 501 | (sizeof (jbyte) == sizeof (sal_Int8)) && | |||||
| 502 | (sizeof (jshort) == sizeof (sal_Int16)) && | |||||
| 503 | (sizeof (jint) == sizeof (sal_Int32)) && | |||||
| 504 | (sizeof (jlong) == sizeof (sal_Int64))) | |||||
| 505 | { | |||||
| 506 | OUString const & from_env_typename = | |||||
| 507 | OUString::unacquired( &pFrom->pTypeName ); | |||||
| 508 | OUString const & to_env_typename = | |||||
| 509 | OUString::unacquired( &pTo->pTypeName ); | |||||
| 510 | ||||||
| 511 | uno_Mapping * mapping = 0; | |||||
| 512 | ||||||
| 513 | try | |||||
| 514 | { | |||||
| 515 | if ( from_env_typename == UNO_LB_JAVA"java" && to_env_typename == UNO_LB_UNO"uno" ) | |||||
| 516 | { | |||||
| 517 | Bridge * bridge = | |||||
| 518 | new Bridge( pFrom, pTo->pExtEnv, true ); // ref count = 1 | |||||
| 519 | mapping = &bridge->m_java2uno; | |||||
| 520 | uno_registerMapping( | |||||
| 521 | &mapping, Bridge_free, | |||||
| 522 | pFrom, (uno_Environment *)pTo->pExtEnv, 0 ); | |||||
| 523 | } | |||||
| 524 | else if ( from_env_typename == UNO_LB_UNO"uno" && to_env_typename == UNO_LB_JAVA"java" ) | |||||
| 525 | { | |||||
| 526 | Bridge * bridge = | |||||
| 527 | new Bridge( pTo, pFrom->pExtEnv, false ); // ref count = 1 | |||||
| 528 | mapping = &bridge->m_uno2java; | |||||
| 529 | uno_registerMapping( | |||||
| 530 | &mapping, Bridge_free, | |||||
| 531 | (uno_Environment *)pFrom->pExtEnv, pTo, 0 ); | |||||
| 532 | } | |||||
| 533 | } | |||||
| 534 | catch (const BridgeRuntimeError & err) | |||||
| 535 | { | |||||
| 536 | #if OSL_DEBUG_LEVEL1 > 0 | |||||
| 537 | OString cstr_msg( | |||||
| 538 | OUStringToOString( | |||||
| 539 | OUSTR("[jni_uno bridge error] ")::rtl::OUString( (&("[jni_uno bridge error] ")[0]), ((sal_Int32 )((sizeof ("[jni_uno bridge error] ") / sizeof (("[jni_uno bridge error] " )[0]))-1)), (((rtl_TextEncoding) 11)) ) + err.m_message, | |||||
| 540 | RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11)) ) ); | |||||
| 541 | OSL_FAIL( cstr_msg.getStr() )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "541" ": "), "%s", cstr_msg.getStr()); } } while (false); | |||||
| 542 | #else | |||||
| 543 | (void) err; // unused | |||||
| 544 | #endif | |||||
| 545 | } | |||||
| 546 | catch (const ::jvmaccess::VirtualMachine::AttachGuard::CreationException &) | |||||
| 547 | { | |||||
| 548 | OSL_FAIL(do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "550" ": "), "%s", "[jni_uno bridge error] attaching current thread " "to java failed!"); } } while (false) | |||||
| 549 | "[jni_uno bridge error] attaching current thread "do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "550" ": "), "%s", "[jni_uno bridge error] attaching current thread " "to java failed!"); } } while (false) | |||||
| 550 | "to java failed!" )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "550" ": "), "%s", "[jni_uno bridge error] attaching current thread " "to java failed!"); } } while (false); | |||||
| 551 | } | |||||
| 552 | ||||||
| 553 | *ppMapping = mapping; | |||||
| 554 | } | |||||
| 555 | } | |||||
| 556 | ||||||
| 557 | //------------------------------------------------------------------------------ | |||||
| 558 | SAL_DLLPUBLIC_EXPORT__attribute__ ((visibility("default"))) sal_Bool SAL_CALL component_canUnload( TimeValue * pTime ) | |||||
| 559 | SAL_THROW_EXTERN_C()throw () | |||||
| 560 | { | |||||
| 561 | return (*g_moduleCount.canUnload)( &g_moduleCount, pTime ); | |||||
| 562 | } | |||||
| 563 | } | |||||
| 564 | ||||||
| 565 | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |