diff options
author | Bjoern Michaelsen <bjoern.michaelsen@canonical.com> | 2013-04-18 18:26:28 +0200 |
---|---|---|
committer | Bjoern Michaelsen <bjoern.michaelsen@canonical.com> | 2013-04-23 22:20:31 +0200 |
commit | b9337e22ce1dbf2eba0e8c8db294ae99f4111f91 (patch) | |
tree | 53ee1bd3dfd213815a21579151983cb997922b05 /include/jvmaccess | |
parent | move global headers script (diff) | |
download | core-b9337e22ce1dbf2eba0e8c8db294ae99f4111f91.tar.gz core-b9337e22ce1dbf2eba0e8c8db294ae99f4111f91.zip |
execute move of global headers
see https://gerrit.libreoffice.org/#/c/3367/
and Change-Id: I00c96fa77d04b33a6f8c8cd3490dfcd9bdc9e84a for details
Change-Id: I199a75bc4042af20817265d5ef85b1134a96ff5a
Diffstat (limited to 'include/jvmaccess')
-rw-r--r-- | include/jvmaccess/classpath.hxx | 139 | ||||
-rw-r--r-- | include/jvmaccess/jvmaccessdllapi.h | 24 | ||||
-rw-r--r-- | include/jvmaccess/unovirtualmachine.hxx | 104 | ||||
-rw-r--r-- | include/jvmaccess/virtualmachine.hxx | 151 |
4 files changed, 418 insertions, 0 deletions
diff --git a/include/jvmaccess/classpath.hxx b/include/jvmaccess/classpath.hxx new file mode 100644 index 000000000000..1cc8d83ab348 --- /dev/null +++ b/include/jvmaccess/classpath.hxx @@ -0,0 +1,139 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_JVMACCESS_CLASSPATH_HXX +#define INCLUDED_JVMACCESS_CLASSPATH_HXX + +#include "jvmaccessdllapi.h" +#include "sal/config.h" +#include "com/sun/star/uno/Reference.hxx" + +#include "jni.h" + +namespace com { namespace sun { namespace star { namespace uno { + class XComponentContext; +} } } } + +namespace jvmaccess { + +/** + Helper functions for class path handling. +*/ +class JVMACCESS_DLLPUBLIC ClassPath { +public: + /** + translates a class path into a java.net.URL[] instance. + + @param context + a component context; must not be null. + + @param environment + a JNI environment; must not be null. + + @param classPath + a list of zero or more internal (see the + com.sun.star.uri.ExternalUriReferenceTranslator service) URI references, + where any space characters (U+0020) are ignored (and, in particular, + separate adjacent URI references). Any vnd.sun.star.expand URL + references in the list are expanded using the + com.sun.star.util.theMacroExpander singleton of the given context. + + @returns + a local reference to a java.net.URL[] instance containing the external + (see the com.sun.star.uri.ExternalUriReferenceTranslator service) + equivalents of all the URI references in the given classPath. If null, a + (still pending) JNI exception occurred. + + @throws com::sun::star::uno::RuntimeException + */ + static inline ::jobjectArray + translateToUrls( + ::com::sun::star::uno::Reference< + ::com::sun::star::uno::XComponentContext > const & context, + ::JNIEnv * environment, OUString const & classPath) + { + return + static_cast< ::jobjectArray >( + doTranslateToUrls(context, environment, classPath)); + } + + /** + loads a class via a java.net.URLClassLoader. + + @param context + a component context; must not be null. + + @param environment + a JNI environment; must not be null. + + @param classPath + a list of zero or more internal (see the + com.sun.star.uri.ExternalUriReferenceTranslator service) URI references, + where any space characters (U+0020) are ignored (and, in particular, + separate adjacent URI references). Any vnd.sun.star.expand URL + references in the list are expanded using the + com.sun.star.util.theMacroExpander singleton of the given context. + + @param name + the Java binary name of the class to load. + + @returns + a local reference to a java.lang.Class instance. If null, a (still + pending) JNI exception occurred. + + @throws com::sun::star::uno::RuntimeException + */ + static inline ::jclass loadClass( + ::com::sun::star::uno::Reference< + ::com::sun::star::uno::XComponentContext > const & context, + ::JNIEnv * environment, OUString const & classPath, + OUString const & name) + { + return + static_cast< ::jclass >( + doLoadClass(context, environment, classPath, name)); + } + +private: + ClassPath(); // not defined + ClassPath(ClassPath &); // not defined + ~ClassPath(); // not defined + void operator =(ClassPath &); // not defined + + // Functions that replace JNIEnv, jobjectArray, and jclass with void *, so + // that their mangled C++ names do not depend on the JDK version used at + // compile time: + + static void * doTranslateToUrls( + ::com::sun::star::uno::Reference< + ::com::sun::star::uno::XComponentContext > const & context, + void * environment, OUString const & classPath); + + static void * doLoadClass( + ::com::sun::star::uno::Reference< + ::com::sun::star::uno::XComponentContext > const & context, + void * environment, OUString const & classPath, + OUString const & name); +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/jvmaccess/jvmaccessdllapi.h b/include/jvmaccess/jvmaccessdllapi.h new file mode 100644 index 000000000000..0f6651b5dbf8 --- /dev/null +++ b/include/jvmaccess/jvmaccessdllapi.h @@ -0,0 +1,24 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef INCLUDED_JVMACCESS_JVMACCESSDLLAPI_H +#define INCLUDED_JVMACCESS_JVMACCESSDLLAPI_H + +#include <sal/types.h> + +#if defined JVMACCESS_DLLIMPLEMENTATION +# define JVMACCESS_DLLPUBLIC SAL_DLLPUBLIC_EXPORT +#else +# define JVMACCESS_DLLPUBLIC SAL_DLLPUBLIC_IMPORT +#endif +#define JVMACCESS_DLLPRIVATE SAL_DLLPRIVATE + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/jvmaccess/unovirtualmachine.hxx b/include/jvmaccess/unovirtualmachine.hxx new file mode 100644 index 000000000000..4d618d14d863 --- /dev/null +++ b/include/jvmaccess/unovirtualmachine.hxx @@ -0,0 +1,104 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_JVMACCESS_UNOVIRTUALMACHINE_HXX +#define INCLUDED_JVMACCESS_UNOVIRTUALMACHINE_HXX + +#include "jvmaccessdllapi.h" +#include "sal/config.h" +#include "salhelper/simplereferenceobject.hxx" +#include "rtl/ref.hxx" + +namespace jvmaccess { + +class VirtualMachine; + +/** An encapsulating wrapper around a Java virtual machine and an appropriate + UNO class loader. + */ +class JVMACCESS_DLLPUBLIC UnoVirtualMachine: public salhelper::SimpleReferenceObject { +public: + /** An exception indicating failure to create a UnoVirtualMachine. + */ + class JVMACCESS_DLLPUBLIC CreationException + { + public: + CreationException(); + + CreationException(CreationException const &); + + virtual ~CreationException(); + + CreationException & operator =(CreationException const &); + }; + + /** Create a wrapper around a Java virtual machine and an appropriate UNO + class loader. + + @param virtualMachine + A Java virtual machine wrapper. Must not be null. + + @param classLoader + A local or global JNI reference, relative to the given virtualMachine, + to an appropriate UNO class loader instance. Must not be null. This + parameter should be of type jobject, not void *, but the exact + definition of jobject is different for different JDK versions, so that + the mangled C++ name of the constructor would depend on the JDK version + used at compile time. + + @exception CreationException + Thrown in case creation fails (due to a JNI problem). + */ + UnoVirtualMachine( + rtl::Reference< jvmaccess::VirtualMachine > const & virtualMachine, + void * classLoader); + + /** Get the Java virtual machine wrapper. + + @return + The Java virtual machine wrapper. Will never be null. + */ + rtl::Reference< jvmaccess::VirtualMachine > getVirtualMachine() const; + + /** Get the UNO class loader. + + @return + A global JNI reference to the UNO class loader. (The JNI reference must + not be deleted by client code.) Will never be null. This should be of + type jobject, not void *, but the exact definition of jobject is + different for different JDK versions, so that the mangled C++ name of + the function would depend on the JDK version used at compile time. + */ + void * getClassLoader() const; + +private: + UnoVirtualMachine(UnoVirtualMachine &); // not defined + void operator =(UnoVirtualMachine &); // not defined + + virtual ~UnoVirtualMachine(); + + rtl::Reference< jvmaccess::VirtualMachine > m_virtualMachine; + void * m_classLoader; +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/jvmaccess/virtualmachine.hxx b/include/jvmaccess/virtualmachine.hxx new file mode 100644 index 000000000000..57ac5ead39f4 --- /dev/null +++ b/include/jvmaccess/virtualmachine.hxx @@ -0,0 +1,151 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_JVMACCESS_VIRTUALMACHINE_HXX +#define INCLUDED_JVMACCESS_VIRTUALMACHINE_HXX + +#include "jvmaccessdllapi.h" +#include "rtl/ref.hxx" +#include "salhelper/simplereferenceobject.hxx" + +#include "jni.h" + +namespace jvmaccess { + +/** An encapsulating wrapper around a Java virtual machine. + */ +class JVMACCESS_DLLPUBLIC VirtualMachine: public salhelper::SimpleReferenceObject +{ +public: + /** A helper to attach a thread to a Java virtual machine. + + @descr + Upon construction of a guard the current thread is attached to the + virtual machine, and upon destruction of the guard the thread is + detached again. For any one thread, multiple instances of this class + may be used in a stack-like fashion (care is taken to only really + detach the thread from the virtual machine upon destruction of the guard + at the bottom of the stack). + */ + class JVMACCESS_DLLPUBLIC AttachGuard + { + public: + /** An exception indicating failure to create an AttachGuard. + */ + class JVMACCESS_DLLPUBLIC CreationException + { + public: + CreationException(); + + CreationException(CreationException const &); + + virtual ~CreationException(); + + CreationException & operator =(CreationException const &); + }; + + /** Attach the current thread to a virtual machine. + + @param rMachine + The virtual machine to attach to. Must not be a null reference. + + @exception CreationException + Thrown in case attaching fails (due to a JNI problem). + */ + explicit AttachGuard(rtl::Reference< VirtualMachine > const & rMachine); + + /** Detach the current thread from the virtual machine again. + */ + ~AttachGuard(); + + /** Get a JNI environment pointer for the current thread. + + @return + A valid JNI environment pointer. Will never be null. + */ + inline JNIEnv * getEnvironment() const { return m_pEnvironment; } + + private: + AttachGuard(AttachGuard &); // not implemented + void operator =(AttachGuard); // not implemented + + rtl::Reference< VirtualMachine > m_xMachine; + JNIEnv * m_pEnvironment; + bool m_bDetach; + }; + + /** Create a wrapper around a Java virtual machine. + + @param pVm + A JNI pointer to virtual machine. Must not be null. + + @param nVersion + The JNI version of the virtual machine pointed to by pVm. Must be at + least JNI_VERSION_1_2. This parameter should be of type jint, not int, + but at least on some platforms the definition of jint changed from + JDK 1.3 (long) to JDK 1.4 (int), so that the mangled C++ name of the + constructor would depend on the JDK version used at compile time. + + @param bDestroy + Whether to destroy the virtual machine when destructing the wrapper + (i.e., whether the wrapper owns the virtual machine pointed to by pVm). + + @param pMainThreadEnv + A valid JNI environment pointer for the current thread; must not be + null. The current thread must be "initially attached" to the virtual + machine while this constructor is being called (i.e., it must be the + thread that has called JNI_CreateJavaVM in case the virtual machine has + been started via the JNI Invocation API, and it must not already have + called DetachCurrentThread; or it must be executing native code called + from a "primordial" virtual machine). This environment pointer was + formerly used to obtain a reference to the thread's current context + class loader (java.lang.Thread.getCurrentClassLoader; if later a native + thread was attached to the virtual machine, that thread's context class + loader would be null, so the AttachGuard first of all set it to the + saved value; this feature has been removed again for performance reasons + and because the default context class loader is often not useful, so + that code relying on a context class loader has to set one explicitly, + anyway). This parameter is currently unused (but may be used again in + the future). + */ + VirtualMachine(JavaVM * pVm, int nVersion, bool bDestroy, + JNIEnv * pMainThreadEnv); + +private: + VirtualMachine(VirtualMachine &); // not implemented + void operator =(VirtualMachine); // not implemented + + virtual ~VirtualMachine(); + + JNIEnv * attachThread(bool * pAttached) const; + + void detachThread() const; + + JavaVM * m_pVm; + jint m_nVersion; + bool m_bDestroy; + + friend class AttachGuard; // to access attachThread, detachThread +}; + +} + +#endif // INCLUDED_JVMACCESS_VIRTUALMACHINE_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |