1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_stoc.hxx" 26 27 #include "javavm.hxx" 28 29 #include "interact.hxx" 30 #include "jvmargs.hxx" 31 32 #include "com/sun/star/beans/NamedValue.hpp" 33 #include "com/sun/star/beans/PropertyState.hpp" 34 #include "com/sun/star/beans/PropertyValue.hpp" 35 #include "com/sun/star/container/XContainer.hpp" 36 #include "com/sun/star/java/JavaNotFoundException.hpp" 37 #include "com/sun/star/java/InvalidJavaSettingsException.hpp" 38 #include "com/sun/star/java/RestartRequiredException.hpp" 39 #include "com/sun/star/java/JavaDisabledException.hpp" 40 #include "com/sun/star/java/JavaVMCreationFailureException.hpp" 41 #include "com/sun/star/lang/DisposedException.hpp" 42 #include "com/sun/star/lang/IllegalArgumentException.hpp" 43 #include "com/sun/star/lang/XEventListener.hpp" 44 #include "com/sun/star/lang/XMultiComponentFactory.hpp" 45 #include "com/sun/star/lang/XSingleComponentFactory.hpp" 46 #include "com/sun/star/lang/WrappedTargetRuntimeException.hpp" 47 #include "com/sun/star/registry/XRegistryKey.hpp" 48 #include "com/sun/star/registry/XSimpleRegistry.hpp" 49 #include "com/sun/star/task/XInteractionHandler.hpp" 50 #include "com/sun/star/uno/Exception.hpp" 51 #include "com/sun/star/uno/Reference.hxx" 52 #include "com/sun/star/uno/RuntimeException.hpp" 53 #include "com/sun/star/uno/Sequence.hxx" 54 #include "com/sun/star/uno/XComponentContext.hpp" 55 #include "com/sun/star/uno/XCurrentContext.hpp" 56 #include "com/sun/star/uno/XInterface.hpp" 57 #include "com/sun/star/util/XMacroExpander.hpp" 58 #include "com/sun/star/container/XNameAccess.hpp" 59 #include "cppuhelper/exc_hlp.hxx" 60 #include "cppuhelper/factory.hxx" 61 #include "cppuhelper/implbase1.hxx" 62 #include "cppuhelper/implementationentry.hxx" 63 #include "jvmaccess/classpath.hxx" 64 #include "jvmaccess/unovirtualmachine.hxx" 65 #include "jvmaccess/virtualmachine.hxx" 66 #include "osl/file.hxx" 67 #include "osl/thread.h" 68 #include "rtl/bootstrap.hxx" 69 #include "rtl/process.h" 70 #include "rtl/string.h" 71 #include "rtl/ustrbuf.hxx" 72 #include "rtl/ustring.h" 73 #include "rtl/ustring.hxx" 74 #include "rtl/uri.hxx" 75 #include "sal/types.h" 76 #include "uno/current_context.hxx" 77 #include "uno/environment.h" 78 #include "uno/lbnames.h" 79 #include "jvmfwk/framework.h" 80 #include "jni.h" 81 82 #include <stack> 83 #include <string.h> 84 #include <time.h> 85 #include <memory> 86 #include <vector> 87 #include "boost/scoped_array.hpp" 88 #define OUSTR(x) rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( x )) 89 90 // Properties of the javavm can be put 91 // as a komma separated list in this 92 // environment variable 93 #define PROPERTIES_ENV "OO_JAVA_PROPERTIES" 94 #ifdef UNIX 95 #define INI_FILE "javarc" 96 #ifdef MACOSX 97 #define DEF_JAVALIB "JavaVM.framework" 98 #else 99 #define DEF_JAVALIB "libjvm.so" 100 #endif 101 #define TIMEZONE "MEZ" 102 #else 103 #define INI_FILE "java.ini" 104 #define DEF_JAVALIB "jvm.dll" 105 #define TIMEZONE "MET" 106 #endif 107 108 /* Within this implementation of the com.sun.star.java.JavaVirtualMachine 109 * service and com.sun.star.java.theJavaVirtualMachine singleton, the method 110 * com.sun.star.java.XJavaVM.getJavaVM relies on the following: 111 * 1 The string "$URE_INTERNAL_JAVA_DIR/" is expanded via the 112 * com.sun.star.util.theMacroExpander singleton into an internal (see the 113 * com.sun.star.uri.ExternalUriReferenceTranslator service), hierarchical URI 114 * reference relative to which the URE JAR files can be addressed. 115 * 2 The string "$URE_INTERNAL_JAVA_CLASSPATH" is either not expandable via the 116 * com.sun.star.util.theMacroExpander singleton 117 * (com.sun.star.lang.IllegalArgumentException), or is expanded via the 118 * com.sun.star.util.theMacroExpander singleton into a list of zero or more 119 * internal (see the com.sun.star.uri.ExternalUriReferenceTranslator service) 120 * URIs, where any space characters (U+0020) are ignored (and, in particular, 121 * separate adjacent URIs). 122 * If either of these requirements is not met, getJavaVM raises a 123 * com.sun.star.uno.RuntimeException. 124 */ 125 126 namespace css = com::sun::star; 127 128 using stoc_javavm::JavaVirtualMachine; 129 130 namespace { 131 132 133 134 class NoJavaIniException: public css::uno::Exception 135 { 136 }; 137 138 class SingletonFactory: 139 private cppu::WeakImplHelper1< css::lang::XEventListener > 140 { 141 public: 142 static css::uno::Reference< css::uno::XInterface > getSingleton( 143 css::uno::Reference< css::uno::XComponentContext > const & rContext); 144 145 private: 146 SingletonFactory(SingletonFactory &); // not implemented 147 void operator =(SingletonFactory); // not implemented 148 149 inline SingletonFactory() {} 150 151 virtual inline ~SingletonFactory() {} 152 153 virtual void SAL_CALL disposing(css::lang::EventObject const &); 154 155 static void dispose(); 156 157 // TODO ok to keep these static? 158 static osl::Mutex m_aMutex; 159 static css::uno::Reference< css::uno::XInterface > m_xSingleton; 160 static bool m_bDisposed; 161 }; 162 163 css::uno::Reference< css::uno::XInterface > SingletonFactory::getSingleton( 164 css::uno::Reference< css::uno::XComponentContext > const & rContext) 165 { 166 css::uno::Reference< css::uno::XInterface > xSingleton; 167 css::uno::Reference< css::lang::XComponent > xComponent; 168 { 169 osl::MutexGuard aGuard(m_aMutex); 170 if (!m_xSingleton.is()) 171 { 172 if (m_bDisposed) 173 throw css::lang::DisposedException(); 174 xComponent = css::uno::Reference< css::lang::XComponent >( 175 rContext, css::uno::UNO_QUERY_THROW); 176 m_xSingleton = static_cast< cppu::OWeakObject * >( 177 new JavaVirtualMachine(rContext)); 178 } 179 xSingleton = m_xSingleton; 180 } 181 if (xComponent.is()) 182 try 183 { 184 xComponent->addEventListener(new SingletonFactory); 185 } 186 catch (...) 187 { 188 dispose(); 189 throw; 190 } 191 return xSingleton; 192 } 193 194 void SAL_CALL SingletonFactory::disposing(css::lang::EventObject const &) 195 { 196 dispose(); 197 } 198 199 void SingletonFactory::dispose() 200 { 201 css::uno::Reference< css::lang::XComponent > xComponent; 202 { 203 osl::MutexGuard aGuard(m_aMutex); 204 xComponent = css::uno::Reference< css::lang::XComponent >( 205 m_xSingleton, css::uno::UNO_QUERY); 206 m_xSingleton.clear(); 207 m_bDisposed = true; 208 } 209 if (xComponent.is()) 210 xComponent->dispose(); 211 } 212 213 osl::Mutex SingletonFactory::m_aMutex; 214 css::uno::Reference< css::uno::XInterface > SingletonFactory::m_xSingleton; 215 bool SingletonFactory::m_bDisposed = false; 216 217 rtl::OUString serviceGetImplementationName() 218 { 219 return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 220 "com.sun.star.comp.stoc.JavaVirtualMachine")); 221 } 222 223 css::uno::Sequence< rtl::OUString > serviceGetSupportedServiceNames() 224 { 225 rtl::OUString aServiceName( 226 RTL_CONSTASCII_USTRINGPARAM("com.sun.star.java.JavaVirtualMachine")); 227 return css::uno::Sequence< rtl::OUString >(&aServiceName, 1); 228 } 229 230 css::uno::Reference< css::uno::XInterface > SAL_CALL serviceCreateInstance( 231 css::uno::Reference< css::uno::XComponentContext > const & rContext) 232 { 233 // Only one single instance of this service is ever constructed, and is 234 // available until the component context used to create this instance is 235 // disposed. Afterwards, this function throws a DisposedException (as do 236 // all relevant methods on the single service instance). 237 return SingletonFactory::getSingleton(rContext); 238 } 239 240 cppu::ImplementationEntry const aServiceImplementation[] 241 = { { serviceCreateInstance, 242 serviceGetImplementationName, 243 serviceGetSupportedServiceNames, 244 cppu::createSingleComponentFactory, 245 0, 0 }, 246 { 0, 0, 0, 0, 0, 0 } }; 247 248 typedef std::stack< jvmaccess::VirtualMachine::AttachGuard * > GuardStack; 249 250 extern "C" { 251 252 static void destroyAttachGuards(void * pData) 253 { 254 GuardStack * pStack = static_cast< GuardStack * >(pData); 255 if (pStack != 0) 256 { 257 while (!pStack->empty()) 258 { 259 delete pStack->top(); 260 pStack->pop(); 261 } 262 delete pStack; 263 } 264 } 265 266 } 267 268 bool askForRetry(css::uno::Any const & rException) 269 { 270 css::uno::Reference< css::uno::XCurrentContext > xContext( 271 css::uno::getCurrentContext()); 272 if (xContext.is()) 273 { 274 css::uno::Reference< css::task::XInteractionHandler > xHandler; 275 xContext->getValueByName(rtl::OUString( 276 RTL_CONSTASCII_USTRINGPARAM( 277 "java-vm.interaction-handler"))) 278 >>= xHandler; 279 if (xHandler.is()) 280 { 281 rtl::Reference< stoc_javavm::InteractionRequest > xRequest( 282 new stoc_javavm::InteractionRequest(rException)); 283 xHandler->handle(xRequest.get()); 284 return xRequest->retry(); 285 } 286 } 287 return false; 288 } 289 290 // Only gets the properties if the "Proxy Server" entry in the option dialog is 291 // set to manual (i.e. not to none) 292 void getINetPropsFromConfig(stoc_javavm::JVM * pjvm, 293 const css::uno::Reference<css::lang::XMultiComponentFactory> & xSMgr, 294 const css::uno::Reference<css::uno::XComponentContext> &xCtx ) 295 { 296 css::uno::Reference<css::uno::XInterface> xConfRegistry = xSMgr->createInstanceWithContext( 297 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.ConfigurationRegistry")), 298 xCtx ); 299 if(!xConfRegistry.is()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("javavm.cxx: couldn't get ConfigurationRegistry")), 0); 300 301 css::uno::Reference<css::registry::XSimpleRegistry> xConfRegistry_simple(xConfRegistry, css::uno::UNO_QUERY); 302 if(!xConfRegistry_simple.is()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("javavm.cxx: couldn't get ConfigurationRegistry")), 0); 303 304 xConfRegistry_simple->open(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Inet")), sal_True, sal_False); 305 css::uno::Reference<css::registry::XRegistryKey> xRegistryRootKey = xConfRegistry_simple->getRootKey(); 306 307 // if ooInetProxyType is not 0 then read the settings 308 css::uno::Reference<css::registry::XRegistryKey> proxyEnable= xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Settings/ooInetProxyType"))); 309 if( proxyEnable.is() && 0 != proxyEnable->getLongValue()) 310 { 311 // read ftp proxy name 312 css::uno::Reference<css::registry::XRegistryKey> ftpProxy_name = xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Settings/ooInetFTPProxyName"))); 313 if(ftpProxy_name.is() && ftpProxy_name->getStringValue().getLength()) { 314 rtl::OUString ftpHost = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ftp.proxyHost=")); 315 ftpHost += ftpProxy_name->getStringValue(); 316 317 // read ftp proxy port 318 css::uno::Reference<css::registry::XRegistryKey> ftpProxy_port = xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Settings/ooInetFTPProxyPort"))); 319 if(ftpProxy_port.is() && ftpProxy_port->getLongValue()) { 320 rtl::OUString ftpPort = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ftp.proxyPort=")); 321 ftpPort += rtl::OUString::valueOf(ftpProxy_port->getLongValue()); 322 323 pjvm->pushProp(ftpHost); 324 pjvm->pushProp(ftpPort); 325 } 326 } 327 328 // read http proxy name 329 css::uno::Reference<css::registry::XRegistryKey> httpProxy_name = xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Settings/ooInetHTTPProxyName"))); 330 if(httpProxy_name.is() && httpProxy_name->getStringValue().getLength()) { 331 rtl::OUString httpHost = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("http.proxyHost=")); 332 httpHost += httpProxy_name->getStringValue(); 333 334 // read http proxy port 335 css::uno::Reference<css::registry::XRegistryKey> httpProxy_port = xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Settings/ooInetHTTPProxyPort"))); 336 if(httpProxy_port.is() && httpProxy_port->getLongValue()) { 337 rtl::OUString httpPort = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("http.proxyPort=")); 338 httpPort += rtl::OUString::valueOf(httpProxy_port->getLongValue()); 339 340 pjvm->pushProp(httpHost); 341 pjvm->pushProp(httpPort); 342 } 343 } 344 345 // read https proxy name 346 css::uno::Reference<css::registry::XRegistryKey> httpsProxy_name = xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Settings/ooInetHTTPSProxyName"))); 347 if(httpsProxy_name.is() && httpsProxy_name->getStringValue().getLength()) { 348 rtl::OUString httpsHost = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("https.proxyHost=")); 349 httpsHost += httpsProxy_name->getStringValue(); 350 351 // read https proxy port 352 css::uno::Reference<css::registry::XRegistryKey> httpsProxy_port = xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Settings/ooInetHTTPSProxyPort"))); 353 if(httpsProxy_port.is() && httpsProxy_port->getLongValue()) { 354 rtl::OUString httpsPort = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("https.proxyPort=")); 355 httpsPort += rtl::OUString::valueOf(httpsProxy_port->getLongValue()); 356 357 pjvm->pushProp(httpsHost); 358 pjvm->pushProp(httpsPort); 359 } 360 } 361 362 // read nonProxyHosts 363 css::uno::Reference<css::registry::XRegistryKey> nonProxies_name = xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Settings/ooInetNoProxy"))); 364 if(nonProxies_name.is() && nonProxies_name->getStringValue().getLength()) { 365 rtl::OUString httpNonProxyHosts = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("http.nonProxyHosts=")); 366 rtl::OUString ftpNonProxyHosts= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ftp.nonProxyHosts=")); 367 rtl::OUString value= nonProxies_name->getStringValue(); 368 // replace the separator ";" by "|" 369 value= value.replace((sal_Unicode)';', (sal_Unicode)'|'); 370 371 httpNonProxyHosts += value; 372 ftpNonProxyHosts += value; 373 374 pjvm->pushProp(httpNonProxyHosts); 375 pjvm->pushProp(ftpNonProxyHosts); 376 } 377 378 // read socks settings 379 /* Reference<XRegistryKey> socksProxy_name = xRegistryRootKey->openKey(OUSTR("Settings/ooInetSOCKSProxyName")); 380 if (socksProxy_name.is() && httpProxy_name->getStringValue().getLength()) { 381 OUString socksHost = OUSTR("socksProxyHost="); 382 socksHost += socksProxy_name->getStringValue(); 383 384 // read http proxy port 385 Reference<XRegistryKey> socksProxy_port = xRegistryRootKey->openKey(OUSTR("Settings/ooInetSOCKSProxyPort")); 386 if (socksProxy_port.is() && socksProxy_port->getLongValue()) { 387 OUString socksPort = OUSTR("socksProxyPort="); 388 socksPort += OUString::valueOf(socksProxy_port->getLongValue()); 389 390 pjvm->pushProp(socksHost); 391 pjvm->pushProp(socksPort); 392 } 393 } 394 */ } 395 xConfRegistry_simple->close(); 396 } 397 398 void getDefaultLocaleFromConfig( 399 stoc_javavm::JVM * pjvm, 400 const css::uno::Reference<css::lang::XMultiComponentFactory> & xSMgr, 401 const css::uno::Reference<css::uno::XComponentContext> &xCtx ) 402 { 403 css::uno::Reference<css::uno::XInterface> xConfRegistry = 404 xSMgr->createInstanceWithContext( 405 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 406 "com.sun.star.configuration.ConfigurationRegistry")), xCtx ); 407 if(!xConfRegistry.is()) 408 throw css::uno::RuntimeException( 409 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("javavm.cxx: couldn't get ConfigurationRegistry")), 0); 410 411 css::uno::Reference<css::registry::XSimpleRegistry> xConfRegistry_simple( 412 xConfRegistry, css::uno::UNO_QUERY); 413 if(!xConfRegistry_simple.is()) 414 throw css::uno::RuntimeException( 415 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("javavm.cxx: couldn't get ConfigurationRegistry")), 0); 416 417 xConfRegistry_simple->open(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Setup")), sal_True, sal_False); 418 css::uno::Reference<css::registry::XRegistryKey> xRegistryRootKey = xConfRegistry_simple->getRootKey(); 419 420 // read locale 421 css::uno::Reference<css::registry::XRegistryKey> ooLocale = xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("L10N/ooLocale"))); 422 css::uno::Reference<css::registry::XRegistryKey> ooSetupSystemLocale = xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("L10N/ooSetupSystemLocale"))); 423 if(ooLocale.is() && ooLocale->getStringValue().getLength()) { 424 rtl::OUString language; 425 sal_Int32 index = ooLocale->getStringValue().indexOf((sal_Unicode) '-'); 426 if(index >= 0) { 427 language = ooLocale->getStringValue().copy(0, index); 428 } else { 429 language = ooLocale->getStringValue(); 430 } 431 if(language.getLength()) { 432 rtl::OUString prop(RTL_CONSTASCII_USTRINGPARAM("user.language=")); 433 prop += language; 434 pjvm->pushProp(prop); 435 } 436 } 437 if(ooSetupSystemLocale.is() && ooSetupSystemLocale->getStringValue().getLength()) { 438 sal_Int32 index = ooSetupSystemLocale->getStringValue().indexOf((sal_Unicode) '-'); 439 if(index >= 0) { 440 rtl::OUString country = ooSetupSystemLocale->getStringValue().copy(index + 1); 441 if(country.getLength()) { 442 rtl::OUString prop(RTL_CONSTASCII_USTRINGPARAM("user.country=")); 443 prop += country; 444 pjvm->pushProp(prop); 445 } 446 } 447 } 448 449 xConfRegistry_simple->close(); 450 } 451 452 453 454 void getJavaPropsFromSafetySettings( 455 stoc_javavm::JVM * pjvm, 456 const css::uno::Reference<css::lang::XMultiComponentFactory> & xSMgr, 457 const css::uno::Reference<css::uno::XComponentContext> &xCtx) 458 { 459 css::uno::Reference<css::uno::XInterface> xConfRegistry = 460 xSMgr->createInstanceWithContext( 461 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 462 "com.sun.star.configuration.ConfigurationRegistry")), 463 xCtx); 464 if(!xConfRegistry.is()) 465 throw css::uno::RuntimeException( 466 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("javavm.cxx: couldn't get ConfigurationRegistry")), 0); 467 468 css::uno::Reference<css::registry::XSimpleRegistry> xConfRegistry_simple( 469 xConfRegistry, css::uno::UNO_QUERY); 470 if(!xConfRegistry_simple.is()) 471 throw css::uno::RuntimeException( 472 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("javavm.cxx: couldn't get ConfigurationRegistry")), 0); 473 474 xConfRegistry_simple->open( 475 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Office.Java")), 476 sal_True, sal_False); 477 css::uno::Reference<css::registry::XRegistryKey> xRegistryRootKey = 478 xConfRegistry_simple->getRootKey(); 479 480 if (xRegistryRootKey.is()) 481 { 482 css::uno::Reference<css::registry::XRegistryKey> key_NetAccess= xRegistryRootKey->openKey(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VirtualMachine/NetAccess"))); 483 if (key_NetAccess.is()) 484 { 485 sal_Int32 val= key_NetAccess->getLongValue(); 486 rtl::OUString sVal; 487 switch( val) 488 { 489 case 0: sVal= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("host")); 490 break; 491 case 1: sVal= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("unrestricted")); 492 break; 493 case 3: sVal= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("none")); 494 break; 495 } 496 rtl::OUString sProperty( RTL_CONSTASCII_USTRINGPARAM("appletviewer.security.mode=")); 497 sProperty= sProperty + sVal; 498 pjvm->pushProp(sProperty); 499 } 500 css::uno::Reference<css::registry::XRegistryKey> key_CheckSecurity= xRegistryRootKey->openKey( 501 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VirtualMachine/Security"))); 502 if( key_CheckSecurity.is()) 503 { 504 sal_Bool val= (sal_Bool) key_CheckSecurity->getLongValue(); 505 rtl::OUString sProperty(RTL_CONSTASCII_USTRINGPARAM("stardiv.security.disableSecurity=")); 506 if( val) 507 sProperty= sProperty + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("false")); 508 else 509 sProperty= sProperty + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("true")); 510 pjvm->pushProp( sProperty); 511 } 512 } 513 xConfRegistry_simple->close(); 514 } 515 516 static void setTimeZone(stoc_javavm::JVM * pjvm) throw() { 517 /* A Bug in the Java function 518 ** struct Hjava_util_Properties * java_lang_System_initProperties( 519 ** struct Hjava_lang_System *this, 520 ** struct Hjava_util_Properties *props); 521 ** This function doesn't detect MEZ, MET or "W. Europe Standard Time" 522 */ 523 struct tm *tmData; 524 time_t clock = time(NULL); 525 tzset(); 526 tmData = localtime(&clock); 527 #ifdef MACOSX 528 char * p = tmData->tm_zone; 529 #elif defined(_MSC_VER) && (_MSC_VER >= 1900) 530 /* The UCRT declares only the underscore spelling; the POSIX name was 531 removed. glibc and VC9 keep it, so the branch below stays live. */ 532 char * p = _tzname[0]; 533 #else 534 char * p = tzname[0]; 535 #endif 536 537 if (!strcmp(TIMEZONE, p)) 538 pjvm->pushProp(rtl::OUString::createFromAscii("user.timezone=ECT")); 539 } 540 541 void initVMConfiguration( 542 stoc_javavm::JVM * pjvm, 543 const css::uno::Reference<css::lang::XMultiComponentFactory> & xSMgr, 544 const css::uno::Reference<css::uno::XComponentContext > &xCtx) 545 { 546 stoc_javavm::JVM jvm; 547 try { 548 getINetPropsFromConfig(&jvm, xSMgr, xCtx); 549 } 550 catch(css::uno::Exception & exception) { 551 #if OSL_DEBUG_LEVEL > 1 552 rtl::OString message = rtl::OUStringToOString(exception.Message, RTL_TEXTENCODING_ASCII_US); 553 OSL_TRACE("javavm.cxx: can not get INetProps cause of >%s<", message.getStr()); 554 #else 555 (void) exception; // unused 556 #endif 557 } 558 559 try { 560 getDefaultLocaleFromConfig(&jvm, xSMgr,xCtx); 561 } 562 catch(css::uno::Exception & exception) { 563 #if OSL_DEBUG_LEVEL > 1 564 rtl::OString message = rtl::OUStringToOString(exception.Message, RTL_TEXTENCODING_ASCII_US); 565 OSL_TRACE("javavm.cxx: can not get locale cause of >%s<", message.getStr()); 566 #else 567 (void) exception; // unused 568 #endif 569 } 570 571 try 572 { 573 getJavaPropsFromSafetySettings(&jvm, xSMgr, xCtx); 574 } 575 catch(css::uno::Exception & exception) { 576 #if OSL_DEBUG_LEVEL > 1 577 rtl::OString message = rtl::OUStringToOString(exception.Message, RTL_TEXTENCODING_ASCII_US); 578 OSL_TRACE("javavm.cxx: couldn't get safety settings because of >%s<", message.getStr()); 579 #else 580 (void) exception; // unused 581 #endif 582 } 583 584 *pjvm= jvm; 585 setTimeZone(pjvm); 586 587 } 588 589 class DetachCurrentThread { 590 public: 591 explicit DetachCurrentThread(JavaVM * jvm): m_jvm(jvm) {} 592 593 ~DetachCurrentThread() { 594 if (m_jvm->DetachCurrentThread() != 0) { 595 OSL_ASSERT(false); 596 } 597 } 598 599 private: 600 DetachCurrentThread(DetachCurrentThread &); // not defined 601 void operator =(DetachCurrentThread &); // not defined 602 603 JavaVM * m_jvm; 604 }; 605 606 } 607 608 extern "C" void SAL_CALL 609 component_getImplementationEnvironment(sal_Char const ** pEnvTypeName, 610 uno_Environment **) 611 { 612 *pEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; 613 } 614 615 extern "C" void * SAL_CALL component_getFactory(sal_Char const * pImplName, 616 void * pServiceManager, 617 void * pRegistryKey) 618 { 619 return cppu::component_getFactoryHelper(pImplName, pServiceManager, 620 pRegistryKey, 621 aServiceImplementation); 622 } 623 624 // There is no component_canUnload, as the library cannot be unloaded. 625 626 JavaVirtualMachine::JavaVirtualMachine( 627 css::uno::Reference< css::uno::XComponentContext > const & rContext): 628 JavaVirtualMachine_Impl(*static_cast< osl::Mutex * >(this)), 629 m_xContext(rContext), 630 m_bDisposed(false), 631 m_pJavaVm(0), 632 m_bDontCreateJvm(false), 633 m_aAttachGuards(destroyAttachGuards) // TODO check for validity 634 {} 635 636 void SAL_CALL 637 JavaVirtualMachine::initialize(css::uno::Sequence< css::uno::Any > const & 638 rArguments) 639 { 640 osl::MutexGuard aGuard(*this); 641 if (m_bDisposed) 642 throw css::lang::DisposedException( 643 rtl::OUString(), static_cast< cppu::OWeakObject * >(this)); 644 if (m_xUnoVirtualMachine.is()) 645 throw css::uno::RuntimeException( 646 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 647 "bad call to initialize")), 648 static_cast< cppu::OWeakObject * >(this)); 649 css::beans::NamedValue val; 650 if (rArguments.getLength() == 1 && (rArguments[0] >>= val) 651 && val.Name.equalsAsciiL( 652 RTL_CONSTASCII_STRINGPARAM( "UnoVirtualMachine"))) 653 { 654 OSL_ENSURE( 655 sizeof (sal_Int64) >= sizeof (jvmaccess::UnoVirtualMachine *), 656 "Pointer cannot be represented as sal_Int64"); 657 sal_Int64 nPointer = reinterpret_cast< sal_Int64 >( 658 static_cast< jvmaccess::UnoVirtualMachine * >(0)); 659 val.Value >>= nPointer; 660 m_xUnoVirtualMachine = 661 reinterpret_cast< jvmaccess::UnoVirtualMachine * >(nPointer); 662 } else { 663 OSL_ENSURE( 664 sizeof (sal_Int64) >= sizeof (jvmaccess::VirtualMachine *), 665 "Pointer cannot be represented as sal_Int64"); 666 sal_Int64 nPointer = reinterpret_cast< sal_Int64 >( 667 static_cast< jvmaccess::VirtualMachine * >(0)); 668 if (rArguments.getLength() == 1) 669 rArguments[0] >>= nPointer; 670 rtl::Reference< jvmaccess::VirtualMachine > vm( 671 reinterpret_cast< jvmaccess::VirtualMachine * >(nPointer)); 672 if (vm.is()) { 673 try { 674 m_xUnoVirtualMachine = new jvmaccess::UnoVirtualMachine(vm, 0); 675 } catch (jvmaccess::UnoVirtualMachine::CreationException &) { 676 throw css::uno::RuntimeException( 677 rtl::OUString( 678 RTL_CONSTASCII_USTRINGPARAM( 679 "jvmaccess::UnoVirtualMachine::CreationException")), 680 static_cast< cppu::OWeakObject * >(this)); 681 } 682 } 683 } 684 if (!m_xUnoVirtualMachine.is()) { 685 throw css::lang::IllegalArgumentException( 686 rtl::OUString( 687 RTL_CONSTASCII_USTRINGPARAM( 688 "sequence of exactly one any containing either (a) a" 689 " com.sun.star.beans.NamedValue with Name" 690 " \"UnoVirtualMachine\" and Value a hyper representing a" 691 " non-null pointer to a jvmaccess:UnoVirtualMachine, or (b)" 692 " a hyper representing a non-null pointer to a" 693 " jvmaccess::VirtualMachine required")), 694 static_cast< cppu::OWeakObject * >(this), 0); 695 } 696 m_xVirtualMachine = m_xUnoVirtualMachine->getVirtualMachine(); 697 } 698 699 rtl::OUString SAL_CALL JavaVirtualMachine::getImplementationName() 700 { 701 return serviceGetImplementationName(); 702 } 703 704 sal_Bool SAL_CALL 705 JavaVirtualMachine::supportsService(rtl::OUString const & rServiceName) 706 { 707 css::uno::Sequence< rtl::OUString > aNames(getSupportedServiceNames()); 708 for (sal_Int32 i = 0; i < aNames.getLength(); ++i) 709 if (aNames[i] == rServiceName) 710 return true; 711 return false; 712 } 713 714 css::uno::Sequence< rtl::OUString > SAL_CALL 715 JavaVirtualMachine::getSupportedServiceNames() 716 { 717 return serviceGetSupportedServiceNames(); 718 } 719 720 css::uno::Any SAL_CALL 721 JavaVirtualMachine::getJavaVM(css::uno::Sequence< sal_Int8 > const & rProcessId) 722 { 723 osl::MutexGuard aGuard(*this); 724 if (m_bDisposed) 725 throw css::lang::DisposedException( 726 rtl::OUString(), static_cast< cppu::OWeakObject * >(this)); 727 css::uno::Sequence< sal_Int8 > aId(16); 728 rtl_getGlobalProcessId(reinterpret_cast< sal_uInt8 * >(aId.getArray())); 729 enum ReturnType { 730 RETURN_JAVAVM, RETURN_VIRTUALMACHINE, RETURN_UNOVIRTUALMACHINE }; 731 ReturnType returnType = 732 rProcessId.getLength() == 17 && rProcessId[16] == 0 733 ? RETURN_VIRTUALMACHINE 734 : rProcessId.getLength() == 17 && rProcessId[16] == 1 735 ? RETURN_UNOVIRTUALMACHINE 736 : RETURN_JAVAVM; 737 css::uno::Sequence< sal_Int8 > aProcessId(rProcessId); 738 if (returnType != RETURN_JAVAVM) 739 aProcessId.realloc(16); 740 if (aId != aProcessId) 741 return css::uno::Any(); 742 743 while (!m_xVirtualMachine.is()) // retry until successful 744 { 745 // This is the second attempt to create Java. m_bDontCreateJvm is 746 // set which means instantiating the JVM might crash. 747 if (m_bDontCreateJvm) 748 //throw css::uno::RuntimeException(); 749 return css::uno::Any(); 750 751 stoc_javavm::JVM aJvm; 752 initVMConfiguration(&aJvm, m_xContext->getServiceManager(), 753 m_xContext); 754 //Create the JavaVMOption array 755 const std::vector<rtl::OUString> & props = aJvm.getProperties(); 756 boost::scoped_array<JavaVMOption> sarOptions( 757 new JavaVMOption[props.size()]); 758 JavaVMOption * arOptions = sarOptions.get(); 759 //Create an array that contains the strings which are passed 760 //into the options 761 boost::scoped_array<rtl::OString> sarPropStrings( 762 new rtl::OString[props.size()]); 763 rtl::OString * arPropStrings = sarPropStrings.get(); 764 765 rtl::OString sJavaOption("-"); 766 typedef std::vector<rtl::OUString>::const_iterator cit; 767 int index = 0; 768 for (cit i = props.begin(); i != props.end(); i++) 769 { 770 rtl::OString sOption = rtl::OUStringToOString( 771 *i, osl_getThreadTextEncoding()); 772 773 if (!sOption.matchIgnoreAsciiCase(sJavaOption, 0)) 774 arPropStrings[index]= rtl::OString("-D") + sOption; 775 else 776 arPropStrings[index] = sOption; 777 778 arOptions[index].optionString = (sal_Char*)arPropStrings[index].getStr(); 779 arOptions[index].extraInfo = 0; 780 index ++; 781 } 782 783 JNIEnv * pMainThreadEnv = 0; 784 javaFrameworkError errcode = JFW_E_NONE; 785 errcode = jfw_startVM(arOptions, index, & m_pJavaVm, 786 & pMainThreadEnv); 787 788 bool bStarted = false; 789 switch (errcode) 790 { 791 case JFW_E_NONE: bStarted = true; break; 792 case JFW_E_NO_SELECT: 793 { 794 // No Java configured. We silenty run the java configuration 795 // Java. 796 javaFrameworkError errFind = jfw_findAndSelectJRE( NULL ); 797 if (errFind == JFW_E_NONE) 798 { 799 continue; 800 } 801 else if (errFind == JFW_E_NO_JAVA_FOUND) 802 { 803 804 //Warning MessageBox: 805 //%PRODUCTNAME requires a Java runtime environment (JRE) to perform this task. 806 //Please install a JRE and restart %PRODUCTNAME. 807 css::java::JavaNotFoundException exc( 808 rtl::OUString( 809 RTL_CONSTASCII_USTRINGPARAM( 810 "JavaVirtualMachine::getJavaVM failed because" 811 " No suitable JRE found!")), 812 static_cast< cppu::OWeakObject * >(this)); 813 askForRetry(css::uno::makeAny(exc)); 814 return css::uno::Any(); 815 } 816 else 817 { 818 //An unexpected error occurred 819 throw css::uno::RuntimeException( 820 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 821 "[JavaVirtualMachine]:An unexpected error occurred" 822 " while searching for a Java!")), 0); 823 } 824 } 825 case JFW_E_INVALID_SETTINGS: 826 { 827 //Warning MessageBox: 828 // The %PRODUCTNAME configuration has been changed. Under Tools 829 // - Options - %PRODUCTNAME - Java, select the Java runtime environment 830 // you want to have used by %PRODUCTNAME. 831 css::java::InvalidJavaSettingsException exc( 832 rtl::OUString( 833 RTL_CONSTASCII_USTRINGPARAM( 834 "JavaVirtualMachine::getJavaVM failed because" 835 " Java settings have changed!")), 836 static_cast< cppu::OWeakObject * >(this)); 837 askForRetry(css::uno::makeAny(exc)); 838 return css::uno::Any(); 839 } 840 case JFW_E_JAVA_DISABLED: 841 { 842 //QueryBox: 843 //%PRODUCTNAME requires a Java runtime environment (JRE) to perform 844 //this task. However, use of a JRE has been disabled. Do you want to 845 //enable the use of a JRE now? 846 css::java::JavaDisabledException exc( 847 rtl::OUString( 848 RTL_CONSTASCII_USTRINGPARAM( 849 "JavaVirtualMachine::getJavaVM failed because" 850 " Java is disabled!")), 851 static_cast< cppu::OWeakObject * >(this)); 852 if( ! askForRetry(css::uno::makeAny(exc))) 853 return css::uno::Any(); 854 continue; 855 } 856 case JFW_E_VM_CREATION_FAILED: 857 { 858 //If the creation failed because the JRE has been uninstalled then 859 //we search another one. As long as there is a javaldx, we should 860 //never come into this situation. javaldx checks alway if the JRE 861 //still exist. 862 JavaInfo * pJavaInfo = NULL; 863 if (JFW_E_NONE == jfw_getSelectedJRE(&pJavaInfo)) 864 { 865 sal_Bool bExist = sal_False; 866 if (JFW_E_NONE == jfw_existJRE(pJavaInfo, &bExist)) 867 { 868 if (bExist == sal_False 869 && ! (pJavaInfo->nRequirements & JFW_REQUIRE_NEEDRESTART)) 870 { 871 javaFrameworkError errFind = jfw_findAndSelectJRE( NULL ); 872 if (errFind == JFW_E_NONE) 873 { 874 continue; 875 } 876 } 877 } 878 } 879 880 jfw_freeJavaInfo(pJavaInfo); 881 // 882 //Error: %PRODUCTNAME requires a Java 883 //runtime environment (JRE) to perform this task. The selected JRE 884 //is defective. Please select another version or install a new JRE 885 //and select it under Tools - Options - %PRODUCTNAME - Java. 886 css::java::JavaVMCreationFailureException exc( 887 rtl::OUString( 888 RTL_CONSTASCII_USTRINGPARAM( 889 "JavaVirtualMachine::getJavaVM failed because" 890 " Java is defective!")), 891 static_cast< cppu::OWeakObject * >(this), 0); 892 askForRetry(css::uno::makeAny(exc)); 893 return css::uno::Any(); 894 } 895 case JFW_E_RUNNING_JVM: 896 { 897 //This service should make sure that we do not start java twice. 898 OSL_ASSERT(0); 899 break; 900 } 901 case JFW_E_NEED_RESTART: 902 { 903 //Error: 904 //For the selected Java runtime environment to work properly, 905 //%PRODUCTNAME must be restarted. Please restart %PRODUCTNAME now. 906 css::java::RestartRequiredException exc( 907 rtl::OUString( 908 RTL_CONSTASCII_USTRINGPARAM( 909 "JavaVirtualMachine::getJavaVM failed because" 910 "Office must be restarted before Java can be used!")), 911 static_cast< cppu::OWeakObject * >(this)); 912 askForRetry(css::uno::makeAny(exc)); 913 return css::uno::Any(); 914 } 915 default: 916 //RuntimeException: error is somewhere in the java framework. 917 //An unexpected error occurred 918 throw css::uno::RuntimeException( 919 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 920 "[JavaVirtualMachine]:An unexpected error occurred" 921 " while starting Java!")), 0); 922 } 923 924 if (bStarted) 925 { 926 { 927 DetachCurrentThread detach(m_pJavaVm); 928 // necessary to make debugging work; this thread will be 929 // suspended when the destructor of detach returns 930 m_xVirtualMachine = new jvmaccess::VirtualMachine( 931 m_pJavaVm, JNI_VERSION_1_2, true, pMainThreadEnv); 932 setUpUnoVirtualMachine(pMainThreadEnv); 933 } 934 // Listen for changes in the configuration (e.g. proxy settings): 935 // TODO this is done too late; changes to the configuration done 936 // after the above call to initVMConfiguration are lost 937 registerConfigChangesListener(); 938 939 break; 940 } 941 } 942 if (!m_xUnoVirtualMachine.is()) { 943 try { 944 jvmaccess::VirtualMachine::AttachGuard guard(m_xVirtualMachine); 945 setUpUnoVirtualMachine(guard.getEnvironment()); 946 } catch (jvmaccess::VirtualMachine::AttachGuard::CreationException &) { 947 throw css::uno::RuntimeException( 948 rtl::OUString( 949 RTL_CONSTASCII_USTRINGPARAM( 950 "jvmaccess::VirtualMachine::AttachGuard::" 951 "CreationException occurred")), 952 static_cast< cppu::OWeakObject * >(this)); 953 } 954 } 955 switch (returnType) { 956 default: // RETURN_JAVAVM 957 if (m_pJavaVm == 0) { 958 throw css::uno::RuntimeException( 959 rtl::OUString( 960 RTL_CONSTASCII_USTRINGPARAM( 961 "JavaVirtualMachine service was initialized in a way" 962 " that the requested JavaVM pointer is not available")), 963 static_cast< cppu::OWeakObject * >(this)); 964 } 965 return css::uno::makeAny(reinterpret_cast< sal_IntPtr >(m_pJavaVm)); 966 case RETURN_VIRTUALMACHINE: 967 OSL_ASSERT(sizeof (sal_Int64) >= sizeof (jvmaccess::VirtualMachine *)); 968 return css::uno::makeAny( 969 reinterpret_cast< sal_Int64 >( 970 m_xUnoVirtualMachine->getVirtualMachine().get())); 971 case RETURN_UNOVIRTUALMACHINE: 972 OSL_ASSERT(sizeof (sal_Int64) >= sizeof (jvmaccess::VirtualMachine *)); 973 return css::uno::makeAny( 974 reinterpret_cast< sal_Int64 >(m_xUnoVirtualMachine.get())); 975 } 976 } 977 978 sal_Bool SAL_CALL JavaVirtualMachine::isVMStarted() 979 { 980 osl::MutexGuard aGuard(*this); 981 if (m_bDisposed) 982 throw css::lang::DisposedException( 983 rtl::OUString(), static_cast< cppu::OWeakObject * >(this)); 984 return m_xUnoVirtualMachine.is(); 985 } 986 987 sal_Bool SAL_CALL JavaVirtualMachine::isVMEnabled() 988 { 989 { 990 osl::MutexGuard aGuard(*this); 991 if (m_bDisposed) 992 throw css::lang::DisposedException( 993 rtl::OUString(), static_cast< cppu::OWeakObject * >(this)); 994 } 995 // stoc_javavm::JVM aJvm; 996 // initVMConfiguration(&aJvm, m_xContext->getServiceManager(), m_xContext); 997 // return aJvm.isEnabled(); 998 //ToDo 999 sal_Bool bEnabled = sal_False; 1000 if (jfw_getEnabled( & bEnabled) != JFW_E_NONE) 1001 throw css::uno::RuntimeException(); 1002 return bEnabled; 1003 } 1004 1005 sal_Bool SAL_CALL JavaVirtualMachine::isThreadAttached() 1006 { 1007 osl::MutexGuard aGuard(*this); 1008 if (m_bDisposed) 1009 throw css::lang::DisposedException( 1010 rtl::OUString(), static_cast< cppu::OWeakObject * >(this)); 1011 // TODO isThreadAttached only returns true if the thread was attached via 1012 // registerThread: 1013 GuardStack * pStack 1014 = static_cast< GuardStack * >(m_aAttachGuards.getData()); 1015 return pStack != 0 && !pStack->empty(); 1016 } 1017 1018 void SAL_CALL JavaVirtualMachine::registerThread() 1019 { 1020 osl::MutexGuard aGuard(*this); 1021 if (m_bDisposed) 1022 throw css::lang::DisposedException( 1023 rtl::OUString(), static_cast< cppu::OWeakObject * >(this)); 1024 if (!m_xUnoVirtualMachine.is()) 1025 throw css::uno::RuntimeException( 1026 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1027 "JavaVirtualMachine::registerThread:" 1028 " null VirtualMachine")), 1029 static_cast< cppu::OWeakObject * >(this)); 1030 GuardStack * pStack 1031 = static_cast< GuardStack * >(m_aAttachGuards.getData()); 1032 if (pStack == 0) 1033 { 1034 pStack = new GuardStack; 1035 m_aAttachGuards.setData(pStack); 1036 } 1037 try 1038 { 1039 pStack->push( 1040 new jvmaccess::VirtualMachine::AttachGuard( 1041 m_xUnoVirtualMachine->getVirtualMachine())); 1042 } 1043 catch (jvmaccess::VirtualMachine::AttachGuard::CreationException &) 1044 { 1045 throw css::uno::RuntimeException( 1046 rtl::OUString( 1047 RTL_CONSTASCII_USTRINGPARAM( 1048 "JavaVirtualMachine::registerThread: jvmaccess::" 1049 "VirtualMachine::AttachGuard::CreationException")), 1050 static_cast< cppu::OWeakObject * >(this)); 1051 } 1052 } 1053 1054 void SAL_CALL JavaVirtualMachine::revokeThread() 1055 { 1056 osl::MutexGuard aGuard(*this); 1057 if (m_bDisposed) 1058 throw css::lang::DisposedException( 1059 rtl::OUString(), static_cast< cppu::OWeakObject * >(this)); 1060 if (!m_xUnoVirtualMachine.is()) 1061 throw css::uno::RuntimeException( 1062 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1063 "JavaVirtualMachine::revokeThread:" 1064 " null VirtualMachine")), 1065 static_cast< cppu::OWeakObject * >(this)); 1066 GuardStack * pStack 1067 = static_cast< GuardStack * >(m_aAttachGuards.getData()); 1068 if (pStack == 0 || pStack->empty()) 1069 throw css::uno::RuntimeException( 1070 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1071 "JavaVirtualMachine::revokeThread:" 1072 " no matching registerThread")), 1073 static_cast< cppu::OWeakObject * >(this)); 1074 delete pStack->top(); 1075 pStack->pop(); 1076 } 1077 1078 void SAL_CALL 1079 JavaVirtualMachine::disposing(css::lang::EventObject const & rSource) 1080 { 1081 osl::MutexGuard aGuard(*this); 1082 if (rSource.Source == m_xInetConfiguration) 1083 m_xInetConfiguration.clear(); 1084 if (rSource.Source == m_xJavaConfiguration) 1085 m_xJavaConfiguration.clear(); 1086 } 1087 1088 void SAL_CALL JavaVirtualMachine::elementInserted( 1089 css::container::ContainerEvent const &) 1090 {} 1091 1092 void SAL_CALL JavaVirtualMachine::elementRemoved( 1093 css::container::ContainerEvent const &) 1094 {} 1095 1096 // If a user changes the setting, for example for proxy settings, then this 1097 // function will be called from the configuration manager. Even if the .xml 1098 // file does not contain an entry yet and that entry has to be inserted, this 1099 // function will be called. We call java.lang.System.setProperty for the new 1100 // values. 1101 void SAL_CALL JavaVirtualMachine::elementReplaced( 1102 css::container::ContainerEvent const & rEvent) 1103 { 1104 // TODO Using the new value stored in rEvent is wrong here. If two threads 1105 // receive different elementReplaced calls in quick succession, it is 1106 // unspecified which changes the JVM's system properties last. A correct 1107 // solution must atomically (i.e., protected by a mutex) read the latest 1108 // value from the configuration and set it as a system property at the JVM. 1109 1110 rtl::OUString aAccessor; 1111 rEvent.Accessor >>= aAccessor; 1112 rtl::OUString aPropertyName; 1113 rtl::OUString aPropertyName2; 1114 rtl::OUString aPropertyValue; 1115 bool bSecurityChanged = false; 1116 if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("ooInetProxyType"))) 1117 { 1118 // Proxy none, manually 1119 sal_Int32 value = 0; 1120 rEvent.Element >>= value; 1121 setINetSettingsInVM(value != 0); 1122 return; 1123 } 1124 else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM( 1125 "ooInetHTTPProxyName"))) 1126 { 1127 aPropertyName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1128 "http.proxyHost")); 1129 rEvent.Element >>= aPropertyValue; 1130 } 1131 else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM( 1132 "ooInetHTTPProxyPort"))) 1133 { 1134 aPropertyName 1135 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("http.proxyPort")); 1136 sal_Int32 n = 0; 1137 rEvent.Element >>= n; 1138 aPropertyValue = rtl::OUString::valueOf(n); 1139 } 1140 else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM( 1141 "ooInetHTTPSProxyName"))) 1142 { 1143 aPropertyName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1144 "https.proxyHost")); 1145 rEvent.Element >>= aPropertyValue; 1146 } 1147 else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM( 1148 "ooInetHTTPSProxyPort"))) 1149 { 1150 aPropertyName 1151 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("https.proxyPort")); 1152 sal_Int32 n = 0; 1153 rEvent.Element >>= n; 1154 aPropertyValue = rtl::OUString::valueOf(n); 1155 } 1156 else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM( 1157 "ooInetFTPProxyName"))) 1158 { 1159 aPropertyName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1160 "ftp.proxyHost")); 1161 rEvent.Element >>= aPropertyValue; 1162 } 1163 else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM( 1164 "ooInetFTPProxyPort"))) 1165 { 1166 aPropertyName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1167 "ftp.proxyPort")); 1168 sal_Int32 n = 0; 1169 rEvent.Element >>= n; 1170 aPropertyValue = rtl::OUString::valueOf(n); 1171 } 1172 else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM( 1173 "ooInetNoProxy"))) 1174 { 1175 aPropertyName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1176 "http.nonProxyHosts")); 1177 aPropertyName2 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1178 "ftp.nonProxyHosts")); 1179 rEvent.Element >>= aPropertyValue; 1180 aPropertyValue = aPropertyValue.replace(';', '|'); 1181 } 1182 else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("NetAccess"))) 1183 { 1184 aPropertyName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1185 "appletviewer.security.mode")); 1186 sal_Int32 n = 0; 1187 if (rEvent.Element >>= n) 1188 switch (n) 1189 { 1190 case 0: 1191 aPropertyValue = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1192 "host")); 1193 break; 1194 case 1: 1195 aPropertyValue = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1196 "unrestricted")); 1197 break; 1198 case 3: 1199 aPropertyValue = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1200 "none")); 1201 break; 1202 } 1203 else 1204 return; 1205 bSecurityChanged = true; 1206 } 1207 else if (aAccessor.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Security"))) 1208 { 1209 aPropertyName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1210 "stardiv.security.disableSecurity")); 1211 sal_Bool b = sal_Bool(); 1212 if (rEvent.Element >>= b) 1213 if (b) 1214 aPropertyValue = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1215 "false")); 1216 else 1217 aPropertyValue = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1218 "true")); 1219 else 1220 return; 1221 bSecurityChanged = true; 1222 } 1223 else 1224 return; 1225 1226 rtl::Reference< jvmaccess::VirtualMachine > xVirtualMachine; 1227 { 1228 osl::MutexGuard aGuard(*this); 1229 if (m_xUnoVirtualMachine.is()) { 1230 xVirtualMachine = m_xUnoVirtualMachine->getVirtualMachine(); 1231 } 1232 } 1233 if (xVirtualMachine.is()) 1234 { 1235 try 1236 { 1237 jvmaccess::VirtualMachine::AttachGuard aAttachGuard( 1238 xVirtualMachine); 1239 JNIEnv * pJNIEnv = aAttachGuard.getEnvironment(); 1240 1241 // call java.lang.System.setProperty 1242 // String setProperty( String key, String value) 1243 jclass jcSystem= pJNIEnv->FindClass("java/lang/System"); 1244 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:FindClass java/lang/System")), 0); 1245 jmethodID jmSetProps= pJNIEnv->GetStaticMethodID( jcSystem, "setProperty","(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"); 1246 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetStaticMethodID java.lang.System.setProperty")), 0); 1247 1248 jstring jsPropName= pJNIEnv->NewString( aPropertyName.getStr(), aPropertyName.getLength()); 1249 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); 1250 1251 // remove the property if it does not have a value ( user left the dialog field empty) 1252 // or if the port is set to 0 1253 aPropertyValue= aPropertyValue.trim(); 1254 if( 1255 aPropertyValue.getLength() == 0 || 1256 ( 1257 ( 1258 aPropertyName.equals( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ftp.proxyPort"))) || 1259 aPropertyName.equals( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("http.proxyPort"))) /*|| 1260 aPropertyName.equals( OUString( RTL_CONSTASCII_USTRINGPARAM("socksProxyPort")))*/ 1261 ) && 1262 aPropertyValue.equals(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("0"))) 1263 ) 1264 ) 1265 { 1266 // call java.lang.System.getProperties 1267 jmethodID jmGetProps= pJNIEnv->GetStaticMethodID( jcSystem, "getProperties","()Ljava/util/Properties;"); 1268 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetStaticMethodID java.lang.System.getProperties")), 0); 1269 jobject joProperties= pJNIEnv->CallStaticObjectMethod( jcSystem, jmGetProps); 1270 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.getProperties")), 0); 1271 // call java.util.Properties.remove 1272 jclass jcProperties= pJNIEnv->FindClass("java/util/Properties"); 1273 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:FindClass java/util/Properties")), 0); 1274 jmethodID jmRemove= pJNIEnv->GetMethodID( jcProperties, "remove", "(Ljava/lang/Object;)Ljava/lang/Object;"); 1275 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetMethodID java.util.Properties.remove")), 0); 1276 pJNIEnv->CallObjectMethod( joProperties, jmRemove, jsPropName); 1277 1278 // special calse for ftp.nonProxyHosts and http.nonProxyHosts. The office only 1279 // has a value for two java properties 1280 if (aPropertyName2.getLength() > 0) 1281 { 1282 jstring jsPropName2= pJNIEnv->NewString( aPropertyName2.getStr(), aPropertyName2.getLength()); 1283 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); 1284 pJNIEnv->CallObjectMethod( joProperties, jmRemove, jsPropName2); 1285 } 1286 } 1287 else 1288 { 1289 // Change the Value of the property 1290 jstring jsPropValue= pJNIEnv->NewString( aPropertyValue.getStr(), aPropertyValue.getLength()); 1291 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); 1292 pJNIEnv->CallStaticObjectMethod( jcSystem, jmSetProps, jsPropName, jsPropValue); 1293 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.setProperty")), 0); 1294 1295 // special calse for ftp.nonProxyHosts and http.nonProxyHosts. The office only 1296 // has a value for two java properties 1297 if (aPropertyName2.getLength() > 0) 1298 { 1299 jstring jsPropName2= pJNIEnv->NewString( aPropertyName2.getStr(), aPropertyName2.getLength()); 1300 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); 1301 jsPropValue= pJNIEnv->NewString( aPropertyValue.getStr(), aPropertyValue.getLength()); 1302 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); 1303 pJNIEnv->CallStaticObjectMethod( jcSystem, jmSetProps, jsPropName2, jsPropValue); 1304 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.setProperty")), 0); 1305 } 1306 } 1307 1308 // If the settings for Security and NetAccess changed then we have to notify the SandboxSecurity 1309 // SecurityManager 1310 // call System.getSecurityManager() 1311 if (bSecurityChanged) 1312 { 1313 jmethodID jmGetSecur= pJNIEnv->GetStaticMethodID( jcSystem,"getSecurityManager","()Ljava/lang/SecurityManager;"); 1314 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetStaticMethodID java.lang.System.getSecurityManager")), 0); 1315 jobject joSecur= pJNIEnv->CallStaticObjectMethod( jcSystem, jmGetSecur); 1316 if (joSecur != 0) 1317 { 1318 // Make sure the SecurityManager is our SandboxSecurity 1319 // FindClass("com.sun.star.lib.sandbox.SandboxSecurityManager" only worked at the first time 1320 // this code was executed. Maybe it is a security feature. However, all attempts to debug the 1321 // SandboxSecurity class (maybe the VM invokes checkPackageAccess) failed. 1322 // jclass jcSandboxSec= pJNIEnv->FindClass("com.sun.star.lib.sandbox.SandboxSecurity"); 1323 // if(pJNIEnv->ExceptionOccurred()) throw RuntimeException(OUSTR("JNI:FindClass com.sun.star.lib.sandbox.SandboxSecurity"), Reference<XInterface>()); 1324 // jboolean bIsSand= pJNIEnv->IsInstanceOf( joSecur, jcSandboxSec); 1325 // The SecurityManagers class Name must be com.sun.star.lib.sandbox.SandboxSecurity 1326 jclass jcSec= pJNIEnv->GetObjectClass( joSecur); 1327 jclass jcClass= pJNIEnv->FindClass("java/lang/Class"); 1328 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:FindClass java.lang.Class")), 0); 1329 jmethodID jmName= pJNIEnv->GetMethodID( jcClass,"getName","()Ljava/lang/String;"); 1330 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetMethodID java.lang.Class.getName")), 0); 1331 jstring jsClass= (jstring) pJNIEnv->CallObjectMethod( jcSec, jmName); 1332 const jchar* jcharName= pJNIEnv->GetStringChars( jsClass, NULL); 1333 rtl::OUString sName( jcharName); 1334 jboolean bIsSandbox; 1335 if (sName == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.lib.sandbox.SandboxSecurity"))) 1336 bIsSandbox= JNI_TRUE; 1337 else 1338 bIsSandbox= JNI_FALSE; 1339 pJNIEnv->ReleaseStringChars( jsClass, jcharName); 1340 1341 if (bIsSandbox == JNI_TRUE) 1342 { 1343 // call SandboxSecurity.reset 1344 jmethodID jmReset= pJNIEnv->GetMethodID( jcSec,"reset","()V"); 1345 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetMethodID com.sun.star.lib.sandbox.SandboxSecurity.reset")), 0); 1346 pJNIEnv->CallVoidMethod( joSecur, jmReset); 1347 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallVoidMethod com.sun.star.lib.sandbox.SandboxSecurity.reset")), 0); 1348 } 1349 } 1350 } 1351 } 1352 catch (jvmaccess::VirtualMachine::AttachGuard::CreationException &) 1353 { 1354 throw css::uno::RuntimeException( 1355 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1356 "jvmaccess::VirtualMachine::AttachGuard::" 1357 "CreationException")), 1358 0); 1359 } 1360 } 1361 } 1362 1363 JavaVirtualMachine::~JavaVirtualMachine() 1364 { 1365 if (m_xInetConfiguration.is()) 1366 // We should never get here, but just in case... 1367 try 1368 { 1369 m_xInetConfiguration->removeContainerListener(this); 1370 } 1371 catch (css::uno::Exception &) 1372 { 1373 OSL_ENSURE(false, "com.sun.star.uno.Exception caught"); 1374 } 1375 if (m_xJavaConfiguration.is()) 1376 // We should never get here, but just in case... 1377 try 1378 { 1379 m_xJavaConfiguration->removeContainerListener(this); 1380 } 1381 catch (css::uno::Exception &) 1382 { 1383 OSL_ENSURE(false, "com.sun.star.uno.Exception caught"); 1384 } 1385 } 1386 1387 void SAL_CALL JavaVirtualMachine::disposing() 1388 { 1389 css::uno::Reference< css::container::XContainer > xContainer1; 1390 css::uno::Reference< css::container::XContainer > xContainer2; 1391 { 1392 osl::MutexGuard aGuard(*this); 1393 m_bDisposed = true; 1394 xContainer1 = m_xInetConfiguration; 1395 m_xInetConfiguration.clear(); 1396 xContainer2 = m_xJavaConfiguration; 1397 m_xJavaConfiguration.clear(); 1398 } 1399 if (xContainer1.is()) 1400 xContainer1->removeContainerListener(this); 1401 if (xContainer2.is()) 1402 xContainer2->removeContainerListener(this); 1403 } 1404 1405 /*We listen to changes in the configuration. For example, the user changes the proxy 1406 settings in the options dialog (menu tools). Then we are notified of this change and 1407 if the java vm is already running we change the properties (System.lang.System.setProperties) 1408 through JNI. 1409 To receive notifications this class implements XContainerListener. 1410 */ 1411 void JavaVirtualMachine::registerConfigChangesListener() 1412 { 1413 try 1414 { 1415 css::uno::Reference< css::lang::XMultiServiceFactory > xConfigProvider( 1416 m_xContext->getServiceManager()->createInstanceWithContext( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1417 "com.sun.star.configuration.ConfigurationProvider")), m_xContext), css::uno::UNO_QUERY); 1418 1419 if (xConfigProvider.is()) 1420 { 1421 // We register this instance as listener to changes in org.openoffice.Inet/Settings 1422 // arguments for ConfigurationAccess 1423 css::uno::Sequence< css::uno::Any > aArguments(2); 1424 aArguments[0] <<= css::beans::PropertyValue( 1425 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("nodepath")), 1426 0, 1427 css::uno::makeAny(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Inet/Settings"))), 1428 css::beans::PropertyState_DIRECT_VALUE); 1429 // depth: -1 means unlimited 1430 aArguments[1] <<= css::beans::PropertyValue( 1431 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("depth")), 1432 0, 1433 css::uno::makeAny( (sal_Int32)-1), 1434 css::beans::PropertyState_DIRECT_VALUE); 1435 1436 m_xInetConfiguration 1437 = css::uno::Reference< css::container::XContainer >( 1438 xConfigProvider->createInstanceWithArguments( 1439 rtl::OUString( 1440 RTL_CONSTASCII_USTRINGPARAM( 1441 "com.sun.star.configuration.ConfigurationAccess")), 1442 aArguments), 1443 css::uno::UNO_QUERY); 1444 1445 if (m_xInetConfiguration.is()) 1446 m_xInetConfiguration->addContainerListener(this); 1447 1448 // now register as listener to changes in org.openoffice.Java/VirtualMachine 1449 css::uno::Sequence< css::uno::Any > aArguments2(2); 1450 aArguments2[0] <<= css::beans::PropertyValue( 1451 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("nodepath")), 1452 0, 1453 css::uno::makeAny(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Office.Java/VirtualMachine"))), 1454 css::beans::PropertyState_DIRECT_VALUE); 1455 // depth: -1 means unlimited 1456 aArguments2[1] <<= css::beans::PropertyValue( 1457 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("depth")), 1458 0, 1459 css::uno::makeAny( (sal_Int32)-1), 1460 css::beans::PropertyState_DIRECT_VALUE); 1461 1462 m_xJavaConfiguration 1463 = css::uno::Reference< css::container::XContainer >( 1464 xConfigProvider->createInstanceWithArguments( 1465 rtl::OUString( 1466 RTL_CONSTASCII_USTRINGPARAM( 1467 "com.sun.star.configuration.ConfigurationAccess")), 1468 aArguments2), 1469 css::uno::UNO_QUERY); 1470 1471 if (m_xJavaConfiguration.is()) 1472 m_xJavaConfiguration->addContainerListener(this); 1473 } 1474 }catch( css::uno::Exception & e) 1475 { 1476 #if OSL_DEBUG_LEVEL > 1 1477 rtl::OString message = rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_ASCII_US); 1478 OSL_TRACE("javavm.cxx: could not set up listener for Configuration because of >%s<", message.getStr()); 1479 #else 1480 (void) e; // unused 1481 #endif 1482 } 1483 } 1484 1485 // param true: all Inet setting are set as Java Properties on a live VM. 1486 // false: the Java net properties are set to empty value. 1487 void JavaVirtualMachine::setINetSettingsInVM(bool set_reset) 1488 { 1489 osl::MutexGuard aGuard(*this); 1490 try 1491 { 1492 if (m_xUnoVirtualMachine.is()) 1493 { 1494 jvmaccess::VirtualMachine::AttachGuard aAttachGuard( 1495 m_xUnoVirtualMachine->getVirtualMachine()); 1496 JNIEnv * pJNIEnv = aAttachGuard.getEnvironment(); 1497 1498 // The Java Properties 1499 rtl::OUString sFtpProxyHost(RTL_CONSTASCII_USTRINGPARAM("ftp.proxyHost") ); 1500 rtl::OUString sFtpProxyPort(RTL_CONSTASCII_USTRINGPARAM("ftp.proxyPort") ); 1501 rtl::OUString sFtpNonProxyHosts (RTL_CONSTASCII_USTRINGPARAM("ftp.nonProxyHosts")); 1502 rtl::OUString sHttpProxyHost(RTL_CONSTASCII_USTRINGPARAM("http.proxyHost") ); 1503 rtl::OUString sHttpProxyPort(RTL_CONSTASCII_USTRINGPARAM("http.proxyPort") ); 1504 rtl::OUString sHttpNonProxyHosts(RTL_CONSTASCII_USTRINGPARAM("http.nonProxyHosts")); 1505 1506 // creat Java Properties as JNI strings 1507 jstring jsFtpProxyHost= pJNIEnv->NewString( sFtpProxyHost.getStr(), sFtpProxyHost.getLength()); 1508 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); 1509 jstring jsFtpProxyPort= pJNIEnv->NewString( sFtpProxyPort.getStr(), sFtpProxyPort.getLength()); 1510 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); 1511 jstring jsFtpNonProxyHosts= pJNIEnv->NewString( sFtpNonProxyHosts.getStr(), sFtpNonProxyHosts.getLength()); 1512 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); 1513 jstring jsHttpProxyHost= pJNIEnv->NewString( sHttpProxyHost.getStr(), sHttpProxyHost.getLength()); 1514 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); 1515 jstring jsHttpProxyPort= pJNIEnv->NewString( sHttpProxyPort.getStr(), sHttpProxyPort.getLength()); 1516 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); 1517 jstring jsHttpNonProxyHosts= pJNIEnv->NewString( sHttpNonProxyHosts.getStr(), sHttpNonProxyHosts.getLength()); 1518 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); 1519 1520 // prepare java.lang.System.setProperty 1521 jclass jcSystem= pJNIEnv->FindClass("java/lang/System"); 1522 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:FindClass java/lang/System")), 0); 1523 jmethodID jmSetProps= pJNIEnv->GetStaticMethodID( jcSystem, "setProperty","(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"); 1524 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetStaticMethodID java.lang.System.setProperty")), 0); 1525 1526 // call java.lang.System.getProperties 1527 jmethodID jmGetProps= pJNIEnv->GetStaticMethodID( jcSystem, "getProperties","()Ljava/util/Properties;"); 1528 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetStaticMethodID java.lang.System.getProperties")), 0); 1529 jobject joProperties= pJNIEnv->CallStaticObjectMethod( jcSystem, jmGetProps); 1530 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.getProperties")), 0); 1531 // prepare java.util.Properties.remove 1532 jclass jcProperties= pJNIEnv->FindClass("java/util/Properties"); 1533 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:FindClass java/util/Properties")), 0); 1534 1535 if (set_reset) 1536 { 1537 // Set all network properties with the VM 1538 JVM jvm; 1539 getINetPropsFromConfig( &jvm, m_xContext->getServiceManager(), m_xContext); 1540 const ::std::vector< rtl::OUString> & Props = jvm.getProperties(); 1541 typedef ::std::vector< rtl::OUString >::const_iterator C_IT; 1542 1543 for( C_IT i= Props.begin(); i != Props.end(); i++) 1544 { 1545 rtl::OUString prop= *i; 1546 sal_Int32 index= prop.indexOf( (sal_Unicode)'='); 1547 rtl::OUString propName= prop.copy( 0, index); 1548 rtl::OUString propValue= prop.copy( index + 1); 1549 1550 if( propName.equals( sFtpProxyHost)) 1551 { 1552 jstring jsVal= pJNIEnv->NewString( propValue.getStr(), propValue.getLength()); 1553 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); 1554 pJNIEnv->CallStaticObjectMethod( jcSystem, jmSetProps, jsFtpProxyHost, jsVal); 1555 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.setProperty")), 0); 1556 } 1557 else if( propName.equals( sFtpProxyPort)) 1558 { 1559 jstring jsVal= pJNIEnv->NewString( propValue.getStr(), propValue.getLength()); 1560 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); 1561 pJNIEnv->CallStaticObjectMethod( jcSystem, jmSetProps, jsFtpProxyPort, jsVal); 1562 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.setProperty")), 0); 1563 } 1564 else if( propName.equals( sFtpNonProxyHosts)) 1565 { 1566 jstring jsVal= pJNIEnv->NewString( propValue.getStr(), propValue.getLength()); 1567 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); 1568 pJNIEnv->CallStaticObjectMethod( jcSystem, jmSetProps, jsFtpNonProxyHosts, jsVal); 1569 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.setProperty")), 0); 1570 } 1571 else if( propName.equals( sHttpProxyHost)) 1572 { 1573 jstring jsVal= pJNIEnv->NewString( propValue.getStr(), propValue.getLength()); 1574 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); 1575 pJNIEnv->CallStaticObjectMethod( jcSystem, jmSetProps, jsHttpProxyHost, jsVal); 1576 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.setProperty")), 0); 1577 } 1578 else if( propName.equals( sHttpProxyPort)) 1579 { 1580 jstring jsVal= pJNIEnv->NewString( propValue.getStr(), propValue.getLength()); 1581 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); 1582 pJNIEnv->CallStaticObjectMethod( jcSystem, jmSetProps, jsHttpProxyPort, jsVal); 1583 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.setProperty")), 0); 1584 } 1585 else if( propName.equals( sHttpNonProxyHosts)) 1586 { 1587 jstring jsVal= pJNIEnv->NewString( propValue.getStr(), propValue.getLength()); 1588 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:NewString")), 0); 1589 pJNIEnv->CallStaticObjectMethod( jcSystem, jmSetProps, jsHttpNonProxyHosts, jsVal); 1590 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:CallStaticObjectMethod java.lang.System.setProperty")), 0); 1591 } 1592 } 1593 } 1594 else 1595 { 1596 // call java.util.Properties.remove 1597 jmethodID jmRemove= pJNIEnv->GetMethodID( jcProperties, "remove", "(Ljava/lang/Object;)Ljava/lang/Object;"); 1598 if(pJNIEnv->ExceptionOccurred()) throw css::uno::RuntimeException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JNI:GetMethodID java.util.Property.remove")), 0); 1599 pJNIEnv->CallObjectMethod( joProperties, jmRemove, jsFtpProxyHost); 1600 pJNIEnv->CallObjectMethod( joProperties, jmRemove, jsFtpProxyPort); 1601 pJNIEnv->CallObjectMethod( joProperties, jmRemove, jsFtpNonProxyHosts); 1602 pJNIEnv->CallObjectMethod( joProperties, jmRemove, jsHttpProxyHost); 1603 pJNIEnv->CallObjectMethod( joProperties, jmRemove, jsHttpProxyPort); 1604 pJNIEnv->CallObjectMethod( joProperties, jmRemove, jsHttpNonProxyHosts); 1605 } 1606 } 1607 } 1608 catch (css::uno::RuntimeException &) 1609 { 1610 OSL_ENSURE(false, "RuntimeException"); 1611 } 1612 catch (jvmaccess::VirtualMachine::AttachGuard::CreationException &) 1613 { 1614 OSL_ENSURE(false, 1615 "jvmaccess::VirtualMachine::AttachGuard::CreationException"); 1616 } 1617 } 1618 1619 void JavaVirtualMachine::setUpUnoVirtualMachine(JNIEnv * environment) { 1620 css::uno::Reference< css::util::XMacroExpander > exp; 1621 if (!(m_xContext->getValueByName( 1622 rtl::OUString( 1623 RTL_CONSTASCII_USTRINGPARAM( 1624 "/singletons/com.sun.star.util.theMacroExpander"))) 1625 >>= exp) 1626 || !exp.is()) 1627 { 1628 throw css::uno::RuntimeException( 1629 rtl::OUString( 1630 RTL_CONSTASCII_USTRINGPARAM( 1631 "component context fails to supply singleton" 1632 " com.sun.star.util.theMacroExpander of type" 1633 " com.sun.star.util.XMacroExpander")), 1634 m_xContext); 1635 } 1636 rtl::OUString baseUrl; 1637 try { 1638 baseUrl = exp->expandMacros( 1639 rtl::OUString( 1640 RTL_CONSTASCII_USTRINGPARAM("$URE_INTERNAL_JAVA_DIR/"))); 1641 } catch (css::lang::IllegalArgumentException &) { 1642 throw css::uno::RuntimeException( 1643 rtl::OUString( 1644 RTL_CONSTASCII_USTRINGPARAM( 1645 "com::sun::star::lang::IllegalArgumentException")), 1646 static_cast< cppu::OWeakObject * >(this)); 1647 } 1648 rtl::OUString classPath; 1649 try { 1650 classPath = exp->expandMacros( 1651 rtl::OUString( 1652 RTL_CONSTASCII_USTRINGPARAM("$URE_INTERNAL_JAVA_CLASSPATH"))); 1653 } catch (css::lang::IllegalArgumentException &) {} 1654 jclass class_URLClassLoader = environment->FindClass( 1655 "java/net/URLClassLoader"); 1656 if (class_URLClassLoader == 0) { 1657 handleJniException(environment); 1658 } 1659 jmethodID ctor_URLClassLoader = environment->GetMethodID( 1660 class_URLClassLoader, "<init>", "([Ljava/net/URL;)V"); 1661 if (ctor_URLClassLoader == 0) { 1662 handleJniException(environment); 1663 } 1664 jclass class_URL = environment->FindClass("java/net/URL"); 1665 if (class_URL == 0) { 1666 handleJniException(environment); 1667 } 1668 jmethodID ctor_URL_1 = environment->GetMethodID( 1669 class_URL, "<init>", "(Ljava/lang/String;)V"); 1670 if (ctor_URL_1 == 0) { 1671 handleJniException(environment); 1672 } 1673 jvalue args[3]; 1674 args[0].l = environment->NewString( 1675 static_cast< jchar const * >(baseUrl.getStr()), 1676 static_cast< jsize >(baseUrl.getLength())); 1677 if (args[0].l == 0) { 1678 handleJniException(environment); 1679 } 1680 jobject base = environment->NewObjectA(class_URL, ctor_URL_1, args); 1681 if (base == 0) { 1682 handleJniException(environment); 1683 } 1684 jmethodID ctor_URL_2 = environment->GetMethodID( 1685 class_URL, "<init>", "(Ljava/net/URL;Ljava/lang/String;)V"); 1686 if (ctor_URL_2 == 0) { 1687 handleJniException(environment); 1688 } 1689 jobjectArray classpath = jvmaccess::ClassPath::translateToUrls( 1690 m_xContext, environment, classPath); 1691 if (classpath == 0) { 1692 handleJniException(environment); 1693 } 1694 args[0].l = base; 1695 args[1].l = environment->NewStringUTF("unoloader.jar"); 1696 if (args[1].l == 0) { 1697 handleJniException(environment); 1698 } 1699 args[0].l = environment->NewObjectA(class_URL, ctor_URL_2, args); 1700 if (args[0].l == 0) { 1701 handleJniException(environment); 1702 } 1703 args[0].l = environment->NewObjectArray(1, class_URL, args[0].l); 1704 if (args[0].l == 0) { 1705 handleJniException(environment); 1706 } 1707 jobject cl1 = environment->NewObjectA( 1708 class_URLClassLoader, ctor_URLClassLoader, args); 1709 if (cl1 == 0) { 1710 handleJniException(environment); 1711 } 1712 jmethodID method_loadClass = environment->GetMethodID( 1713 class_URLClassLoader, "loadClass", 1714 "(Ljava/lang/String;)Ljava/lang/Class;"); 1715 if (method_loadClass == 0) { 1716 handleJniException(environment); 1717 } 1718 args[0].l = environment->NewStringUTF( 1719 "com.sun.star.lib.unoloader.UnoClassLoader"); 1720 if (args[0].l == 0) { 1721 handleJniException(environment); 1722 } 1723 jclass class_UnoClassLoader = static_cast< jclass >( 1724 environment->CallObjectMethodA(cl1, method_loadClass, args)); 1725 if (class_UnoClassLoader == 0) { 1726 handleJniException(environment); 1727 } 1728 jmethodID ctor_UnoClassLoader = environment->GetMethodID( 1729 class_UnoClassLoader, "<init>", 1730 "(Ljava/net/URL;[Ljava/net/URL;Ljava/lang/ClassLoader;)V"); 1731 if (ctor_UnoClassLoader == 0) { 1732 handleJniException(environment); 1733 } 1734 args[0].l = base; 1735 args[1].l = classpath; 1736 args[2].l = cl1; 1737 jobject cl2 = environment->NewObjectA( 1738 class_UnoClassLoader, ctor_UnoClassLoader, args); 1739 if (cl2 == 0) { 1740 handleJniException(environment); 1741 } 1742 try { 1743 m_xUnoVirtualMachine = new jvmaccess::UnoVirtualMachine( 1744 m_xVirtualMachine, cl2); 1745 } catch (jvmaccess::UnoVirtualMachine::CreationException &) { 1746 throw css::uno::RuntimeException( 1747 rtl::OUString( 1748 RTL_CONSTASCII_USTRINGPARAM( 1749 "jvmaccess::UnoVirtualMachine::CreationException")), 1750 static_cast< cppu::OWeakObject * >(this)); 1751 } 1752 } 1753 1754 void JavaVirtualMachine::handleJniException(JNIEnv * environment) { 1755 environment->ExceptionClear(); 1756 throw css::uno::RuntimeException( 1757 rtl::OUString( 1758 RTL_CONSTASCII_USTRINGPARAM("JNI exception occurred")), 1759 static_cast< cppu::OWeakObject * >(this)); 1760 } 1761