bump product version to 5.0.4.1
[LibreOffice.git] / bridges / source / jni_uno / jni_base.h
blobaf93d6a35cacf7a914b84adf84e07598ad976275
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_BRIDGES_SOURCE_JNI_UNO_JNI_BASE_H
21 #define INCLUDED_BRIDGES_SOURCE_JNI_UNO_JNI_BASE_H
23 #include <sal/config.h>
25 #include <cassert>
27 #include "jvmaccess/unovirtualmachine.hxx"
28 #include "jvmaccess/virtualmachine.hxx"
30 #include "osl/diagnose.h"
32 #include "rtl/alloc.h"
33 #include "rtl/ustring.hxx"
34 #include "sal/log.hxx"
36 #include "uno/environment.h"
37 #include "typelib/typedescription.h"
40 namespace jni_uno
43 class JNI_info;
45 struct BridgeRuntimeError
47 OUString m_message;
49 inline BridgeRuntimeError( OUString const & message )
50 : m_message( message )
55 class JNI_context
57 JNI_info const * m_jni_info;
58 JNIEnv * m_env;
59 jobject m_class_loader;
61 JNI_context( JNI_context & ) SAL_DELETED_FUNCTION;
62 void operator = ( JNI_context ) SAL_DELETED_FUNCTION;
64 void java_exc_occurred() const;
65 public:
66 inline explicit JNI_context(
67 JNI_info const * jni_info, JNIEnv * env, jobject class_loader )
68 : m_jni_info( jni_info ),
69 m_env( env ),
70 m_class_loader( class_loader )
73 inline JNI_info const * get_info() const
74 { return m_jni_info; }
76 inline JNIEnv * operator -> () const
77 { return m_env; }
78 inline JNIEnv * get_jni_env() const
79 { return m_env; }
81 // does not handle exceptions, *classClass will be null if exception
82 // occurred:
83 void getClassForName(jclass * classClass, jmethodID * methodForName) const;
85 // if inException, does not handle exceptions, in which case returned value
86 // will be null if exception occurred:
87 jclass findClass(
88 char const * name, jclass classClass, jmethodID methodForName,
89 bool inException) const;
91 inline void ensure_no_exception() const; // throws BridgeRuntimeError
92 inline bool assert_no_exception() const; // asserts and clears exception
94 OUString get_stack_trace( jobject jo_exc = 0 ) const;
97 inline void JNI_context::ensure_no_exception() const
99 if (m_env->ExceptionCheck())
101 java_exc_occurred();
105 inline bool JNI_context::assert_no_exception() const
107 if (m_env->ExceptionCheck())
109 SAL_WARN("bridges", "unexpected java exception occurred");
110 #if OSL_DEBUG_LEVEL > 0
111 m_env->ExceptionDescribe();
112 #endif
113 m_env->ExceptionClear();
114 return false;
116 return true;
120 class JNI_guarded_context
121 : private ::jvmaccess::VirtualMachine::AttachGuard,
122 public JNI_context
124 JNI_guarded_context( JNI_guarded_context & ) SAL_DELETED_FUNCTION;
125 void operator = ( JNI_guarded_context ) SAL_DELETED_FUNCTION;
127 public:
128 inline explicit JNI_guarded_context(
129 JNI_info const * jni_info,
130 rtl::Reference<jvmaccess::UnoVirtualMachine> const & vm_access)
131 : AttachGuard( vm_access->getVirtualMachine() ),
132 JNI_context(
133 jni_info, AttachGuard::getEnvironment(),
134 static_cast< jobject >(vm_access->getClassLoader()) )
139 class JLocalAutoRef
141 JNI_context const & m_jni;
142 jobject m_jo;
144 public:
145 inline JLocalAutoRef( JNI_context const & jni )
146 : m_jni( jni ),
147 m_jo( 0 )
149 inline explicit JLocalAutoRef( JNI_context const & jni, jobject jo )
150 : m_jni( jni ),
151 m_jo( jo )
153 inline JLocalAutoRef( JLocalAutoRef & auto_ref );
154 inline ~JLocalAutoRef();
156 inline jobject get() const
157 { return m_jo; }
158 inline bool is() const
159 { return (0 != m_jo); }
160 inline jobject release();
161 inline void reset();
162 inline void reset( jobject jo );
163 inline JLocalAutoRef & operator = ( JLocalAutoRef & auto_ref );
166 inline JLocalAutoRef::~JLocalAutoRef()
168 if (0 != m_jo)
169 m_jni->DeleteLocalRef( m_jo );
172 inline JLocalAutoRef::JLocalAutoRef( JLocalAutoRef & auto_ref )
173 : m_jni( auto_ref.m_jni ),
174 m_jo( auto_ref.m_jo )
176 auto_ref.m_jo = 0;
179 inline jobject JLocalAutoRef::release()
181 jobject jo = m_jo;
182 m_jo = 0;
183 return jo;
186 inline void JLocalAutoRef::reset()
188 if (0 != m_jo)
189 m_jni->DeleteLocalRef( m_jo );
190 m_jo = 0;
193 inline void JLocalAutoRef::reset( jobject jo )
195 if (jo != m_jo)
197 if (0 != m_jo)
198 m_jni->DeleteLocalRef( m_jo );
199 m_jo = jo;
203 inline JLocalAutoRef & JLocalAutoRef::operator = ( JLocalAutoRef & auto_ref )
205 assert( m_jni.get_jni_env() == auto_ref.m_jni.get_jni_env() );
206 reset( auto_ref.m_jo );
207 auto_ref.m_jo = 0;
208 return *this;
213 struct rtl_mem
215 inline static void * operator new ( size_t nSize )
216 { return rtl_allocateMemory( nSize ); }
217 inline static void operator delete ( void * mem )
218 { if (mem) rtl_freeMemory( mem ); }
219 inline static void * operator new ( size_t, void * mem )
220 { return mem; }
221 inline static void operator delete ( void *, void * )
224 static inline rtl_mem * allocate( ::std::size_t bytes );
227 inline rtl_mem * rtl_mem::allocate( ::std::size_t bytes )
229 void * p = rtl_allocateMemory( bytes );
230 if (0 == p)
231 throw BridgeRuntimeError( "out of memory!" );
232 return static_cast<rtl_mem *>(p);
236 class TypeDescr
238 typelib_TypeDescription * m_td;
240 TypeDescr( TypeDescr & ) SAL_DELETED_FUNCTION;
241 void operator = ( TypeDescr ) SAL_DELETED_FUNCTION;
243 public:
244 inline explicit TypeDescr( typelib_TypeDescriptionReference * td_ref );
245 inline ~TypeDescr()
246 { TYPELIB_DANGER_RELEASE( m_td ); }
248 inline typelib_TypeDescription * get() const
249 { return m_td; }
252 inline TypeDescr::TypeDescr( typelib_TypeDescriptionReference * td_ref )
253 : m_td( 0 )
255 TYPELIB_DANGER_GET( &m_td, td_ref );
256 if (0 == m_td)
258 throw BridgeRuntimeError(
259 "cannot get comprehensive type description for " +
260 OUString::unacquired( &td_ref->pTypeName ) );
266 #endif
268 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */