diff options
author | Olivier Hallot <olivier.hallot@libreoffice.org> | 2018-04-10 22:50:31 -0300 |
---|---|---|
committer | Olivier Hallot <olivier.hallot@libreoffice.org> | 2018-04-17 11:58:30 +0200 |
commit | cdbb14cedb7d07aec0dda47fbb5ab65a02fb0cf6 (patch) | |
tree | 4a1c6729acb91b65c4b7aa613c2ff91ce71e49e3 /sfx2 | |
parent | 08ec0144cc6c58ce9aeb4d573cee4fd46c484bcd (diff) |
Enable new Help to be installed as extension
This patch enables the new help to be installed as an extension
The extension must match the locale and LibreOffice version
Extension id must be <locale>.help.libreoffice.org
Version must match product version
Help extension can be packed as Uno package from new help
offline build (--with-help=html)
To test the patch, use the en-US help in uno package format available in
https://helponline.libreoffice.org/Help_en-US_6.1.oxt
(To make it distinct from other help installations, the headings paragraphs
are in red.)
Change-Id: I2ff9eb94ef932c29ff7a93ce0241837213b25f2f
Reviewed-on: https://gerrit.libreoffice.org/52700
Reviewed-by: Olivier Hallot <olivier.hallot@libreoffice.org>
Tested-by: Olivier Hallot <olivier.hallot@libreoffice.org>
Diffstat (limited to 'sfx2')
-rw-r--r-- | sfx2/source/appl/sfxhelp.cxx | 99 |
1 files changed, 92 insertions, 7 deletions
diff --git a/sfx2/source/appl/sfxhelp.cxx b/sfx2/source/appl/sfxhelp.cxx index 43606ae0183e..d0cc5248264b 100644 --- a/sfx2/source/appl/sfxhelp.cxx +++ b/sfx2/source/appl/sfxhelp.cxx @@ -39,6 +39,7 @@ #include <com/sun/star/frame/ModuleManager.hpp> #include <com/sun/star/system/SystemShellExecute.hpp> #include <com/sun/star/system/SystemShellExecuteFlags.hpp> +#include <com/sun/star/deployment/PackageInformationProvider.hpp> #include <unotools/configmgr.hxx> #include <unotools/configitem.hxx> #include <svtools/helpopt.hxx> @@ -82,6 +83,10 @@ using namespace ::com::sun::star::uno; using namespace ::com::sun::star::util; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::system; +using ::com::sun::star::deployment::PackageInformationProvider; +using ::com::sun::star::deployment::XPackageInformationProvider; + +namespace uno = css::uno ; class NoHelpErrorBox { @@ -200,6 +205,78 @@ bool impl_hasHTMLHelpInstalled() return bOK; } +// Root path of the HTML help extension +OUString getExtensionHTMLHelpRootURL() +{ + static OUString s_instURL; + if (!s_instURL.isEmpty()) + return s_instURL; + + static OUString aLocaleStr; + + if (aLocaleStr.isEmpty()) + { + // detect installed locale + aLocaleStr = HelpLocaleString(); + } + + Reference< XComponentContext > m_xContext( comphelper::getProcessComponentContext() ); + const Reference< XPackageInformationProvider > xPackageInfo = PackageInformationProvider::get(m_xContext); + + s_instURL = xPackageInfo->getPackageLocation(aLocaleStr + ".help.libreoffice.org"); + + return s_instURL; +} + +/// Check if HTML help extension is installed +/// verify extension installed and correct version +bool impl_hasHTMLHelpExtensionInstalled() +{ + if (comphelper::LibreOfficeKit::isActive()) + return false; + + static OUString aLocaleStr; + static OUString aRootURL; + static OUString aVersion; + + if (aLocaleStr.isEmpty()) + { + // detect installed locale + aLocaleStr = HelpLocaleString(); + } + + OUString aIdentifier(aLocaleStr + ".help.libreoffice.org"); + + if (aRootURL.isEmpty()) + { + Reference< XComponentContext > m_xContext( comphelper::getProcessComponentContext() ); + const Reference< XPackageInformationProvider > xPackageInfo = PackageInformationProvider::get(m_xContext); + aRootURL = xPackageInfo->getPackageLocation(aIdentifier); + if(aRootURL.isEmpty()) + { + return false; + } + uno::Sequence< uno::Sequence< OUString > > aExtensionList (xPackageInfo->getExtensionList()); + + if(aExtensionList.hasElements()) + { + for (long i = aExtensionList.getLength() - 1; i >= 0; i--) + { + SAL_INFO("sfx.appl", aExtensionList[i][0] + " - " + aExtensionList[i][1]) ; + if (aExtensionList[i][0] == aIdentifier) + { + aVersion = aExtensionList[i][1]; + break; + } + } + } + } + + bool bOK(!aRootURL.isEmpty() && (aVersion.startsWith(utl::ConfigManager::getProductVersion()))); + + return bOK; +} + } // namespace /// Return the locale we prefer for displaying help @@ -690,12 +767,12 @@ static bool impl_showOnlineHelp( const OUString& rURL ) #define SHTML3 "\"><script type=\"text/javascript\"> window.location.href = \"" #define SHTML4 "\";</script><title>Help Page Redirection</title></head><body></body></html>" -static bool impl_showOfflineHelp( const OUString& rURL ) + +static bool impl_showOfflineHelp( const OUString& rURL, const OUString& rBaseInstallPath) { - OUString aBaseInstallPath = getHelpRootURL(); OUString const aInternal( "vnd.sun.star.help://" ); - OUString aHelpLink( aBaseInstallPath + "/index.html?" ); + OUString aHelpLink( rBaseInstallPath + "/index.html?" ); aHelpLink += rURL.copy( aInternal.getLength() ); aHelpLink = aHelpLink.replaceAll("%2F","/").replaceAll("%3A",":"); @@ -813,10 +890,14 @@ bool SfxHelp::Start_Impl(const OUString& rURL, const vcl::Window* pWindow, const impl_showOnlineHelp( aHelpURL ); return true; } - + if ( impl_hasHTMLHelpExtensionInstalled() ) + { + impl_showOfflineHelp( aHelpURL, getExtensionHTMLHelpRootURL() ); + return true; + } if ( impl_hasHTMLHelpInstalled() ) { - impl_showOfflineHelp(aHelpURL); + impl_showOfflineHelp(aHelpURL, getHelpRootURL()); return true; } @@ -957,12 +1038,16 @@ bool SfxHelp::Start_Impl(const OUString& rURL, weld::Widget* pWidget, const OUSt return true; } + if ( impl_hasHTMLHelpExtensionInstalled() ) + { + impl_showOfflineHelp( aHelpURL, getExtensionHTMLHelpRootURL() ); + return true; + } if ( impl_hasHTMLHelpInstalled() ) { - impl_showOfflineHelp(aHelpURL); + impl_showOfflineHelp(aHelpURL, getHelpRootURL()); return true; } - if ( !impl_hasHelpInstalled() ) { std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(pWidget, "sfx/ui/helpmanual.ui")); |