diff options
author | Kay Ramme <kr@openoffice.org> | 2000-09-28 16:33:44 +0000 |
---|---|---|
committer | Kay Ramme <kr@openoffice.org> | 2000-09-28 16:33:44 +0000 |
commit | d0e964592ee1c527c70722d1e6662b806bf6466f (patch) | |
tree | de682a710b29662e1ce8ad9d57b8c8b5581de579 /stoc/source/javaloader | |
parent | 67535bf49c9003a55f9763655d4efaf089ad9742 (diff) |
unicode changes; now uses the java_uno bridge;
Diffstat (limited to 'stoc/source/javaloader')
-rw-r--r-- | stoc/source/javaloader/javaloader.cxx | 505 |
1 files changed, 104 insertions, 401 deletions
diff --git a/stoc/source/javaloader/javaloader.cxx b/stoc/source/javaloader/javaloader.cxx index 139e7a4d57df..64d138e67601 100644 --- a/stoc/source/javaloader/javaloader.cxx +++ b/stoc/source/javaloader/javaloader.cxx @@ -2,9 +2,9 @@ * * $RCSfile: javaloader.cxx,v $ * - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: hr $ $Date: 2000-09-18 15:29:34 $ + * last change: $Author: kr $ $Date: 2000-09-28 17:33:44 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -59,49 +59,31 @@ * ************************************************************************/ -#include <string.h> #include <osl/diagnose.h> -#include <osl/interlck.h> #include <rtl/ustring> #include <rtl/process.h> -#include <uno/dispatcher.h> #include <uno/environment.h> -#include <uno/mapping.h> #include <uno/mapping.hxx> #include <cppuhelper/servicefactory.hxx> -#include <com/sun/star/uno/Reference.hxx> - #ifdef LINUX #undef minor #undef major #endif -#include <com/sun/star/corba/giop/MessageHeader_1_1.hpp> - -#include <com/sun/star/bridge/XBridgeFactory.hpp> -#include <com/sun/star/bridge/XBridge.hpp> -#include <com/sun/star/bridge/XInstanceProvider.hpp> - -#include <com/sun/star/connection/XConnection.hpp> #include <com/sun/star/java/XJavaVM.hpp> #include <com/sun/star/java/XJavaThreadRegister_11.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> -#include <bridges/remote/context.h> -#include <bridges/remote/connection.h> -#include <bridges/remote/remote.h> - #include "jni.h" #include <cppuhelper/factory.hxx> -#include <cppuhelper/implbase1.hxx> #include <cppuhelper/implbase2.hxx> #include <com/sun/star/loader/XImplementationLoader.hpp> @@ -111,251 +93,51 @@ #include <com/sun/star/lang/XInitialization.hpp> #include <com/sun/star/registry/XRegistryKey.hpp> -#include "jthreadpool.hxx" -using namespace ::com::sun::star::bridge; -using namespace ::com::sun::star::connection; using namespace ::com::sun::star::java; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::loader; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::registry; -using namespace ::com::sun::star::io; using namespace ::cppu; using namespace ::rtl; namespace loader { - class JVMThreadAttach { - JavaVM * _pJavaVM; - Reference<XJavaThreadRegister_11> _xJavaThreadRegister_11; - - public: - JNIEnv * _pJNIEnv; - - JVMThreadAttach(JavaVM * pJavaVM, XJavaThreadRegister_11 * pXJavaThreadRegister_11) throw (RuntimeException); - ~JVMThreadAttach() throw (RuntimeException); - }; - - JVMThreadAttach::JVMThreadAttach(JavaVM * pJavaVM, XJavaThreadRegister_11 * pXJavaThreadRegister_11) throw (RuntimeException) - : _pJNIEnv(NULL), - _pJavaVM(pJavaVM), - _xJavaThreadRegister_11(pXJavaThreadRegister_11) - { - pXJavaThreadRegister_11->registerThread(); - pJavaVM->AttachCurrentThread(&_pJNIEnv, NULL); - } - - JVMThreadAttach::~JVMThreadAttach() throw (RuntimeException) - { - _xJavaThreadRegister_11->revokeThread(); - if(!_xJavaThreadRegister_11->isThreadAttached()) - _pJavaVM->DetachCurrentThread(); - } - - - - struct ConnectionWrapper : public remote_Connection { - sal_Int32 _refCount; - - JavaVM * _pJavaVM; - XJavaThreadRegister_11 * _pXJavaThreadRegister_11; - - jclass _jcByteArray; - jmethodID _jmConnection_read; - jmethodID _jmConnection_write; - jmethodID _jmConnection_flush; - jmethodID _jmConnection_close; - jobject _joConnection; - - ConnectionWrapper(JavaVM * pJavaVM, XJavaThreadRegister_11 * pXJavaThreadRegister_11, jobject joConnection) throw(RuntimeException); - ~ConnectionWrapper() throw(RuntimeException); - - }; - - void SAL_CALL ConnectionWrapper_acquire(remote_Connection * blb) { - ++ ((ConnectionWrapper *)blb)->_refCount; - } - - void SAL_CALL ConnectionWrapper_release (remote_Connection * blb) { - if(!-- ((ConnectionWrapper *)blb)->_refCount) - delete (ConnectionWrapper *)blb; - } - - sal_Int32 SAL_CALL ConnectionWrapper_read(remote_Connection * blb, sal_Int8 *pDest, sal_Int32 nSize) { - ConnectionWrapper * pC = (ConnectionWrapper *)blb; - jint jiRes = -1; - - try { - JVMThreadAttach jvm(pC->_pJavaVM, pC->_pXJavaThreadRegister_11); - - try { - jobjectArray joDest = jvm._pJNIEnv->NewObjectArray(1, pC->_jcByteArray, 0); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 1"), Reference<XInterface>()); - jvm._pJNIEnv->SetObjectArrayElement(joDest, 0, jvm._pJNIEnv->NewByteArray(10)); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 2"), Reference<XInterface>()); - - jiRes = jvm._pJNIEnv->CallIntMethod(pC->_joConnection, pC->_jmConnection_read, joDest, (jint)nSize); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 3"), Reference<XInterface>()); - - jbyteArray jaDest = reinterpret_cast<jbyteArray>(jvm._pJNIEnv->GetObjectArrayElement(joDest, 0)); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 4"), Reference<XInterface>()); - - jbyte * pBytes = jvm._pJNIEnv->GetByteArrayElements(jaDest, NULL); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 5"), Reference<XInterface>()); - memcpy(pDest, pBytes, jiRes * sizeof(sal_Int8)); - jvm._pJNIEnv->ReleaseByteArrayElements(jaDest, pBytes, 0); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 6"), Reference<XInterface>()); - } - catch(RuntimeException & runtimeException) { - if(jvm._pJNIEnv->ExceptionOccurred()) { - jvm._pJNIEnv->ExceptionDescribe(); - jvm._pJNIEnv->ExceptionClear(); - } - - throw runtimeException; - } - } - catch(RuntimeException &) { - osl_trace("ConnectionWrapper_read - runtimeException occurred\n"); - jiRes = -1; - } - - return (sal_Int32)jiRes; - } - - sal_Int32 SAL_CALL ConnectionWrapper_write(remote_Connection * blb, const sal_Int8 *pSource, sal_Int32 nSize) { - ConnectionWrapper * pC = (ConnectionWrapper *)blb; - - try { - JVMThreadAttach jvm(pC->_pJavaVM, pC->_pXJavaThreadRegister_11); - - try { - jbyteArray jaSource = jvm._pJNIEnv->NewByteArray(nSize); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 7"), Reference<XInterface>()); - jbyte * pBytes = jvm._pJNIEnv->GetByteArrayElements(jaSource, NULL); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 8"), Reference<XInterface>()); - memcpy(pBytes, pSource, nSize * sizeof(jbyte)); - jvm._pJNIEnv->ReleaseByteArrayElements(jaSource, pBytes, 0); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 9"), Reference<XInterface>()); - - jvm._pJNIEnv->CallVoidMethod(pC->_joConnection, pC->_jmConnection_write, jaSource, (jint)nSize); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 10"), Reference<XInterface>()); - } - catch(RuntimeException & runtimeException) { - if(jvm._pJNIEnv->ExceptionOccurred()) { - jvm._pJNIEnv->ExceptionDescribe(); - jvm._pJNIEnv->ExceptionClear(); - } - - throw runtimeException; - } - } - catch(RuntimeException &) { - osl_trace("ConnectionWrapper_read - runtimeException occurred\n"); - nSize = -1; - } - - return nSize; - } - - void SAL_CALL ConnectionWrapper_flush(remote_Connection * blb) { - ConnectionWrapper * pC = (ConnectionWrapper *)blb; - - JVMThreadAttach jvm(pC->_pJavaVM, pC->_pXJavaThreadRegister_11); - jvm._pJNIEnv->CallVoidMethod(pC->_joConnection, pC->_jmConnection_flush); - if(jvm._pJNIEnv->ExceptionOccurred()) { - jvm._pJNIEnv->ExceptionDescribe(); - jvm._pJNIEnv->ExceptionClear(); - } - } - - void SAL_CALL ConnectionWrapper_close(remote_Connection * blb) { - ConnectionWrapper * pC = (ConnectionWrapper *)blb; - - JVMThreadAttach jvm(pC->_pJavaVM, pC->_pXJavaThreadRegister_11); - jvm._pJNIEnv->CallVoidMethod(pC->_joConnection, pC->_jmConnection_close); - if(jvm._pJNIEnv->ExceptionOccurred()) { - jvm._pJNIEnv->ExceptionDescribe(); - jvm._pJNIEnv->ExceptionClear(); - } - } - - ConnectionWrapper::ConnectionWrapper(JavaVM * pJavaVM, XJavaThreadRegister_11 * pXJavaThreadRegister_11, jobject joConnection) throw(RuntimeException) - : _refCount(0), - _pJavaVM(pJavaVM), - _pXJavaThreadRegister_11(pXJavaThreadRegister_11) - { - if(!pJavaVM || !pXJavaThreadRegister_11 || !joConnection) - throw RuntimeException(OUString::createFromAscii("hier 11"), Reference<XInterface>()); - - acquire = ConnectionWrapper_acquire; - release = ConnectionWrapper_release; - read = ConnectionWrapper_read; - write = ConnectionWrapper_write; - flush = ConnectionWrapper_flush; - close = ConnectionWrapper_close; - - JVMThreadAttach jvm(pJavaVM, pXJavaThreadRegister_11); - - _jcByteArray = jvm._pJNIEnv->FindClass("[B"); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 12"), Reference<XInterface>()); - _jcByteArray = reinterpret_cast<jclass>(jvm._pJNIEnv->NewGlobalRef(reinterpret_cast<jobject>(_jcByteArray))); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 13"), Reference<XInterface>()); - - jclass jcConnection = jvm._pJNIEnv->FindClass("com/sun/star/connection/XConnection"); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 14"), Reference<XInterface>()); - - _jmConnection_read = jvm._pJNIEnv->GetMethodID(jcConnection, "read", "([[BI)I"); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 15"), Reference<XInterface>()); -// _jmConnection_read = reinterpret_cast<jmethodID>(jvm._pJNIEnv->NewGlobalRef(reinterpret_cast<jobject>(_jmConnection_read))); - _jmConnection_write = jvm._pJNIEnv->GetMethodID(jcConnection, "write", "([B)V"); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 16"), Reference<XInterface>()); -// _jmConnection_write = reinterpret_cast<jmethodID>(jvm._pJNIEnv->NewGlobalRef(reinterpret_cast<jobject>(_jmConnection_write))); - _jmConnection_flush = jvm._pJNIEnv->GetMethodID(jcConnection, "flush", "()V"); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 17"), Reference<XInterface>()); -// _jmConnection_flush = reinterpret_cast<jmethodID>(jvm._pJNIEnv->NewGlobalRef(reinterpret_cast<jobject>(_jmConnection_flush))); - _jmConnection_close = jvm._pJNIEnv->GetMethodID(jcConnection, "close", "()V"); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 18"), Reference<XInterface>()); -// _jmConnection_close = reinterpret_cast<jmethodID>(jvm._pJNIEnv->NewGlobalRef(reinterpret_cast<jobject>(_jmConnection_close))); - - _joConnection = jvm._pJNIEnv->NewGlobalRef(joConnection); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 19"), Reference<XInterface>()); - } - - ConnectionWrapper::~ConnectionWrapper() throw(RuntimeException) { - JVMThreadAttach jvm(_pJavaVM, _pXJavaThreadRegister_11); - - jvm._pJNIEnv->DeleteGlobalRef(_joConnection); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 20"), Reference<XInterface>()); - - jvm._pJNIEnv->DeleteGlobalRef(reinterpret_cast<jobject>(_jmConnection_read)); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 21"), Reference<XInterface>()); - jvm._pJNIEnv->DeleteGlobalRef(reinterpret_cast<jobject>(_jmConnection_write)); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 22"), Reference<XInterface>()); - jvm._pJNIEnv->DeleteGlobalRef(reinterpret_cast<jobject>(_jmConnection_flush)); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 23"), Reference<XInterface>()); - jvm._pJNIEnv->DeleteGlobalRef(reinterpret_cast<jobject>(_jmConnection_close)); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 24"), Reference<XInterface>()); - - jvm._pJNIEnv->DeleteGlobalRef(_jcByteArray); if(jvm._pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 25"), Reference<XInterface>()); - } - - - - class JavaComponentLoader : public WeakImplHelper2<XImplementationLoader, XServiceInfo> { Reference<XMultiServiceFactory> _xSMgr; Reference<XImplementationLoader> _javaLoader; - uno_Environment * _pRemote_Environment; protected: JavaComponentLoader(const Reference<XMultiServiceFactory> & rXSMgr) throw(RuntimeException); - ~JavaComponentLoader(); + virtual ~JavaComponentLoader() throw(); public: static const OUString implname; static const OUString servname; - static Reference<XInterface> CreateInstance(const Reference<XMultiServiceFactory> & rSMgr) throw(Exception); - static Sequence<OUString> SAL_CALL getSupportedServiceNames_Static(); + + static Reference<XInterface> SAL_CALL CreateInstance(const Reference<XMultiServiceFactory> & rSMgr) throw(Exception); + static Sequence<OUString> SAL_CALL getSupportedServiceNames_Static() throw(); // XServiceInfo - virtual OUString SAL_CALL getImplementationName() throw(::com::sun::star::uno::RuntimeException); - virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) throw(::com::sun::star::uno::RuntimeException); - virtual Sequence<OUString> SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException); + virtual OUString SAL_CALL getImplementationName() throw(RuntimeException); + virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) throw(RuntimeException); + virtual Sequence<OUString> SAL_CALL getSupportedServiceNames() throw(RuntimeException); // XImplementationLoader virtual Reference<XInterface> SAL_CALL activate(const OUString& implementationName, const OUString& implementationLoaderUrl, const OUString& locationUrl, const Reference<XRegistryKey>& xKey) throw(CannotActivateFactoryException, RuntimeException); virtual sal_Bool SAL_CALL writeRegistryInfo(const Reference<XRegistryKey>& xKey, const OUString& implementationLoaderUrl, const OUString& locationUrl) throw(CannotRegisterImplementationException, RuntimeException); }; - const OUString JavaComponentLoader::implname = L"com.sun.star.comp.stoc.JavaComponentLoader"; - const OUString JavaComponentLoader::servname = L"com.sun.star.loader.Java2"; + const OUString JavaComponentLoader::implname = OUString::createFromAscii("com.sun.star.comp.stoc.JavaComponentLoader"); + const OUString JavaComponentLoader::servname = OUString::createFromAscii("com.sun.star.loader.Java2"); - Sequence<OUString> SAL_CALL JavaComponentLoader::getSupportedServiceNames_Static() { + Sequence<OUString> SAL_CALL JavaComponentLoader::getSupportedServiceNames_Static() throw() { return Sequence<OUString>(&servname, 1); } - Reference<XInterface> SAL_CALL JavaComponentLoader::CreateInstance(const Reference<XMultiServiceFactory> & rSMgr) throw(Exception) - { + Reference<XInterface> SAL_CALL JavaComponentLoader::CreateInstance(const Reference<XMultiServiceFactory> & rSMgr) throw(Exception) { Reference<XInterface> xRet; try { @@ -364,212 +146,137 @@ namespace loader { xRet = Reference<XInterface>::query(pXLoader); } catch(RuntimeException & runtimeException) { - osl_trace("Could not init javaloader\n"); OString message = OUStringToOString(runtimeException.Message, RTL_TEXTENCODING_ASCII_US); - fprintf(stderr, "exception: %s\n", (const char *)message); + osl_trace("javaloader - could not init javaloader cause of %s", message.getStr()); } return xRet; } JavaComponentLoader::JavaComponentLoader(const Reference<XMultiServiceFactory> & rSMgr) throw(RuntimeException) - : _pRemote_Environment(NULL) + : _xSMgr(rSMgr) { - Reference<XJavaVM> xJavaVM(rSMgr->createInstance(OUString::createFromAscii("com.sun.star.java.JavaVirtualMachine")), UNO_QUERY); - - Reference<XJavaThreadRegister_11> xJavaThreadRegister_11(xJavaVM, UNO_QUERY); - - JavaVM * pJavaVM; - - - Sequence<sal_Int8> processID(16); - rtl_getGlobalProcessId(reinterpret_cast<sal_uInt8 *>(processID.getArray())); + sal_Int32 size = 0; + uno_Environment ** ppJava_environments = NULL; + uno_Environment * pUno_environment = NULL; + typelib_InterfaceTypeDescription * pType_XImplementationLoader = 0; + JNIEnv * pJNIEnv = NULL; - pJavaVM = *(JavaVM **)(xJavaVM->getJavaVM(processID).getValue()); -// pJavaVM = *reinterpret_cast<JavaVM **>(xJavaVM->getJavaVM(processID).getValue()); - - if(!pJavaVM) - throw RuntimeException(OUString::createFromAscii("hier -1"), Reference<XInterface>()); - - JNIEnv * pJNIEnv; - - pJavaVM->AttachCurrentThread(&pJNIEnv, (void *)NULL); - xJavaThreadRegister_11->registerThread(); - - if( ! javaloader_initNativeThreadPool( pJNIEnv, xJavaThreadRegister_11 ) ) - { - throw RuntimeException( - OUString::createFromAscii( "native threadpool couldn't be initialzed" ), - Reference< XInterface > () ); - } - - remote_Connection * pRemote_Connection = NULL; + Reference<XJavaThreadRegister_11> xJavaThreadRegister_11; + Reference<XInterface> javaVM; + JavaVM * pJavaVM = NULL; try { - jclass jcServiceManager = pJNIEnv->FindClass("com/sun/star/comp/servicemanager/ServiceManager"); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 26"), Reference<XInterface>()); - jmethodID jmServiceManager_init = pJNIEnv->GetMethodID(jcServiceManager, "<init>", "()V"); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 27"), Reference<XInterface>()); - jobject joServiceManager = pJNIEnv->NewObject(jcServiceManager, jmServiceManager_init); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 28"), Reference<XInterface>()); - - // we need to register the need services - static const char * neededServices[] = { - "com.sun.star.comp.servicemanager.ServiceManager", - "com.sun.star.comp.loader.JavaLoader", - "com.sun.star.lib.uno.bridges.java_remote.java_remote_bridge", - "com.sun.star.comp.connections.PipedConnection", - "com.sun.star.comp.connections.ConstantInstanceProvider" - }; - - - jclass jcString = pJNIEnv->FindClass("java/lang/String"); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 29"), Reference<XInterface>()); - jobjectArray jaNeededServices = pJNIEnv->NewObjectArray(sizeof(neededServices) / sizeof(char *), jcString, NULL); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 30"), Reference<XInterface>()); - for(int i = 0; i < sizeof(neededServices) / sizeof(char *); ++ i) { - pJNIEnv->SetObjectArrayElement(jaNeededServices, i, pJNIEnv->NewStringUTF(neededServices[i])); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 31"), Reference<XInterface>()); - } - - jmethodID jmServiceManager_addFactories = pJNIEnv->GetMethodID(jcServiceManager, - "addFactories", - "([Ljava/lang/String;)V"); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 32"), Reference<XInterface>()); - - pJNIEnv->CallVoidMethod(joServiceManager, jmServiceManager_addFactories, jaNeededServices); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 33"), Reference<XInterface>()); - - // - jmethodID jmServiceManager_createInstanceWithArguments = pJNIEnv->GetMethodID(jcServiceManager, - "createInstanceWithArguments", - "(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object;"); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 34"), Reference<XInterface>()); - - // create an instance of our special inprocess connection - jmethodID jmServiceManager_createInstance = pJNIEnv->GetMethodID(jcServiceManager, - "createInstance", - "(Ljava/lang/String;)Ljava/lang/Object;"); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 35"), Reference<XInterface>()); - - jstring jsConnectionName = pJNIEnv->NewStringUTF("com.sun.star.connection.PipedConnection"); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 36"), Reference<XInterface>()); - jobject joConnection_nativeSide = pJNIEnv->CallObjectMethod(joServiceManager, - jmServiceManager_createInstance, - jsConnectionName); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 37"), Reference<XInterface>()); - - jclass jcObject = pJNIEnv->FindClass("java/lang/Object"); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 38"), Reference<XInterface>()); - jobjectArray jaArgs = pJNIEnv->NewObjectArray(1, jcObject, joConnection_nativeSide); - jobject joConnection_javaSide = pJNIEnv->CallObjectMethod(joServiceManager, - jmServiceManager_createInstanceWithArguments, - jsConnectionName, jaArgs); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 39"), Reference<XInterface>()); - - // create an constant service provider with java servicemanager - jstring jsInstanceProvider = pJNIEnv->NewStringUTF("com.sun.star.comp.connection.InstanceProvider"); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 40"), Reference<XInterface>()); - jobject joInstanceProvider = pJNIEnv->CallObjectMethod(joServiceManager, - jmServiceManager_createInstance, - jsInstanceProvider); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 41"), Reference<XInterface>()); - - // create the bridge factory && the bridge - jaArgs = pJNIEnv->NewObjectArray(3, jcObject, NULL); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 42"), Reference<XInterface>()); - - pJNIEnv->SetObjectArrayElement(jaArgs, 0, pJNIEnv->NewStringUTF("iiop")); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 43"), Reference<XInterface>()); - pJNIEnv->SetObjectArrayElement(jaArgs, 1, joConnection_javaSide); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 44"), Reference<XInterface>()); - pJNIEnv->SetObjectArrayElement(jaArgs, 2, joInstanceProvider); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 45"), Reference<XInterface>()); - - jstring jsBridgeComponent = pJNIEnv->NewStringUTF("com.sun.star.bridge.Bridge"); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 46"), Reference<XInterface>()); - jobject joBridge = pJNIEnv->CallObjectMethod(joServiceManager, - jmServiceManager_createInstanceWithArguments, - jsBridgeComponent, - jaArgs); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 47"), Reference<XInterface>()); - - pRemote_Connection = new ConnectionWrapper(pJavaVM, xJavaThreadRegister_11.get(), joConnection_nativeSide); - } - catch(RuntimeException & runtimeException) { - if(pJNIEnv->ExceptionOccurred()) { - pJNIEnv->ExceptionDescribe(); - pJNIEnv->ExceptionClear(); - } + // get a java vm, where we can create a loader + javaVM = rSMgr->createInstance(OUString::createFromAscii("com.sun.star.java.JavaVirtualMachine")); + if(!javaVM.is()) throw RuntimeException(OUString::createFromAscii("javaloader error - 10"), Reference<XInterface>()); + Reference<XJavaVM> javaVM_xJavaVM(javaVM, UNO_QUERY); + if(!javaVM_xJavaVM.is()) throw RuntimeException(OUString::createFromAscii("javaloader error - 11"), Reference<XInterface>()); - throw runtimeException; - } - - xJavaThreadRegister_11->revokeThread(); - if(!xJavaThreadRegister_11->isThreadAttached()) - pJavaVM->DetachCurrentThread(); + Sequence<sal_Int8> processID(16); + rtl_getGlobalProcessId(reinterpret_cast<sal_uInt8 *>(processID.getArray())); + pJavaVM = *(JavaVM **)(javaVM_xJavaVM->getJavaVM(processID).getValue()); +// pJavaVM = *reinterpret_cast<JavaVM **>(javaVM_xJavaVM->getJavaVM(processID).getValue()); + if(!pJavaVM) throw RuntimeException(OUString::createFromAscii("javaloader error - 12"), Reference<XInterface>()); - // - // everything is prepared to map an initial object from remote (java) to here - // - OString idStr("the id string"); - OString dcpStr("the description string"); - remote_Context * pRemote_Context = remote_createContext(pRemote_Connection, idStr.pData, dcpStr.pData, NULL); if(!pRemote_Connection) throw RuntimeException(OUString::createFromAscii("hier 48"), Reference<XInterface>()); + xJavaThreadRegister_11 = Reference<XJavaThreadRegister_11>(javaVM, UNO_QUERY); + if(xJavaThreadRegister_11.is()) + xJavaThreadRegister_11->registerThread(); - uno_getEnvironment(&_pRemote_Environment, "remote", pRemote_Context); if(!_pRemote_Environment) throw RuntimeException(OUString::createFromAscii("hier 49"), Reference<XInterface>()); + pJavaVM->AttachCurrentThread((void **)&pJNIEnv, (void *)NULL); - uno_Environment * pUNO_Environment = NULL; - uno_getEnvironment(&pUNO_Environment, "uno", NULL); if(!pUNO_Environment) throw RuntimeException(OUString::createFromAscii("hier 50"), Reference<XInterface>()); - Mapping mapping(_pRemote_Environment, pUNO_Environment, OString()); + // instantiate the java JavaLoader + jclass jcJavaLoader = pJNIEnv->FindClass("com/sun/star/comp/loader/JavaLoader"); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("error - 26"), Reference<XInterface>()); + jmethodID jmJavaLoader_init = pJNIEnv->GetMethodID(jcJavaLoader, "<init>", "()V"); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("error - 27"), Reference<XInterface>()); + jobject joJavaLoader = pJNIEnv->NewObject(jcJavaLoader, jmJavaLoader_init); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("error - 28"), Reference<XInterface>()); + // map the java JavaLoader to this environment + OUString sJava(RTL_CONSTASCII_USTRINGPARAM("java")); - OString remoteO("SERVICEMANAGER"); + uno_getRegisteredEnvironments(&ppJava_environments, &size, (uno_memAlloc)malloc, sJava.pData); + if(!size) throw RuntimeException(OUString::createFromAscii("javaloader error - 1"), Reference<XInterface>()); - typelib_InterfaceTypeDescription *pType = 0; - getCppuType((Reference <XInterface> *) 0).getDescription((typelib_TypeDescription **) & pType) ; if(!pType) throw RuntimeException(OUString::createFromAscii("hier 51"), Reference<XInterface>()); + // why is there no convinient contructor? + OUString sCppu_current_lb_name(RTL_CONSTASCII_USTRINGPARAM(CPPU_CURRENT_LANGUAGE_BINDING_NAME)); + uno_getEnvironment(&pUno_environment, sCppu_current_lb_name.pData, NULL); + if(!pUno_environment) throw RuntimeException(OUString::createFromAscii("javaloader error - 2"), Reference<XInterface>()); - remote_Interface *pRemoteI = 0; + Mapping java_curr(ppJava_environments[0], pUno_environment); + if(!java_curr.is()) throw RuntimeException(OUString::createFromAscii("javaloader error - 3"), Reference<XInterface>()); - getCppuType( (::com::sun::star::corba::giop::MessageHeader_1_1*)0 ); + // release all java environments + for(sal_Int32 i = 0; i < size; ++ i) + ppJava_environments[i]->release(ppJava_environments[i]); + size = 0; + free(ppJava_environments); + // release uno environment + pUno_environment->release(pUno_environment); + pUno_environment = NULL; - pRemote_Context->getRemoteInstance(_pRemote_Environment, - &pRemoteI, - remoteO.pData, - pType); if(!pRemoteI) throw RuntimeException(OUString::createFromAscii("hier 52"), Reference<XInterface>()); + getCppuType((Reference<XImplementationLoader> *) 0).getDescription((typelib_TypeDescription **) & pType_XImplementationLoader); + if(!pType_XImplementationLoader) throw RuntimeException(OUString::createFromAscii("javaloader error - 4"), Reference<XInterface>()); - // got an interface ! - uno_Environment *pEnvCpp =0; - uno_getEnvironment(&pEnvCpp , CPPU_CURRENT_LANGUAGE_BINDING_NAME , 0); if(!pEnvCpp) throw RuntimeException(OUString::createFromAscii("hier 53"), Reference<XInterface>()); + _javaLoader = Reference<XImplementationLoader>(reinterpret_cast<XImplementationLoader *>(java_curr.mapInterface(joJavaLoader, pType_XImplementationLoader))); + if(!_javaLoader.is()) throw RuntimeException(OUString::createFromAscii("javaloader error - 13"), Reference<XInterface>()); - Mapping map(_pRemote_Environment , pEnvCpp); + typelib_typedescription_release(reinterpret_cast<typelib_TypeDescription *>(pType_XImplementationLoader)); + pType_XImplementationLoader = NULL; - XInterface * pCppI = (XInterface *) map.mapInterface(pRemoteI, pType); if(!pCppI) throw RuntimeException(OUString::createFromAscii("hier 54"), Reference<XInterface>()); - Reference<XInterface> rReturn = Reference<XInterface>(pCppI); + // detach from java vm + if(xJavaThreadRegister_11.is()) { + xJavaThreadRegister_11->revokeThread(); - Reference<XMultiServiceFactory> serviceManager(rReturn, UNO_QUERY); if(!serviceManager.is()) throw RuntimeException(OUString::createFromAscii("hier 55"), Reference<XInterface>()); + if(!xJavaThreadRegister_11->isThreadAttached()) + pJavaVM->DetachCurrentThread(); + } + else + pJavaVM->DetachCurrentThread(); - Reference<XInterface> javaLoader_xInterface = - serviceManager->createInstance(OUString::createFromAscii("com.sun.star.loader.Java")); if(!javaLoader_xInterface.is()) throw RuntimeException(OUString::createFromAscii("hier 56"), Reference<XInterface>()); - _javaLoader = Reference<XImplementationLoader>(javaLoader_xInterface, UNO_QUERY); if(!_javaLoader.is()) throw RuntimeException(OUString::createFromAscii("hier 57"), Reference<XInterface>()); - _javaLoader->acquire(); + pJNIEnv = NULL; - Reference<XInitialization> javaLoader_xInit(javaLoader_xInterface, UNO_QUERY); + // set the service manager at the javaloader + Reference<XInitialization> javaLoader_XInitialization(_javaLoader, UNO_QUERY); + if(!javaLoader_XInitialization.is()) throw RuntimeException(OUString::createFromAscii("javaloader error - 14"), Reference<XInterface>()); - Any any_smgr; - any_smgr <<= rSMgr; - javaLoader_xInit->initialize(Sequence<Any>(&any_smgr, 1)); + Any any; + any <<= _xSMgr; + javaLoader_XInitialization->initialize(Sequence<Any>(&any, 1)); + } + catch(RuntimeException & runtimeException) { + // release all java environments + for(sal_Int32 i = 0; i < size; ++ i) + ppJava_environments[i]->release(ppJava_environments[i]); - // important: release the context and the environments + if(pUno_environment) + pUno_environment->release(pUno_environment); - pCppI->release(); - pEnvCpp->release(pEnvCpp); - pRemoteI->release(pRemoteI); + if(pType_XImplementationLoader) + typelib_typedescription_release(reinterpret_cast<typelib_TypeDescription *>(pType_XImplementationLoader)); - pUNO_Environment->release(pUNO_Environment); - pRemote_Context->aBase.release(reinterpret_cast<uno_Context *>(pRemote_Context)); - } + // detach from java vm + if(pJNIEnv) + if(xJavaThreadRegister_11.is()) { + xJavaThreadRegister_11->revokeThread(); + if(!xJavaThreadRegister_11->isThreadAttached()) + pJavaVM->DetachCurrentThread(); + } + else + pJavaVM->DetachCurrentThread(); - JavaComponentLoader::~JavaComponentLoader() { - if(_pRemote_Environment) - { - _pRemote_Environment->dispose(_pRemote_Environment); - _pRemote_Environment->release(_pRemote_Environment); + throw; } + OSL_TRACE("javaloader.cxx: mapped javaloader - 0x%x", _javaLoader.get()); + } -// JVMThreadAttach jvm(pC->_pJavaVM, pC->_pXJavaThreadRegister_11); - -// try { -// jclass jcThreadPool = jvm._pJNIEnv->FindClass("com/sun/star/lib/uno/environments/remote/ThreadPool"); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 1"), Reference<XInterface>()); -// jmethodID jmThreadPool_reset = jvm._pJNIEnv->GetMethodID(jcThreadPool, "reset", "()V"); if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUString::createFromAscii("hier 1"), Reference<XInterface>()); -// jvm._pJNIEnv->CallStaticVoidMethod(jcThreadPool, jmThreadPool_reset); -// } -// catch( + JavaComponentLoader::~JavaComponentLoader() throw() { } // XServiceInfo @@ -598,11 +305,8 @@ namespace loader { sal_Bool SAL_CALL JavaComponentLoader::writeRegistryInfo(const Reference<XRegistryKey> & xKey, const OUString & blabla, const OUString & rLibName) throw(CannotRegisterImplementationException, RuntimeException) { - sal_Bool bSuccess = sal_False; - - bSuccess = _javaLoader->writeRegistryInfo(xKey, blabla, rLibName); - - return bSuccess; + OSL_TRACE("JavaComponentLoader::writeRegistryInfo"); + return _javaLoader->writeRegistryInfo(xKey, blabla, rLibName); } @@ -671,4 +375,3 @@ extern "C" return pRet; } } - |