| File: | bridges/source/jni_uno/jni_bridge.cxx |
| Location: | line 506, column 9 |
| Description: | Dereference of null pointer |
| 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: */ |