From 6948c546fdc00dddec7d58e03150dcc87921d6b2 Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Mon, 26 Oct 2015 17:55:14 +0100 Subject: tdf#75637: Resolve help images via a vnd.libreoffice.image UCP ...which uses the logic already available in VCL's ImplImageTree to locate the image zip files and find fallbacks for incomplete themes and for localized images. Change-Id: Ic1c15fcacb6596a27a2b051093232902202bf472 --- Repository.mk | 1 + include/vcl/implimagetree.hxx | 121 +++++++++++++++ .../data/org/openoffice/ucb/Configuration.xcu | 11 ++ postprocess/Rdb_services.mk | 1 + ucb/Library_ucpimage.mk | 33 ++++ ucb/Module_ucb.mk | 1 + ucb/source/ucp/image/ucpimage.component | 17 ++ ucb/source/ucp/image/ucpimage.cxx | 172 +++++++++++++++++++++ vcl/inc/impimagetree.hxx | 117 -------------- vcl/osx/vclnsapp.mm | 4 +- vcl/source/app/settings.cxx | 2 +- vcl/source/app/svmain.cxx | 4 +- vcl/source/control/fixed.cxx | 6 +- vcl/source/gdi/bitmapex.cxx | 6 +- vcl/source/gdi/image.cxx | 6 +- vcl/source/gdi/imagerepository.cxx | 8 +- vcl/source/gdi/impimagetree.cxx | 71 ++++++++- xmlhelp/source/cxxhelp/provider/databases.cxx | 122 +++------------ xmlhelp/source/cxxhelp/provider/databases.hxx | 6 +- xmlhelp/source/cxxhelp/provider/provider.cxx | 14 -- xmlhelp/source/cxxhelp/provider/urlparameter.cxx | 4 +- xmlhelp/util/main_transform.xsl | 53 +------ 22 files changed, 470 insertions(+), 310 deletions(-) create mode 100644 include/vcl/implimagetree.hxx create mode 100644 ucb/Library_ucpimage.mk create mode 100644 ucb/source/ucp/image/ucpimage.component create mode 100644 ucb/source/ucp/image/ucpimage.cxx delete mode 100644 vcl/inc/impimagetree.hxx diff --git a/Repository.mk b/Repository.mk index 1a57f302f46a..4399aa58d165 100644 --- a/Repository.mk +++ b/Repository.mk @@ -416,6 +416,7 @@ $(eval $(call gb_Helper_register_libraries_for_install,OOOLIBS,ooo, \ $(if $(ENABLE_TELEPATHY),tubes) \ ucpexpand1 \ ucpext \ + ucpimage \ ucpcmis1 \ ucptdoc1 \ unordf \ diff --git a/include/vcl/implimagetree.hxx b/include/vcl/implimagetree.hxx new file mode 100644 index 000000000000..ffab4a827f7d --- /dev/null +++ b/include/vcl/implimagetree.hxx @@ -0,0 +1,121 @@ +/* -*- 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 . + */ + +#ifndef INCLUDED_INCLUDE_VCL_IMPLIMAGETREE_HXX +#define INCLUDED_INCLUDE_VCL_IMPLIMAGETREE_HXX + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace com { namespace sun { namespace star { namespace container { + class XNameAccess; +} } } } + +class ImplImageTree { +public: + VCL_DLLPUBLIC static ImplImageTree & get(); + + ImplImageTree(); + + ~ImplImageTree(); + + VCL_DLLPUBLIC OUString getImageUrl( + OUString const & name, OUString const & style, OUString const & lang); + + bool loadImage( + OUString const & name, OUString const & style, + BitmapEx & bitmap, bool localized = false, bool loadMissing = false ); + + bool loadDefaultImage( + OUString const & style, + BitmapEx& bitmap); + + /** a crude form of life cycle control (called from DeInitVCL; otherwise, + * if the ImplImageTree singleton were destroyed during exit that would + * be too late for the destructors of the bitmaps in maIconCache)*/ + void shutDown(); + + css::uno::Reference< css::container::XNameAccess > getNameAccess(); + +private: + ImplImageTree(const ImplImageTree&) = delete; + ImplImageTree& operator=(const ImplImageTree&) = delete; + + typedef std::unordered_map, OUStringHash> IconCache; + typedef std::unordered_map IconLinkHash; + + struct IconSet { + OUString maURL; + css::uno::Reference maNameAccess; + IconCache maIconCache; + IconLinkHash maLinkHash; + + IconSet() {} + IconSet(const OUString &aURL) : maURL(aURL) {} + }; + + /// Map between the theme name(s) and the content. + typedef std::unordered_map StyleIconSet; + + /// Remember all the (used) icon styles and individual icons in them. + StyleIconSet maIconSet; + + /// Style used for the current operations; switches switch several times during fallback search. + OUString maCurrentStyle; + + bool doLoadImage( + OUString const & name, OUString const & style, + BitmapEx & bitmap, bool localized); + + bool checkPathAccess(); + + void setStyle(OUString const & style ); + + void createStyle(); + + bool iconCacheLookup( OUString const & name, bool localized, BitmapEx & bitmap ); + + bool findImage(std::vector< OUString > const & paths, BitmapEx & bitmap ); + + void loadImageLinks(); + + void parseLinkFile(std::shared_ptr stream); + + /// Return name of a real .png according to links.txt. + OUString const & getRealImageName(OUString const & name); + + /** Return name of the fallback style for the provided one. + + Must not be cyclic :-) The last theme in the chain returns an empty string. + */ + static OUString fallbackStyle(const OUString &style); +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/officecfg/registry/data/org/openoffice/ucb/Configuration.xcu b/officecfg/registry/data/org/openoffice/ucb/Configuration.xcu index f10ddbf897fa..ff38a798f2be 100644 --- a/officecfg/registry/data/org/openoffice/ucb/Configuration.xcu +++ b/officecfg/registry/data/org/openoffice/ucb/Configuration.xcu @@ -179,6 +179,17 @@ + + + com.sun.star.ucb.ImageContentProvider + + + vnd.libreoffice.image + + + + + diff --git a/postprocess/Rdb_services.mk b/postprocess/Rdb_services.mk index 5e703b20b2d7..1974b591d440 100644 --- a/postprocess/Rdb_services.mk +++ b/postprocess/Rdb_services.mk @@ -98,6 +98,7 @@ $(eval $(call gb_Rdb_add_components,services,\ ucb/source/ucp/file/ucpfile1 \ $(if $(ENABLE_CURL),ucb/source/ucp/ftp/ucpftp1) \ ucb/source/ucp/hierarchy/ucphier1 \ + ucb/source/ucp/image/ucpimage \ ucb/source/ucp/package/ucppkg1 \ ucb/source/ucp/tdoc/ucptdoc1 \ UnoControls/util/ctl \ diff --git a/ucb/Library_ucpimage.mk b/ucb/Library_ucpimage.mk new file mode 100644 index 000000000000..9c683f748f75 --- /dev/null +++ b/ucb/Library_ucpimage.mk @@ -0,0 +1,33 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# 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/. +# + +$(eval $(call gb_Library_Library,ucpimage)) + +$(eval $(call gb_Library_add_exception_objects,ucpimage, \ + ucb/source/ucp/image/ucpimage \ +)) + +$(eval $(call gb_Library_set_componentfile,ucpimage,ucb/source/ucp/image/ucpimage)) + +$(eval $(call gb_Library_use_externals,ucpimage, \ + boost_headers \ +)) + +$(eval $(call gb_Library_use_libraries,ucpimage, \ + cppu \ + cppuhelper \ + sal \ + ucbhelper \ + vcl \ + $(gb_UWINAPI) \ +)) + +$(eval $(call gb_Library_use_sdk_api,ucpimage)) + +# vim: set noet sw=4 ts=4: diff --git a/ucb/Module_ucb.mk b/ucb/Module_ucb.mk index a143aca3f635..990161c95393 100644 --- a/ucb/Module_ucb.mk +++ b/ucb/Module_ucb.mk @@ -20,6 +20,7 @@ $(eval $(call gb_Module_add_targets,ucb,\ Library_ucpfile1 \ $(if $(ENABLE_CURL),Library_ucpftp1) \ Library_ucphier1 \ + Library_ucpimage \ Library_ucppkg1 \ Library_ucptdoc1 \ )) diff --git a/ucb/source/ucp/image/ucpimage.component b/ucb/source/ucp/image/ucpimage.component new file mode 100644 index 000000000000..6dba0ddc211e --- /dev/null +++ b/ucb/source/ucp/image/ucpimage.component @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/ucb/source/ucp/image/ucpimage.cxx b/ucb/source/ucp/image/ucpimage.cxx new file mode 100644 index 000000000000..fb3acff4e4ae --- /dev/null +++ b/ucb/source/ucp/image/ucpimage.cxx @@ -0,0 +1,172 @@ +/* -*- 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/. + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// A LO-private ("implementation detail") UCP used to access images from help +// content, with theme fallback and localization support as provided by VCL's +// ImplImageTree. +// +// The URL scheme is +// +// "vnd.libreoffice.image://"["?lang="] + +namespace { + +class Provider final: + private osl::Mutex, + public cppu::WeakComponentImplHelper< + css::lang::XServiceInfo, css::ucb::XContentProvider> +{ +public: + explicit Provider( + css::uno::Reference const & context): + WeakComponentImplHelper(*static_cast(this)), context_(context) + {} + +private: + OUString SAL_CALL getImplementationName() + throw (css::uno::RuntimeException, std::exception) override + { return OUString("com.sun.star.comp.ucb.ImageContentProvider"); } + + sal_Bool SAL_CALL supportsService(OUString const & ServiceName) + throw (css::uno::RuntimeException, std::exception) override + { return cppu::supportsService(this, ServiceName); } + + css::uno::Sequence SAL_CALL getSupportedServiceNames() + throw (css::uno::RuntimeException, std::exception) override + { + return css::uno::Sequence{ + "com.sun.star.ucb.ImageContentProvider"}; + } + + css::uno::Reference SAL_CALL queryContent( + css::uno::Reference const & Identifier) + throw ( + css::ucb::IllegalIdentifierException, css::uno::RuntimeException, + std::exception) + override + { + css::uno::Reference context; + { + osl::MutexGuard g(*this); + context = context_; + } + if (!context.is()) { + throw css::lang::DisposedException(); + } + auto url(Identifier->getContentIdentifier()); + auto uri(css::uri::UriReferenceFactory::create(context)->parse(url)); + if (!(uri.is() + && uri->getScheme().equalsIgnoreAsciiCase( + "vnd.libreoffice.image"))) + { + throw css::ucb::IllegalIdentifierException(url); + } + auto auth( + rtl::Uri::decode( + uri->getAuthority(), rtl_UriDecodeStrict, + RTL_TEXTENCODING_UTF8)); + if (auth.isEmpty()) { + throw css::ucb::IllegalIdentifierException(url); + } + auto path(uri->getPath()); + if (path.isEmpty()) { + throw css::ucb::IllegalIdentifierException(url); + } + OUStringBuffer buf; + assert(path[0] == '/'); + for (sal_Int32 i = 1;;) { + auto j = path.indexOf('/', i); + if (j == -1) { + j = path.getLength(); + } + auto seg( + rtl::Uri::decode( + path.copy(i, j - i), rtl_UriDecodeStrict, + RTL_TEXTENCODING_UTF8)); + if (seg.isEmpty()) { + throw css::ucb::IllegalIdentifierException(url); + } + if (i != 1) { + buf.append('/'); + } + buf.append(seg); + if (j == path.getLength()) { + break; + } + i = j + 1; + } + auto decPath(buf.makeStringAndClear()); + OUString lang; + if (uri->hasQuery()) { + if (!uri->getQuery().startsWith("lang=", &lang)) { + throw css::ucb::IllegalIdentifierException(url); + } + lang = rtl::Uri::decode( + lang, rtl_UriDecodeStrict, RTL_TEXTENCODING_UTF8); + if (lang.isEmpty()) { + throw css::ucb::IllegalIdentifierException(url); + } + } + OUString newUrl; + { + SolarMutexGuard g; + newUrl = ImplImageTree::get().getImageUrl(decPath, auth, lang); + } + ucbhelper::Content content; + return + ucbhelper::Content::create( + newUrl, css::uno::Reference(), + context, content) + ? content.get() : css::uno::Reference(); + } + + sal_Int32 SAL_CALL compareContentIds( + css::uno::Reference const & Id1, + css::uno::Reference const & Id2) + throw (css::uno::RuntimeException, std::exception) override + { + return Id1->getContentIdentifier().compareTo( + Id2->getContentIdentifier()); + } + + void SAL_CALL disposing() override { + context_.clear(); + } + + css::uno::Reference context_; +}; + +} + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL +com_sun_star_comp_ucb_ImageContentProvider_get_implementation( + css::uno::XComponentContext * context, + css::uno::Sequence const &) +{ + return cppu::acquire(new Provider(context)); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/impimagetree.hxx b/vcl/inc/impimagetree.hxx deleted file mode 100644 index 2ee52c8dd917..000000000000 --- a/vcl/inc/impimagetree.hxx +++ /dev/null @@ -1,117 +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 . - */ - -#ifndef INCLUDED_VCL_INC_IMPIMAGETREE_HXX -#define INCLUDED_VCL_INC_IMPIMAGETREE_HXX - -#include "sal/config.h" - -#include -#include -#include - -#include "com/sun/star/uno/Reference.hxx" -#include "rtl/ustring.hxx" -#include "salhelper/singletonref.hxx" - -namespace com { namespace sun { namespace star { namespace container { - class XNameAccess; -} } } } -class BitmapEx; - -class ImplImageTree { -public: - ImplImageTree(); - - ~ImplImageTree(); - - bool loadImage( - OUString const & name, OUString const & style, - BitmapEx & bitmap, bool localized = false, bool loadMissing = false ); - - bool loadDefaultImage( - OUString const & style, - BitmapEx& bitmap); - - /** a crude form of life cycle control (called from DeInitVCL; otherwise, - * if the ImplImageTree singleton were destroyed during exit that would - * be too late for the destructors of the bitmaps in maIconCache)*/ - void shutDown(); - - css::uno::Reference< css::container::XNameAccess > getNameAccess(); - -private: - ImplImageTree(const ImplImageTree&) = delete; - ImplImageTree& operator=(const ImplImageTree&) = delete; - - typedef std::unordered_map, OUStringHash> IconCache; - typedef std::unordered_map IconLinkHash; - - struct IconSet { - OUString maURL; - css::uno::Reference maNameAccess; - IconCache maIconCache; - IconLinkHash maLinkHash; - - IconSet() {} - IconSet(const OUString &aURL) : maURL(aURL) {} - }; - - /// Map between the theme name(s) and the content. - typedef std::unordered_map StyleIconSet; - - /// Remember all the (used) icon styles and individual icons in them. - StyleIconSet maIconSet; - - /// Style used for the current operations; switches switch several times during fallback search. - OUString maCurrentStyle; - - bool doLoadImage( - OUString const & name, OUString const & style, - BitmapEx & bitmap, bool localized); - - bool checkPathAccess(); - - void setStyle(OUString const & style ); - - void createStyle(); - - bool iconCacheLookup( OUString const & name, bool localized, BitmapEx & bitmap ); - - bool findImage(std::vector< OUString > const & paths, BitmapEx & bitmap ); - - void loadImageLinks(); - - void parseLinkFile(std::shared_ptr stream); - - /// Return name of a real .png according to links.txt. - OUString const & getRealImageName(OUString const & name); - - /** Return name of the fallback style for the provided one. - - Must not be cyclic :-) The last theme in the chain returns an empty string. - */ - static OUString fallbackStyle(const OUString &style); -}; - -typedef salhelper::SingletonRef< ImplImageTree > ImplImageTreeSingletonRef; - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/osx/vclnsapp.mm b/vcl/osx/vclnsapp.mm index 2614754cf4ce..fd0d58333b57 100644 --- a/vcl/osx/vclnsapp.mm +++ b/vcl/osx/vclnsapp.mm @@ -24,10 +24,10 @@ #include #include +#include #include #include -#include "impimagetree.hxx" #include "osx/saldata.hxx" #include "osx/salframe.h" #include "osx/salframeview.h" @@ -412,7 +412,7 @@ { ApplicationEvent aEv(ApplicationEvent::TYPE_PRIVATE_DOSHUTDOWN); GetpApp()->AppEvent( aEv ); - ImplImageTreeSingletonRef()->shutDown(); + ImplImageTree::get().shutDown(); // DeInitVCL should be called in ImplSVMain - unless someon _exits first which // can occur in Desktop::doShutdown for example } diff --git a/vcl/source/app/settings.cxx b/vcl/source/app/settings.cxx index a8fb56a9633d..2fd759794732 100644 --- a/vcl/source/app/settings.cxx +++ b/vcl/source/app/settings.cxx @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -56,7 +57,6 @@ using namespace ::com::sun::star; #include "svdata.hxx" -#include "impimagetree.hxx" struct ImplMouseData { diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx index d2fe69a171ee..684546f430e0 100644 --- a/vcl/source/app/svmain.cxx +++ b/vcl/source/app/svmain.cxx @@ -35,6 +35,7 @@ #include "vcl/cvtgrf.hxx" #include "vcl/scheduler.hxx" #include "vcl/image.hxx" +#include "vcl/implimagetree.hxx" #include "vcl/settings.hxx" #include "vcl/unowrap.hxx" #include "vcl/configsettings.hxx" @@ -68,7 +69,6 @@ #include "salsys.hxx" #include "saltimer.hxx" #include "salimestatus.hxx" -#include "impimagetree.hxx" #include "xconnection.hxx" #include "vcl/opengl/OpenGLContext.hxx" @@ -368,7 +368,7 @@ void DeInitVCL() DBG_ASSERT( nBadTopWindows==0, aBuf.getStr() ); #endif - ImplImageTreeSingletonRef()->shutDown(); + ImplImageTree::get().shutDown(); osl_removeSignalHandler( pExceptionHandler); pExceptionHandler = NULL; diff --git a/vcl/source/control/fixed.cxx b/vcl/source/control/fixed.cxx index 990f1a6cf2d3..9502c08e97fc 100644 --- a/vcl/source/control/fixed.cxx +++ b/vcl/source/control/fixed.cxx @@ -23,12 +23,12 @@ #include "vcl/dialog.hxx" #include "vcl/event.hxx" #include "vcl/fixed.hxx" +#include "vcl/implimagetree.hxx" #include "vcl/svapp.hxx" #include "vcl/settings.hxx" #include #include "controldata.hxx" -#include "impimagetree.hxx" #include "window.h" #define FIXEDLINE_TEXT_BORDER 4 @@ -1035,12 +1035,12 @@ bool FixedImage::SetModeImage( const Image& rImage ) Image FixedImage::loadThemeImage(const OString &rFileName) { - static ImplImageTreeSingletonRef aImageTree; OUString sIconTheme = Application::GetSettings().GetStyleSettings().DetermineIconTheme(); const OUString sFileName(OStringToOUString(rFileName, RTL_TEXTENCODING_UTF8)); BitmapEx aBitmap; - bool bSuccess = aImageTree->loadImage(sFileName, sIconTheme, aBitmap, true); + bool bSuccess = ImplImageTree::get().loadImage( + sFileName, sIconTheme, aBitmap, true); SAL_WARN_IF(!bSuccess, "vcl.layout", "Unable to load " << sFileName << " from theme " << sIconTheme); return Image(aBitmap); diff --git a/vcl/source/gdi/bitmapex.cxx b/vcl/source/gdi/bitmapex.cxx index 804e64616757..8fa1211498c5 100644 --- a/vcl/source/gdi/bitmapex.cxx +++ b/vcl/source/gdi/bitmapex.cxx @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -36,7 +37,6 @@ #include #include -#include #include // BitmapEx::Create @@ -107,11 +107,9 @@ BitmapEx::BitmapEx( const ResId& rResId ) : void BitmapEx::loadFromIconTheme( const OUString& rIconName ) { - static ImplImageTreeSingletonRef aImageTree; - OUString aIconTheme = Application::GetSettings().GetStyleSettings().DetermineIconTheme(); - if( !aImageTree->loadImage( rIconName, aIconTheme, *this, true ) ) + if( !ImplImageTree::get().loadImage( rIconName, aIconTheme, *this, true ) ) { #ifdef DBG_UTIL OStringBuffer aErrorStr( diff --git a/vcl/source/gdi/image.cxx b/vcl/source/gdi/image.cxx index adfec173cfd5..f6e70cf78799 100644 --- a/vcl/source/gdi/image.cxx +++ b/vcl/source/gdi/image.cxx @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include #if OSL_DEBUG_LEVEL > 0 @@ -370,8 +370,6 @@ void ImageList::ImplInit( sal_uInt16 nItems, const Size &rSize ) void ImageAryData::Load(const OUString &rPrefix) { - static ImplImageTreeSingletonRef aImageTree; - OUString aIconTheme = Application::GetSettings().GetStyleSettings().DetermineIconTheme(); OUString aFileName = rPrefix; @@ -379,7 +377,7 @@ void ImageAryData::Load(const OUString &rPrefix) #if OSL_DEBUG_LEVEL > 0 bool bSuccess = #endif - aImageTree->loadImage( aFileName, aIconTheme, maBitmapEx, true ); + ImplImageTree::get().loadImage(aFileName, aIconTheme, maBitmapEx, true); #if OSL_DEBUG_LEVEL > 0 if ( !bSuccess ) { diff --git a/vcl/source/gdi/imagerepository.cxx b/vcl/source/gdi/imagerepository.cxx index 66398d972328..dadc622cdcce 100644 --- a/vcl/source/gdi/imagerepository.cxx +++ b/vcl/source/gdi/imagerepository.cxx @@ -19,9 +19,9 @@ #include #include +#include #include #include -#include "impimagetree.hxx" namespace vcl { @@ -29,15 +29,13 @@ namespace vcl { OUString sIconTheme = Application::GetSettings().GetStyleSettings().DetermineIconTheme(); - ImplImageTreeSingletonRef aImplImageTree; - return aImplImageTree->loadImage( _rName, sIconTheme, _out_rImage, _bSearchLanguageDependent, loadMissing ); + return ImplImageTree::get().loadImage( _rName, sIconTheme, _out_rImage, _bSearchLanguageDependent, loadMissing ); } bool ImageRepository::loadDefaultImage( BitmapEx& _out_rImage) { OUString sIconTheme = Application::GetSettings().GetStyleSettings().DetermineIconTheme(); - ImplImageTreeSingletonRef aImplImageTree; - return aImplImageTree->loadDefaultImage( sIconTheme,_out_rImage); + return ImplImageTree::get().loadDefaultImage( sIconTheme,_out_rImage); } } // namespace vcl diff --git a/vcl/source/gdi/impimagetree.cxx b/vcl/source/gdi/impimagetree.cxx index 38cfefdb14fe..9bec5dcfe83f 100644 --- a/vcl/source/gdi/impimagetree.cxx +++ b/vcl/source/gdi/impimagetree.cxx @@ -34,15 +34,16 @@ #include "osl/file.hxx" #include "osl/diagnose.h" #include "rtl/bootstrap.hxx" +#include "rtl/uri.hxx" #include "tools/stream.hxx" #include "tools/urlobj.hxx" #include "vcl/bitmapex.hxx" #include +#include #include "vcl/pngread.hxx" #include "vcl/settings.hxx" #include "vcl/svapp.hxx" -#include "impimagetree.hxx" #include #include @@ -93,6 +94,11 @@ static void loadImageFromStream(std::shared_ptr xStream, OUString cons } +ImplImageTree & ImplImageTree::get() { + static ImplImageTree instance; + return instance; +} + ImplImageTree::ImplImageTree() { } @@ -101,6 +107,65 @@ ImplImageTree::~ImplImageTree() { } +OUString ImplImageTree::getImageUrl( + OUString const & name, OUString const & style, OUString const & lang) +{ + OUString aStyle(style); + while (!aStyle.isEmpty()) + { + try { + setStyle(aStyle); + + std::vector< OUString > paths; + paths.push_back(getRealImageName(name)); + + if (!lang.isEmpty()) + { + sal_Int32 pos = name.lastIndexOf('/'); + if (pos != -1) + { + std::vector aFallbacks( + LanguageTag(lang).getFallbackStrings(true)); + for (std::vector< OUString >::reverse_iterator it( aFallbacks.rbegin()); + it != aFallbacks.rend(); ++it) + { + paths.push_back( getRealImageName( createPath(name, pos, *it) ) ); + } + } + } + + try { + if (checkPathAccess()) { + const uno::Reference &rNameAccess = maIconSet[maCurrentStyle].maNameAccess; + + for (std::vector::const_reverse_iterator j(paths.rbegin()); j != paths.rend(); ++j) + { + if (rNameAccess->hasByName(*j)) + { + return "vnd.sun.star.zip://" + + rtl::Uri::encode( + maIconSet[maCurrentStyle].maURL + ".zip", + rtl_UriCharClassRegName, + rtl_UriEncodeIgnoreEscapes, + RTL_TEXTENCODING_UTF8) + + "/" + *j; + // assuming *j contains no problematic chars + } + } + } + } catch (css::uno::RuntimeException &) { + throw; + } catch (const css::uno::Exception & e) { + SAL_INFO("vcl", "exception " << e.Message); + } + } + catch (css::uno::RuntimeException &) {} + + aStyle = fallbackStyle(aStyle); + } + return OUString(); +} + OUString ImplImageTree::fallbackStyle(const OUString &style) { if (style == "galaxy") @@ -361,9 +426,7 @@ css::uno::Reference ImplImageTree::getNameAccess() /// Recursively dump all names ... css::uno::Sequence ImageTree_getAllImageNames() { - static ImplImageTreeSingletonRef aImageTree; - - css::uno::Reference xRef(aImageTree->getNameAccess()); + css::uno::Reference xRef(ImplImageTree::get().getNameAccess()); return xRef->getElementNames(); } diff --git a/xmlhelp/source/cxxhelp/provider/databases.cxx b/xmlhelp/source/cxxhelp/provider/databases.cxx index 908fdab56177..5f2d0b991f66 100644 --- a/xmlhelp/source/cxxhelp/provider/databases.cxx +++ b/xmlhelp/source/cxxhelp/provider/databases.cxx @@ -120,7 +120,6 @@ OUString Databases::expandURL( const OUString& aURL, Reference< uno::XComponentC Databases::Databases( bool showBasic, const OUString& instPath, - const com::sun::star::uno::Sequence< OUString >& imagesZipPaths, const OUString& productName, const OUString& productVersion, const OUString& styleSheet, @@ -137,9 +136,7 @@ Databases::Databases( bool showBasic, prodVersion( "%PRODUCTVERSION" ), vendName( "%VENDORNAME" ), vendVersion( "%VENDORVERSION" ), - vendShort( "%VENDORSHORT" ), - m_aImagesZipPaths( imagesZipPaths ), - m_aSymbolsStyleName( "" ) + vendShort( "%VENDORSHORT" ) { m_xSMgr = Reference< XMultiComponentFactory >( m_xContext->getServiceManager(), UNO_QUERY ); @@ -207,106 +204,33 @@ Databases::~Databases() } } -static bool impl_getZipFile( - Sequence< OUString > & rImagesZipPaths, - const OUString & rZipName, - OUString & rFileName ) -{ - OUString aWorkingDir; - osl_getProcessWorkingDir( &aWorkingDir.pData ); - const OUString *pPathArray = rImagesZipPaths.getArray(); - for ( int i = 0; i < rImagesZipPaths.getLength(); ++i ) - { - OUString aFileName = pPathArray[ i ]; - if ( !aFileName.isEmpty() ) - { - if ( !aFileName.endsWith("/") ) - { - aFileName += "/"; - } - aFileName += rZipName; - // the icons are not read when the URL is a symlink - osl::File::getAbsoluteFileURL( aWorkingDir, aFileName, rFileName ); - - // test existence - osl::DirectoryItem aDirItem; - if ( osl::DirectoryItem::get( rFileName, aDirItem ) == osl::FileBase::E_None ) - return true; - } - } - return false; -} - -OString Databases::getImagesZipFileURL() +OString Databases::getImageTheme() { + uno::Reference< lang::XMultiServiceFactory > xConfigProvider = + configuration::theDefaultProvider::get(m_xContext); + + // set root path + uno::Sequence < uno::Any > lParams(1); + beans::PropertyValue aParam ; + aParam.Name = "nodepath"; + aParam.Value <<= OUString("org.openoffice.Office.Common"); + lParams[0] = uno::makeAny(aParam); + + // open it + uno::Reference< uno::XInterface > xCFG( xConfigProvider->createInstanceWithArguments( + OUString("com.sun.star.configuration.ConfigurationAccess"), + lParams) ); + + uno::Reference< container::XHierarchicalNameAccess > xAccess(xCFG, uno::UNO_QUERY_THROW); + uno::Any aResult = xAccess->getByHierarchicalName(OUString("Misc/SymbolStyle")); OUString aSymbolsStyleName; - try - { - uno::Reference< lang::XMultiServiceFactory > xConfigProvider = - configuration::theDefaultProvider::get(m_xContext); - - // set root path - uno::Sequence < uno::Any > lParams(1); - beans::PropertyValue aParam ; - aParam.Name = "nodepath"; - aParam.Value <<= OUString("org.openoffice.Office.Common"); - lParams[0] = uno::makeAny(aParam); - - // open it - uno::Reference< uno::XInterface > xCFG( xConfigProvider->createInstanceWithArguments( - OUString("com.sun.star.configuration.ConfigurationAccess"), - lParams) ); - - bool bChanged = false; - uno::Reference< container::XHierarchicalNameAccess > xAccess(xCFG, uno::UNO_QUERY_THROW); - uno::Any aResult = xAccess->getByHierarchicalName(OUString("Misc/SymbolStyle")); - if ( (aResult >>= aSymbolsStyleName) && m_aSymbolsStyleName != aSymbolsStyleName ) - { - m_aSymbolsStyleName = aSymbolsStyleName; - bChanged = true; - } - - if ( m_aImagesZipFileURL.isEmpty() || bChanged ) - { - OUString aImageZip; - bool bFound = false; - - if ( !aSymbolsStyleName.isEmpty() ) - { - if ( aSymbolsStyleName == "auto" ) - { - // with the layered images*.zip, tango is the most - // complete theme, so show that one - // FIXME instead of using a general vnd.sun.star.zip:// - // for imgrepos, we should have some vnd.sun.star.image:// - // so that we don't have to re-open the stream for every - // image in the help - aSymbolsStyleName = "tango"; - } - OUString aZipName = "images_" + aSymbolsStyleName + ".zip"; + aResult >>= aSymbolsStyleName; - bFound = impl_getZipFile( m_aImagesZipPaths, aZipName, aImageZip ); - } - - if ( ! bFound ) - bFound = impl_getZipFile( m_aImagesZipPaths, OUString( "images.zip" ), aImageZip ); - - if ( ! bFound ) - aImageZip.clear(); - - m_aImagesZipFileURL = OUStringToOString( - rtl::Uri::encode( - aImageZip, - rtl_UriCharClassPchar, - rtl_UriEncodeIgnoreEscapes, - RTL_TEXTENCODING_UTF8 ), RTL_TEXTENCODING_UTF8 ); - } - } - catch ( NoSuchElementException const & ) + if ( aSymbolsStyleName.isEmpty() || aSymbolsStyleName == "auto" ) { + aSymbolsStyleName = "tango"; } - - return m_aImagesZipFileURL; + return aSymbolsStyleName.toUtf8(); } void Databases::replaceName( OUString& oustring ) const diff --git a/xmlhelp/source/cxxhelp/provider/databases.hxx b/xmlhelp/source/cxxhelp/provider/databases.hxx index 9e33a98e02cf..9b331cc96af2 100644 --- a/xmlhelp/source/cxxhelp/provider/databases.hxx +++ b/xmlhelp/source/cxxhelp/provider/databases.hxx @@ -140,7 +140,6 @@ namespace chelp { Databases( bool showBasic, const OUString& instPath, - const com::sun::star::uno::Sequence< OUString >& imagesZipPaths, const OUString& productName, const OUString& productVersion, const OUString& styleSheet, @@ -148,7 +147,7 @@ namespace chelp { ~Databases(); - OString getImagesZipFileURL(); + OString getImageTheme(); OUString getInstallPathAsURL(); @@ -265,9 +264,6 @@ namespace chelp { prodName,prodVersion,vendName,vendVersion,vendShort; OUString m_aInstallDirectory; // Installation directory - com::sun::star::uno::Sequence< OUString > m_aImagesZipPaths; - OString m_aImagesZipFileURL; - OUString m_aSymbolsStyleName; std::vector< OUString > m_avModules; diff --git a/xmlhelp/source/cxxhelp/provider/provider.cxx b/xmlhelp/source/cxxhelp/provider/provider.cxx index 781554d8a445..95b1c6de4d7b 100644 --- a/xmlhelp/source/cxxhelp/provider/provider.cxx +++ b/xmlhelp/source/cxxhelp/provider/provider.cxx @@ -35,7 +35,6 @@ #include #include #include -#include #include "databases.hxx" #include "provider.hxx" @@ -324,22 +323,9 @@ void ContentProvider::init() } OUString productversion( setupversion + " " + setupextension ); - - uno::Sequence< OUString > aImagesZipPaths( 2 ); - xHierAccess = getHierAccess( sProvider, "org.openoffice.Office.Common" ); - - OUString aPath( getKey( xHierAccess, "Path/Current/UserConfig" ) ); - subst( aPath ); - aImagesZipPaths[ 0 ] = aPath; - - aPath = "$BRAND_BASE_DIR/$BRAND_SHARE_SUBDIR/config"; - rtl::Bootstrap::expandMacros(aPath); - aImagesZipPaths[ 1 ] = aPath; - bool showBasic = getBooleanKey(xHierAccess,"Help/ShowBasic"); m_pDatabases = new Databases( showBasic, instPath, - aImagesZipPaths, utl::ConfigManager::getProductName(), productversion, stylesheet, diff --git a/xmlhelp/source/cxxhelp/provider/urlparameter.cxx b/xmlhelp/source/cxxhelp/provider/urlparameter.cxx index 14f6240d6da5..72a57d1d24f3 100644 --- a/xmlhelp/source/cxxhelp/provider/urlparameter.cxx +++ b/xmlhelp/source/cxxhelp/provider/urlparameter.cxx @@ -890,8 +890,8 @@ InputStreamTransformer::InputStreamTransformer( URLParameter* urlParam, pDatabases->getProductVersion().getLength(), RTL_TEXTENCODING_UTF8 ) + OString('\''); - parString[last++] = "imgrepos"; - parString[last++] = OString('\'') + pDatabases->getImagesZipFileURL() + OString('\''); + parString[last++] = "imgtheme"; + parString[last++] = OString('\'') + pDatabases->getImageTheme() + OString('\''); parString[last++] = "hp"; parString[last++] = OString('\'') + urlParam->getByName( "HelpPrefix" ) + OString('\''); diff --git a/xmlhelp/util/main_transform.xsl b/xmlhelp/util/main_transform.xsl index b6b9c2e6c76c..b30effe1ca94 100644 --- a/xmlhelp/util/main_transform.xsl +++ b/xmlhelp/util/main_transform.xsl @@ -99,7 +99,7 @@ - + @@ -110,7 +110,7 @@ - + @@ -801,19 +801,6 @@ - - - - - - - - - - - - - @@ -821,11 +808,11 @@ - - + + - + @@ -931,36 +918,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- cgit