From c864bd31056677277919078c4fd04966ef8b14de Mon Sep 17 00:00:00 2001 From: Matúš Kukan Date: Wed, 22 Jan 2014 18:39:49 +0100 Subject: fwk: Constructor feature for one instance ContextChangeEventMultiplexer. Change-Id: Ibb89e4dd46fc5d1f8a85f96b7e4677fa764bb112 --- .../inc/services/ContextChangeEventMultiplexer.hxx | 139 ----------------- framework/source/register/registerservices.cxx | 5 +- .../services/ContextChangeEventMultiplexer.cxx | 173 ++++++++++++++------- framework/util/fwk.component | 3 +- 4 files changed, 117 insertions(+), 203 deletions(-) delete mode 100644 framework/inc/services/ContextChangeEventMultiplexer.hxx (limited to 'framework') diff --git a/framework/inc/services/ContextChangeEventMultiplexer.hxx b/framework/inc/services/ContextChangeEventMultiplexer.hxx deleted file mode 100644 index 1d7e2b150973..000000000000 --- a/framework/inc/services/ContextChangeEventMultiplexer.hxx +++ /dev/null @@ -1,139 +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_SERVICES_CONTEXTCHANGEEVENTMULTIPLEXER_HXX -#define INCLUDED_FRAMEWORK_INC_SERVICES_CONTEXTCHANGEEVENTMULTIPLEXER_HXX - -#include - -#include -#include - -#include "macros/xserviceinfo.hxx" - -#include -#include - - -namespace -{ - typedef ::cppu::WeakComponentImplHelper4 < - css::ui::XContextChangeEventMultiplexer, - css::lang::XSingleComponentFactory, - css::lang::XServiceInfo, - css::lang::XEventListener - > ContextChangeEventMultiplexerInterfaceBase; -} - - -namespace cssu = ::com::sun::star::uno; -namespace cssl = ::com::sun::star::lang; - -namespace framework { - -class ContextChangeEventMultiplexer - : private ::boost::noncopyable, - private ::cppu::BaseMutex, - public ContextChangeEventMultiplexerInterfaceBase -{ -public: - ContextChangeEventMultiplexer(const cssu::Reference& rxContext); - virtual ~ContextChangeEventMultiplexer (void); - - virtual void SAL_CALL disposing (void); - - // XContextChangeEventMultiplexer - virtual void SAL_CALL addContextChangeEventListener ( - const cssu::Reference& rxListener, - const cssu::Reference& rxEventFocus) - throw(cssu::RuntimeException, cssl::IllegalArgumentException); - virtual void SAL_CALL removeContextChangeEventListener ( - const cssu::Reference& rxListener, - const cssu::Reference& rxEventFocus) - throw(cssu::RuntimeException, cssl::IllegalArgumentException); - virtual void SAL_CALL removeAllContextChangeEventListeners ( - const cssu::Reference& rxListener) - throw(cssu::RuntimeException, cssl::IllegalArgumentException); - virtual void SAL_CALL broadcastContextChangeEvent ( - const css::ui::ContextChangeEventObject& rContextChangeEventObject, - const cssu::Reference& rxEventFocus) - throw(cssu::RuntimeException); - - // XSingleComponentFactory - virtual cssu::Reference SAL_CALL createInstanceWithContext ( - const cssu::Reference& rxContext) - throw (cssu::Exception, cssu::RuntimeException); - virtual cssu::Reference SAL_CALL createInstanceWithArgumentsAndContext ( - const cssu::Sequence& rArguments, - const cssu::Reference& rxContext) - throw (cssu::Exception, cssu::RuntimeException); - - // XServiceInfo - virtual ::rtl::OUString SAL_CALL getImplementationName (void) - throw (cssu::RuntimeException); - virtual sal_Bool SAL_CALL supportsService ( - const ::rtl::OUString& rsServiceName) - throw (cssu::RuntimeException); - virtual cssu::Sequence< ::rtl::OUString> SAL_CALL getSupportedServiceNames (void) - throw (cssu::RuntimeException); - - // XEventListener - virtual void SAL_CALL disposing ( - const css::lang::EventObject& rEvent) - throw (cssu::RuntimeException); - - static ::rtl::OUString SAL_CALL impl_getStaticImplementationName (void); - static cssu::Reference SAL_CALL impl_createFactory ( - const cssu::Reference& xServiceManager); - -private: - typedef ::std::vector > ListenerContainer; - class FocusDescriptor - { - public: - ListenerContainer maListeners; - ::rtl::OUString msCurrentApplicationName; - ::rtl::OUString msCurrentContextName; - }; - typedef ::std::map, FocusDescriptor> ListenerMap; - ListenerMap maListeners; - - /** Notify all listeners in the container that is associated with - the given event focus. - - Typically called twice from broadcastEvent(), once for the - given event focus and onece for NULL. - */ - void BroadcastEventToSingleContainer ( - const css::ui::ContextChangeEventObject& rEventObject, - const cssu::Reference& rxEventFocus); - FocusDescriptor* GetFocusDescriptor ( - const cssu::Reference& rxEventFocus, - const bool bCreateWhenMissing); - - static cssu::Sequence< ::rtl::OUString > SAL_CALL static_GetSupportedServiceNames (void); - static cssu::Reference SAL_CALL static_CreateInstance ( - const cssu::Reference& rxComponentContext) - throw (cssu::Exception); -}; - -} // end of namespace framework - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/source/register/registerservices.cxx b/framework/source/register/registerservices.cxx index 06735d518561..c0d5cf3583a1 100644 --- a/framework/source/register/registerservices.cxx +++ b/framework/source/register/registerservices.cxx @@ -35,11 +35,8 @@ =================================================================================================================*/ #include -#include - COMPONENTGETFACTORY ( fwk, - IFFACTORY( ::framework::Desktop ) else - IFFACTORY( ::framework::ContextChangeEventMultiplexer ) + IFFACTORY( ::framework::Desktop ) ) /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/source/services/ContextChangeEventMultiplexer.cxx b/framework/source/services/ContextChangeEventMultiplexer.cxx index 53c319efe5b0..5bdcaf03f33f 100644 --- a/framework/source/services/ContextChangeEventMultiplexer.cxx +++ b/framework/source/services/ContextChangeEventMultiplexer.cxx @@ -17,25 +17,107 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include "services/ContextChangeEventMultiplexer.hxx" -#include "services.h" +#include +#include +#include +#include +#include + +#include #include +#include + +#include +#include +#include +#include -using ::rtl::OUString; +namespace cssl = css::lang; +namespace cssu = css::uno; using namespace css; -using namespace cssu; +using namespace css::uno; -namespace framework { +namespace { -#define IMPLEMENTATION_NAME "org.apache.openoffice.comp.framework.ContextChangeEventMultiplexer" +typedef ::cppu::WeakComponentImplHelper3 < + css::ui::XContextChangeEventMultiplexer, + css::lang::XServiceInfo, + css::lang::XEventListener + > ContextChangeEventMultiplexerInterfaceBase; -ContextChangeEventMultiplexer::ContextChangeEventMultiplexer ( - const cssu::Reference& rxContext) +class ContextChangeEventMultiplexer + : private ::boost::noncopyable, + private ::cppu::BaseMutex, + public ContextChangeEventMultiplexerInterfaceBase +{ +public: + ContextChangeEventMultiplexer(); + virtual ~ContextChangeEventMultiplexer (void); + + virtual void SAL_CALL disposing (void); + + // XContextChangeEventMultiplexer + virtual void SAL_CALL addContextChangeEventListener ( + const cssu::Reference& rxListener, + const cssu::Reference& rxEventFocus) + throw(cssu::RuntimeException, cssl::IllegalArgumentException); + virtual void SAL_CALL removeContextChangeEventListener ( + const cssu::Reference& rxListener, + const cssu::Reference& rxEventFocus) + throw(cssu::RuntimeException, cssl::IllegalArgumentException); + virtual void SAL_CALL removeAllContextChangeEventListeners ( + const cssu::Reference& rxListener) + throw(cssu::RuntimeException, cssl::IllegalArgumentException); + virtual void SAL_CALL broadcastContextChangeEvent ( + const css::ui::ContextChangeEventObject& rContextChangeEventObject, + const cssu::Reference& rxEventFocus) + throw(cssu::RuntimeException); + + // XServiceInfo + virtual ::rtl::OUString SAL_CALL getImplementationName (void) + throw (cssu::RuntimeException); + virtual sal_Bool SAL_CALL supportsService ( + const ::rtl::OUString& rsServiceName) + throw (cssu::RuntimeException); + virtual cssu::Sequence< ::rtl::OUString> SAL_CALL getSupportedServiceNames (void) + throw (cssu::RuntimeException); + + // XEventListener + virtual void SAL_CALL disposing ( + const css::lang::EventObject& rEvent) + throw (cssu::RuntimeException); + +private: + typedef ::std::vector > ListenerContainer; + class FocusDescriptor + { + public: + ListenerContainer maListeners; + ::rtl::OUString msCurrentApplicationName; + ::rtl::OUString msCurrentContextName; + }; + typedef ::std::map, FocusDescriptor> ListenerMap; + ListenerMap maListeners; + + /** Notify all listeners in the container that is associated with + the given event focus. + + Typically called twice from broadcastEvent(), once for the + given event focus and onece for NULL. + */ + void BroadcastEventToSingleContainer ( + const css::ui::ContextChangeEventObject& rEventObject, + const cssu::Reference& rxEventFocus); + FocusDescriptor* GetFocusDescriptor ( + const cssu::Reference& rxEventFocus, + const bool bCreateWhenMissing); +}; + +ContextChangeEventMultiplexer::ContextChangeEventMultiplexer() : ContextChangeEventMultiplexerInterfaceBase(m_aMutex), maListeners() { - (void)rxContext; } ContextChangeEventMultiplexer::~ContextChangeEventMultiplexer (void) @@ -229,30 +311,10 @@ ContextChangeEventMultiplexer::FocusDescriptor* ContextChangeEventMultiplexer::G return NULL; } -// XSingleComponentFactory -cssu::Reference SAL_CALL ContextChangeEventMultiplexer::createInstanceWithContext ( - const cssu::Reference& rxContext) - throw (cssu::Exception, cssu::RuntimeException) -{ - (void)rxContext; - return cssu::Reference(); -} - -cssu::Reference SAL_CALL ContextChangeEventMultiplexer::createInstanceWithArgumentsAndContext ( - const cssu::Sequence& rArguments, - const cssu::Reference& rxContext) - throw (cssu::Exception, cssu::RuntimeException) -{ - (void)rArguments; - (void)rxContext; - return cssu::Reference(); -} - -// XServiceInfo -::rtl::OUString SAL_CALL ContextChangeEventMultiplexer::getImplementationName (void) +OUString SAL_CALL ContextChangeEventMultiplexer::getImplementationName() throw(cssu::RuntimeException) { - return impl_getStaticImplementationName(); + return OUString("org.apache.openoffice.comp.framework.ContextChangeEventMultiplexer"); } sal_Bool SAL_CALL ContextChangeEventMultiplexer::supportsService ( const ::rtl::OUString& rsServiceName) @@ -261,10 +323,11 @@ sal_Bool SAL_CALL ContextChangeEventMultiplexer::supportsService ( const ::rtl:: return cppu::supportsService(this, rsServiceName); } -cssu::Sequence SAL_CALL ContextChangeEventMultiplexer::getSupportedServiceNames (void) +css::uno::Sequence SAL_CALL ContextChangeEventMultiplexer::getSupportedServiceNames() throw (cssu::RuntimeException) { - return static_GetSupportedServiceNames(); + // it's a singleton, not a service + return css::uno::Sequence(); } void SAL_CALL ContextChangeEventMultiplexer::disposing ( const css::lang::EventObject& rEvent) @@ -283,37 +346,29 @@ void SAL_CALL ContextChangeEventMultiplexer::disposing ( const css::lang::EventO maListeners.erase(iDescriptor); } -// Local and static methods. -OUString SAL_CALL ContextChangeEventMultiplexer::impl_getStaticImplementationName (void) -{ - return OUString(IMPLEMENTATION_NAME); -} +struct Instance { + explicit Instance(): + instance(static_cast( + new ContextChangeEventMultiplexer())) + { + } -cssu::Sequence SAL_CALL ContextChangeEventMultiplexer::static_GetSupportedServiceNames (void) -{ - return css::uno::Sequence(); -} + css::uno::Reference instance; +}; + +struct Singleton: + public rtl::Static +{}; -cssu::Reference ContextChangeEventMultiplexer::impl_createFactory ( - const cssu::Reference& rxServiceManager) -{ - (void)rxServiceManager; - return cppu::createSingleComponentFactory( - ContextChangeEventMultiplexer::static_CreateInstance, - ContextChangeEventMultiplexer::impl_getStaticImplementationName(), - ContextChangeEventMultiplexer::static_GetSupportedServiceNames() - ); } -cssu::Reference SAL_CALL ContextChangeEventMultiplexer::static_CreateInstance ( - const cssu::Reference& rxComponentContext) - throw (cssu::Exception) +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL +org_apache_openoffice_comp_framework_ContextChangeEventMultiplexer_get_implementation( + css::uno::XComponentContext *, + css::uno::Sequence const &) { - ContextChangeEventMultiplexer* pObject = new ContextChangeEventMultiplexer(rxComponentContext); - cssu::Reference xService (static_cast(pObject), cssu::UNO_QUERY); - return xService; + return cppu::acquire(static_cast( + Singleton::get().instance.get())); } -} // end of namespace framework - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/util/fwk.component b/framework/util/fwk.component index 47a817f1cbdd..9d5fbb1a7cc5 100644 --- a/framework/util/fwk.component +++ b/framework/util/fwk.component @@ -43,7 +43,8 @@ constructor="com_sun_star_comp_framework_DocumentAcceleratorConfiguration_get_implementation"> - +