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