diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk
index 7687ee9fd06d..0ef13a1f7372 100644
--- a/offapi/UnoApi_offapi.mk
+++ b/offapi/UnoApi_offapi.mk
@@ -3746,6 +3746,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/text,\
ColumnSeparatorStyle \
ControlCharacter \
DateDisplayFormat \
+ DialogFactoryService \
DocumentStatistic \
FilenameDisplayFormat \
FontEmphasis \
diff --git a/offapi/com/sun/star/text/DialogFactoryService.idl b/offapi/com/sun/star/text/DialogFactoryService.idl
new file mode 100644
index 000000000000..060dc7eeef2e
--- /dev/null
+++ b/offapi/com/sun/star/text/DialogFactoryService.idl
@@ -0,0 +1,38 @@
+/* -*- 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 .
+ */
+
+module com { module sun { module star { module text {
+
+/**
+ The sw module uses this to get a pointer to the from the swui module.
+ Because we have a dependency in our modules that goes the "wrong" way.
+
+ @since LibreOffice 24.8
+
+ @internal
+
+ ATTENTION: This is marked internal and does not
+ have the published flag, which means it is subject to
+ change without notice and should not be used outside the LibreOffice core.
+*/
+service DialogFactoryService : com::sun::star::lang::XUnoTunnel;
+
+}; }; }; };
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/Library_swui.mk b/sw/Library_swui.mk
index 3a56419f7327..2c6d8512fe44 100644
--- a/sw/Library_swui.mk
+++ b/sw/Library_swui.mk
@@ -19,7 +19,7 @@
$(eval $(call gb_Library_Library,swui))
-$(eval $(call gb_Library_set_plugin_for,swui,sw))
+$(eval $(call gb_Library_set_componentfile,swui,sw/util/swui,services))
$(eval $(call gb_Library_set_include,swui,\
-I$(SRCDIR)/sw/inc \
@@ -72,6 +72,7 @@ $(eval $(call gb_Library_use_libraries,swui,\
svx \
svx \
svxcore \
+ sw \
tk \
tl \
ucbhelper \
diff --git a/sw/qa/unit/sw-dialogs-test.cxx b/sw/qa/unit/sw-dialogs-test.cxx
index 48652ca1db74..0e9bd50db309 100644
--- a/sw/qa/unit/sw-dialogs-test.cxx
+++ b/sw/qa/unit/sw-dialogs-test.cxx
@@ -13,6 +13,8 @@
#include
#include
#include
+#include
+#include
class SwAbstractDialogFactory;
@@ -62,16 +64,11 @@ void SwDialogsTest::setUp()
component_ = loadFromDesktop(
"private:factory/swriter", "com.sun.star.text.TextDocument");
// Make sure the swui library's global pSwResMgr is initialized
- // (alternatively to dynamically loading the library, SwCreateDialogFactory
- // could be declared in an include file and this CppunitTest link against
- // the swui library):
- OUString url("${LO_LIB_DIR}/" SVLIBRARY("swui"));
- rtl::Bootstrap::expandMacros(url); //TODO: detect failure
- CPPUNIT_ASSERT(libSwui_.load(url, SAL_LOADMODULE_GLOBAL));
- auto fn = reinterpret_cast(
- libSwui_.getFunctionSymbol("SwCreateDialogFactory"));
- CPPUNIT_ASSERT(fn != nullptr);
- (*fn)();
+ auto xService = css::text::DialogFactoryService::create(comphelper::getProcessComponentContext());
+ CPPUNIT_ASSERT(xService.is());
+ // get a factory instance
+ SwAbstractDialogFactory* pFactory = reinterpret_cast(xService->getSomething({}));
+ CPPUNIT_ASSERT(pFactory != nullptr);
}
void SwDialogsTest::tearDown()
diff --git a/sw/qa/unit/sw-dialogs-test_2.cxx b/sw/qa/unit/sw-dialogs-test_2.cxx
index 42e8d4b786da..e0de86d276d3 100644
--- a/sw/qa/unit/sw-dialogs-test_2.cxx
+++ b/sw/qa/unit/sw-dialogs-test_2.cxx
@@ -13,7 +13,8 @@
#include
#include
#include
-
+#include
+#include
#include
class SwAbstractDialogFactory;
@@ -59,16 +60,11 @@ void SwDialogsTest2::setUp()
ScreenshotTest::setUp();
SwGlobals::ensure();
// Make sure the swui library's global pSwResMgr is initialized
- // (alternatively to dynamically loading the library, SwCreateDialogFactory
- // could be declared in an include file and this CppunitTest link against
- // the swui library):
- OUString url("${LO_LIB_DIR}/" SVLIBRARY("swui"));
- rtl::Bootstrap::expandMacros(url); //TODO: detect failure
- CPPUNIT_ASSERT(libSwui_.load(url, SAL_LOADMODULE_GLOBAL));
- auto fn = reinterpret_cast(
- libSwui_.getFunctionSymbol("SwCreateDialogFactory"));
- CPPUNIT_ASSERT(fn != nullptr);
- (*fn)();
+ auto xService = css::text::DialogFactoryService::create(comphelper::getProcessComponentContext());
+ CPPUNIT_ASSERT(xService.is());
+ // get a factory instance
+ SwAbstractDialogFactory* pFactory = reinterpret_cast(xService->getSomething({}));
+ CPPUNIT_ASSERT(pFactory != nullptr);
}
void SwDialogsTest2::registerKnownDialogsByID(mapType& /*rKnownDialogs*/)
diff --git a/sw/source/ui/dialog/swuiexp.cxx b/sw/source/ui/dialog/swuiexp.cxx
index e141dab80d0d..7f2912414b6d 100644
--- a/sw/source/ui/dialog/swuiexp.cxx
+++ b/sw/source/ui/dialog/swuiexp.cxx
@@ -18,8 +18,9 @@
*/
#include "swdlgfact.hxx"
-
#include
+#include
+#include
namespace swui
{
@@ -30,10 +31,44 @@ SwAbstractDialogFactory& GetFactory()
}
}
-extern "C" {
-SAL_DLLPUBLIC_EXPORT SwAbstractDialogFactory* SwCreateDialogFactory()
+/// anonymous implementation namespace
+namespace
{
- return &::swui::GetFactory();
+class DialogFactoryService
+ : public ::cppu::WeakImplHelper
+{
+public:
+ // css::lang::XServiceInfo:
+ virtual OUString SAL_CALL getImplementationName() override
+ {
+ return "com.sun.star.text.comp.DialogFactoryService";
+ }
+ virtual sal_Bool SAL_CALL supportsService(const OUString& serviceName) override
+ {
+ return cppu::supportsService(this, serviceName);
+ }
+ virtual css::uno::Sequence SAL_CALL getSupportedServiceNames() override
+ {
+ return { "com.sun.star.text.DialogFactoryService" };
+ }
+
+ // XUnoTunnel
+ virtual sal_Int64 SAL_CALL
+ getSomething(const ::css::uno::Sequence<::sal_Int8>& /*aIdentifier*/) override
+ {
+ SwAbstractDialogFactory* pFactory = &::swui::GetFactory();
+ return reinterpret_cast(pFactory);
+ }
+};
+
+} // closing anonymous implementation namespace
+
+extern "C" {
+SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_text_DialogFactoryService_get_implementation(css::uno::XComponentContext*,
+ css::uno::Sequence const&)
+{
+ return cppu::acquire(new DialogFactoryService);
}
}
diff --git a/sw/source/uibase/dialog/swabstdlg.cxx b/sw/source/uibase/dialog/swabstdlg.cxx
index d5651d731cd4..fffc1a6c2a6f 100644
--- a/sw/source/uibase/dialog/swabstdlg.cxx
+++ b/sw/source/uibase/dialog/swabstdlg.cxx
@@ -18,38 +18,17 @@
*/
#include
-
-#include
-
-typedef SwAbstractDialogFactory* (*SwFuncPtrCreateDialogFactory)();
-
-#ifndef DISABLE_DYNLOADING
-
-extern "C" { static void thisModule() {} }
-
-#else
-
-extern "C" SwAbstractDialogFactory* SwCreateDialogFactory();
-
-#endif
+#include
+#include
SwAbstractDialogFactory* SwAbstractDialogFactory::Create()
{
- SwFuncPtrCreateDialogFactory fp = nullptr;
-#ifndef DISABLE_DYNLOADING
- static ::osl::Module aDialogLibrary;
- static constexpr OUStringLiteral sLibName(u"" SWUI_DLL_NAME);
- if ( aDialogLibrary.is() || aDialogLibrary.loadRelative( &thisModule, sLibName,
- SAL_LOADMODULE_GLOBAL | SAL_LOADMODULE_LAZY ) )
- fp = reinterpret_cast(
- aDialogLibrary.getFunctionSymbol( "SwCreateDialogFactory" ));
-#else
- fp = SwCreateDialogFactory;
-#endif
-
- if ( fp )
- return fp();
- return nullptr;
+ auto xService = css::text::DialogFactoryService::create(comphelper::getProcessComponentContext());
+ assert(xService);
+ // get a factory instance
+ SwAbstractDialogFactory* pFactory = reinterpret_cast(xService->getSomething({}));
+ assert(pFactory);
+ return pFactory;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/util/swui.component b/sw/util/swui.component
new file mode 100644
index 000000000000..215b49a4dbb1
--- /dev/null
+++ b/sw/util/swui.component
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
diff --git a/vcl/workben/docxfuzzer.cxx b/vcl/workben/docxfuzzer.cxx
index 73fc198bd886..b7739d788414 100644
--- a/vcl/workben/docxfuzzer.cxx
+++ b/vcl/workben/docxfuzzer.cxx
@@ -11,11 +11,6 @@
#include
#include "commonfuzzer.hxx"
-extern "C" void* SwCreateDialogFactory()
-{
- return nullptr;
-}
-
extern "C" bool TestImportDOCX(SvStream &rStream);
extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
diff --git a/vcl/workben/fodt2pdffuzzer.cxx b/vcl/workben/fodt2pdffuzzer.cxx
index 91e04966c1ff..27fa83cb7203 100644
--- a/vcl/workben/fodt2pdffuzzer.cxx
+++ b/vcl/workben/fodt2pdffuzzer.cxx
@@ -15,8 +15,6 @@
#include
#include "commonfuzzer.hxx"
-extern "C" void* SwCreateDialogFactory() { return nullptr; }
-
extern "C" bool TestPDFExportFODT(SvStream& rStream);
static void silent_error_func(void*, const char* /*format*/, ...) {}
diff --git a/vcl/workben/fodtfuzzer.cxx b/vcl/workben/fodtfuzzer.cxx
index 71c37aa7c42d..0e95b59e979d 100644
--- a/vcl/workben/fodtfuzzer.cxx
+++ b/vcl/workben/fodtfuzzer.cxx
@@ -11,11 +11,6 @@
#include
#include "commonfuzzer.hxx"
-extern "C" void* SwCreateDialogFactory()
-{
- return nullptr;
-}
-
extern "C" bool TestImportFODT(SvStream &rStream);
extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
diff --git a/vcl/workben/htmlfuzzer.cxx b/vcl/workben/htmlfuzzer.cxx
index b2e89442088b..093f368b05fd 100644
--- a/vcl/workben/htmlfuzzer.cxx
+++ b/vcl/workben/htmlfuzzer.cxx
@@ -11,8 +11,6 @@
#include
#include "commonfuzzer.hxx"
-extern "C" void* SwCreateDialogFactory() { return nullptr; }
-
extern "C" bool TestImportHTML(SvStream& rStream);
extern "C" int LLVMFuzzerInitialize(int* argc, char*** argv)
diff --git a/vcl/workben/rtffuzzer.cxx b/vcl/workben/rtffuzzer.cxx
index cd68a84eda6c..34031a8e3f55 100644
--- a/vcl/workben/rtffuzzer.cxx
+++ b/vcl/workben/rtffuzzer.cxx
@@ -67,11 +67,6 @@ extern "C" void* lo_get_custom_widget_func(const char*)
return nullptr;
}
-extern "C" void* SwCreateDialogFactory()
-{
- return nullptr;
-}
-
extern "C" bool TestImportRTF(SvStream &rStream);
extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
diff --git a/vcl/workben/ww2fuzzer.cxx b/vcl/workben/ww2fuzzer.cxx
index 5ffe0445c3fb..2578b2ca855a 100644
--- a/vcl/workben/ww2fuzzer.cxx
+++ b/vcl/workben/ww2fuzzer.cxx
@@ -107,11 +107,6 @@ extern "C" void* lo_get_custom_widget_func(const char*)
return nullptr;
}
-extern "C" void* SwCreateDialogFactory()
-{
- return nullptr;
-}
-
extern "C" bool TestImportWW2(SvStream &rStream);
extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
diff --git a/vcl/workben/ww6fuzzer.cxx b/vcl/workben/ww6fuzzer.cxx
index a17be9105a06..3ce6e8ed58bc 100644
--- a/vcl/workben/ww6fuzzer.cxx
+++ b/vcl/workben/ww6fuzzer.cxx
@@ -109,11 +109,6 @@ extern "C" void* lo_get_custom_widget_func(const char*)
return nullptr;
}
-extern "C" void* SwCreateDialogFactory()
-{
- return nullptr;
-}
-
extern "C" bool TestImportWW6(SvStream &rStream);
extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
diff --git a/vcl/workben/ww8fuzzer.cxx b/vcl/workben/ww8fuzzer.cxx
index 113e798610f3..61737aa46ab2 100644
--- a/vcl/workben/ww8fuzzer.cxx
+++ b/vcl/workben/ww8fuzzer.cxx
@@ -109,11 +109,6 @@ extern "C" void* lo_get_custom_widget_func(const char*)
return nullptr;
}
-extern "C" void* SwCreateDialogFactory()
-{
- return nullptr;
-}
-
extern "C" bool TestImportWW8(SvStream &rStream);
extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)