summaryrefslogtreecommitdiff
path: root/linguistic
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2021-08-10 10:13:04 +0200
committerStephan Bergmann <sbergman@redhat.com>2021-08-10 15:07:35 +0200
commitf989bd22cc3c80d3c5119e3de1a269ab9a80bd78 (patch)
treeff9b16d113c5255ec696927b4b85a34d40cb32d9 /linguistic
parent7a3eaef6dd707781c2f4e341aebb9d4c42df780f (diff)
Catch exceptions when setting up linguistic extensions
...not only from the createInstance calls, but also from later calls like XSpellChecker::getLocales. At least when installing <https://www.puimula.org/htp/ooo/voikko-win/5.0.2.20170827/voikko.oxt> (which only contains native code for macOS and Windows) on Linux, that getLocales call would cause a RuntimeException, but which was effectively left uncaught and thus caused a crash. Change-Id: Id06760cb91b9aef2f3bbfe94213e40146214903d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120260 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'linguistic')
-rw-r--r--linguistic/source/lngsvcmgr.cxx116
1 files changed, 51 insertions, 65 deletions
diff --git a/linguistic/source/lngsvcmgr.cxx b/linguistic/source/lngsvcmgr.cxx
index b4b8d3836f6e..a0f9822e4779 100644
--- a/linguistic/source/lngsvcmgr.cxx
+++ b/linguistic/source/lngsvcmgr.cxx
@@ -940,7 +940,6 @@ void LngSvcMgr::GetAvailableSpellSvcs_Impl()
uno::Reference< lang::XSingleComponentFactory > xCompFactory;
uno::Reference< lang::XSingleServiceFactory > xFactory;
- uno::Reference< linguistic2::XSpellChecker > xSvc;
xCompFactory.set(aCurrent, css::uno::UNO_QUERY);
if (!xCompFactory.is())
{
@@ -950,27 +949,24 @@ void LngSvcMgr::GetAvailableSpellSvcs_Impl()
{
try
{
- xSvc.set( ( xCompFactory.is() ? xCompFactory->createInstanceWithContext( xContext ) : xFactory->createInstance() ), uno::UNO_QUERY );
+ uno::Reference< linguistic2::XSpellChecker > xSvc( ( xCompFactory.is() ? xCompFactory->createInstanceWithContext( xContext ) : xFactory->createInstance() ), uno::UNO_QUERY_THROW );
+
+ OUString aImplName;
+ std::vector< LanguageType > aLanguages;
+ uno::Reference< XServiceInfo > xInfo( xSvc, uno::UNO_QUERY );
+ if (xInfo.is())
+ aImplName = xInfo->getImplementationName();
+ SAL_WARN_IF( aImplName.isEmpty(), "linguistic", "empty implementation name" );
+ uno::Sequence<lang::Locale> aLocaleSequence(xSvc->getLocales());
+ aLanguages = LocaleSeqToLangVec( aLocaleSequence );
+
+ pAvailSpellSvcs->push_back( std::make_unique<SvcInfo>( aImplName, aLanguages ) );
}
catch (const uno::Exception &)
{
SAL_WARN( "linguistic", "createInstance failed" );
}
}
-
- if (xSvc.is())
- {
- OUString aImplName;
- std::vector< LanguageType > aLanguages;
- uno::Reference< XServiceInfo > xInfo( xSvc, uno::UNO_QUERY );
- if (xInfo.is())
- aImplName = xInfo->getImplementationName();
- SAL_WARN_IF( aImplName.isEmpty(), "linguistic", "empty implementation name" );
- uno::Sequence<lang::Locale> aLocaleSequence(xSvc->getLocales());
- aLanguages = LocaleSeqToLangVec( aLocaleSequence );
-
- pAvailSpellSvcs->push_back( std::make_unique<SvcInfo>( aImplName, aLanguages ) );
- }
}
}
@@ -998,7 +994,6 @@ void LngSvcMgr::GetAvailableGrammarSvcs_Impl()
uno::Reference< lang::XSingleComponentFactory > xCompFactory;
uno::Reference< lang::XSingleServiceFactory > xFactory;
- uno::Reference< linguistic2::XProofreader > xSvc;
xCompFactory.set(aCurrent, css::uno::UNO_QUERY);
if (!xCompFactory.is())
{
@@ -1008,13 +1003,24 @@ void LngSvcMgr::GetAvailableGrammarSvcs_Impl()
{
try
{
- if (xCompFactory.is())
- {
- xSvc.set(xCompFactory->createInstanceWithContext(xContext), uno::UNO_QUERY);
- }
- else
+ uno::Reference< linguistic2::XProofreader > xSvc(
+ xCompFactory.is()
+ ? xCompFactory->createInstanceWithContext(xContext)
+ : xFactory->createInstance(),
+ uno::UNO_QUERY_THROW);
+
+ if (pAvailGrammarSvcs)
{
- xSvc.set(xFactory->createInstance(), uno::UNO_QUERY);
+ OUString aImplName;
+ std::vector< LanguageType > aLanguages;
+ uno::Reference< XServiceInfo > xInfo( xSvc, uno::UNO_QUERY );
+ if (xInfo.is())
+ aImplName = xInfo->getImplementationName();
+ SAL_WARN_IF( aImplName.isEmpty(), "linguistic", "empty implementation name" );
+ uno::Sequence<lang::Locale> aLocaleSequence(xSvc->getLocales());
+ aLanguages = LocaleSeqToLangVec( aLocaleSequence );
+
+ pAvailGrammarSvcs->push_back( std::make_unique<SvcInfo>( aImplName, aLanguages ) );
}
}
catch (const uno::Exception &)
@@ -1023,19 +1029,6 @@ void LngSvcMgr::GetAvailableGrammarSvcs_Impl()
}
}
- if (xSvc.is() && pAvailGrammarSvcs)
- {
- OUString aImplName;
- std::vector< LanguageType > aLanguages;
- uno::Reference< XServiceInfo > xInfo( xSvc, uno::UNO_QUERY );
- if (xInfo.is())
- aImplName = xInfo->getImplementationName();
- SAL_WARN_IF( aImplName.isEmpty(), "linguistic", "empty implementation name" );
- uno::Sequence<lang::Locale> aLocaleSequence(xSvc->getLocales());
- aLanguages = LocaleSeqToLangVec( aLocaleSequence );
-
- pAvailGrammarSvcs->push_back( std::make_unique<SvcInfo>( aImplName, aLanguages ) );
- }
}
}
@@ -1062,7 +1055,6 @@ void LngSvcMgr::GetAvailableHyphSvcs_Impl()
uno::Reference< lang::XSingleComponentFactory > xCompFactory;
uno::Reference< lang::XSingleServiceFactory > xFactory;
- uno::Reference< linguistic2::XHyphenator > xSvc;
xCompFactory.set(aCurrent, css::uno::UNO_QUERY);
if (!xCompFactory.is())
{
@@ -1072,25 +1064,22 @@ void LngSvcMgr::GetAvailableHyphSvcs_Impl()
{
try
{
- xSvc.set( ( xCompFactory.is() ? xCompFactory->createInstanceWithContext( xContext ) : xFactory->createInstance() ), uno::UNO_QUERY );
+ uno::Reference< linguistic2::XHyphenator > xSvc( ( xCompFactory.is() ? xCompFactory->createInstanceWithContext( xContext ) : xFactory->createInstance() ), uno::UNO_QUERY_THROW );
+ OUString aImplName;
+ std::vector< LanguageType > aLanguages;
+ uno::Reference< XServiceInfo > xInfo( xSvc, uno::UNO_QUERY );
+ if (xInfo.is())
+ aImplName = xInfo->getImplementationName();
+ SAL_WARN_IF( aImplName.isEmpty(), "linguistic", "empty implementation name" );
+ uno::Sequence<lang::Locale> aLocaleSequence(xSvc->getLocales());
+ aLanguages = LocaleSeqToLangVec( aLocaleSequence );
+ pAvailHyphSvcs->push_back( std::make_unique<SvcInfo>( aImplName, aLanguages ) );
}
catch (const uno::Exception &)
{
SAL_WARN( "linguistic", "createInstance failed" );
}
}
- if (xSvc.is())
- {
- OUString aImplName;
- std::vector< LanguageType > aLanguages;
- uno::Reference< XServiceInfo > xInfo( xSvc, uno::UNO_QUERY );
- if (xInfo.is())
- aImplName = xInfo->getImplementationName();
- SAL_WARN_IF( aImplName.isEmpty(), "linguistic", "empty implementation name" );
- uno::Sequence<lang::Locale> aLocaleSequence(xSvc->getLocales());
- aLanguages = LocaleSeqToLangVec( aLocaleSequence );
- pAvailHyphSvcs->push_back( std::make_unique<SvcInfo>( aImplName, aLanguages ) );
- }
}
}
@@ -1118,7 +1107,6 @@ void LngSvcMgr::GetAvailableThesSvcs_Impl()
uno::Reference< lang::XSingleComponentFactory > xCompFactory;
uno::Reference< lang::XSingleServiceFactory > xFactory;
- uno::Reference< linguistic2::XThesaurus > xSvc;
xCompFactory.set(aCurrent, css::uno::UNO_QUERY);
if (!xCompFactory.is())
{
@@ -1128,26 +1116,24 @@ void LngSvcMgr::GetAvailableThesSvcs_Impl()
{
try
{
- xSvc.set( ( xCompFactory.is() ? xCompFactory->createInstanceWithContext( xContext ) : xFactory->createInstance() ), uno::UNO_QUERY );
+ uno::Reference< linguistic2::XThesaurus > xSvc( ( xCompFactory.is() ? xCompFactory->createInstanceWithContext( xContext ) : xFactory->createInstance() ), uno::UNO_QUERY_THROW );
+
+ OUString aImplName;
+ std::vector< LanguageType > aLanguages;
+ uno::Reference< XServiceInfo > xInfo( xSvc, uno::UNO_QUERY );
+ if (xInfo.is())
+ aImplName = xInfo->getImplementationName();
+ SAL_WARN_IF( aImplName.isEmpty(), "linguistic", "empty implementation name" );
+ uno::Sequence<lang::Locale> aLocaleSequence(xSvc->getLocales());
+ aLanguages = LocaleSeqToLangVec( aLocaleSequence );
+
+ pAvailThesSvcs->push_back( std::make_unique<SvcInfo>( aImplName, aLanguages ) );
}
catch (const uno::Exception &)
{
SAL_WARN( "linguistic", "createInstance failed" );
}
}
- if (xSvc.is())
- {
- OUString aImplName;
- std::vector< LanguageType > aLanguages;
- uno::Reference< XServiceInfo > xInfo( xSvc, uno::UNO_QUERY );
- if (xInfo.is())
- aImplName = xInfo->getImplementationName();
- SAL_WARN_IF( aImplName.isEmpty(), "linguistic", "empty implementation name" );
- uno::Sequence<lang::Locale> aLocaleSequence(xSvc->getLocales());
- aLanguages = LocaleSeqToLangVec( aLocaleSequence );
-
- pAvailThesSvcs->push_back( std::make_unique<SvcInfo>( aImplName, aLanguages ) );
- }
}
}