diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2020-07-09 08:51:57 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2020-07-31 08:41:02 +0200 |
commit | 6362ebab298549e8616c32cafd75cb3959ba7d65 (patch) | |
tree | 51c7b449beb1d120e5ec47d83683288133c53e52 | |
parent | 400edb0b7721600fedfae87bb209d6879f4a3f81 (diff) |
dbaccess: create instances with uno constructors
See tdf#74608 for motivation
Change-Id: Icbce3ef3f77a19f9174f6aa39791dcf99e51f0c2
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/98395
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r-- | dbaccess/Library_dba.mk | 1 | ||||
-rw-r--r-- | dbaccess/source/core/dataaccess/databasecontext.cxx | 47 | ||||
-rw-r--r-- | dbaccess/source/core/inc/DatabaseDataProvider.hxx | 8 | ||||
-rw-r--r-- | dbaccess/source/core/inc/databasecontext.hxx | 11 | ||||
-rw-r--r-- | dbaccess/source/core/misc/DatabaseDataProvider.cxx | 28 | ||||
-rw-r--r-- | dbaccess/source/core/misc/services.cxx | 59 | ||||
-rw-r--r-- | dbaccess/source/filter/xml/dbloader2.cxx | 5 | ||||
-rw-r--r-- | dbaccess/util/dba.component | 10 |
8 files changed, 54 insertions, 115 deletions
diff --git a/dbaccess/Library_dba.mk b/dbaccess/Library_dba.mk index ecef24d3b4c2..e8f65a5e1a6b 100644 --- a/dbaccess/Library_dba.mk +++ b/dbaccess/Library_dba.mk @@ -120,7 +120,6 @@ $(eval $(call gb_Library_add_exception_objects,dba,\ dbaccess/source/core/misc/migrwarndlg \ dbaccess/source/core/misc/PropertyForward \ dbaccess/source/core/misc/sdbcoretools \ - dbaccess/source/core/misc/services \ dbaccess/source/core/misc/veto \ dbaccess/source/core/recovery/dbdocrecovery \ dbaccess/source/core/recovery/settingsimport \ diff --git a/dbaccess/source/core/dataaccess/databasecontext.cxx b/dbaccess/source/core/dataaccess/databasecontext.cxx index c7ddce73b48a..01d83bafa7ee 100644 --- a/dbaccess/source/core/dataaccess/databasecontext.cxx +++ b/dbaccess/source/core/dataaccess/databasecontext.cxx @@ -60,6 +60,7 @@ #include <tools/diagnose_ex.h> #include <tools/urlobj.hxx> #include <ucbhelper/content.hxx> +#include <rtl/ref.hxx> #include <unotools/sharedunocomponent.hxx> #include <vector> @@ -84,6 +85,10 @@ using ::com::sun::star::ucb::InteractiveIOException; using ::com::sun::star::ucb::IOErrorCode_NOT_EXISTING; using ::com::sun::star::ucb::IOErrorCode_NOT_EXISTING_PATH; +static osl::Mutex g_InstanceGuard; +static rtl::Reference<dbaccess::ODatabaseContext> g_Instance; +static bool g_Disposed = false; + namespace dbaccess { @@ -196,26 +201,10 @@ ODatabaseContext::~ODatabaseContext() m_xDatabaseRegistrations.clear(); } -// Helper -OUString ODatabaseContext::getImplementationName_static() -{ - return "com.sun.star.comp.dba.ODatabaseContext"; -} - -Reference< XInterface > ODatabaseContext::Create(const Reference< XComponentContext >& _rxContext) -{ - return *( new ODatabaseContext( _rxContext ) ); -} - -Sequence< OUString > ODatabaseContext::getSupportedServiceNames_static() -{ - return { "com.sun.star.sdb.DatabaseContext" }; -} - // XServiceInfo OUString ODatabaseContext::getImplementationName( ) { - return getImplementationName_static(); + return "com.sun.star.comp.dba.ODatabaseContext"; } sal_Bool ODatabaseContext::supportsService( const OUString& _rServiceName ) @@ -225,7 +214,7 @@ sal_Bool ODatabaseContext::supportsService( const OUString& _rServiceName ) Sequence< OUString > ODatabaseContext::getSupportedServiceNames( ) { - return getSupportedServiceNames_static(); + return { "com.sun.star.sdb.DatabaseContext" }; } Reference< XInterface > ODatabaseContext::impl_createNewDataSource() @@ -278,6 +267,14 @@ void ODatabaseContext::disposing() } } +void ODatabaseContext::dispose() +{ + DatabaseAccessContext_Base::dispose(); + osl::MutexGuard aGuard(g_InstanceGuard); + g_Instance.clear(); + g_Disposed = true; +} + // XNamingService Reference< XInterface > ODatabaseContext::getRegisteredObject(const OUString& _rName) { @@ -760,4 +757,18 @@ void ODatabaseContext::onBasicManagerCreated( const Reference< XModel >& _rxForD } // namespace dbaccess + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +com_sun_star_comp_dba_ODatabaseContext_get_implementation( + css::uno::XComponentContext* context, css::uno::Sequence<css::uno::Any> const& ) +{ + osl::MutexGuard aGuard(g_InstanceGuard); + if (g_Disposed) + return nullptr; + if (!g_Instance) + g_Instance.set(new dbaccess::ODatabaseContext(context)); + g_Instance->acquire(); + return static_cast<cppu::OWeakObject*>(g_Instance.get()); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/dbaccess/source/core/inc/DatabaseDataProvider.hxx b/dbaccess/source/core/inc/DatabaseDataProvider.hxx index 68c066412a20..3ea202a10c85 100644 --- a/dbaccess/source/core/inc/DatabaseDataProvider.hxx +++ b/dbaccess/source/core/inc/DatabaseDataProvider.hxx @@ -52,14 +52,6 @@ class DatabaseDataProvider: private ::cppu::BaseMutex, public: explicit DatabaseDataProvider(css::uno::Reference< css::uno::XComponentContext > const & context); - // css::lang::XServiceInfo - static methods - /// @throws css::uno::RuntimeException - static css::uno::Sequence< OUString > getSupportedServiceNames_Static(); - /// @throws css::uno::RuntimeException - static OUString getImplementationName_Static(); - static css::uno::Reference< css::uno::XInterface > - Create(css::uno::Reference< css::uno::XComponentContext > const & context); - private: // css::uno::XInterface: virtual css::uno::Any SAL_CALL queryInterface(css::uno::Type const & type) override; diff --git a/dbaccess/source/core/inc/databasecontext.hxx b/dbaccess/source/core/inc/databasecontext.hxx index 0c1848042b26..4b5e8aec6c94 100644 --- a/dbaccess/source/core/inc/databasecontext.hxx +++ b/dbaccess/source/core/inc/databasecontext.hxx @@ -116,6 +116,9 @@ public: // OComponentHelper virtual void SAL_CALL disposing() override; + // XComponent + virtual void SAL_CALL dispose() override; + // XSingleServiceFactory virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance( ) override; virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithArguments( const css::uno::Sequence< css::uno::Any >& _rArguments ) override; @@ -125,14 +128,6 @@ public: virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; - // XServiceInfo - static methods - /// @throws css::uno::RuntimeException - static css::uno::Sequence< OUString > getSupportedServiceNames_static(); - /// @throws css::uno::RuntimeException - static OUString getImplementationName_static(); - static css::uno::Reference< css::uno::XInterface > - Create(const css::uno::Reference< css::uno::XComponentContext >&); - // XElementAccess virtual css::uno::Type SAL_CALL getElementType( ) override; virtual sal_Bool SAL_CALL hasElements( ) override; diff --git a/dbaccess/source/core/misc/DatabaseDataProvider.cxx b/dbaccess/source/core/misc/DatabaseDataProvider.cxx index b5179e57b32f..185591d76203 100644 --- a/dbaccess/source/core/misc/DatabaseDataProvider.cxx +++ b/dbaccess/source/core/misc/DatabaseDataProvider.cxx @@ -96,15 +96,10 @@ uno::Any DatabaseDataProvider::queryInterface(uno::Type const & type) return TDatabaseDataProvider::queryInterface(type); } -OUString DatabaseDataProvider::getImplementationName_Static( ) -{ - return "com.sun.star.comp.dbaccess.DatabaseDataProvider"; -} - // XServiceInfo OUString SAL_CALL DatabaseDataProvider::getImplementationName( ) { - return getImplementationName_Static(); + return "com.sun.star.comp.dbaccess.DatabaseDataProvider"; } sal_Bool SAL_CALL DatabaseDataProvider::supportsService( const OUString& _rServiceName ) @@ -112,19 +107,9 @@ sal_Bool SAL_CALL DatabaseDataProvider::supportsService( const OUString& _rServi return cppu::supportsService(this, _rServiceName); } -uno::Sequence< OUString > DatabaseDataProvider::getSupportedServiceNames_Static( ) -{ - return { "com.sun.star.chart2.data.DatabaseDataProvider" }; -} - uno::Sequence< OUString > SAL_CALL DatabaseDataProvider::getSupportedServiceNames( ) { - return getSupportedServiceNames_Static(); -} - -uno::Reference< uno::XInterface > DatabaseDataProvider::Create(uno::Reference< uno::XComponentContext > const & context) -{ - return *(new DatabaseDataProvider(context)) ; + return { "com.sun.star.chart2.data.DatabaseDataProvider" }; } // lang::XInitialization: @@ -1077,4 +1062,13 @@ void DatabaseDataProvider::impl_invalidateParameter_nothrow() } // namespace dbaccess + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +com_sun_star_comp_dbaccess_DatabaseDataProvider_get_implementation( + css::uno::XComponentContext* context, css::uno::Sequence<css::uno::Any> const& ) +{ + return cppu::acquire(new dbaccess::DatabaseDataProvider(context)); +} + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/dbaccess/source/core/misc/services.cxx b/dbaccess/source/core/misc/services.cxx deleted file mode 100644 index c45c1673b03e..000000000000 --- a/dbaccess/source/core/misc/services.cxx +++ /dev/null @@ -1,59 +0,0 @@ -/* -*- 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 . - */ - -#include <cppuhelper/factory.hxx> -#include <cppuhelper/implementationentry.hxx> -#include <DatabaseDataProvider.hxx> - -#include <databasecontext.hxx> - -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::registry; - -namespace dba{ - ::cppu::ImplementationEntry const entries[] = { - { - &::dbaccess::DatabaseDataProvider::Create, - &::dbaccess::DatabaseDataProvider::getImplementationName_Static, - &::dbaccess::DatabaseDataProvider::getSupportedServiceNames_Static, - &cppu::createSingleComponentFactory, nullptr, 0 - }, - - { - &dbaccess::ODatabaseContext::Create, - &dbaccess::ODatabaseContext::getImplementationName_static, - &dbaccess::ODatabaseContext::getSupportedServiceNames_static, - &cppu::createOneInstanceComponentFactory, nullptr, 0 - }, - - { nullptr, nullptr, nullptr, nullptr, nullptr, 0 } - }; -} - -extern "C" SAL_DLLPUBLIC_EXPORT void* dba_component_getFactory( - const char* pImplementationName, - void* pServiceManager, - void* pRegistryKey) -{ - return cppu::component_getFactoryHelper( - pImplementationName, pServiceManager, pRegistryKey, dba::entries); -}; - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/dbaccess/source/filter/xml/dbloader2.cxx b/dbaccess/source/filter/xml/dbloader2.cxx index 9587647a38ff..8ccf9e5d7a02 100644 --- a/dbaccess/source/filter/xml/dbloader2.cxx +++ b/dbaccess/source/filter/xml/dbloader2.cxx @@ -355,10 +355,13 @@ void SAL_CALL DBContentLoader::load(const Reference< XFrame > & rFrame, const OU OUString sViewName = aMediaDesc.getOrDefault( "ViewName", OUString( "Default" ) ); aMediaDesc.remove( "ViewName" ); + // this needs to stay alive for duration of this method + Reference< XDatabaseContext > xDatabaseContext; + sal_Int32 nInitialSelection = -1; if ( !xModel.is() ) { - Reference< XDatabaseContext > xDatabaseContext( DatabaseContext::create(m_aContext) ); + xDatabaseContext = DatabaseContext::create(m_aContext); OUString sFactoryName = SvtModuleOptions().GetFactoryEmptyDocumentURL(SvtModuleOptions::EFactory::DATABASE); bCreateNew = sFactoryName.match(_rURL); diff --git a/dbaccess/util/dba.component b/dbaccess/util/dba.component index 90ba9e3ba7e9..83795ff82f77 100644 --- a/dbaccess/util/dba.component +++ b/dbaccess/util/dba.component @@ -18,8 +18,9 @@ --> <component loader="com.sun.star.loader.SharedLibrary" environment="@CPPU_ENV@" - prefix="dba" xmlns="http://openoffice.org/2010/uno-components"> - <implementation name="com.sun.star.comp.dbaccess.DatabaseDataProvider"> + xmlns="http://openoffice.org/2010/uno-components"> + <implementation name="com.sun.star.comp.dbaccess.DatabaseDataProvider" + constructor="com_sun_star_comp_dbaccess_DatabaseDataProvider_get_implementation"> <service name="com.sun.star.chart2.data.DatabaseDataProvider"/> </implementation> <implementation name="com.sun.star.comp.dba.DataAccessDescriptorFactory" @@ -35,7 +36,10 @@ constructor="com_sun_star_comp_dba_OComponentDefinition"> <service name="com.sun.star.sdb.TableDefinition"/> </implementation> - <implementation name="com.sun.star.comp.dba.ODatabaseContext"> + <implementation name="com.sun.star.comp.dba.ODatabaseContext" + constructor="com_sun_star_comp_dba_ODatabaseContext_get_implementation"> + <!-- fake singleton so the servicemanager calls dispose() on us so we can clean up the global --> + <singleton name="com.sun.star.comp.dba.theODatabaseContext"/> <service name="com.sun.star.sdb.DatabaseContext"/> </implementation> <implementation name="com.sun.star.comp.dba.ODatabaseDocument" |