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