diff options
author | Kurt Zenker <kz@openoffice.org> | 2004-03-25 13:56:11 +0000 |
---|---|---|
committer | Kurt Zenker <kz@openoffice.org> | 2004-03-25 13:56:11 +0000 |
commit | 37f35814d03c6147736713fa1404ddba68d5544e (patch) | |
tree | 2f564def8e9de7b9612d7ab44398d4a35c27e7b8 /sj2 | |
parent | 6cfd9a33f4923e624635c99e45e5f43e3ada3e98 (diff) |
INTEGRATION: CWS jl3 (1.15.32); FILE MERGED
2004/02/17 11:57:57 jl 1.15.32.3: #111907#
2004/02/09 13:42:47 jl 1.15.32.2: RESYNC: (1.15-1.17); FILE MERGED
2003/11/20 16:40:04 jl 1.15.32.1: #111907# replace TKTThreadAttach by jvmaccess::VirtualMachine, directory source/java is now empty
Diffstat (limited to 'sj2')
-rw-r--r-- | sj2/source/jscpp/sjapplet_impl.cxx | 382 |
1 files changed, 243 insertions, 139 deletions
diff --git a/sj2/source/jscpp/sjapplet_impl.cxx b/sj2/source/jscpp/sjapplet_impl.cxx index 7f1caad648..9fe178650b 100644 --- a/sj2/source/jscpp/sjapplet_impl.cxx +++ b/sj2/source/jscpp/sjapplet_impl.cxx @@ -2,9 +2,9 @@ * * $RCSfile: sjapplet_impl.cxx,v $ * - * $Revision: 1.17 $ + * $Revision: 1.18 $ * - * last change: $Author: vg $ $Date: 2003-12-17 20:37:09 $ + * last change: $Author: kz $ $Date: 2004-03-25 14:56:11 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -78,25 +78,22 @@ #include <vcl/wrkwin.hxx> #include <vcl/syschild.hxx> #include <vcl/sysdata.hxx> +#include <com/sun/star/java/XJavaVM.hpp> -#ifdef SOLAR_JAVA -#include <jnihelp.hxx> -#endif // SOLAR_JAVA - -using namespace ::rtl; using namespace ::osl; -#ifdef SOLAR_JAVA -using namespace ::sj2; -#endif // SOLAR_JAVA using namespace ::utl; - #ifdef SOLAR_JAVA using namespace ::com::sun::star::java; #endif // SOLAR_JAVA + using namespace ::com::sun::star::lang; using namespace ::com::sun::star::uno; + +#define OUSTR( x ) ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( x )) + #ifdef SOLAR_JAVA + static void testJavaException(JNIEnv * pEnv) throw(com::sun::star::uno::RuntimeException) { jthrowable jtThrowable = pEnv->ExceptionOccurred(); @@ -111,10 +108,10 @@ static void testJavaException(JNIEnv * pEnv) throw(com::sun::star::uno::Runtime jstring jsMessage = (jstring)pEnv->CallObjectMethod(jtThrowable, jmThrowable_getMessage); - OUString ouMessage; + rtl::OUString ouMessage; if(jsMessage) { const jchar * jcMessage = pEnv->GetStringChars(jsMessage, NULL); - ouMessage = OUString(jcMessage); + ouMessage = rtl::OUString(jcMessage); pEnv->ReleaseStringChars(jsMessage, jcMessage); } @@ -124,7 +121,7 @@ static void testJavaException(JNIEnv * pEnv) throw(com::sun::star::uno::Runtime #else // !SOLAR_JAVA static void throwException() throw(com::sun::star::uno::RuntimeException) { - throw RuntimeException(OUString(RTL_CONSTASCII_USTRINGPARAM("Java applets not supported.")), Reference<XInterface>()); + throw RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Java applets not supported.")), Reference<XInterface>()); } #endif @@ -226,9 +223,10 @@ _joWindow = 0; } #endif // SOLAR_JAVA + #ifdef SOLAR_JAVA SjApplet2_Impl::SjApplet2_Impl() throw(com::sun::star::uno::RuntimeException) -: _pJVM(NULL), + : _joAppletExecutionContext(0), _jcAppletExecutionContext(0) @@ -238,18 +236,29 @@ SjApplet2_Impl::SjApplet2_Impl() throw(com::sun::star::uno::RuntimeException) {} #endif -SjApplet2_Impl::~SjApplet2_Impl() throw() { -#ifdef SOLAR_JAVA -if (_joAppletExecutionContext) { - TKTThreadAttach jenv(_pJVM, _xJavaThreadRegister_11.get()); - - _pEmbeddedWindow->dispose(jenv.pEnv); - delete _pEmbeddedWindow; - jenv.pEnv->DeleteGlobalRef(_joAppletExecutionContext); - jenv.pEnv->DeleteGlobalRef(_jcAppletExecutionContext); +SjApplet2_Impl::~SjApplet2_Impl() throw() +{ +#ifdef SOLAR_JAVA + if (_joAppletExecutionContext) + { + try + { + if ( ! _virtualMachine.is()) + return; + jvmaccess::VirtualMachine::AttachGuard vmAttachGuard(_virtualMachine); + JNIEnv * pEnv = vmAttachGuard.getEnvironment(); + _pEmbeddedWindow->dispose(pEnv); + delete _pEmbeddedWindow; + + pEnv->DeleteGlobalRef(_joAppletExecutionContext); + pEnv->DeleteGlobalRef(_jcAppletExecutionContext); + } + catch (jvmaccess::VirtualMachine::AttachGuard::CreationException &) + { + } +#endif } -#endif } void SjApplet2_Impl::init(Window * pParentWin, @@ -263,16 +272,16 @@ void SjApplet2_Impl::init(Window * pParentWin, // Java URL erzeugen - OUString url = rDocBase.GetMainURL(INetURLObject::DECODE_TO_IURI); + rtl::OUString url = rDocBase.GetMainURL(INetURLObject::DECODE_TO_IURI); if(!url.getLength()) - url = OUString(RTL_CONSTASCII_USTRINGPARAM("file:///")); + url = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("file:///")); if (url.getLength()) { //WorkAround, weil Java mit dem | nicht zurecht kommt if(rDocBase.GetProtocol() == INET_PROT_FILE && url.pData->buffer[9] == INET_ENC_DELIM_TOKEN) { - OUString tmp = url.copy(0, 9); - tmp += OUString(INET_DELIM_TOKEN); + rtl::OUString tmp = url.copy(0, 9); + tmp += rtl::OUString(INET_DELIM_TOKEN); tmp += url.copy(10); url = tmp; @@ -281,84 +290,88 @@ void SjApplet2_Impl::init(Window * pParentWin, #if OSL_DEBUG_LEVEL > 1 - OString tmp = OUStringToOString(url, RTL_TEXTENCODING_ASCII_US); + rtl::OString tmp = rtl::OUStringToOString(url, RTL_TEXTENCODING_ASCII_US); OSL_TRACE("SjApplet2_Impl::init - mainUrl: %s\n", tmp.getStr()); #endif - _xJavaVM = Reference<XJavaVM>(smgr->createInstance(OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.java.JavaVirtualMachine"))), UNO_QUERY); - _xJavaThreadRegister_11 = Reference<XJavaThreadRegister_11>(_xJavaVM, UNO_QUERY); - - Sequence<sal_Int8> processID(16); + Reference<XJavaVM>_xJavaVM = Reference<XJavaVM>(smgr->createInstance( + OUSTR("com.sun.star.java.JavaVirtualMachine")), UNO_QUERY); + Sequence<sal_Int8> processID(17); rtl_getGlobalProcessId((sal_uInt8 *)processID.getArray()); - Any aVMPtr = _xJavaVM->getJavaVM(processID); - if( sizeof(_pJVM) == sizeof(sal_Int32)) - { - // 32 bit system - sal_Int32 nP = 0; - aVMPtr >>= nP; - _pJVM = (JavaVM*)nP; - } - else if(sizeof(_pJVM) == sizeof(sal_Int64)) + processID[16] = 0; + + OSL_ENSURE(sizeof (sal_Int64) + >= sizeof (jvmaccess::VirtualMachine *), + "Pointer cannot be represented as sal_Int64"); + sal_Int64 nPointer = reinterpret_cast< sal_Int64 >( + static_cast< jvmaccess::VirtualMachine * >(0)); + _xJavaVM->getJavaVM(processID) >>= nPointer; + _virtualMachine = reinterpret_cast< jvmaccess::VirtualMachine * >(nPointer); + if (!_virtualMachine.is()) + return; + + try { - // 64 bit system - sal_Int64 nP = 0; - aVMPtr >>= nP; - _pJVM = (JavaVM*)nP; - } + jvmaccess::VirtualMachine::AttachGuard vmAttachGuard(_virtualMachine); - if(!_pJVM) // did we get a vm? - throw RuntimeException(OUString(RTL_CONSTASCII_USTRINGPARAM("sjapplet_impl.cxx: couldn't get a java vm")), Reference<XInterface>()); + JNIEnv * pEnv = vmAttachGuard.getEnvironment(); - TKTThreadAttach jenv(_pJVM, _xJavaThreadRegister_11.get()); + _jcAppletExecutionContext = pEnv->FindClass("stardiv/applet/AppletExecutionContext"); testJavaException(pEnv); + _jcAppletExecutionContext = (jclass) pEnv->NewGlobalRef(_jcAppletExecutionContext ); testJavaException(pEnv); - _jcAppletExecutionContext = jenv.pEnv->FindClass("stardiv/applet/AppletExecutionContext"); testJavaException(jenv.pEnv); - _jcAppletExecutionContext = (jclass)jenv.pEnv->NewGlobalRef(_jcAppletExecutionContext ); testJavaException(jenv.pEnv); + jclass jcURL = pEnv->FindClass("java/net/URL"); testJavaException(pEnv); + jmethodID jmURL_rinit = pEnv->GetMethodID(jcURL, "<init>", "(Ljava/lang/String;)V"); testJavaException(pEnv); + jobject joDocBase = pEnv->AllocObject(jcURL); testJavaException(pEnv); + jstring jsURL = pEnv->NewString(url.getStr(), url.getLength()); testJavaException(pEnv); + pEnv->CallVoidMethod(joDocBase, jmURL_rinit, jsURL); testJavaException(pEnv); - jclass jcURL = jenv.pEnv->FindClass("java/net/URL"); testJavaException(jenv.pEnv); - jmethodID jmURL_rinit = jenv.pEnv->GetMethodID(jcURL, "<init>", "(Ljava/lang/String;)V"); testJavaException(jenv.pEnv); - jobject joDocBase = jenv.pEnv->AllocObject(jcURL); testJavaException(jenv.pEnv); - jstring jsURL = jenv.pEnv->NewString(url.getStr(), url.getLength()); testJavaException(jenv.pEnv); - jenv.pEnv->CallVoidMethod(joDocBase, jmURL_rinit, jsURL); testJavaException(jenv.pEnv); + jclass jcHashtable = pEnv->FindClass("java/util/Hashtable"); testJavaException(pEnv); + jmethodID jmHashtable_rinit = pEnv->GetMethodID(jcHashtable, "<init>", "()V"); testJavaException(pEnv); + jmethodID jmHashtable_put = pEnv->GetMethodID(jcHashtable, "put", + "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); testJavaException(pEnv); + jobject joParameters = pEnv->AllocObject(jcHashtable); testJavaException(pEnv); + pEnv->CallVoidMethod(joParameters, jmHashtable_rinit); testJavaException(pEnv); - jclass jcHashtable = jenv.pEnv->FindClass("java/util/Hashtable"); testJavaException(jenv.pEnv); - jmethodID jmHashtable_rinit = jenv.pEnv->GetMethodID(jcHashtable, "<init>", "()V"); testJavaException(jenv.pEnv); - jmethodID jmHashtable_put = jenv.pEnv->GetMethodID(jcHashtable, "put", - "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); testJavaException(jenv.pEnv); - jobject joParameters = jenv.pEnv->AllocObject(jcHashtable); testJavaException(jenv.pEnv); - jenv.pEnv->CallVoidMethod(joParameters, jmHashtable_rinit); testJavaException(jenv.pEnv); - - for(sal_Int64 i = 0; i < rCmdList.Count(); ++i) { - const SvCommand & rCmd = rCmdList[i]; - String aCmd = rCmd.GetCommand(); - String aLoweredCmd = aCmd.ToLowerAscii(); + for(sal_Int64 i = 0; i < rCmdList.Count(); ++i) { + const SvCommand & rCmd = rCmdList[i]; + String aCmd = rCmd.GetCommand(); + String aLoweredCmd = aCmd.ToLowerAscii(); #if OSL_DEBUG_LEVEL > 1 - OUString command = aCmd; - OUString value = rCmd.GetArgument(); - OString cmd_tmp = OUStringToOString(command, RTL_TEXTENCODING_ASCII_US); - OString value_tmp = OUStringToOString(value, RTL_TEXTENCODING_ASCII_US); - OSL_TRACE("command: %s=%s", cmd_tmp.getStr(), value_tmp.getStr()); + rtl::OUString command = aCmd; + rtl::OUString value = rCmd.GetArgument(); + rtl::OString cmd_tmp = rtl::OUStringToOString(command, RTL_TEXTENCODING_ASCII_US); + rtl::OString value_tmp = rtl::OUStringToOString(value, RTL_TEXTENCODING_ASCII_US); + OSL_TRACE("command: %s=%s", cmd_tmp.getStr(), value_tmp.getStr()); #endif + jstring jsCommand = pEnv->NewString(aLoweredCmd.GetBuffer(), aLoweredCmd.Len()); testJavaException(pEnv); + jstring jsArg = pEnv->NewString(rCmd.GetArgument().GetBuffer(), rCmd.GetArgument().Len()); testJavaException(pEnv); + pEnv->CallObjectMethod(joParameters, jmHashtable_put, jsCommand, jsArg); testJavaException(pEnv); + } - jstring jsCommand = jenv.pEnv->NewString(aLoweredCmd.GetBuffer(), aLoweredCmd.Len()); testJavaException(jenv.pEnv); - jstring jsArg = jenv.pEnv->NewString(rCmd.GetArgument().GetBuffer(), rCmd.GetArgument().Len()); testJavaException(jenv.pEnv); - jenv.pEnv->CallObjectMethod(joParameters, jmHashtable_put, jsCommand, jsArg); testJavaException(jenv.pEnv); - } + SystemEnvData const * pEnvData = ((SystemChildWindow *)pParentWin)->GetSystemData(); + _pEmbeddedWindow = new EmbeddedWindow(pEnv, pEnvData); - SystemEnvData const * pEnvData = ((SystemChildWindow *)pParentWin)->GetSystemData(); - _pEmbeddedWindow = new EmbeddedWindow(jenv.pEnv, pEnvData); + jmethodID jmAppletExecutionContext_rinit = pEnv->GetMethodID(_jcAppletExecutionContext, "<init>", + "(Ljava/net/URL;Ljava/util/Hashtable;Ljava/awt/Container;J)V"); testJavaException(pEnv); + jmethodID jmAppletExecutionContext_init = pEnv->GetMethodID(_jcAppletExecutionContext, "init", "()V"); testJavaException(pEnv); + jmethodID jmAppletExecutionContext_startUp = pEnv->GetMethodID(_jcAppletExecutionContext, "startUp", "()V"); testJavaException(pEnv); - jmethodID jmAppletExecutionContext_rinit = jenv.pEnv->GetMethodID(_jcAppletExecutionContext, "<init>", - "(Ljava/net/URL;Ljava/util/Hashtable;Ljava/awt/Container;J)V"); testJavaException(jenv.pEnv); - jmethodID jmAppletExecutionContext_init = jenv.pEnv->GetMethodID(_jcAppletExecutionContext, "init", "()V"); testJavaException(jenv.pEnv); - jmethodID jmAppletExecutionContext_startUp = jenv.pEnv->GetMethodID(_jcAppletExecutionContext, "startUp", "()V"); testJavaException(jenv.pEnv); + _joAppletExecutionContext = pEnv->AllocObject(_jcAppletExecutionContext); testJavaException(pEnv); + _joAppletExecutionContext = pEnv->NewGlobalRef(_joAppletExecutionContext); testJavaException(pEnv); + pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_rinit, + joDocBase, joParameters, _pEmbeddedWindow->_joWindow, (jlong)0); testJavaException(pEnv); + pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_init); testJavaException(pEnv); + pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_startUp); testJavaException(pEnv); + + } + catch(jvmaccess::VirtualMachine::AttachGuard::CreationException & ) + { + throw RuntimeException( + OUSTR("sjapplet_impl.cxx: Could not create jvmaccess::" + "VirtualMachine::AttachGuard!"), 0); + } - _joAppletExecutionContext = jenv.pEnv->AllocObject(_jcAppletExecutionContext); testJavaException(jenv.pEnv); - _joAppletExecutionContext = jenv.pEnv->NewGlobalRef(_joAppletExecutionContext); testJavaException(jenv.pEnv); - jenv.pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_rinit, - joDocBase, joParameters, _pEmbeddedWindow->_joWindow, (jlong)0); testJavaException(jenv.pEnv); - jenv.pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_init); testJavaException(jenv.pEnv); - jenv.pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_startUp); testJavaException(jenv.pEnv); #else // !SOLAR_JAVA throwException(); #endif @@ -366,14 +379,31 @@ void SjApplet2_Impl::init(Window * pParentWin, void SjApplet2_Impl::setSize(const Size & rSize) throw(com::sun::star::uno::RuntimeException) { -#ifdef SOLAR_JAVA - TKTThreadAttach jenv(_pJVM, _xJavaThreadRegister_11.get()); - - _pParentWin->SetSizePixel(rSize); - jmethodID jmAppletExecutionContext_resize = jenv.pEnv->GetMethodID(_jcAppletExecutionContext, "appletResize", "(II)V"); testJavaException(jenv.pEnv); - jenv.pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_resize, (jint)rSize.Width(), - (jint)rSize.Height()); testJavaException(jenv.pEnv); +#ifdef SOLAR_JAVA + try + { + if ( ! _virtualMachine.is()) + return; + jvmaccess::VirtualMachine::AttachGuard vmAttachGuard(_virtualMachine); + JNIEnv * pEnv = vmAttachGuard.getEnvironment(); + + _pParentWin->SetSizePixel(rSize); + + jmethodID jmAppletExecutionContext_resize = pEnv->GetMethodID( + _jcAppletExecutionContext, "appletResize", "(II)V"); + testJavaException(pEnv); + pEnv->CallVoidMethod(_joAppletExecutionContext, + jmAppletExecutionContext_resize, (jint)rSize.Width(), + (jint)rSize.Height()); + testJavaException(pEnv); + } + catch (jvmaccess::VirtualMachine::AttachGuard::CreationException &) + { + throw RuntimeException( + OUSTR("SjApplet2_Impl::setSize, Could not create jvmaccess::" + "VirtualMachine::AttachGuard!"), 0); + } #else // !SOLAR_JAVA throwException(); #endif @@ -382,10 +412,24 @@ void SjApplet2_Impl::setSize(const Size & rSize) throw(com::sun::star::uno::Runt void SjApplet2_Impl::restart() throw(com::sun::star::uno::RuntimeException) { #ifdef SOLAR_JAVA - TKTThreadAttach jenv(_pJVM, _xJavaThreadRegister_11.get()); - - jmethodID jmAppletExecutionContext_restart = jenv.pEnv->GetMethodID(_jcAppletExecutionContext, "restart", "()V"); testJavaException(jenv.pEnv); - jenv.pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_restart); testJavaException(jenv.pEnv); + try + { + if ( ! _virtualMachine.is()) + return; + jvmaccess::VirtualMachine::AttachGuard vmAttachGuard(_virtualMachine); + JNIEnv * pEnv = vmAttachGuard.getEnvironment(); + jmethodID jmAppletExecutionContext_restart = pEnv->GetMethodID( + _jcAppletExecutionContext, "restart", "()V"); + testJavaException(pEnv); + pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_restart); + testJavaException(pEnv); + } + catch (jvmaccess::VirtualMachine::AttachGuard::CreationException &) + { + throw RuntimeException( + OUSTR("SjApplet2_Impl::restart, Could not create jvmaccess::" + "VirtualMachine::AttachGuard!"), 0); + } #else // !SOLAR_JAVA throwException(); #endif @@ -394,10 +438,24 @@ void SjApplet2_Impl::restart() throw(com::sun::star::uno::RuntimeException) void SjApplet2_Impl::reload() throw(com::sun::star::uno::RuntimeException) { #ifdef SOLAR_JAVA - TKTThreadAttach jenv(_pJVM, _xJavaThreadRegister_11.get()); - - jmethodID jmAppletExecutionContext_reload = jenv.pEnv->GetMethodID(_jcAppletExecutionContext, "reload", "()V"); testJavaException(jenv.pEnv); - jenv.pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_reload); testJavaException(jenv.pEnv); + try + { + if ( ! _virtualMachine.is()) + return; + jvmaccess::VirtualMachine::AttachGuard vmAttachGuard(_virtualMachine); + JNIEnv * pEnv = vmAttachGuard.getEnvironment(); + jmethodID jmAppletExecutionContext_reload = pEnv->GetMethodID( + _jcAppletExecutionContext, "reload", "()V"); + testJavaException(pEnv); + pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_reload); + testJavaException(pEnv); + } + catch (jvmaccess::VirtualMachine::AttachGuard::CreationException &) + { + throw RuntimeException( + OUSTR("SjApplet2_Impl::reload, Could not create jvmaccess::" + "VirtualMachine::AttachGuard!"), 0); + } #else // !SOLAR_JAVA throwException(); #endif @@ -406,10 +464,24 @@ void SjApplet2_Impl::reload() throw(com::sun::star::uno::RuntimeException) void SjApplet2_Impl::start() throw(com::sun::star::uno::RuntimeException) { #ifdef SOLAR_JAVA - TKTThreadAttach jenv(_pJVM, _xJavaThreadRegister_11.get()); - - jmethodID jmAppletExecutionContext_sendStart = jenv.pEnv->GetMethodID(_jcAppletExecutionContext, "sendStart", "()V"); testJavaException(jenv.pEnv); - jenv.pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_sendStart); testJavaException(jenv.pEnv); + try + { + if ( ! _virtualMachine.is()) + return; + jvmaccess::VirtualMachine::AttachGuard vmAttachGuard(_virtualMachine); + JNIEnv * pEnv = vmAttachGuard.getEnvironment(); + jmethodID jmAppletExecutionContext_sendStart = pEnv->GetMethodID( + _jcAppletExecutionContext, "sendStart", "()V"); + testJavaException(pEnv); + pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_sendStart); + testJavaException(pEnv); + } + catch (jvmaccess::VirtualMachine::AttachGuard::CreationException &) + { + throw RuntimeException( + OUSTR("SjApplet2_Impl::restart, Could not create jvmaccess::" + "VirtualMachine::AttachGuard!"), 0); + } #else // !SOLAR_JAVA throwException(); #endif @@ -418,10 +490,24 @@ void SjApplet2_Impl::start() throw(com::sun::star::uno::RuntimeException) void SjApplet2_Impl::stop() throw(com::sun::star::uno::RuntimeException) { #ifdef SOLAR_JAVA - TKTThreadAttach jenv(_pJVM, _xJavaThreadRegister_11.get()); - - jmethodID jmAppletExecutionContext_sendStop = jenv.pEnv->GetMethodID(_jcAppletExecutionContext, "sendStop", "()V"); testJavaException(jenv.pEnv); - jenv.pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_sendStop); testJavaException(jenv.pEnv); + try + { + if ( ! _virtualMachine.is()) + return; + jvmaccess::VirtualMachine::AttachGuard vmAttachGuard(_virtualMachine); + JNIEnv * pEnv = vmAttachGuard.getEnvironment(); + jmethodID jmAppletExecutionContext_sendStop = pEnv->GetMethodID( + _jcAppletExecutionContext, "sendStop", "()V"); + testJavaException(pEnv); + pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_sendStop); + testJavaException(pEnv); + } + catch (jvmaccess::VirtualMachine::AttachGuard::CreationException &) + { + throw RuntimeException( + OUSTR("SjApplet2_Impl::restart, Could not create jvmaccess::" + "VirtualMachine::AttachGuard!"), 0); + } #else // !SOLAR_JAVA throwException(); #endif @@ -430,35 +516,53 @@ void SjApplet2_Impl::stop() throw(com::sun::star::uno::RuntimeException) void SjApplet2_Impl::close() throw(com::sun::star::uno::RuntimeException) { #ifdef SOLAR_JAVA - TKTThreadAttach jenv(_pJVM, _xJavaThreadRegister_11.get()); - - jmethodID jmAppletExecutionContext_shutdown = jenv.pEnv->GetMethodID(_jcAppletExecutionContext, "shutdown", "()V"); testJavaException(jenv.pEnv); - jenv.pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_shutdown); testJavaException(jenv.pEnv); - - jmethodID jmWaitForDispose= jenv.pEnv->GetMethodID(_jcAppletExecutionContext,"waitForDispose","()V"); - testJavaException(jenv.pEnv); - //blocks until the applet has destroyed itself and the container was disposed (stardiv.applet.AppletExecutionContext.dispose) - jenv.pEnv->CallVoidMethod(_joAppletExecutionContext, jmWaitForDispose); - - // now that the applet is disposed, we dispose the AppletExecutionContext, that will end the thread - // which dispatches the applet methods, such as init, start, stop , destroy. - jmethodID jmAppletExecutionContext_dispose= jenv.pEnv->GetMethodID(_jcAppletExecutionContext, - "dispose", "()V"); testJavaException(jenv.pEnv); - jenv.pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_dispose); - testJavaException(jenv.pEnv); - - if( _pParentWin ) + try { - WorkWindow* pAppWin = Application::GetAppWindow(); - if(pAppWin) - { - while(_pParentWin->GetChildCount()) + if ( ! _virtualMachine.is()) + return; + jvmaccess::VirtualMachine::AttachGuard vmAttachGuard(_virtualMachine); + JNIEnv * pEnv = vmAttachGuard.getEnvironment(); + + jmethodID jmAppletExecutionContext_shutdown = pEnv->GetMethodID( + _jcAppletExecutionContext, "shutdown", "()V"); + testJavaException(pEnv); + pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_shutdown); + testJavaException(pEnv); + + jmethodID jmWaitForDispose= pEnv->GetMethodID( + _jcAppletExecutionContext,"waitForDispose","()V"); + testJavaException(pEnv); + //blocks until the applet has destroyed itself and the container was disposed + //(stardiv.applet.AppletExecutionContext.dispose) + pEnv->CallVoidMethod(_joAppletExecutionContext, jmWaitForDispose); + + // now that the applet is disposed, we dispose the AppletExecutionContext, that will end the thread + // which dispatches the applet methods, such as init, start, stop , destroy. + jmethodID jmAppletExecutionContext_dispose= pEnv->GetMethodID( + _jcAppletExecutionContext,"dispose", "()V"); + testJavaException(pEnv); + pEnv->CallVoidMethod(_joAppletExecutionContext, jmAppletExecutionContext_dispose); + testJavaException(pEnv); + + if( _pParentWin ) + { + WorkWindow* pAppWin = Application::GetAppWindow(); + if(pAppWin) { - Window* pChild = _pParentWin->GetChild(0); - pChild->Show( FALSE ); - pChild->SetParent( pAppWin ); + while(_pParentWin->GetChildCount()) + { + Window* pChild = _pParentWin->GetChild(0); + pChild->Show( FALSE ); + pChild->SetParent( pAppWin ); + } } - } + } + } + catch (jvmaccess::VirtualMachine::AttachGuard::CreationException &) + { + throw RuntimeException( + OUSTR("SjApplet2_Impl::close, Could not create jvmaccess::" + "VirtualMachine::AttachGuard!"), 0); } #else // !SOLAR_JAVA throwException(); |