summaryrefslogtreecommitdiff
path: root/dbaccess
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2020-07-09 08:51:57 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2020-07-31 08:41:02 +0200
commit6362ebab298549e8616c32cafd75cb3959ba7d65 (patch)
tree51c7b449beb1d120e5ec47d83683288133c53e52 /dbaccess
parent400edb0b7721600fedfae87bb209d6879f4a3f81 (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>
Diffstat (limited to 'dbaccess')
-rw-r--r--dbaccess/Library_dba.mk1
-rw-r--r--dbaccess/source/core/dataaccess/databasecontext.cxx47
-rw-r--r--dbaccess/source/core/inc/DatabaseDataProvider.hxx8
-rw-r--r--dbaccess/source/core/inc/databasecontext.hxx11
-rw-r--r--dbaccess/source/core/misc/DatabaseDataProvider.cxx28
-rw-r--r--dbaccess/source/core/misc/services.cxx59
-rw-r--r--dbaccess/source/filter/xml/dbloader2.cxx5
-rw-r--r--dbaccess/util/dba.component10
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"