From 785312dc11a78f72784c04a2e8e3183162a1e28b Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Fri, 24 Jul 2020 08:36:10 +0200 Subject: stoc/javavm: create instances with uno constructors See tdf#74608 for motivation. Change-Id: I4eb381d19e453ceb2b035462f0f5de923458a03e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/99345 Tested-by: Jenkins Reviewed-by: Noel Grandin --- stoc/source/javavm/javavm.component | 5 +- stoc/source/javavm/javavm.cxx | 145 ++++++++---------------------------- stoc/source/javavm/javavm.hxx | 4 + 3 files changed, 36 insertions(+), 118 deletions(-) (limited to 'stoc') diff --git a/stoc/source/javavm/javavm.component b/stoc/source/javavm/javavm.component index 04367fad7ee3..79d993ddd62c 100644 --- a/stoc/source/javavm/javavm.component +++ b/stoc/source/javavm/javavm.component @@ -18,8 +18,9 @@ --> - + xmlns="http://openoffice.org/2010/uno-components"> + diff --git a/stoc/source/javavm/javavm.cxx b/stoc/source/javavm/javavm.cxx index 7df1fed46c57..c2c5f469e914 100644 --- a/stoc/source/javavm/javavm.cxx +++ b/stoc/source/javavm/javavm.cxx @@ -108,111 +108,6 @@ class NoJavaIniException: public css::uno::Exception { }; -class SingletonFactory: - private cppu::WeakImplHelper< css::lang::XEventListener > -{ -public: - static css::uno::Reference< css::uno::XInterface > getSingleton( - css::uno::Reference< css::uno::XComponentContext > const & rContext); - -private: - SingletonFactory() {} - - virtual ~SingletonFactory() override {} - - SingletonFactory(const SingletonFactory&) = delete; - SingletonFactory& operator=(const SingletonFactory&) = delete; - - virtual void SAL_CALL disposing(css::lang::EventObject const &) override; - - static void dispose(); - - // TODO ok to keep these static? - static osl::Mutex m_aMutex; - static css::uno::Reference< css::uno::XInterface > m_xSingleton; - static bool m_bDisposed; -}; - -css::uno::Reference< css::uno::XInterface > SingletonFactory::getSingleton( - css::uno::Reference< css::uno::XComponentContext > const & rContext) -{ - css::uno::Reference< css::uno::XInterface > xSingleton; - css::uno::Reference< css::lang::XComponent > xComponent; - { - osl::MutexGuard aGuard(m_aMutex); - if (!m_xSingleton.is()) - { - if (m_bDisposed) - throw css::lang::DisposedException(); - xComponent.set( rContext, css::uno::UNO_QUERY_THROW); - m_xSingleton = static_cast< cppu::OWeakObject * >( - new JavaVirtualMachine(rContext)); - } - xSingleton = m_xSingleton; - } - if (xComponent.is()) - try - { - xComponent->addEventListener(new SingletonFactory); - } - catch (...) - { - dispose(); - throw; - } - return xSingleton; -} - -void SAL_CALL SingletonFactory::disposing(css::lang::EventObject const &) -{ - dispose(); -} - -void SingletonFactory::dispose() -{ - css::uno::Reference< css::lang::XComponent > xComponent; - { - osl::MutexGuard aGuard(m_aMutex); - xComponent.set( m_xSingleton, css::uno::UNO_QUERY); - m_xSingleton.clear(); - m_bDisposed = true; - } - if (xComponent.is()) - xComponent->dispose(); -} - -osl::Mutex SingletonFactory::m_aMutex; -css::uno::Reference< css::uno::XInterface > SingletonFactory::m_xSingleton; -bool SingletonFactory::m_bDisposed = false; - -OUString serviceGetImplementationName() -{ - return "com.sun.star.comp.stoc.JavaVirtualMachine"; -} - -css::uno::Sequence< OUString > serviceGetSupportedServiceNames() -{ - return css::uno::Sequence< OUString > { "com.sun.star.java.JavaVirtualMachine" }; -} - -css::uno::Reference< css::uno::XInterface > serviceCreateInstance( - css::uno::Reference< css::uno::XComponentContext > const & rContext) -{ - // Only one single instance of this service is ever constructed, and is - // available until the component context used to create this instance is - // disposed. Afterwards, this function throws a DisposedException (as do - // all relevant methods on the single service instance). - return SingletonFactory::getSingleton(rContext); -} - -cppu::ImplementationEntry const aServiceImplementation[] - = { { serviceCreateInstance, - serviceGetImplementationName, - serviceGetSupportedServiceNames, - cppu::createSingleComponentFactory, - nullptr, 0 }, - { nullptr, nullptr, nullptr, nullptr, nullptr, 0 } }; - typedef std::stack< jvmaccess::VirtualMachine::AttachGuard * > GuardStack; extern "C" { @@ -577,15 +472,6 @@ private: } -extern "C" SAL_DLLPUBLIC_EXPORT void * javavm_component_getFactory(char const * pImplName, - void * pServiceManager, - void * pRegistryKey) -{ - return cppu::component_getFactoryHelper(pImplName, pServiceManager, - pRegistryKey, - aServiceImplementation); -} - JavaVirtualMachine::JavaVirtualMachine( css::uno::Reference< css::uno::XComponentContext > const & rContext): JavaVirtualMachine_Impl(m_aMutex), @@ -654,7 +540,7 @@ JavaVirtualMachine::initialize(css::uno::Sequence< css::uno::Any > const & OUString SAL_CALL JavaVirtualMachine::getImplementationName() { - return serviceGetImplementationName(); + return "com.sun.star.comp.stoc.JavaVirtualMachine"; } sal_Bool SAL_CALL @@ -666,7 +552,7 @@ JavaVirtualMachine::supportsService(OUString const & rServiceName) css::uno::Sequence< OUString > SAL_CALL JavaVirtualMachine::getSupportedServiceNames() { - return serviceGetSupportedServiceNames(); + return { "com.sun.star.java.JavaVirtualMachine" }; } css::uno::Any SAL_CALL @@ -1592,4 +1478,31 @@ void JavaVirtualMachine::handleJniException(JNIEnv * environment) { static_cast< cppu::OWeakObject * >(this)); } + +static osl::Mutex m_aMutex; +static rtl::Reference< JavaVirtualMachine > m_xSingleton; + + +void JavaVirtualMachine::dispose() { + JavaVirtualMachine_Impl::dispose(); + osl::MutexGuard aGuard(m_aMutex); + m_xSingleton.clear(); +} + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +stoc_JavaVM_get_implementation( + css::uno::XComponentContext* context , css::uno::Sequence const&) +{ + // Only one single instance of this service is ever constructed, and is + // available until the component context used to create this instance is + // disposed. Afterwards, this function throws a DisposedException (as do + // all relevant methods on the single service instance). + osl::MutexGuard aGuard(m_aMutex); + if (!m_xSingleton.is()) + m_xSingleton.set(new JavaVirtualMachine(context)); + m_xSingleton->acquire(); + return static_cast(m_xSingleton.get()); +} + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/stoc/source/javavm/javavm.hxx b/stoc/source/javavm/javavm.hxx index 13418c30011c..896d380572ec 100644 --- a/stoc/source/javavm/javavm.hxx +++ b/stoc/source/javavm/javavm.hxx @@ -105,6 +105,10 @@ public: virtual void SAL_CALL elementReplaced(css::container::ContainerEvent const & rEvent) override; + // XComponent + virtual void SAL_CALL + dispose() override; + private: JavaVirtualMachine(JavaVirtualMachine const &) = delete; void operator =(const JavaVirtualMachine&) = delete; -- cgit