| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_stoc.hxx" |
| |
| #include "javavm.hxx" |
| |
| #include "interact.hxx" |
| #include "jvmargs.hxx" |
| |
| #include "com/sun/star/beans/NamedValue.hpp" |
| #include "com/sun/star/beans/PropertyState.hpp" |
| #include "com/sun/star/beans/PropertyValue.hpp" |
| #include "com/sun/star/container/XContainer.hpp" |
| #include "com/sun/star/java/JavaNotFoundException.hpp" |
| #include "com/sun/star/java/InvalidJavaSettingsException.hpp" |
| #include "com/sun/star/java/RestartRequiredException.hpp" |
| #include "com/sun/star/java/JavaDisabledException.hpp" |
| #include "com/sun/star/java/JavaVMCreationFailureException.hpp" |
| #include "com/sun/star/lang/DisposedException.hpp" |
| #include "com/sun/star/lang/IllegalArgumentException.hpp" |
| #include "com/sun/star/lang/XEventListener.hpp" |
| #include "com/sun/star/lang/XMultiComponentFactory.hpp" |
| #include "com/sun/star/lang/XSingleComponentFactory.hpp" |
| #include "com/sun/star/lang/WrappedTargetRuntimeException.hpp" |
| #include "com/sun/star/registry/XRegistryKey.hpp" |
| #include "com/sun/star/registry/XSimpleRegistry.hpp" |
| #include "com/sun/star/task/XInteractionHandler.hpp" |
| #include "com/sun/star/uno/Exception.hpp" |
| #include "com/sun/star/uno/Reference.hxx" |
| #include "com/sun/star/uno/RuntimeException.hpp" |
| #include "com/sun/star/uno/Sequence.hxx" |
| #include "com/sun/star/uno/XComponentContext.hpp" |
| #include "com/sun/star/uno/XCurrentContext.hpp" |
| #include "com/sun/star/uno/XInterface.hpp" |
| #include "com/sun/star/util/XMacroExpander.hpp" |
| #include "com/sun/star/container/XNameAccess.hpp" |
| #include "cppuhelper/exc_hlp.hxx" |
| #include "cppuhelper/factory.hxx" |
| #include "cppuhelper/implbase1.hxx" |
| #include "cppuhelper/implementationentry.hxx" |
| #include "jvmaccess/classpath.hxx" |
| #include "jvmaccess/unovirtualmachine.hxx" |
| #include "jvmaccess/virtualmachine.hxx" |
| #include "osl/file.hxx" |
| #include "osl/thread.h" |
| #include "rtl/bootstrap.hxx" |
| #include "rtl/process.h" |
| #include "rtl/string.h" |
| #include "rtl/ustrbuf.hxx" |
| #include "rtl/ustring.h" |
| #include "rtl/ustring.hxx" |
| #include "rtl/uri.hxx" |
| #include "sal/types.h" |
| #include "uno/current_context.hxx" |
| #include "uno/environment.h" |
| #include "uno/lbnames.h" |
| #include "jvmfwk/framework.h" |
| #include "jni.h" |
| |
| #include <stack> |
| #include <string.h> |
| #include <time.h> |
| #include <memory> |
| #include <vector> |
| #include "boost/scoped_array.hpp" |
| #define OUSTR(x) rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( x )) |
| |
| // Properties of the javavm can be put |
| // as a komma separated list in this |
| // environment variable |
| #define PROPERTIES_ENV "OO_JAVA_PROPERTIES" |
| #ifdef UNIX |
| #define INI_FILE "javarc" |
| #ifdef MACOSX |
| #define DEF_JAVALIB "JavaVM.framework" |
| #else |
| #define DEF_JAVALIB "libjvm.so" |
| #endif |
| #define TIMEZONE "MEZ" |
| #else |
| #define INI_FILE "java.ini" |
| #define DEF_JAVALIB "jvm.dll" |
| #define TIMEZONE "MET" |
| #endif |
| |
| /* Within this implementation of the com.sun.star.java.JavaVirtualMachine |
| * service and com.sun.star.java.theJavaVirtualMachine singleton, the method |
| * com.sun.star.java.XJavaVM.getJavaVM relies on the following: |
| * 1 The string "$URE_INTERNAL_JAVA_DIR/" is expanded via the |
| * com.sun.star.util.theMacroExpander singleton into an internal (see the |
| * com.sun.star.uri.ExternalUriReferenceTranslator service), hierarchical URI |
| * reference relative to which the URE JAR files can be addressed. |
| * 2 The string "$URE_INTERNAL_JAVA_CLASSPATH" is either not expandable via the |
| * com.sun.star.util.theMacroExpander singleton |
| * (com.sun.star.lang.IllegalArgumentException), or is expanded via the |
| * com.sun.star.util.theMacroExpander singleton into a list of zero or more |
| * internal (see the com.sun.star.uri.ExternalUriReferenceTranslator service) |
| * URIs, where any space characters (U+0020) are ignored (and, in particular, |
| * separate adjacent URIs). |
| * If either of these requirements is not met, getJavaVM raises a |
| * com.sun.star.uno.RuntimeException. |
| */ |
| |
| namespace css = com::sun::star; |
| |
| using stoc_javavm::JavaVirtualMachine; |
| |
| namespace { |
| |
| |
| |
| class NoJavaIniException: public css::uno::Exception |
| { |
| }; |
| |
| class SingletonFactory: |
| private cppu::WeakImplHelper1< css::lang::XEventListener > |
| { |
| public: |
| static css::uno::Reference< css::uno::XInterface > getSingleton( |
| css::uno::Reference< css::uno::XComponentContext > const & rContext); |
| |
| private: |
| SingletonFactory(SingletonFactory &); // not implemented |
| void operator =(SingletonFactory); // not implemented |
| |
| inline SingletonFactory() {} |
| |
| virtual inline ~SingletonFactory() {} |
| |
| virtual void SAL_CALL disposing(css::lang::EventObject const &) |
| throw (css::uno::RuntimeException); |
| |
| static void dispose(); |
| |
| // TODO ok to keep these static? |
| static osl::Mutex m_aMutex; |
| static css::uno::Reference< css::uno::XInterface > m_xSingleton; |
| static bool m_bDisposed; |
| }; |
| |
| css::uno::Reference< css::uno::XInterface > SingletonFactory::getSingleton( |
| css::uno::Reference< css::uno::XComponentContext > const & rContext) |
| { |
| css::uno::Reference< css::uno::XInterface > xSingleton; |
| css::uno::Reference< css::lang::XComponent > xComponent; |
| { |
| osl::MutexGuard aGuard(m_aMutex); |
| if (!m_xSingleton.is()) |
| { |
| if (m_bDisposed) |
| throw css::lang::DisposedException(); |
| xComponent = css::uno::Reference< css::lang::XComponent >( |
| rContext, css::uno::UNO_QUERY_THROW); |
| m_xSingleton = static_cast< cppu::OWeakObject * >( |
| new JavaVirtualMachine(rContext)); |
| } |
| xSingleton = m_xSingleton; |
| } |
| if (xComponent.is()) |
| try |
| { |
| xComponent->addEventListener(new SingletonFactory); |
| } |
| catch (...) |
| { |
| dispose(); |
| throw; |
| } |
| return xSingleton; |
| } |
| |
| void SAL_CALL SingletonFactory::disposing(css::lang::EventObject const &) |
| throw (css::uno::RuntimeException) |
| { |
| dispose(); |
| } |
| |
| void SingletonFactory::dispose() |
| { |
| css::uno::Reference< css::lang::XComponent > xComponent; |
| { |
| osl::MutexGuard aGuard(m_aMutex); |
| xComponent = css::uno::Reference< css::lang::XComponent >( |
| m_xSingleton, css::uno::UNO_QUERY); |
| m_xSingleton.clear(); |
| m_bDisposed = true; |
| } |
| if (xComponent.is()) |
| xComponent->dispose(); |
| } |
| |
| osl::Mutex SingletonFactory::m_aMutex; |
| css::uno::Reference< css::uno::XInterface > SingletonFactory::m_xSingleton; |
| bool SingletonFactory::m_bDisposed = false; |
| |
| rtl::OUString serviceGetImplementationName() |
| { |
| return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "com.sun.star.comp.stoc.JavaVirtualMachine")); |
| } |
| |
| css::uno::Sequence< rtl::OUString > serviceGetSupportedServiceNames() |
| { |
| rtl::OUString aServiceName( |
| RTL_CONSTASCII_USTRINGPARAM("com.sun.star.java.JavaVirtualMachine")); |
| return css::uno::Sequence< rtl::OUString >(&aServiceName, 1); |
| } |
| |
| css::uno::Reference< css::uno::XInterface > SAL_CALL serviceCreateInstance( |
| css::uno::Reference< css::uno::XComponentContext > const & rContext) |
| SAL_THROW((css::uno::Exception)) |
| { |
| // Only one single instance of this service is ever constructed, and is |
| // available until the component context used to create this instance is |
| // disposed. Afterwards, this function throws a DisposedException (as do |
| // all relevant methods on the single service instance). |
| return SingletonFactory::getSingleton(rContext); |
| } |
| |
| cppu::ImplementationEntry const aServiceImplementation[] |
| = { { serviceCreateInstance, |
| serviceGetImplementationName, |
| serviceGetSupportedServiceNames, |
| cppu::createSingleComponentFactory, |
| 0, 0 }, |
| { 0, 0, 0, 0, 0, 0 } }; |
| |
| typedef std::stack< jvmaccess::VirtualMachine::AttachGuard * > GuardStack; |
| |
| extern "C" { |
| |
| static void destroyAttachGuards(void * pData) |
| { |
| GuardStack * pStack = static_cast< GuardStack * >(pData); |
| if (pStack != 0) |
| { |
| while (!pStack->empty()) |
| { |
| delete pStack->top(); |
| pStack->pop(); |
| } |
| delete pStack; |
| } |
| } |
| |
| } |
| |
| bool askForRetry(css::uno::Any const & rException) |
| { |
| css::uno::Reference< css::uno::XCurrentContext > xContext( |
| css::uno::getCurrentContext()); |
| if (xContext.is()) |
| { |
| css::uno::Reference< css::task::XInteractionHandler > xHandler; |
| xContext->getValueByName(rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "java-vm.interaction-handler"))) |
| >>= xHandler; |
| if (xHandler.is()) |
| { |
| rtl::Reference< stoc_javavm::InteractionRequest > xRequest( |
| new stoc_javavm::InteractionRequest(rException)); |
| xHandler->handle(xRequest.get()); |
| return xRequest->retry(); |
| } |
| } |
| return false; |
| } |
| |
| // Only gets the properties if the "Proxy Server" entry in the option dialog is |
| // set to manual (i.e. not to none) |
| void getINetPropsFromConfig(stoc_javavm::JVM * pjvm, |
| const css::uno::Reference<css::lang::XMultiComponentFactory> & xSMgr, |
| const css::uno::Reference<css::uno::XComponentContext> &xCtx ) throw (css::uno::Exception) |
| { |
| css::uno::Reference<css::uno::XInterface> xConfRegistry = xSMgr->createInstanceWithContext( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.ConfigurationRegistry")), |
| xCtx ); |
| if(!xConfRegistry.is()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("javavm.cxx: couldn't get ConfigurationRegistry")), 0); |
| |
| css::uno::Reference<css::registry::XSimpleRegistry> xConfRegistry_simple(xConfRegistry, css::uno::UNO_QUERY); |
| if(!xConfRegistry_simple.is()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("javavm.cxx: couldn't get ConfigurationRegistry")), 0); |
| |
| xConfRegistry_simple->open(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Inet")), sal_True, sal_False); |
| css::uno::Reference<css::registry::XRegistryKey> xRegistryRootKey = xConfRegistry_simple->getRootKey(); |
| |
| // if ooInetProxyType is not 0 then read the settings |
| css::uno::Reference<css::registry::XRegistryKey> proxyEnable= xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Settings/ooInetProxyType"))); |
| if( proxyEnable.is() && 0 != proxyEnable->getLongValue()) |
| { |
| // read ftp proxy name |
| css::uno::Reference<css::registry::XRegistryKey> ftpProxy_name = xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Settings/ooInetFTPProxyName"))); |
| if(ftpProxy_name.is() && ftpProxy_name->getStringValue().getLength()) { |
| rtl::OUString ftpHost = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ftp.proxyHost=")); |
| ftpHost += ftpProxy_name->getStringValue(); |
| |
| // read ftp proxy port |
| css::uno::Reference<css::registry::XRegistryKey> ftpProxy_port = xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Settings/ooInetFTPProxyPort"))); |
| if(ftpProxy_port.is() && ftpProxy_port->getLongValue()) { |
| rtl::OUString ftpPort = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ftp.proxyPort=")); |
| ftpPort += rtl::OUString::valueOf(ftpProxy_port->getLongValue()); |
| |
| pjvm->pushProp(ftpHost); |
| pjvm->pushProp(ftpPort); |
| } |
| } |
| |
| // read http proxy name |
| css::uno::Reference<css::registry::XRegistryKey> httpProxy_name = xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Settings/ooInetHTTPProxyName"))); |
| if(httpProxy_name.is() && httpProxy_name->getStringValue().getLength()) { |
| rtl::OUString httpHost = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("http.proxyHost=")); |
| httpHost += httpProxy_name->getStringValue(); |
| |
| // read http proxy port |
| css::uno::Reference<css::registry::XRegistryKey> httpProxy_port = xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Settings/ooInetHTTPProxyPort"))); |
| if(httpProxy_port.is() && httpProxy_port->getLongValue()) { |
| rtl::OUString httpPort = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("http.proxyPort=")); |
| httpPort += rtl::OUString::valueOf(httpProxy_port->getLongValue()); |
| |
| pjvm->pushProp(httpHost); |
| pjvm->pushProp(httpPort); |
| } |
| } |
| |
| // read https proxy name |
| css::uno::Reference<css::registry::XRegistryKey> httpsProxy_name = xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Settings/ooInetHTTPSProxyName"))); |
| if(httpsProxy_name.is() && httpsProxy_name->getStringValue().getLength()) { |
| rtl::OUString httpsHost = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("https.proxyHost=")); |
| httpsHost += httpsProxy_name->getStringValue(); |
| |
| // read https proxy port |
| css::uno::Reference<css::registry::XRegistryKey> httpsProxy_port = xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Settings/ooInetHTTPSProxyPort"))); |
| if(httpsProxy_port.is() && httpsProxy_port->getLongValue()) { |
| rtl::OUString httpsPort = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("https.proxyPort=")); |
| httpsPort += rtl::OUString::valueOf(httpsProxy_port->getLongValue()); |
| |
| pjvm->pushProp(httpsHost); |
| pjvm->pushProp(httpsPort); |
| } |
| } |
| |
| // read nonProxyHosts |
| css::uno::Reference<css::registry::XRegistryKey> nonProxies_name = xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Settings/ooInetNoProxy"))); |
| if(nonProxies_name.is() && nonProxies_name->getStringValue().getLength()) { |
| rtl::OUString httpNonProxyHosts = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("http.nonProxyHosts=")); |
| rtl::OUString ftpNonProxyHosts= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ftp.nonProxyHosts=")); |
| rtl::OUString value= nonProxies_name->getStringValue(); |
| // replace the separator ";" by "|" |
| value= value.replace((sal_Unicode)';', (sal_Unicode)'|'); |
| |
| httpNonProxyHosts += value; |
| ftpNonProxyHosts += value; |
| |
| pjvm->pushProp(httpNonProxyHosts); |
| pjvm->pushProp(ftpNonProxyHosts); |
| } |
| |
| // read socks settings |
| /* Reference<XRegistryKey> socksProxy_name = xRegistryRootKey->openKey(OUSTR("Settings/ooInetSOCKSProxyName")); |
| if (socksProxy_name.is() && httpProxy_name->getStringValue().getLength()) { |
| OUString socksHost = OUSTR("socksProxyHost="); |
| socksHost += socksProxy_name->getStringValue(); |
| |
| // read http proxy port |
| Reference<XRegistryKey> socksProxy_port = xRegistryRootKey->openKey(OUSTR("Settings/ooInetSOCKSProxyPort")); |
| if (socksProxy_port.is() && socksProxy_port->getLongValue()) { |
| OUString socksPort = OUSTR("socksProxyPort="); |
| socksPort += OUString::valueOf(socksProxy_port->getLongValue()); |
| |
| pjvm->pushProp(socksHost); |
| pjvm->pushProp(socksPort); |
| } |
| } |
| */ } |
| xConfRegistry_simple->close(); |
| } |
| |
| void getDefaultLocaleFromConfig( |
| stoc_javavm::JVM * pjvm, |
| const css::uno::Reference<css::lang::XMultiComponentFactory> & xSMgr, |
| const css::uno::Reference<css::uno::XComponentContext> &xCtx ) throw(css::uno::Exception) |
| { |
| css::uno::Reference<css::uno::XInterface> xConfRegistry = |
| xSMgr->createInstanceWithContext( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "com.sun.star.configuration.ConfigurationRegistry")), xCtx ); |
| if(!xConfRegistry.is()) |
| throw css::uno::RuntimeException( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("javavm.cxx: couldn't get ConfigurationRegistry")), 0); |
| |
| css::uno::Reference<css::registry::XSimpleRegistry> xConfRegistry_simple( |
| xConfRegistry, css::uno::UNO_QUERY); |
| if(!xConfRegistry_simple.is()) |
| throw css::uno::RuntimeException( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("javavm.cxx: couldn't get ConfigurationRegistry")), 0); |
| |
| xConfRegistry_simple->open(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Setup")), sal_True, sal_False); |
| css::uno::Reference<css::registry::XRegistryKey> xRegistryRootKey = xConfRegistry_simple->getRootKey(); |
| |
| // read locale |
| css::uno::Reference<css::registry::XRegistryKey> locale = xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("L10N/ooLocale"))); |
| if(locale.is() && locale->getStringValue().getLength()) { |
| rtl::OUString language; |
| rtl::OUString country; |
| |
| sal_Int32 index = locale->getStringValue().indexOf((sal_Unicode) '-'); |
| |
| if(index >= 0) { |
| language = locale->getStringValue().copy(0, index); |
| country = locale->getStringValue().copy(index + 1); |
| |
| if(language.getLength()) { |
| rtl::OUString prop(RTL_CONSTASCII_USTRINGPARAM("user.language=")); |
| prop += language; |
| |
| pjvm->pushProp(prop); |
| } |
| |
| if(country.getLength()) { |
| rtl::OUString prop(RTL_CONSTASCII_USTRINGPARAM("user.country=")); |
| prop += country; |
| |
| pjvm->pushProp(prop); |
| } |
| } |
| } |
| |
| xConfRegistry_simple->close(); |
| } |
| |
| |
| |
| void getJavaPropsFromSafetySettings( |
| stoc_javavm::JVM * pjvm, |
| const css::uno::Reference<css::lang::XMultiComponentFactory> & xSMgr, |
| const css::uno::Reference<css::uno::XComponentContext> &xCtx) throw(css::uno::Exception) |
| { |
| css::uno::Reference<css::uno::XInterface> xConfRegistry = |
| xSMgr->createInstanceWithContext( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "com.sun.star.configuration.ConfigurationRegistry")), |
| xCtx); |
| if(!xConfRegistry.is()) |
| throw css::uno::RuntimeException( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("javavm.cxx: couldn't get ConfigurationRegistry")), 0); |
| |
| css::uno::Reference<css::registry::XSimpleRegistry> xConfRegistry_simple( |
| xConfRegistry, css::uno::UNO_QUERY); |
| if(!xConfRegistry_simple.is()) |
| throw css::uno::RuntimeException( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("javavm.cxx: couldn't get ConfigurationRegistry")), 0); |
| |
| xConfRegistry_simple->open( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Office.Java")), |
| sal_True, sal_False); |
| css::uno::Reference<css::registry::XRegistryKey> xRegistryRootKey = |
| xConfRegistry_simple->getRootKey(); |
| |
| if (xRegistryRootKey.is()) |
| { |
| css::uno::Reference<css::registry::XRegistryKey> key_NetAccess= xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VirtualMachine/NetAccess"))); |
| if (key_NetAccess.is()) |
| { |
| sal_Int32 val= key_NetAccess->getLongValue(); |
| rtl::OUString sVal; |
| switch( val) |
| { |
| case 0: sVal= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("host")); |
| break; |
| case 1: sVal= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("unrestricted")); |
| break; |
| case 3: sVal= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("none")); |
| break; |
| } |
| rtl::OUString sProperty( RTL_CONSTASCII_USTRINGPARAM("appletviewer.security.mode=")); |
| sProperty= sProperty + sVal; |
| pjvm->pushProp(sProperty); |
| } |
| css::uno::Reference<css::registry::XRegistryKey> key_CheckSecurity= xRegistryRootKey->openKey( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VirtualMachine/Security"))); |
| if( key_CheckSecurity.is()) |
| { |
| sal_Bool val= (sal_Bool) key_CheckSecurity->getLongValue(); |
| rtl::OUString sProperty(RTL_CONSTASCII_USTRINGPARAM("stardiv.security.disableSecurity=")); |
| if( val) |
| sProperty= sProperty + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("false")); |
| else |
| sProperty= sProperty + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("true")); |
| pjvm->pushProp( sProperty); |
| } |
| } |
| xConfRegistry_simple->close(); |
| } |
| |
| static void setTimeZone(stoc_javavm::JVM * pjvm) throw() { |
| /* A Bug in the Java function |
| ** struct Hjava_util_Properties * java_lang_System_initProperties( |
| ** struct Hjava_lang_System *this, |
| ** struct Hjava_util_Properties *props); |
| ** This function doesn't detect MEZ, MET or "W. Europe Standard Time" |
| */ |
| struct tm *tmData; |
| time_t clock = time(NULL); |
| tzset(); |
| tmData = localtime(&clock); |
| #ifdef MACOSX |
| char * p = tmData->tm_zone; |
| #else |
| char * p = tzname[0]; |
| #endif |
| |
| if (!strcmp(TIMEZONE, p)) |
| pjvm->pushProp(rtl::OUString::createFromAscii("user.timezone=ECT")); |
| } |
| |
| void initVMConfiguration( |
| stoc_javavm::JVM * pjvm, |
| const css::uno::Reference<css::lang::XMultiComponentFactory> & xSMgr, |
| const css::uno::Reference<css::uno::XComponentContext > &xCtx) throw(css::uno::Exception) |
| { |
| stoc_javavm::JVM jvm; |
| try { |
| getINetPropsFromConfig(&jvm, xSMgr, xCtx); |
| } |
| catch(css::uno::Exception & exception) { |
| #if OSL_DEBUG_LEVEL > 1 |
| rtl::OString message = rtl::OUStringToOString(exception.Message, RTL_TEXTENCODING_ASCII_US); |
| OSL_TRACE("javavm.cxx: can not get INetProps cause of >%s<", message.getStr()); |
| #else |
| (void) exception; // unused |
| #endif |
| } |
| |
| try { |
| getDefaultLocaleFromConfig(&jvm, xSMgr,xCtx); |
| } |
| catch(css::uno::Exception & exception) { |
| #if OSL_DEBUG_LEVEL > 1 |
| rtl::OString message = rtl::OUStringToOString(exception.Message, RTL_TEXTENCODING_ASCII_US); |
| OSL_TRACE("javavm.cxx: can not get locale cause of >%s<", message.getStr()); |
| #else |
| (void) exception; // unused |
| #endif |
| } |
| |
| try |
| { |
| getJavaPropsFromSafetySettings(&jvm, xSMgr, xCtx); |
| } |
| catch(css::uno::Exception & exception) { |
| #if OSL_DEBUG_LEVEL > 1 |
| rtl::OString message = rtl::OUStringToOString(exception.Message, RTL_TEXTENCODING_ASCII_US); |
| OSL_TRACE("javavm.cxx: couldn't get safety settings because of >%s<", message.getStr()); |
| #else |
| (void) exception; // unused |
| #endif |
| } |
| |
| *pjvm= jvm; |
| setTimeZone(pjvm); |
| |
| } |
| |
| class DetachCurrentThread { |
| public: |
| explicit DetachCurrentThread(JavaVM * jvm): m_jvm(jvm) {} |
| |
| ~DetachCurrentThread() { |
| if (m_jvm->DetachCurrentThread() != 0) { |
| OSL_ASSERT(false); |
| } |
| } |
| |
| private: |
| DetachCurrentThread(DetachCurrentThread &); // not defined |
| void operator =(DetachCurrentThread &); // not defined |
| |
| JavaVM * m_jvm; |
| }; |
| |
| } |
| |
| extern "C" void SAL_CALL |
| component_getImplementationEnvironment(sal_Char const ** pEnvTypeName, |
| uno_Environment **) |
| { |
| *pEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; |
| } |
| |
| extern "C" void * SAL_CALL component_getFactory(sal_Char const * pImplName, |
| void * pServiceManager, |
| void * pRegistryKey) |
| { |
| return cppu::component_getFactoryHelper(pImplName, pServiceManager, |
| pRegistryKey, |
| aServiceImplementation); |
| } |
| |
| // There is no component_canUnload, as the library cannot be unloaded. |
| |
| JavaVirtualMachine::JavaVirtualMachine( |
| css::uno::Reference< css::uno::XComponentContext > const & rContext): |
| JavaVirtualMachine_Impl(*static_cast< osl::Mutex * >(this)), |
| m_xContext(rContext), |
| m_bDisposed(false), |
| m_pJavaVm(0), |
| m_bDontCreateJvm(false), |
| m_aAttachGuards(destroyAttachGuards) // TODO check for validity |
| {} |
| |
| void SAL_CALL |
| JavaVirtualMachine::initialize(css::uno::Sequence< css::uno::Any > const & |
| rArguments) |
| throw (css::uno::Exception) |
| { |
| osl::MutexGuard aGuard(*this); |
| if (m_bDisposed) |
| throw css::lang::DisposedException( |
| rtl::OUString(), static_cast< cppu::OWeakObject * >(this)); |
| if (m_xUnoVirtualMachine.is()) |
| throw css::uno::RuntimeException( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "bad call to initialize")), |
| static_cast< cppu::OWeakObject * >(this)); |
| css::beans::NamedValue val; |
| if (rArguments.getLength() == 1 && (rArguments[0] >>= val) |
| && val.Name.equalsAsciiL( |
| RTL_CONSTASCII_STRINGPARAM( "UnoVirtualMachine"))) |
| { |
| OSL_ENSURE( |
| sizeof (sal_Int64) >= sizeof (jvmaccess::UnoVirtualMachine *), |
| "Pointer cannot be represented as sal_Int64"); |
| sal_Int64 nPointer = reinterpret_cast< sal_Int64 >( |
| static_cast< jvmaccess::UnoVirtualMachine * >(0)); |
| val.Value >>= nPointer; |
| m_xUnoVirtualMachine = |
| reinterpret_cast< jvmaccess::UnoVirtualMachine * >(nPointer); |
| } else { |
| 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)); |
| if (rArguments.getLength() == 1) |
| rArguments[0] >>= nPointer; |
| rtl::Reference< jvmaccess::VirtualMachine > vm( |
| reinterpret_cast< jvmaccess::VirtualMachine * >(nPointer)); |
| if (vm.is()) { |
| try { |
| m_xUnoVirtualMachine = new jvmaccess::UnoVirtualMachine(vm, 0); |
| } catch (jvmaccess::UnoVirtualMachine::CreationException &) { |
| throw css::uno::RuntimeException( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "jvmaccess::UnoVirtualMachine::CreationException")), |
| static_cast< cppu::OWeakObject * >(this)); |
| } |
| } |
| } |
| if (!m_xUnoVirtualMachine.is()) { |
| throw css::lang::IllegalArgumentException( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "sequence of exactly one any containing either (a) a" |
| " com.sun.star.beans.NamedValue with Name" |
| " \"UnoVirtualMachine\" and Value a hyper representing a" |
| " non-null pointer to a jvmaccess:UnoVirtualMachine, or (b)" |
| " a hyper representing a non-null pointer to a" |
| " jvmaccess::VirtualMachine required")), |
| static_cast< cppu::OWeakObject * >(this), 0); |
| } |
| m_xVirtualMachine = m_xUnoVirtualMachine->getVirtualMachine(); |
| } |
| |
| rtl::OUString SAL_CALL JavaVirtualMachine::getImplementationName() |
| throw (css::uno::RuntimeException) |
| { |
| return serviceGetImplementationName(); |
| } |
| |
| sal_Bool SAL_CALL |
| JavaVirtualMachine::supportsService(rtl::OUString const & rServiceName) |
| throw (css::uno::RuntimeException) |
| { |
| css::uno::Sequence< rtl::OUString > aNames(getSupportedServiceNames()); |
| for (sal_Int32 i = 0; i < aNames.getLength(); ++i) |
| if (aNames[i] == rServiceName) |
| return true; |
| return false; |
| } |
| |
| css::uno::Sequence< rtl::OUString > SAL_CALL |
| JavaVirtualMachine::getSupportedServiceNames() |
| throw (css::uno::RuntimeException) |
| { |
| return serviceGetSupportedServiceNames(); |
| } |
| |
| css::uno::Any SAL_CALL |
| JavaVirtualMachine::getJavaVM(css::uno::Sequence< sal_Int8 > const & rProcessId) |
| throw (css::uno::RuntimeException) |
| { |
| osl::MutexGuard aGuard(*this); |
| if (m_bDisposed) |
| throw css::lang::DisposedException( |
| rtl::OUString(), static_cast< cppu::OWeakObject * >(this)); |
| css::uno::Sequence< sal_Int8 > aId(16); |
| rtl_getGlobalProcessId(reinterpret_cast< sal_uInt8 * >(aId.getArray())); |
| enum ReturnType { |
| RETURN_JAVAVM, RETURN_VIRTUALMACHINE, RETURN_UNOVIRTUALMACHINE }; |
| ReturnType returnType = |
| rProcessId.getLength() == 17 && rProcessId[16] == 0 |
| ? RETURN_VIRTUALMACHINE |
| : rProcessId.getLength() == 17 && rProcessId[16] == 1 |
| ? RETURN_UNOVIRTUALMACHINE |
| : RETURN_JAVAVM; |
| css::uno::Sequence< sal_Int8 > aProcessId(rProcessId); |
| if (returnType != RETURN_JAVAVM) |
| aProcessId.realloc(16); |
| if (aId != aProcessId) |
| return css::uno::Any(); |
| |
| while (!m_xVirtualMachine.is()) // retry until successful |
| { |
| // This is the second attempt to create Java. m_bDontCreateJvm is |
| // set which means instantiating the JVM might crash. |
| if (m_bDontCreateJvm) |
| //throw css::uno::RuntimeException(); |
| return css::uno::Any(); |
| |
| stoc_javavm::JVM aJvm; |
| initVMConfiguration(&aJvm, m_xContext->getServiceManager(), |
| m_xContext); |
| //Create the JavaVMOption array |
| const std::vector<rtl::OUString> & props = aJvm.getProperties(); |
| boost::scoped_array<JavaVMOption> sarOptions( |
| new JavaVMOption[props.size()]); |
| JavaVMOption * arOptions = sarOptions.get(); |
| //Create an array that contains the strings which are passed |
| //into the options |
| boost::scoped_array<rtl::OString> sarPropStrings( |
| new rtl::OString[props.size()]); |
| rtl::OString * arPropStrings = sarPropStrings.get(); |
| |
| rtl::OString sJavaOption("-"); |
| typedef std::vector<rtl::OUString>::const_iterator cit; |
| int index = 0; |
| for (cit i = props.begin(); i != props.end(); i++) |
| { |
| rtl::OString sOption = rtl::OUStringToOString( |
| *i, osl_getThreadTextEncoding()); |
| |
| if (!sOption.matchIgnoreAsciiCase(sJavaOption, 0)) |
| arPropStrings[index]= rtl::OString("-D") + sOption; |
| else |
| arPropStrings[index] = sOption; |
| |
| arOptions[index].optionString = (sal_Char*)arPropStrings[index].getStr(); |
| arOptions[index].extraInfo = 0; |
| index ++; |
| } |
| |
| JNIEnv * pMainThreadEnv = 0; |
| javaFrameworkError errcode = JFW_E_NONE; |
| errcode = jfw_startVM(arOptions, index, & m_pJavaVm, |
| & pMainThreadEnv); |
| |
| bool bStarted = false; |
| switch (errcode) |
| { |
| case JFW_E_NONE: bStarted = true; break; |
| case JFW_E_NO_SELECT: |
| { |
| // No Java configured. We silenty run the java configuration |
| // Java. |
| javaFrameworkError errFind = jfw_findAndSelectJRE( NULL ); |
| if (errFind == JFW_E_NONE) |
| { |
| continue; |
| } |
| else if (errFind == JFW_E_NO_JAVA_FOUND) |
| { |
| |
| //Warning MessageBox: |
| //%PRODUCTNAME requires a Java runtime environment (JRE) to perform this task. |
| //Please install a JRE and restart %PRODUCTNAME. |
| css::java::JavaNotFoundException exc( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "JavaVirtualMachine::getJavaVM failed because" |
| " No suitable JRE found!")), |
| static_cast< cppu::OWeakObject * >(this)); |
| askForRetry(css::uno::makeAny(exc)); |
| return css::uno::Any(); |
| } |
| else |
| { |
| //An unexpected error occurred |
| throw css::uno::RuntimeException( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "[JavaVirtualMachine]:An unexpected error occurred" |
| " while searching for a Java!")), 0); |
| } |
| } |
| case JFW_E_INVALID_SETTINGS: |
| { |
| //Warning MessageBox: |
| // The %PRODUCTNAME configuration has been changed. Under Tools |
| // - Options - %PRODUCTNAME - Java, select the Java runtime environment |
| // you want to have used by %PRODUCTNAME. |
| css::java::InvalidJavaSettingsException exc( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "JavaVirtualMachine::getJavaVM failed because" |
| " Java settings have changed!")), |
| static_cast< cppu::OWeakObject * >(this)); |
| askForRetry(css::uno::makeAny(exc)); |
| return css::uno::Any(); |
| } |
| case JFW_E_JAVA_DISABLED: |
| { |
| //QueryBox: |
| //%PRODUCTNAME requires a Java runtime environment (JRE) to perform |
| //this task. However, use of a JRE has been disabled. Do you want to |
| //enable the use of a JRE now? |
| css::java::JavaDisabledException exc( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "JavaVirtualMachine::getJavaVM failed because" |
| " Java is disabled!")), |
| static_cast< cppu::OWeakObject * >(this)); |
| if( ! askForRetry(css::uno::makeAny(exc))) |
| return css::uno::Any(); |
| continue; |
| } |
| case JFW_E_VM_CREATION_FAILED: |
| { |
| //If the creation failed because the JRE has been uninstalled then |
| //we search another one. As long as there is a javaldx, we should |
| //never come into this situation. javaldx checks alway if the JRE |
| //still exist. |
| JavaInfo * pJavaInfo = NULL; |
| if (JFW_E_NONE == jfw_getSelectedJRE(&pJavaInfo)) |
| { |
| sal_Bool bExist = sal_False; |
| if (JFW_E_NONE == jfw_existJRE(pJavaInfo, &bExist)) |
| { |
| if (bExist == sal_False |
| && ! (pJavaInfo->nRequirements & JFW_REQUIRE_NEEDRESTART)) |
| { |
| javaFrameworkError errFind = jfw_findAndSelectJRE( NULL ); |
| if (errFind == JFW_E_NONE) |
| { |
| continue; |
| } |
| } |
| } |
| } |
| |
| jfw_freeJavaInfo(pJavaInfo); |
| // |
| //Error: %PRODUCTNAME requires a Java |
| //runtime environment (JRE) to perform this task. The selected JRE |
| //is defective. Please select another version or install a new JRE |
| //and select it under Tools - Options - %PRODUCTNAME - Java. |
| css::java::JavaVMCreationFailureException exc( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "JavaVirtualMachine::getJavaVM failed because" |
| " Java is defective!")), |
| static_cast< cppu::OWeakObject * >(this), 0); |
| askForRetry(css::uno::makeAny(exc)); |
| return css::uno::Any(); |
| } |
| case JFW_E_RUNNING_JVM: |
| { |
| //This service should make sure that we do not start java twice. |
| OSL_ASSERT(0); |
| break; |
| } |
| case JFW_E_NEED_RESTART: |
| { |
| //Error: |
| //For the selected Java runtime environment to work properly, |
| //%PRODUCTNAME must be restarted. Please restart %PRODUCTNAME now. |
| css::java::RestartRequiredException exc( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "JavaVirtualMachine::getJavaVM failed because" |
| "Office must be restarted before Java can be used!")), |
| static_cast< cppu::OWeakObject * >(this)); |
| askForRetry(css::uno::makeAny(exc)); |
| return css::uno::Any(); |
| } |
| default: |
| //RuntimeException: error is somewhere in the java framework. |
| //An unexpected error occurred |
| throw css::uno::RuntimeException( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "[JavaVirtualMachine]:An unexpected error occurred" |
| " while starting Java!")), 0); |
| } |
| |
| if (bStarted) |
| { |
| { |
| DetachCurrentThread detach(m_pJavaVm); |
| // necessary to make debugging work; this thread will be |
| // suspended when the destructor of detach returns |
| m_xVirtualMachine = new jvmaccess::VirtualMachine( |
| m_pJavaVm, JNI_VERSION_1_2, true, pMainThreadEnv); |
| setUpUnoVirtualMachine(pMainThreadEnv); |
| } |
| // Listen for changes in the configuration (e.g. proxy settings): |
| // TODO this is done too late; changes to the configuration done |
| // after the above call to initVMConfiguration are lost |
| registerConfigChangesListener(); |
| |
| break; |
| } |
| } |
| if (!m_xUnoVirtualMachine.is()) { |
| try { |
| jvmaccess::VirtualMachine::AttachGuard guard(m_xVirtualMachine); |
| setUpUnoVirtualMachine(guard.getEnvironment()); |
| } catch (jvmaccess::VirtualMachine::AttachGuard::CreationException &) { |
| throw css::uno::RuntimeException( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "jvmaccess::VirtualMachine::AttachGuard::" |
| "CreationException occurred")), |
| static_cast< cppu::OWeakObject * >(this)); |
| } |
| } |
| switch (returnType) { |
| default: // RETURN_JAVAVM |
| if (m_pJavaVm == 0) { |
| throw css::uno::RuntimeException( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "JavaVirtualMachine service was initialized in a way" |
| " that the requested JavaVM pointer is not available")), |
| static_cast< cppu::OWeakObject * >(this)); |
| } |
| return css::uno::makeAny(reinterpret_cast< sal_IntPtr >(m_pJavaVm)); |
| case RETURN_VIRTUALMACHINE: |
| OSL_ASSERT(sizeof (sal_Int64) >= sizeof (jvmaccess::VirtualMachine *)); |
| return css::uno::makeAny( |
| reinterpret_cast< sal_Int64 >( |
| m_xUnoVirtualMachine->getVirtualMachine().get())); |
| case RETURN_UNOVIRTUALMACHINE: |
| OSL_ASSERT(sizeof (sal_Int64) >= sizeof (jvmaccess::VirtualMachine *)); |
| return css::uno::makeAny( |
| reinterpret_cast< sal_Int64 >(m_xUnoVirtualMachine.get())); |
| } |
| } |
| |
| sal_Bool SAL_CALL JavaVirtualMachine::isVMStarted() |
| throw (css::uno::RuntimeException) |
| { |
| osl::MutexGuard aGuard(*this); |
| if (m_bDisposed) |
| throw css::lang::DisposedException( |
| rtl::OUString(), static_cast< cppu::OWeakObject * >(this)); |
| return m_xUnoVirtualMachine.is(); |
| } |
| |
| sal_Bool SAL_CALL JavaVirtualMachine::isVMEnabled() |
| throw (css::uno::RuntimeException) |
| { |
| { |
| osl::MutexGuard aGuard(*this); |
| if (m_bDisposed) |
| throw css::lang::DisposedException( |
| rtl::OUString(), static_cast< cppu::OWeakObject * >(this)); |
| } |
| // stoc_javavm::JVM aJvm; |
| // initVMConfiguration(&aJvm, m_xContext->getServiceManager(), m_xContext); |
| // return aJvm.isEnabled(); |
| //ToDo |
| sal_Bool bEnabled = sal_False; |
| if (jfw_getEnabled( & bEnabled) != JFW_E_NONE) |
| throw css::uno::RuntimeException(); |
| return bEnabled; |
| } |
| |
| sal_Bool SAL_CALL JavaVirtualMachine::isThreadAttached() |
| throw (css::uno::RuntimeException) |
| { |
| osl::MutexGuard aGuard(*this); |
| if (m_bDisposed) |
| throw css::lang::DisposedException( |
| rtl::OUString(), static_cast< cppu::OWeakObject * >(this)); |
| // TODO isThreadAttached only returns true if the thread was attached via |
| // registerThread: |
| GuardStack * pStack |
| = static_cast< GuardStack * >(m_aAttachGuards.getData()); |
| return pStack != 0 && !pStack->empty(); |
| } |
| |
| void SAL_CALL JavaVirtualMachine::registerThread() |
| throw (css::uno::RuntimeException) |
| { |
| osl::MutexGuard aGuard(*this); |
| if (m_bDisposed) |
| throw css::lang::DisposedException( |
| rtl::OUString(), static_cast< cppu::OWeakObject * >(this)); |
| if (!m_xUnoVirtualMachine.is()) |
| throw css::uno::RuntimeException( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "JavaVirtualMachine::registerThread:" |
| " null VirtualMachine")), |
| static_cast< cppu::OWeakObject * >(this)); |
| GuardStack * pStack |
| = static_cast< GuardStack * >(m_aAttachGuards.getData()); |
| if (pStack == 0) |
| { |
| pStack = new GuardStack; |
| m_aAttachGuards.setData(pStack); |
| } |
| try |
| { |
| pStack->push( |
| new jvmaccess::VirtualMachine::AttachGuard( |
| m_xUnoVirtualMachine->getVirtualMachine())); |
| } |
| catch (jvmaccess::VirtualMachine::AttachGuard::CreationException &) |
| { |
| throw css::uno::RuntimeException( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "JavaVirtualMachine::registerThread: jvmaccess::" |
| "VirtualMachine::AttachGuard::CreationException")), |
| static_cast< cppu::OWeakObject * >(this)); |
| } |
| } |
| |
| void SAL_CALL JavaVirtualMachine::revokeThread() |
| throw (css::uno::RuntimeException) |
| { |
| osl::MutexGuard aGuard(*this); |
| if (m_bDisposed) |
| throw css::lang::DisposedException( |
| rtl::OUString(), static_cast< cppu::OWeakObject * >(this)); |
| if (!m_xUnoVirtualMachine.is()) |
| throw css::uno::RuntimeException( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "JavaVirtualMachine::revokeThread:" |
| " null VirtualMachine")), |
| static_cast< cppu::OWeakObject * >(this)); |
| GuardStack * pStack |
| = static_cast< GuardStack * >(m_aAttachGuards.getData()); |
| if (pStack == 0 || pStack->empty()) |
| throw css::uno::RuntimeException( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "JavaVirtualMachine::revokeThread:" |
| " no matching registerThread")), |
| static_cast< cppu::OWeakObject * >(this)); |
| delete pStack->top(); |
| pStack->pop(); |
| } |
| |
| void SAL_CALL |
| JavaVirtualMachine::disposing(css::lang::EventObject const & rSource) |
| throw (css::uno::RuntimeException) |
| { |
| osl::MutexGuard aGuard(*this); |
| if (rSource.Source == m_xInetConfiguration) |
| m_xInetConfiguration.clear(); |
| if (rSource.Source == m_xJavaConfiguration) |
| m_xJavaConfiguration.clear(); |
| } |
| |
| void SAL_CALL JavaVirtualMachine::elementInserted( |
| css::container::ContainerEvent const &) |
| throw (css::uno::RuntimeException) |
| {} |
| |
| void SAL_CALL JavaVirtualMachine::elementRemoved( |
| css::container::ContainerEvent const &) |
| throw (css::uno::RuntimeException) |
| {} |
| |
| // If a user changes the setting, for example for proxy settings, then this |
| // function will be called from the configuration manager. Even if the .xml |
| // file does not contain an entry yet and that entry has to be inserted, this |
| // function will be called. We call java.lang.System.setProperty for the new |
| // values. |
| void SAL_CALL JavaVirtualMachine::elementReplaced( |
| css::container::ContainerEvent const & rEvent) |
| throw (css::uno::RuntimeException) |
| { |
| // TODO Using the new value stored in rEvent is wrong here. If two threads |
| // receive different elementReplaced calls in quick succession, it is |
| // unspecified which changes the JVM's system properties last. A correct |
| // solution must atomically (i.e., protected by a mutex) read the latest |
| // value from the configuration and set it as a system property at the JVM. |
| |
| rtl::OUString aAccessor; |
| rEvent.Accessor >>= aAccessor; |
| rtl::OUString aPropertyName; |
| rtl::OUString aPropertyName2; |
| rtl::OUString aPropertyValue; |
| bool bSecurityChanged = false; |
| if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("ooInetProxyType"))) |
| { |
| // Proxy none, manually |
| sal_Int32 value = 0; |
| rEvent.Element >>= value; |
| setINetSettingsInVM(value != 0); |
| return; |
| } |
| else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM( |
| "ooInetHTTPProxyName"))) |
| { |
| aPropertyName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "http.proxyHost")); |
| rEvent.Element >>= aPropertyValue; |
| } |
| else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM( |
| "ooInetHTTPProxyPort"))) |
| { |
| aPropertyName |
| = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("http.proxyPort")); |
| sal_Int32 n = 0; |
| rEvent.Element >>= n; |
| aPropertyValue = rtl::OUString::valueOf(n); |
| } |
| else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM( |
| "ooInetHTTPSProxyName"))) |
| { |
| aPropertyName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "https.proxyHost")); |
| rEvent.Element >>= aPropertyValue; |
| } |
| else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM( |
| "ooInetHTTPSProxyPort"))) |
| { |
| aPropertyName |
| = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("https.proxyPort")); |
| sal_Int32 n = 0; |
| rEvent.Element >>= n; |
| aPropertyValue = rtl::OUString::valueOf(n); |
| } |
| else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM( |
| "ooInetFTPProxyName"))) |
| { |
| aPropertyName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "ftp.proxyHost")); |
| rEvent.Element >>= aPropertyValue; |
| } |
| else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM( |
| "ooInetFTPProxyPort"))) |
| { |
| aPropertyName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "ftp.proxyPort")); |
| sal_Int32 n = 0; |
| rEvent.Element >>= n; |
| aPropertyValue = rtl::OUString::valueOf(n); |
| } |
| else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM( |
| "ooInetNoProxy"))) |
| { |
| aPropertyName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "http.nonProxyHosts")); |
| aPropertyName2 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "ftp.nonProxyHosts")); |
| rEvent.Element >>= aPropertyValue; |
| aPropertyValue = aPropertyValue.replace(';', '|'); |
| } |
| else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("NetAccess"))) |
| { |
| aPropertyName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "appletviewer.security.mode")); |
| sal_Int32 n = 0; |
| if (rEvent.Element >>= n) |
| switch (n) |
| { |
| case 0: |
| aPropertyValue = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "host")); |
| break; |
| case 1: |
| aPropertyValue = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "unrestricted")); |
| break; |
| case 3: |
| aPropertyValue = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "none")); |
| break; |
| } |
| else |
| return; |
| bSecurityChanged = true; |
| } |
| else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Security"))) |
| { |
| aPropertyName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "stardiv.security.disableSecurity")); |
| sal_Bool b = sal_Bool(); |
| if (rEvent.Element >>= b) |
| if (b) |
| aPropertyValue = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "false")); |
| else |
| aPropertyValue = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "true")); |
| else |
| return; |
| bSecurityChanged = true; |
| } |
| else |
| return; |
| |
| rtl::Reference< jvmaccess::VirtualMachine > xVirtualMachine; |
| { |
| osl::MutexGuard aGuard(*this); |
| if (m_xUnoVirtualMachine.is()) { |
| xVirtualMachine = m_xUnoVirtualMachine->getVirtualMachine(); |
| } |
| } |
| if (xVirtualMachine.is()) |
| { |
| try |
| { |
| jvmaccess::VirtualMachine::AttachGuard aAttachGuard( |
| xVirtualMachine); |
| JNIEnv * pJNIEnv = aAttachGuard.getEnvironment(); |
| |
| // call java.lang.System.setProperty |
| // String setProperty( String key, String value) |
| jclass jcSystem= pJNIEnv->FindClass("java/lang/System"); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:FindClass java/lang/System")), 0); |
| jmethodID jmSetProps= pJNIEnv->GetStaticMethodID( jcSystem, "setProperty","(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetStaticMethodID java.lang.System.setProperty")), 0); |
| |
| jstring jsPropName= pJNIEnv->NewString( aPropertyName.getStr(), aPropertyName.getLength()); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); |
| |
| // remove the property if it does not have a value ( user left the dialog field empty) |
| // or if the port is set to 0 |
| aPropertyValue= aPropertyValue.trim(); |
| if( |
| aPropertyValue.getLength() == 0 || |
| ( |
| ( |
| aPropertyName.equals( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ftp.proxyPort"))) || |
| aPropertyName.equals( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("http.proxyPort"))) /*|| |
| aPropertyName.equals( OUString( RTL_CONSTASCII_USTRINGPARAM("socksProxyPort")))*/ |
| ) && |
| aPropertyValue.equals(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("0"))) |
| ) |
| ) |
| { |
| // call java.lang.System.getProperties |
| jmethodID jmGetProps= pJNIEnv->GetStaticMethodID( jcSystem, "getProperties","()Ljava/util/Properties;"); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetStaticMethodID java.lang.System.getProperties")), 0); |
| jobject joProperties= pJNIEnv->CallStaticObjectMethod( jcSystem, jmGetProps); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.getProperties")), 0); |
| // call java.util.Properties.remove |
| jclass jcProperties= pJNIEnv->FindClass("java/util/Properties"); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:FindClass java/util/Properties")), 0); |
| jmethodID jmRemove= pJNIEnv->GetMethodID( jcProperties, "remove", "(Ljava/lang/Object;)Ljava/lang/Object;"); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetMethodID java.util.Properties.remove")), 0); |
| pJNIEnv->CallObjectMethod( joProperties, jmRemove, jsPropName); |
| |
| // special calse for ftp.nonProxyHosts and http.nonProxyHosts. The office only |
| // has a value for two java properties |
| if (aPropertyName2.getLength() > 0) |
| { |
| jstring jsPropName2= pJNIEnv->NewString( aPropertyName2.getStr(), aPropertyName2.getLength()); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); |
| pJNIEnv->CallObjectMethod( joProperties, jmRemove, jsPropName2); |
| } |
| } |
| else |
| { |
| // Change the Value of the property |
| jstring jsPropValue= pJNIEnv->NewString( aPropertyValue.getStr(), aPropertyValue.getLength()); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); |
| pJNIEnv->CallStaticObjectMethod( jcSystem, jmSetProps, jsPropName, jsPropValue); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.setProperty")), 0); |
| |
| // special calse for ftp.nonProxyHosts and http.nonProxyHosts. The office only |
| // has a value for two java properties |
| if (aPropertyName2.getLength() > 0) |
| { |
| jstring jsPropName2= pJNIEnv->NewString( aPropertyName2.getStr(), aPropertyName2.getLength()); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); |
| jsPropValue= pJNIEnv->NewString( aPropertyValue.getStr(), aPropertyValue.getLength()); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); |
| pJNIEnv->CallStaticObjectMethod( jcSystem, jmSetProps, jsPropName2, jsPropValue); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.setProperty")), 0); |
| } |
| } |
| |
| // If the settings for Security and NetAccess changed then we have to notify the SandboxSecurity |
| // SecurityManager |
| // call System.getSecurityManager() |
| if (bSecurityChanged) |
| { |
| jmethodID jmGetSecur= pJNIEnv->GetStaticMethodID( jcSystem,"getSecurityManager","()Ljava/lang/SecurityManager;"); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetStaticMethodID java.lang.System.getSecurityManager")), 0); |
| jobject joSecur= pJNIEnv->CallStaticObjectMethod( jcSystem, jmGetSecur); |
| if (joSecur != 0) |
| { |
| // Make sure the SecurityManager is our SandboxSecurity |
| // FindClass("com.sun.star.lib.sandbox.SandboxSecurityManager" only worked at the first time |
| // this code was executed. Maybe it is a security feature. However, all attempts to debug the |
| // SandboxSecurity class (maybe the VM invokes checkPackageAccess) failed. |
| // jclass jcSandboxSec= pJNIEnv->FindClass("com.sun.star.lib.sandbox.SandboxSecurity"); |
| // if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUSTR("JNI:FindClass com.sun.star.lib.sandbox.SandboxSecurity"), Reference<XInterface>()); |
| // jboolean bIsSand= pJNIEnv->IsInstanceOf( joSecur, jcSandboxSec); |
| // The SecurityManagers class Name must be com.sun.star.lib.sandbox.SandboxSecurity |
| jclass jcSec= pJNIEnv->GetObjectClass( joSecur); |
| jclass jcClass= pJNIEnv->FindClass("java/lang/Class"); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:FindClass java.lang.Class")), 0); |
| jmethodID jmName= pJNIEnv->GetMethodID( jcClass,"getName","()Ljava/lang/String;"); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetMethodID java.lang.Class.getName")), 0); |
| jstring jsClass= (jstring) pJNIEnv->CallObjectMethod( jcSec, jmName); |
| const jchar* jcharName= pJNIEnv->GetStringChars( jsClass, NULL); |
| rtl::OUString sName( jcharName); |
| jboolean bIsSandbox; |
| if (sName == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.lib.sandbox.SandboxSecurity"))) |
| bIsSandbox= JNI_TRUE; |
| else |
| bIsSandbox= JNI_FALSE; |
| pJNIEnv->ReleaseStringChars( jsClass, jcharName); |
| |
| if (bIsSandbox == JNI_TRUE) |
| { |
| // call SandboxSecurity.reset |
| jmethodID jmReset= pJNIEnv->GetMethodID( jcSec,"reset","()V"); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetMethodID com.sun.star.lib.sandbox.SandboxSecurity.reset")), 0); |
| pJNIEnv->CallVoidMethod( joSecur, jmReset); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallVoidMethod com.sun.star.lib.sandbox.SandboxSecurity.reset")), 0); |
| } |
| } |
| } |
| } |
| catch (jvmaccess::VirtualMachine::AttachGuard::CreationException &) |
| { |
| throw css::uno::RuntimeException( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "jvmaccess::VirtualMachine::AttachGuard::" |
| "CreationException")), |
| 0); |
| } |
| } |
| } |
| |
| JavaVirtualMachine::~JavaVirtualMachine() |
| { |
| if (m_xInetConfiguration.is()) |
| // We should never get here, but just in case... |
| try |
| { |
| m_xInetConfiguration->removeContainerListener(this); |
| } |
| catch (css::uno::Exception &) |
| { |
| OSL_ENSURE(false, "com.sun.star.uno.Exception caught"); |
| } |
| if (m_xJavaConfiguration.is()) |
| // We should never get here, but just in case... |
| try |
| { |
| m_xJavaConfiguration->removeContainerListener(this); |
| } |
| catch (css::uno::Exception &) |
| { |
| OSL_ENSURE(false, "com.sun.star.uno.Exception caught"); |
| } |
| } |
| |
| void SAL_CALL JavaVirtualMachine::disposing() |
| { |
| css::uno::Reference< css::container::XContainer > xContainer1; |
| css::uno::Reference< css::container::XContainer > xContainer2; |
| { |
| osl::MutexGuard aGuard(*this); |
| m_bDisposed = true; |
| xContainer1 = m_xInetConfiguration; |
| m_xInetConfiguration.clear(); |
| xContainer2 = m_xJavaConfiguration; |
| m_xJavaConfiguration.clear(); |
| } |
| if (xContainer1.is()) |
| xContainer1->removeContainerListener(this); |
| if (xContainer2.is()) |
| xContainer2->removeContainerListener(this); |
| } |
| |
| /*We listen to changes in the configuration. For example, the user changes the proxy |
| settings in the options dialog (menu tools). Then we are notified of this change and |
| if the java vm is already running we change the properties (System.lang.System.setProperties) |
| through JNI. |
| To receive notifications this class implements XContainerListener. |
| */ |
| void JavaVirtualMachine::registerConfigChangesListener() |
| { |
| try |
| { |
| css::uno::Reference< css::lang::XMultiServiceFactory > xConfigProvider( |
| m_xContext->getServiceManager()->createInstanceWithContext( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "com.sun.star.configuration.ConfigurationProvider")), m_xContext), css::uno::UNO_QUERY); |
| |
| if (xConfigProvider.is()) |
| { |
| // We register this instance as listener to changes in org.openoffice.Inet/Settings |
| // arguments for ConfigurationAccess |
| css::uno::Sequence< css::uno::Any > aArguments(2); |
| aArguments[0] <<= css::beans::PropertyValue( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("nodepath")), |
| 0, |
| css::uno::makeAny(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Inet/Settings"))), |
| css::beans::PropertyState_DIRECT_VALUE); |
| // depth: -1 means unlimited |
| aArguments[1] <<= css::beans::PropertyValue( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("depth")), |
| 0, |
| css::uno::makeAny( (sal_Int32)-1), |
| css::beans::PropertyState_DIRECT_VALUE); |
| |
| m_xInetConfiguration |
| = css::uno::Reference< css::container::XContainer >( |
| xConfigProvider->createInstanceWithArguments( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "com.sun.star.configuration.ConfigurationAccess")), |
| aArguments), |
| css::uno::UNO_QUERY); |
| |
| if (m_xInetConfiguration.is()) |
| m_xInetConfiguration->addContainerListener(this); |
| |
| // now register as listener to changes in org.openoffice.Java/VirtualMachine |
| css::uno::Sequence< css::uno::Any > aArguments2(2); |
| aArguments2[0] <<= css::beans::PropertyValue( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("nodepath")), |
| 0, |
| css::uno::makeAny(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Office.Java/VirtualMachine"))), |
| css::beans::PropertyState_DIRECT_VALUE); |
| // depth: -1 means unlimited |
| aArguments2[1] <<= css::beans::PropertyValue( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("depth")), |
| 0, |
| css::uno::makeAny( (sal_Int32)-1), |
| css::beans::PropertyState_DIRECT_VALUE); |
| |
| m_xJavaConfiguration |
| = css::uno::Reference< css::container::XContainer >( |
| xConfigProvider->createInstanceWithArguments( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "com.sun.star.configuration.ConfigurationAccess")), |
| aArguments2), |
| css::uno::UNO_QUERY); |
| |
| if (m_xJavaConfiguration.is()) |
| m_xJavaConfiguration->addContainerListener(this); |
| } |
| }catch( css::uno::Exception & e) |
| { |
| #if OSL_DEBUG_LEVEL > 1 |
| rtl::OString message = rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_ASCII_US); |
| OSL_TRACE("javavm.cxx: could not set up listener for Configuration because of >%s<", message.getStr()); |
| #else |
| (void) e; // unused |
| #endif |
| } |
| } |
| |
| // param true: all Inet setting are set as Java Properties on a live VM. |
| // false: the Java net properties are set to empty value. |
| void JavaVirtualMachine::setINetSettingsInVM(bool set_reset) |
| { |
| osl::MutexGuard aGuard(*this); |
| try |
| { |
| if (m_xUnoVirtualMachine.is()) |
| { |
| jvmaccess::VirtualMachine::AttachGuard aAttachGuard( |
| m_xUnoVirtualMachine->getVirtualMachine()); |
| JNIEnv * pJNIEnv = aAttachGuard.getEnvironment(); |
| |
| // The Java Properties |
| rtl::OUString sFtpProxyHost(RTL_CONSTASCII_USTRINGPARAM("ftp.proxyHost") ); |
| rtl::OUString sFtpProxyPort(RTL_CONSTASCII_USTRINGPARAM("ftp.proxyPort") ); |
| rtl::OUString sFtpNonProxyHosts (RTL_CONSTASCII_USTRINGPARAM("ftp.nonProxyHosts")); |
| rtl::OUString sHttpProxyHost(RTL_CONSTASCII_USTRINGPARAM("http.proxyHost") ); |
| rtl::OUString sHttpProxyPort(RTL_CONSTASCII_USTRINGPARAM("http.proxyPort") ); |
| rtl::OUString sHttpNonProxyHosts(RTL_CONSTASCII_USTRINGPARAM("http.nonProxyHosts")); |
| |
| // creat Java Properties as JNI strings |
| jstring jsFtpProxyHost= pJNIEnv->NewString( sFtpProxyHost.getStr(), sFtpProxyHost.getLength()); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); |
| jstring jsFtpProxyPort= pJNIEnv->NewString( sFtpProxyPort.getStr(), sFtpProxyPort.getLength()); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); |
| jstring jsFtpNonProxyHosts= pJNIEnv->NewString( sFtpNonProxyHosts.getStr(), sFtpNonProxyHosts.getLength()); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); |
| jstring jsHttpProxyHost= pJNIEnv->NewString( sHttpProxyHost.getStr(), sHttpProxyHost.getLength()); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); |
| jstring jsHttpProxyPort= pJNIEnv->NewString( sHttpProxyPort.getStr(), sHttpProxyPort.getLength()); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); |
| jstring jsHttpNonProxyHosts= pJNIEnv->NewString( sHttpNonProxyHosts.getStr(), sHttpNonProxyHosts.getLength()); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); |
| |
| // prepare java.lang.System.setProperty |
| jclass jcSystem= pJNIEnv->FindClass("java/lang/System"); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:FindClass java/lang/System")), 0); |
| jmethodID jmSetProps= pJNIEnv->GetStaticMethodID( jcSystem, "setProperty","(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetStaticMethodID java.lang.System.setProperty")), 0); |
| |
| // call java.lang.System.getProperties |
| jmethodID jmGetProps= pJNIEnv->GetStaticMethodID( jcSystem, "getProperties","()Ljava/util/Properties;"); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetStaticMethodID java.lang.System.getProperties")), 0); |
| jobject joProperties= pJNIEnv->CallStaticObjectMethod( jcSystem, jmGetProps); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.getProperties")), 0); |
| // prepare java.util.Properties.remove |
| jclass jcProperties= pJNIEnv->FindClass("java/util/Properties"); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:FindClass java/util/Properties")), 0); |
| |
| if (set_reset) |
| { |
| // Set all network properties with the VM |
| JVM jvm; |
| getINetPropsFromConfig( &jvm, m_xContext->getServiceManager(), m_xContext); |
| const ::std::vector< rtl::OUString> & Props = jvm.getProperties(); |
| typedef ::std::vector< rtl::OUString >::const_iterator C_IT; |
| |
| for( C_IT i= Props.begin(); i != Props.end(); i++) |
| { |
| rtl::OUString prop= *i; |
| sal_Int32 index= prop.indexOf( (sal_Unicode)'='); |
| rtl::OUString propName= prop.copy( 0, index); |
| rtl::OUString propValue= prop.copy( index + 1); |
| |
| if( propName.equals( sFtpProxyHost)) |
| { |
| jstring jsVal= pJNIEnv->NewString( propValue.getStr(), propValue.getLength()); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); |
| pJNIEnv->CallStaticObjectMethod( jcSystem, jmSetProps, jsFtpProxyHost, jsVal); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.setProperty")), 0); |
| } |
| else if( propName.equals( sFtpProxyPort)) |
| { |
| jstring jsVal= pJNIEnv->NewString( propValue.getStr(), propValue.getLength()); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); |
| pJNIEnv->CallStaticObjectMethod( jcSystem, jmSetProps, jsFtpProxyPort, jsVal); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.setProperty")), 0); |
| } |
| else if( propName.equals( sFtpNonProxyHosts)) |
| { |
| jstring jsVal= pJNIEnv->NewString( propValue.getStr(), propValue.getLength()); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); |
| pJNIEnv->CallStaticObjectMethod( jcSystem, jmSetProps, jsFtpNonProxyHosts, jsVal); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.setProperty")), 0); |
| } |
| else if( propName.equals( sHttpProxyHost)) |
| { |
| jstring jsVal= pJNIEnv->NewString( propValue.getStr(), propValue.getLength()); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); |
| pJNIEnv->CallStaticObjectMethod( jcSystem, jmSetProps, jsHttpProxyHost, jsVal); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.setProperty")), 0); |
| } |
| else if( propName.equals( sHttpProxyPort)) |
| { |
| jstring jsVal= pJNIEnv->NewString( propValue.getStr(), propValue.getLength()); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); |
| pJNIEnv->CallStaticObjectMethod( jcSystem, jmSetProps, jsHttpProxyPort, jsVal); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.setProperty")), 0); |
| } |
| else if( propName.equals( sHttpNonProxyHosts)) |
| { |
| jstring jsVal= pJNIEnv->NewString( propValue.getStr(), propValue.getLength()); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); |
| pJNIEnv->CallStaticObjectMethod( jcSystem, jmSetProps, jsHttpNonProxyHosts, jsVal); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.setProperty")), 0); |
| } |
| } |
| } |
| else |
| { |
| // call java.util.Properties.remove |
| jmethodID jmRemove= pJNIEnv->GetMethodID( jcProperties, "remove", "(Ljava/lang/Object;)Ljava/lang/Object;"); |
| if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetMethodID java.util.Property.remove")), 0); |
| pJNIEnv->CallObjectMethod( joProperties, jmRemove, jsFtpProxyHost); |
| pJNIEnv->CallObjectMethod( joProperties, jmRemove, jsFtpProxyPort); |
| pJNIEnv->CallObjectMethod( joProperties, jmRemove, jsFtpNonProxyHosts); |
| pJNIEnv->CallObjectMethod( joProperties, jmRemove, jsHttpProxyHost); |
| pJNIEnv->CallObjectMethod( joProperties, jmRemove, jsHttpProxyPort); |
| pJNIEnv->CallObjectMethod( joProperties, jmRemove, jsHttpNonProxyHosts); |
| } |
| } |
| } |
| catch (css::uno::RuntimeException &) |
| { |
| OSL_ENSURE(false, "RuntimeException"); |
| } |
| catch (jvmaccess::VirtualMachine::AttachGuard::CreationException &) |
| { |
| OSL_ENSURE(false, |
| "jvmaccess::VirtualMachine::AttachGuard::CreationException"); |
| } |
| } |
| |
| void JavaVirtualMachine::setUpUnoVirtualMachine(JNIEnv * environment) { |
| css::uno::Reference< css::util::XMacroExpander > exp; |
| if (!(m_xContext->getValueByName( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "/singletons/com.sun.star.util.theMacroExpander"))) |
| >>= exp) |
| || !exp.is()) |
| { |
| throw css::uno::RuntimeException( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "component context fails to supply singleton" |
| " com.sun.star.util.theMacroExpander of type" |
| " com.sun.star.util.XMacroExpander")), |
| m_xContext); |
| } |
| rtl::OUString baseUrl; |
| try { |
| baseUrl = exp->expandMacros( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM("$URE_INTERNAL_JAVA_DIR/"))); |
| } catch (css::lang::IllegalArgumentException &) { |
| throw css::uno::RuntimeException( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "com::sun::star::lang::IllegalArgumentException")), |
| static_cast< cppu::OWeakObject * >(this)); |
| } |
| rtl::OUString classPath; |
| try { |
| classPath = exp->expandMacros( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM("$URE_INTERNAL_JAVA_CLASSPATH"))); |
| } catch (css::lang::IllegalArgumentException &) {} |
| jclass class_URLClassLoader = environment->FindClass( |
| "java/net/URLClassLoader"); |
| if (class_URLClassLoader == 0) { |
| handleJniException(environment); |
| } |
| jmethodID ctor_URLClassLoader = environment->GetMethodID( |
| class_URLClassLoader, "<init>", "([Ljava/net/URL;)V"); |
| if (ctor_URLClassLoader == 0) { |
| handleJniException(environment); |
| } |
| jclass class_URL = environment->FindClass("java/net/URL"); |
| if (class_URL == 0) { |
| handleJniException(environment); |
| } |
| jmethodID ctor_URL_1 = environment->GetMethodID( |
| class_URL, "<init>", "(Ljava/lang/String;)V"); |
| if (ctor_URL_1 == 0) { |
| handleJniException(environment); |
| } |
| jvalue args[3]; |
| args[0].l = environment->NewString( |
| static_cast< jchar const * >(baseUrl.getStr()), |
| static_cast< jsize >(baseUrl.getLength())); |
| if (args[0].l == 0) { |
| handleJniException(environment); |
| } |
| jobject base = environment->NewObjectA(class_URL, ctor_URL_1, args); |
| if (base == 0) { |
| handleJniException(environment); |
| } |
| jmethodID ctor_URL_2 = environment->GetMethodID( |
| class_URL, "<init>", "(Ljava/net/URL;Ljava/lang/String;)V"); |
| if (ctor_URL_2 == 0) { |
| handleJniException(environment); |
| } |
| jobjectArray classpath = jvmaccess::ClassPath::translateToUrls( |
| m_xContext, environment, classPath); |
| if (classpath == 0) { |
| handleJniException(environment); |
| } |
| args[0].l = base; |
| args[1].l = environment->NewStringUTF("unoloader.jar"); |
| if (args[1].l == 0) { |
| handleJniException(environment); |
| } |
| args[0].l = environment->NewObjectA(class_URL, ctor_URL_2, args); |
| if (args[0].l == 0) { |
| handleJniException(environment); |
| } |
| args[0].l = environment->NewObjectArray(1, class_URL, args[0].l); |
| if (args[0].l == 0) { |
| handleJniException(environment); |
| } |
| jobject cl1 = environment->NewObjectA( |
| class_URLClassLoader, ctor_URLClassLoader, args); |
| if (cl1 == 0) { |
| handleJniException(environment); |
| } |
| jmethodID method_loadClass = environment->GetMethodID( |
| class_URLClassLoader, "loadClass", |
| "(Ljava/lang/String;)Ljava/lang/Class;"); |
| if (method_loadClass == 0) { |
| handleJniException(environment); |
| } |
| args[0].l = environment->NewStringUTF( |
| "com.sun.star.lib.unoloader.UnoClassLoader"); |
| if (args[0].l == 0) { |
| handleJniException(environment); |
| } |
| jclass class_UnoClassLoader = static_cast< jclass >( |
| environment->CallObjectMethodA(cl1, method_loadClass, args)); |
| if (class_UnoClassLoader == 0) { |
| handleJniException(environment); |
| } |
| jmethodID ctor_UnoClassLoader = environment->GetMethodID( |
| class_UnoClassLoader, "<init>", |
| "(Ljava/net/URL;[Ljava/net/URL;Ljava/lang/ClassLoader;)V"); |
| if (ctor_UnoClassLoader == 0) { |
| handleJniException(environment); |
| } |
| args[0].l = base; |
| args[1].l = classpath; |
| args[2].l = cl1; |
| jobject cl2 = environment->NewObjectA( |
| class_UnoClassLoader, ctor_UnoClassLoader, args); |
| if (cl2 == 0) { |
| handleJniException(environment); |
| } |
| try { |
| m_xUnoVirtualMachine = new jvmaccess::UnoVirtualMachine( |
| m_xVirtualMachine, cl2); |
| } catch (jvmaccess::UnoVirtualMachine::CreationException &) { |
| throw css::uno::RuntimeException( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "jvmaccess::UnoVirtualMachine::CreationException")), |
| static_cast< cppu::OWeakObject * >(this)); |
| } |
| } |
| |
| void JavaVirtualMachine::handleJniException(JNIEnv * environment) { |
| environment->ExceptionClear(); |
| throw css::uno::RuntimeException( |
| rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM("JNI exception occurred")), |
| static_cast< cppu::OWeakObject * >(this)); |
| } |