diff options
-rw-r--r-- | framework/inc/helper/mischelper.hxx | 28 | ||||
-rw-r--r-- | framework/inc/uifactory/configurationaccessfactorymanager.hxx | 3 | ||||
-rw-r--r-- | framework/inc/uifactory/windowcontentfactorymanager.hxx | 74 | ||||
-rw-r--r-- | framework/source/register/registerservices.cxx | 2 | ||||
-rw-r--r-- | framework/source/uifactory/uielementfactorymanager.cxx | 3 | ||||
-rw-r--r-- | framework/source/uifactory/windowcontentfactorymanager.cxx | 165 | ||||
-rw-r--r-- | framework/util/fwk.component | 3 |
7 files changed, 124 insertions, 154 deletions
diff --git a/framework/inc/helper/mischelper.hxx b/framework/inc/helper/mischelper.hxx index f8fa26ff2b0c..557e56c184ae 100644 --- a/framework/inc/helper/mischelper.hxx +++ b/framework/inc/helper/mischelper.hxx @@ -89,6 +89,34 @@ inline bool IsScriptTypeMatchingToLanguage( sal_Int16 nScriptType, LanguageType return 0 != (nScriptType & SvtLanguageOptions::GetScriptTypeOfLanguage( nLang )); } +inline void RetrieveTypeNameFromResourceURL( const OUString& aResourceURL, OUString& aType, OUString& aName ) +{ + const sal_Int32 RESOURCEURL_PREFIX_SIZE = 17; + const char RESOURCEURL_PREFIX[] = "private:resource/"; + + if (( aResourceURL.startsWith( RESOURCEURL_PREFIX ) ) && + ( aResourceURL.getLength() > RESOURCEURL_PREFIX_SIZE )) + { + OUString aTmpStr( aResourceURL.copy( RESOURCEURL_PREFIX_SIZE )); + sal_Int32 nToken = 0; + sal_Int32 nPart = 0; + do + { + OUString sToken = aTmpStr.getToken( 0, '/', nToken); + if ( !sToken.isEmpty() ) + { + if ( nPart == 0 ) + aType = sToken; + else if ( nPart == 1 ) + aName = sToken; + else + break; + nPart++; + } + } + while( nToken >=0 ); + } +} class FWI_DLLPUBLIC LanguageGuessingHelper { diff --git a/framework/inc/uifactory/configurationaccessfactorymanager.hxx b/framework/inc/uifactory/configurationaccessfactorymanager.hxx index 36aae57b226d..082e169f2351 100644 --- a/framework/inc/uifactory/configurationaccessfactorymanager.hxx +++ b/framework/inc/uifactory/configurationaccessfactorymanager.hxx @@ -25,10 +25,13 @@ #include <com/sun/star/beans/PropertyValue.hpp> #include <com/sun/star/container/XContainerListener.hpp> #include <com/sun/star/container/XNameAccess.hpp> +#include <com/sun/star/uno/XComponentContext.hpp> #include <cppuhelper/implbase1.hxx> #include <rtl/ustring.hxx> +#include <boost/unordered_map.hpp> + namespace framework { class ConfigurationAccess_FactoryManager : public ::cppu::WeakImplHelper1< ::com::sun::star::container::XContainerListener> diff --git a/framework/inc/uifactory/windowcontentfactorymanager.hxx b/framework/inc/uifactory/windowcontentfactorymanager.hxx deleted file mode 100644 index a92303e585b3..000000000000 --- a/framework/inc/uifactory/windowcontentfactorymanager.hxx +++ /dev/null @@ -1,74 +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_FRAMEWORK_INC_UIFACTORY_WINDOWCONTENTFACTORYMANAGER_HXX -#define INCLUDED_FRAMEWORK_INC_UIFACTORY_WINDOWCONTENTFACTORYMANAGER_HXX - -/** Attention: stl headers must(!) be included at first. Otherwise it can make trouble - with solaris headers ... -*/ -#include <vector> -#include <list> - -#include <threadhelp/threadhelpbase.hxx> -#include <macros/generic.hxx> -#include <macros/xinterface.hxx> -#include <macros/xtypeprovider.hxx> -#include <macros/xserviceinfo.hxx> -#include <stdtypes.h> - -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/container/XNameAccess.hpp> -#include "com/sun/star/frame/XModuleManager2.hpp" - -#include <cppuhelper/implbase2.hxx> -#include <rtl/ustring.hxx> - -namespace framework -{ - -class ConfigurationAccess_FactoryManager; -class WindowContentFactoryManager : private ThreadHelpBase , // Struct for right initalization of mutex member! Must be first of baseclasses. - public ::cppu::WeakImplHelper2< com::sun::star::lang::XServiceInfo , - com::sun::star::lang::XSingleComponentFactory> -{ - public: - WindowContentFactoryManager( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext>& rxContext ); - virtual ~WindowContentFactoryManager(); - - // XInterface, XTypeProvider, XServiceInfo - DECLARE_XSERVICEINFO - - // XSingleComponentFactory - virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL createInstanceWithContext( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& Context ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL createInstanceWithArgumentsAndContext( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& Arguments, const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& Context ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); - - static void RetrieveTypeNameFromResourceURL( const OUString& aResourceURL, OUString& aType, OUString& aName ); - private: - - sal_Bool m_bConfigRead; - ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModuleManager2 > m_xModuleManager; - ConfigurationAccess_FactoryManager* m_pConfigAccess; -}; - -} // namespace framework - -#endif // INCLUDED_FRAMEWORK_INC_UIFACTORY_WINDOWCONTENTFACTORYMANAGER_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/source/register/registerservices.cxx b/framework/source/register/registerservices.cxx index 14dc4ce0970b..e74acce876ed 100644 --- a/framework/source/register/registerservices.cxx +++ b/framework/source/register/registerservices.cxx @@ -42,7 +42,6 @@ #include <services/sessionlistener.hxx> #include <services/taskcreatorsrv.hxx> -#include <uifactory/windowcontentfactorymanager.hxx> #include <services/substitutepathvars.hxx> #include <services/ContextChangeEventMultiplexer.hxx> @@ -56,7 +55,6 @@ COMPONENTGETFACTORY ( fwk, IFFACTORY( ::framework::SessionListener ) else IFFACTORY( ::framework::SessionListener ) else IFFACTORY( ::framework::TaskCreatorService ) else - IFFACTORY( ::framework::WindowContentFactoryManager ) else IFFACTORY( ::framework::SubstitutePathVariables ) else IFFACTORY( ::framework::ContextChangeEventMultiplexer ) ) diff --git a/framework/source/uifactory/uielementfactorymanager.cxx b/framework/source/uifactory/uielementfactorymanager.cxx index 28ef238d76f5..68cf917d9d5a 100644 --- a/framework/source/uifactory/uielementfactorymanager.cxx +++ b/framework/source/uifactory/uielementfactorymanager.cxx @@ -19,7 +19,6 @@ #include <sal/config.h> -#include <uifactory/windowcontentfactorymanager.hxx> #include <uifactory/configurationaccessfactorymanager.hxx> #include <helper/mischelper.hxx> @@ -499,7 +498,7 @@ throw ( RuntimeException ) OUString aType; OUString aName; - WindowContentFactoryManager::RetrieveTypeNameFromResourceURL( aResourceURL, aType, aName ); + RetrieveTypeNameFromResourceURL( aResourceURL, aType, aName ); aServiceSpecifier = m_pConfigAccess->getFactorySpecifierFromTypeNameModule( aType, aName, aModuleId ); } // SAFE diff --git a/framework/source/uifactory/windowcontentfactorymanager.cxx b/framework/source/uifactory/windowcontentfactorymanager.cxx index 7f3b638d6697..6ffde73e514e 100644 --- a/framework/source/uifactory/windowcontentfactorymanager.cxx +++ b/framework/source/uifactory/windowcontentfactorymanager.cxx @@ -17,96 +17,95 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include <uifactory/windowcontentfactorymanager.hxx> +#include <sal/config.h> #include <uifactory/configurationaccessfactorymanager.hxx> -#include <threadhelp/resetableguard.hxx> -#include "services.h" +#include <helper/mischelper.hxx> #include <com/sun/star/beans/PropertyValue.hpp> -#include <com/sun/star/beans/XPropertySet.hpp> -#include <com/sun/star/container/XNameAccess.hpp> -#include <com/sun/star/container/XNameContainer.hpp> -#include <com/sun/star/container/XContainer.hpp> #include <com/sun/star/frame/ModuleManager.hpp> +#include "com/sun/star/frame/XModuleManager2.hpp" #include <com/sun/star/frame/XFrame.hpp> -#include <com/sun/star/frame/XModuleManager2.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/lang/XSingleComponentFactory.hpp> #include <com/sun/star/uno/XComponentContext.hpp> -#include <rtl/ustrbuf.hxx> -#include <cppuhelper/weak.hxx> -#include <tools/urlobj.hxx> +#include <cppuhelper/compbase2.hxx> +#include <cppuhelper/supportsservice.hxx> #include <tools/diagnose_ex.h> -#include <vcl/svapp.hxx> - -//_________________________________________________________________________________________________________________ -// Defines -//_________________________________________________________________________________________________________________ using namespace ::com::sun::star; +using namespace framework; + +namespace { -//_________________________________________________________________________________________________________________ -// Namespace -//_________________________________________________________________________________________________________________ +typedef ::cppu::WeakComponentImplHelper2< + com::sun::star::lang::XServiceInfo, + com::sun::star::lang::XSingleComponentFactory > WindowContentFactoryManager_BASE; -namespace framework +class WindowContentFactoryManager : private osl::Mutex, + public WindowContentFactoryManager_BASE { +public: + WindowContentFactoryManager( const css::uno::Reference< css::uno::XComponentContext>& rxContext ); + virtual ~WindowContentFactoryManager(); -//***************************************************************************************************************** -// XInterface, XTypeProvider, XServiceInfo -//***************************************************************************************************************** -DEFINE_XSERVICEINFO_ONEINSTANCESERVICE_2 ( WindowContentFactoryManager , - ::cppu::OWeakObject , - "com.sun.star.ui.WindowContentFactoryManager", - IMPLEMENTATIONNAME_WINDOWCONTENTFACTORYMANAGER - ) + virtual OUString SAL_CALL getImplementationName() + throw (css::uno::RuntimeException) + { + return OUString("com.sun.star.comp.framework.WindowContentFactoryManager"); + } -DEFINE_INIT_SERVICE ( WindowContentFactoryManager, {} ) + virtual sal_Bool SAL_CALL supportsService(OUString const & ServiceName) + throw (css::uno::RuntimeException) + { + return cppu::supportsService(this, ServiceName); + } + + virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() + throw (css::uno::RuntimeException) + { + css::uno::Sequence< OUString > aSeq(1); + aSeq[0] = OUString("com.sun.star.ui.WindowContentFactoryManager"); + return aSeq; + } + + // XSingleComponentFactory + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithContext( const css::uno::Reference< css::uno::XComponentContext >& Context ) throw (css::uno::Exception, css::uno::RuntimeException); + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithArgumentsAndContext( const css::uno::Sequence< css::uno::Any >& Arguments, const css::uno::Reference< css::uno::XComponentContext >& Context ) throw (css::uno::Exception, css::uno::RuntimeException); + +private: + virtual void SAL_CALL disposing() SAL_OVERRIDE; + + css::uno::Reference< css::uno::XComponentContext > m_xContext; + sal_Bool m_bConfigRead; + ConfigurationAccess_FactoryManager* m_pConfigAccess; +}; WindowContentFactoryManager::WindowContentFactoryManager( const uno::Reference< uno::XComponentContext >& rxContext ) : - ThreadHelpBase( &Application::GetSolarMutex() ), + WindowContentFactoryManager_BASE(*static_cast<osl::Mutex *>(this)), + m_xContext( rxContext ), m_bConfigRead( sal_False ) { - m_pConfigAccess = new ConfigurationAccess_FactoryManager( rxContext, OUString( "/org.openoffice.Office.UI.WindowContentFactories/Registered/ContentFactories" ) ); + m_pConfigAccess = new ConfigurationAccess_FactoryManager( m_xContext, + "/org.openoffice.Office.UI.WindowContentFactories/Registered/ContentFactories" ); m_pConfigAccess->acquire(); - m_xModuleManager = frame::ModuleManager::create( rxContext ); } WindowContentFactoryManager::~WindowContentFactoryManager() { - ResetableGuard aLock( m_aLock ); - - // reduce reference count - m_pConfigAccess->release(); + disposing(); } -void WindowContentFactoryManager::RetrieveTypeNameFromResourceURL( const OUString& aResourceURL, OUString& aType, OUString& aName ) +void SAL_CALL WindowContentFactoryManager::disposing() { - const sal_Int32 RESOURCEURL_PREFIX_SIZE = 17; - const char RESOURCEURL_PREFIX[] = "private:resource/"; + osl::MutexGuard g(rBHelper.rMutex); - if (( aResourceURL.startsWith( RESOURCEURL_PREFIX ) ) && - ( aResourceURL.getLength() > RESOURCEURL_PREFIX_SIZE )) + if (m_pConfigAccess) { - OUString aTmpStr( aResourceURL.copy( RESOURCEURL_PREFIX_SIZE )); - sal_Int32 nToken = 0; - sal_Int32 nPart = 0; - do - { - OUString sToken = aTmpStr.getToken( 0, '/', nToken); - if ( !sToken.isEmpty() ) - { - if ( nPart == 0 ) - aType = sToken; - else if ( nPart == 1 ) - aName = sToken; - else - break; - nPart++; - } - } - while( nToken >=0 ); + // reduce reference count + m_pConfigAccess->release(); + m_pConfigAccess = 0; } } @@ -139,18 +138,12 @@ throw (uno::Exception, uno::RuntimeException) } } - uno::Reference< frame::XModuleManager2 > xModuleManager; - // SAFE - { - ResetableGuard aLock( m_aLock ); - xModuleManager = m_xModuleManager; - } - // UNSAFE - // Determine the module identifier OUString aType; OUString aName; OUString aModuleId; + uno::Reference< frame::XModuleManager2 > xModuleManager = + frame::ModuleManager::create( m_xContext ); try { if ( xFrame.is() && xModuleManager.is() ) @@ -170,21 +163,18 @@ throw (uno::Exception, uno::RuntimeException) // Detetmine the implementation name of the window content factory dependent on the // module identifier, user interface element type and name - // SAFE - ResetableGuard aLock( m_aLock ); - + { // SAFE + osl::MutexGuard g(rBHelper.rMutex); if ( !m_bConfigRead ) { m_bConfigRead = sal_True; m_pConfigAccess->readConfigurationData(); } - aImplementationName = m_pConfigAccess->getFactorySpecifierFromTypeNameModule( aType, aName, aModuleId ); + } // SAFE + if ( !aImplementationName.isEmpty() ) { - aLock.unlock(); - // UNSAFE - uno::Reference< lang::XMultiServiceFactory > xServiceManager( Context->getServiceManager(), uno::UNO_QUERY ); if ( xServiceManager.is() ) { @@ -216,6 +206,31 @@ throw (uno::Exception, uno::RuntimeException) return xWindow; } -} // namespace framework +struct Instance { + explicit Instance( + css::uno::Reference<css::uno::XComponentContext> const & context): + instance(static_cast<cppu::OWeakObject *>( + new WindowContentFactoryManager(context))) + { + } + + css::uno::Reference<css::uno::XInterface> instance; +}; + +struct Singleton: + public rtl::StaticWithArg< + Instance, css::uno::Reference<css::uno::XComponentContext>, Singleton> +{}; + +} + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL +com_sun_star_comp_framework_WindowContentFactoryManager_get_implementation( + css::uno::XComponentContext *context, + css::uno::Sequence<css::uno::Any> const &) +{ + return cppu::acquire(static_cast<cppu::OWeakObject *>( + Singleton::get(context).instance.get())); +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/util/fwk.component b/framework/util/fwk.component index cd4014585d71..3a274e86dc1b 100644 --- a/framework/util/fwk.component +++ b/framework/util/fwk.component @@ -154,7 +154,8 @@ constructor="com_sun_star_comp_framework_URLTransformer_get_implementation"> <service name="com.sun.star.util.URLTransformer"/> </implementation> - <implementation name="com.sun.star.comp.framework.WindowContentFactoryManager"> + <implementation name="com.sun.star.comp.framework.WindowContentFactoryManager" + constructor="com_sun_star_comp_framework_WindowContentFactoryManager_get_implementation"> <service name="com.sun.star.ui.WindowContentFactoryManager"/> <singleton name="com.sun.star.ui.theWindowContentFactoryManager"/> </implementation> |