summaryrefslogtreecommitdiff
path: root/javaunohelper/source/bootstrap.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'javaunohelper/source/bootstrap.cxx')
-rw-r--r--javaunohelper/source/bootstrap.cxx189
1 files changed, 189 insertions, 0 deletions
diff --git a/javaunohelper/source/bootstrap.cxx b/javaunohelper/source/bootstrap.cxx
new file mode 100644
index 000000000000..43c7818fa4e3
--- /dev/null
+++ b/javaunohelper/source/bootstrap.cxx
@@ -0,0 +1,189 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_javaunohelper.hxx"
+
+#include "osl/diagnose.h"
+
+#include "rtl/alloc.h"
+#include "rtl/bootstrap.hxx"
+#include "rtl/string.hxx"
+
+#include "uno/mapping.hxx"
+#include "uno/environment.hxx"
+
+#include "cppuhelper/bootstrap.hxx"
+
+#include "com/sun/star/lang/XComponent.hpp"
+#include "com/sun/star/lang/XSingleComponentFactory.hpp"
+
+#include "jni.h"
+#include "jvmaccess/virtualmachine.hxx"
+#include "jvmaccess/unovirtualmachine.hxx"
+
+#include "vm.hxx"
+
+#define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
+
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using ::rtl::OString;
+using ::rtl::OUString;
+
+namespace javaunohelper
+{
+
+inline ::rtl::OUString jstring_to_oustring( jstring jstr, JNIEnv * jni_env )
+{
+ OSL_ASSERT( sizeof (sal_Unicode) == sizeof (jchar) );
+ jsize len = jni_env->GetStringLength( jstr );
+ rtl_uString * ustr =
+ (rtl_uString *)rtl_allocateMemory( sizeof (rtl_uString) + (len * sizeof (sal_Unicode)) );
+ jni_env->GetStringRegion( jstr, 0, len, ustr->buffer );
+ OSL_ASSERT( JNI_FALSE == jni_env->ExceptionCheck() );
+ ustr->refCount = 1;
+ ustr->length = len;
+ ustr->buffer[ len ] = '\0';
+ return ::rtl::OUString( ustr, SAL_NO_ACQUIRE );
+}
+
+}
+
+//==================================================================================================
+extern "C" JNIEXPORT jobject JNICALL Java_com_sun_star_comp_helper_Bootstrap_cppuhelper_1bootstrap(
+ JNIEnv * jni_env, jclass, jstring juno_rc, jobjectArray jpairs,
+ jobject loader )
+{
+ try
+ {
+ if (0 != jpairs)
+ {
+ jsize nPos = 0, len = jni_env->GetArrayLength( jpairs );
+ while (nPos < len)
+ {
+ // name
+ jstring jstr = (jstring)jni_env->GetObjectArrayElement( jpairs, nPos );
+ if (JNI_FALSE != jni_env->ExceptionCheck())
+ {
+ jni_env->ExceptionClear();
+ throw RuntimeException(
+ OUSTR("index out of bounds?!"), Reference< XInterface >() );
+ }
+ if (0 != jstr)
+ {
+ OUString name( ::javaunohelper::jstring_to_oustring( jstr, jni_env ) );
+ // value
+ jstr = (jstring)jni_env->GetObjectArrayElement( jpairs, nPos +1 );
+ if (JNI_FALSE != jni_env->ExceptionCheck())
+ {
+ jni_env->ExceptionClear();
+ throw RuntimeException(
+ OUSTR("index out of bounds?!"), Reference< XInterface >() );
+ }
+ if (0 != jstr)
+ {
+ OUString value( ::javaunohelper::jstring_to_oustring( jstr, jni_env ) );
+
+ // set bootstrap parameter
+ ::rtl::Bootstrap::set( name, value );
+ }
+ }
+ nPos += 2;
+ }
+ }
+
+ // bootstrap uno
+ Reference< XComponentContext > xContext;
+ if (0 == juno_rc)
+ {
+ xContext = ::cppu::defaultBootstrap_InitialComponentContext();
+ }
+ else
+ {
+ OUString uno_rc( ::javaunohelper::jstring_to_oustring( juno_rc, jni_env ) );
+ xContext = ::cppu::defaultBootstrap_InitialComponentContext( uno_rc );
+ }
+
+ // create vm access
+ ::rtl::Reference< ::jvmaccess::UnoVirtualMachine > vm_access(
+ ::javaunohelper::create_vm_access( jni_env, loader ) );
+ // wrap vm singleton entry
+ xContext = ::javaunohelper::install_vm_singleton( xContext, vm_access );
+
+ // get uno envs
+ OUString cpp_env_name = OUSTR(CPPU_CURRENT_LANGUAGE_BINDING_NAME);
+ OUString java_env_name = OUSTR(UNO_LB_JAVA);
+ Environment java_env, cpp_env;
+ uno_getEnvironment((uno_Environment **)&cpp_env, cpp_env_name.pData, NULL);
+ uno_getEnvironment( (uno_Environment **)&java_env, java_env_name.pData, vm_access.get() );
+
+ // map to java
+ Mapping mapping( cpp_env.get(), java_env.get() );
+ if (! mapping.is())
+ {
+ Reference< lang::XComponent > xComp( xContext, UNO_QUERY );
+ if (xComp.is())
+ xComp->dispose();
+ throw RuntimeException(
+ OUSTR("cannot get mapping C++ <-> Java!"),
+ Reference< XInterface >() );
+ }
+
+ jobject jret = (jobject)mapping.mapInterface( xContext.get(), ::getCppuType( &xContext ) );
+ jobject jlocal = jni_env->NewLocalRef( jret );
+ jni_env->DeleteGlobalRef( jret );
+
+ return jlocal;
+ }
+ catch (RuntimeException & exc)
+ {
+ jclass c = jni_env->FindClass( "com/sun/star/uno/RuntimeException" );
+ if (0 != c)
+ {
+ OString cstr( ::rtl::OUStringToOString(
+ exc.Message, RTL_TEXTENCODING_JAVA_UTF8 ) );
+ OSL_TRACE( __FILE__": forwarding RuntimeException: %s", cstr.getStr() );
+ jni_env->ThrowNew( c, cstr.getStr() );
+ }
+ }
+ catch (Exception & exc)
+ {
+ jclass c = jni_env->FindClass( "com/sun/star/uno/Exception" );
+ if (0 != c)
+ {
+ OString cstr( ::rtl::OUStringToOString(
+ exc.Message, RTL_TEXTENCODING_JAVA_UTF8 ) );
+ OSL_TRACE( __FILE__": forwarding Exception: %s", cstr.getStr() );
+ jni_env->ThrowNew( c, cstr.getStr() );
+ }
+ }
+
+ return 0;
+}
+