desktop/source/app/app.cxx | 14 framework/inc/services/ContextChangeEventMultiplexer.hxx | 139 -------- framework/inc/services/desktop.hxx | 6 framework/inc/services/sessionlistener.hxx | 157 ---------- framework/source/register/registerservices.cxx | 8 framework/source/services/ContextChangeEventMultiplexer.cxx | 173 +++++++---- framework/source/services/sessionlistener.cxx | 186 ++++++++---- framework/util/fwk.component | 6 8 files changed, 259 insertions(+), 430 deletions(-)
New commits: commit c864bd31056677277919078c4fd04966ef8b14de Author: Matúš Kukan <[email protected]> Date: Wed Jan 22 18:39:49 2014 +0100 fwk: Constructor feature for one instance ContextChangeEventMultiplexer. Change-Id: Ibb89e4dd46fc5d1f8a85f96b7e4677fa764bb112 diff --git a/framework/inc/services/ContextChangeEventMultiplexer.hxx b/framework/inc/services/ContextChangeEventMultiplexer.hxx deleted file mode 100644 index 1d7e2b1..0000000 --- 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 <com/sun/star/ui/XContextChangeEventMultiplexer.hpp> - -#include <cppuhelper/compbase4.hxx> -#include <cppuhelper/basemutex.hxx> - -#include "macros/xserviceinfo.hxx" - -#include <map> -#include <boost/noncopyable.hpp> - - -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<css::uno::XComponentContext>& rxContext); - virtual ~ContextChangeEventMultiplexer (void); - - virtual void SAL_CALL disposing (void); - - // XContextChangeEventMultiplexer - virtual void SAL_CALL addContextChangeEventListener ( - const cssu::Reference<css::ui::XContextChangeEventListener>& rxListener, - const cssu::Reference<cssu::XInterface>& rxEventFocus) - throw(cssu::RuntimeException, cssl::IllegalArgumentException); - virtual void SAL_CALL removeContextChangeEventListener ( - const cssu::Reference<css::ui::XContextChangeEventListener>& rxListener, - const cssu::Reference<cssu::XInterface>& rxEventFocus) - throw(cssu::RuntimeException, cssl::IllegalArgumentException); - virtual void SAL_CALL removeAllContextChangeEventListeners ( - const cssu::Reference<css::ui::XContextChangeEventListener>& rxListener) - throw(cssu::RuntimeException, cssl::IllegalArgumentException); - virtual void SAL_CALL broadcastContextChangeEvent ( - const css::ui::ContextChangeEventObject& rContextChangeEventObject, - const cssu::Reference<cssu::XInterface>& rxEventFocus) - throw(cssu::RuntimeException); - - // XSingleComponentFactory - virtual cssu::Reference<cssu::XInterface> SAL_CALL createInstanceWithContext ( - const cssu::Reference<cssu::XComponentContext>& rxContext) - throw (cssu::Exception, cssu::RuntimeException); - virtual cssu::Reference<cssu::XInterface > SAL_CALL createInstanceWithArgumentsAndContext ( - const cssu::Sequence<cssu::Any>& rArguments, - const cssu::Reference<cssu::XComponentContext>& 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<cssu::XInterface> SAL_CALL impl_createFactory ( - const cssu::Reference<cssl::XMultiServiceFactory>& xServiceManager); - -private: - typedef ::std::vector<cssu::Reference<css::ui::XContextChangeEventListener> > ListenerContainer; - class FocusDescriptor - { - public: - ListenerContainer maListeners; - ::rtl::OUString msCurrentApplicationName; - ::rtl::OUString msCurrentContextName; - }; - typedef ::std::map<cssu::Reference<cssu::XInterface>, 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<cssu::XInterface>& rxEventFocus); - FocusDescriptor* GetFocusDescriptor ( - const cssu::Reference<cssu::XInterface>& rxEventFocus, - const bool bCreateWhenMissing); - - static cssu::Sequence< ::rtl::OUString > SAL_CALL static_GetSupportedServiceNames (void); - static cssu::Reference<cssu::XInterface> SAL_CALL static_CreateInstance ( - const cssu::Reference<cssu::XComponentContext>& 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 06735d5..c0d5cf3 100644 --- a/framework/source/register/registerservices.cxx +++ b/framework/source/register/registerservices.cxx @@ -35,11 +35,8 @@ =================================================================================================================*/ #include <services/desktop.hxx> -#include <services/ContextChangeEventMultiplexer.hxx> - 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 53c319e..5bdcaf0 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 <com/sun/star/lang/XComponent.hpp> +#include <com/sun/star/lang/XEventListener.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/ui/XContextChangeEventMultiplexer.hpp> +#include <com/sun/star/uno/XComponentContext.hpp> + +#include <cppuhelper/compbase3.hxx> #include <cppuhelper/supportsservice.hxx> +#include <cppuhelper/basemutex.hxx> + +#include <algorithm> +#include <map> +#include <vector> +#include <boost/noncopyable.hpp> -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<cssu::XComponentContext>& 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<css::ui::XContextChangeEventListener>& rxListener, + const cssu::Reference<cssu::XInterface>& rxEventFocus) + throw(cssu::RuntimeException, cssl::IllegalArgumentException); + virtual void SAL_CALL removeContextChangeEventListener ( + const cssu::Reference<css::ui::XContextChangeEventListener>& rxListener, + const cssu::Reference<cssu::XInterface>& rxEventFocus) + throw(cssu::RuntimeException, cssl::IllegalArgumentException); + virtual void SAL_CALL removeAllContextChangeEventListeners ( + const cssu::Reference<css::ui::XContextChangeEventListener>& rxListener) + throw(cssu::RuntimeException, cssl::IllegalArgumentException); + virtual void SAL_CALL broadcastContextChangeEvent ( + const css::ui::ContextChangeEventObject& rContextChangeEventObject, + const cssu::Reference<cssu::XInterface>& 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<cssu::Reference<css::ui::XContextChangeEventListener> > ListenerContainer; + class FocusDescriptor + { + public: + ListenerContainer maListeners; + ::rtl::OUString msCurrentApplicationName; + ::rtl::OUString msCurrentContextName; + }; + typedef ::std::map<cssu::Reference<cssu::XInterface>, 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<cssu::XInterface>& rxEventFocus); + FocusDescriptor* GetFocusDescriptor ( + const cssu::Reference<cssu::XInterface>& 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<cssu::XInterface> SAL_CALL ContextChangeEventMultiplexer::createInstanceWithContext ( - const cssu::Reference<cssu::XComponentContext>& rxContext) - throw (cssu::Exception, cssu::RuntimeException) -{ - (void)rxContext; - return cssu::Reference<cssu::XInterface>(); -} - -cssu::Reference<cssu::XInterface > SAL_CALL ContextChangeEventMultiplexer::createInstanceWithArgumentsAndContext ( - const cssu::Sequence<cssu::Any>& rArguments, - const cssu::Reference<cssu::XComponentContext>& rxContext) - throw (cssu::Exception, cssu::RuntimeException) -{ - (void)rArguments; - (void)rxContext; - return cssu::Reference<cssu::XInterface>(); -} - -// 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<OUString> SAL_CALL ContextChangeEventMultiplexer::getSupportedServiceNames (void) +css::uno::Sequence<OUString> SAL_CALL ContextChangeEventMultiplexer::getSupportedServiceNames() throw (cssu::RuntimeException) { - return static_GetSupportedServiceNames(); + // it's a singleton, not a service + return css::uno::Sequence<OUString>(); } 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<cppu::OWeakObject *>( + new ContextChangeEventMultiplexer())) + { + } -cssu::Sequence<OUString> SAL_CALL ContextChangeEventMultiplexer::static_GetSupportedServiceNames (void) -{ - return css::uno::Sequence<OUString>(); -} + css::uno::Reference<css::uno::XInterface> instance; +}; + +struct Singleton: + public rtl::Static<Instance, Singleton> +{}; -cssu::Reference<cssu::XInterface> ContextChangeEventMultiplexer::impl_createFactory ( - const cssu::Reference<cssl::XMultiServiceFactory>& rxServiceManager) -{ - (void)rxServiceManager; - return cppu::createSingleComponentFactory( - ContextChangeEventMultiplexer::static_CreateInstance, - ContextChangeEventMultiplexer::impl_getStaticImplementationName(), - ContextChangeEventMultiplexer::static_GetSupportedServiceNames() - ); } -cssu::Reference<cssu::XInterface> SAL_CALL ContextChangeEventMultiplexer::static_CreateInstance ( - const cssu::Reference<cssu::XComponentContext>& 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<css::uno::Any> const &) { - ContextChangeEventMultiplexer* pObject = new ContextChangeEventMultiplexer(rxComponentContext); - cssu::Reference<cssu::XInterface> xService (static_cast<XWeak*>(pObject), cssu::UNO_QUERY); - return xService; + return cppu::acquire(static_cast<cppu::OWeakObject *>( + 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 47a817f..9d5fbb1 100644 --- a/framework/util/fwk.component +++ b/framework/util/fwk.component @@ -43,7 +43,8 @@ constructor="com_sun_star_comp_framework_DocumentAcceleratorConfiguration_get_implementation"> <service name="com.sun.star.ui.DocumentAcceleratorConfiguration"/> </implementation> - <implementation name="org.apache.openoffice.comp.framework.ContextChangeEventMultiplexer"> + <implementation name="org.apache.openoffice.comp.framework.ContextChangeEventMultiplexer" + constructor="org_apache_openoffice_comp_framework_ContextChangeEventMultiplexer_get_implementation"> <singleton name="com.sun.star.ui.ContextChangeEventMultiplexer"/> </implementation> <implementation name="com.sun.star.comp.framework.Frame" commit 72139db6b421fea2980e9c8df96bc70463777623 Author: Matúš Kukan <[email protected]> Date: Wed Jan 22 17:49:31 2014 +0100 fwk: Constructor feature for one instance SessionListener. Converted as usual service implementation. Change-Id: I37c2f25e8a463abb236753c1299cc0aeb3007cd9 diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx index 74f9650..d09e22b 100644 --- a/desktop/source/app/app.cxx +++ b/desktop/source/app/app.cxx @@ -2358,23 +2358,15 @@ void Desktop::OpenClients() try { // specifies whether the UI-interaction on Session shutdown is allowed - sal_Bool bAllowUI = isUIOnSessionShutdownAllowed(); - - xSessionListener = SessionListener::createWithOnQuitFlag(::comphelper::getProcessComponentContext(), bAllowUI); - -// css::beans::NamedValue aProperty( OUString( "AllowUserInteractionOnQuit" ), - // css::uno::makeAny( bAllowUI ) ); - // css::uno::Sequence< css::uno::Any > aArgs( 1 ); - // aArgs[0] <<= aProperty; - - // xSessionListener->initialize( aArgs ); + xSessionListener = SessionListener::createWithOnQuitFlag( + ::comphelper::getProcessComponentContext(), isUIOnSessionShutdownAllowed()); } catch(const com::sun::star::uno::Exception& e) { SAL_WARN( "desktop.app", "Registration of session listener failed" << e.Message); } - if ( !bExistsRecoveryData ) + if ( !bExistsRecoveryData && xSessionListener.is() ) { // session management try diff --git a/framework/inc/services/desktop.hxx b/framework/inc/services/desktop.hxx index de5121a..218a7c9 100644 --- a/framework/inc/services/desktop.hxx +++ b/framework/inc/services/desktop.hxx @@ -32,10 +32,7 @@ #include <com/sun/star/frame/XController.hpp> #include <com/sun/star/frame/XDesktop2.hpp> -#include <com/sun/star/frame/WindowArrange.hpp> -#include <com/sun/star/frame/TerminationVetoException.hpp> #include <com/sun/star/frame/XTerminateListener.hpp> -#include <com/sun/star/frame/XWindowArranger.hpp> #include <com/sun/star/frame/XTask.hpp> #include <com/sun/star/frame/XStorable.hpp> #include <com/sun/star/frame/XModel.hpp> @@ -51,9 +48,10 @@ #include <com/sun/star/lang/Locale.hpp> #include <com/sun/star/frame/XDispatchResultListener.hpp> #include <com/sun/star/lang/XEventListener.hpp> -#include <com/sun/star/frame/FeatureStateEvent.hpp> +#include <com/sun/star/lang/XComponent.hpp> #include <com/sun/star/task/XInteractionHandler.hpp> #include <com/sun/star/frame/XDispatchRecorderSupplier.hpp> +#include <com/sun/star/uno/XComponentContext.hpp> #include <unotools/cmdoptions.hxx> #include <cppuhelper/propshlp.hxx> diff --git a/framework/inc/services/sessionlistener.hxx b/framework/inc/services/sessionlistener.hxx deleted file mode 100644 index 42f0fb7..0000000 --- a/framework/inc/services/sessionlistener.hxx +++ /dev/null @@ -1,157 +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_SESSIONLISTENER_HXX -#define INCLUDED_FRAMEWORK_INC_SERVICES_SESSIONLISTENER_HXX - -#include <classes/filtercache.hxx> -#include <threadhelp/threadhelpbase.hxx> -#include <macros/generic.hxx> -#include <macros/xinterface.hxx> -#include <macros/xtypeprovider.hxx> -#include <macros/xserviceinfo.hxx> -#include <general.h> - -#include <com/sun/star/lang/XMultiServiceFactory.hpp> -#include <com/sun/star/lang/XInitialization.hpp> - - -#include <com/sun/star/frame/XSessionManagerListener2.hpp> -#include <com/sun/star/frame/XSessionManagerClient.hpp> -#include <com/sun/star/frame/XStatusListener.hpp> -#include <com/sun/star/frame/FeatureStateEvent.hpp> -#include <com/sun/star/lang/EventObject.hpp> -#include <com/sun/star/uno/Sequence.hxx> -#include <com/sun/star/uno/Any.hxx> - -#include <cppuhelper/implbase4.hxx> - -namespace framework{ - -/// @HTML -/** @short implements flat/deep detection of file/stream formats and provides - further read/write access to the global office type configuration. - - @descr Using of this class makes it possible to get information about the - format type of a given URL or stream. The returned internal type name - can be used to get more information about this format. Further this - class provides full access to the configuration data and following - implementations will support some special query modes. - - @author as96863 - - @docdate 10.03.2003 by as96863 - - @todo <ul> - <li>implementation of query mode</li> - <li>simple restore mechanism of last consistent cache state, - if flush failed</li> - </ul> - */ - -class SessionListener : - // baseclasses (order important for initialization!) - // Struct for right initalization of mutex member! Must be the first one of baseclasses! - private ThreadHelpBase, - // interfaces - public cppu::WeakImplHelper4< - css::lang::XInitialization, - css::frame::XSessionManagerListener2, - css::frame::XStatusListener, - css::lang::XServiceInfo> -{ - //------------------------------------------- - // member - - private: - - /** reference to the uno service manager, which created this service. - It can be used to create own needed helper services. */ - css::uno::Reference< css::uno::XComponentContext > m_xContext; - - css::uno::Reference< css::frame::XSessionManagerClient > m_rSessionManager; - - // restore handling - sal_Bool m_bRestored; - - sal_Bool m_bSessionStoreRequested; - - sal_Bool m_bAllowUserInteractionOnQuit; - sal_Bool m_bTerminated; - - - // in case of synchronous call the caller should do saveDone() call himself! - void StoreSession( sal_Bool bAsync ); - - // let session quietly close the documents, remove lock files, store configuration and etc. - void QuitSessionQuietly(); - - public: - - //--------------------------------------- - // XInterface, XTypeProvider, XServiceInfo - - DECLARE_XSERVICEINFO - - //--------------------------------------- - - /** @short initialize new instance of this class. - - @param xSMGR - reference to the global uno service manager, which created this new - factory instance. It must be used during runtime to create own - needed services. - */ - - SessionListener( const css::uno::Reference< css::uno::XComponentContext >& xContext ); - - virtual ~SessionListener(); - - virtual void SAL_CALL disposing(const com::sun::star::lang::EventObject&) throw (css::uno::RuntimeException); - - - // XInitialization - virtual void SAL_CALL initialize(const css::uno::Sequence< css::uno::Any >& args) throw (css::uno::RuntimeException); - - // XSessionManagerListener - virtual void SAL_CALL doSave( sal_Bool bShutdown, sal_Bool bCancelable ) - throw (css::uno::RuntimeException); - virtual void SAL_CALL approveInteraction( sal_Bool bInteractionGranted ) - throw (css::uno::RuntimeException); - virtual void SAL_CALL shutdownCanceled() - throw (css::uno::RuntimeException); - virtual sal_Bool SAL_CALL doRestore() - throw (css::uno::RuntimeException); - - // XSessionManagerListener2 - virtual void SAL_CALL doQuit() - throw (::com::sun::star::uno::RuntimeException); - - // XStatusListener - virtual void SAL_CALL statusChanged(const com::sun::star::frame::FeatureStateEvent& event) - throw (css::uno::RuntimeException); - - void doSaveImpl( sal_Bool bShutdown, sal_Bool bCancelable ) throw (css::uno::RuntimeException); -}; - -} // namespace framework - -#endif // INCLUDED_FRAMEWORK_INC_SERVICES_SESSIONLISTENER_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/source/register/registerservices.cxx b/framework/source/register/registerservices.cxx index 829b594..06735d5 100644 --- a/framework/source/register/registerservices.cxx +++ b/framework/source/register/registerservices.cxx @@ -34,14 +34,11 @@ ) =================================================================================================================*/ #include <services/desktop.hxx> -#include <services/sessionlistener.hxx> #include <services/ContextChangeEventMultiplexer.hxx> COMPONENTGETFACTORY ( fwk, IFFACTORY( ::framework::Desktop ) else - IFFACTORY( ::framework::SessionListener ) else - IFFACTORY( ::framework::SessionListener ) else IFFACTORY( ::framework::ContextChangeEventMultiplexer ) ) diff --git a/framework/source/services/sessionlistener.cxx b/framework/source/services/sessionlistener.cxx index 4449b82..d1f7d28 100644 --- a/framework/source/services/sessionlistener.cxx +++ b/framework/source/services/sessionlistener.cxx @@ -17,73 +17,149 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include <services/sessionlistener.hxx> +#include <sal/types.h> + #include <services/desktop.hxx> -#include <threadhelp/readguard.hxx> -#include <threadhelp/resetableguard.hxx> +#include <classes/filtercache.hxx> #include <protocols.h> -#include <services.h> - -#include <osl/thread.h> +#include <general.h> #include <vcl/svapp.hxx> #include <unotools/tempfile.hxx> -#include <com/sun/star/lang/XSingleServiceFactory.hpp> -#include <com/sun/star/lang/XComponent.hpp> -#include <com/sun/star/container/XNameAccess.hpp> -#include <com/sun/star/container/XNameContainer.hpp> #include <com/sun/star/beans/NamedValue.hpp> #include <com/sun/star/beans/PropertyValue.hpp> -#include <com/sun/star/beans/PropertyState.hpp> -#include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/frame/theAutoRecovery.hpp> -#include <com/sun/star/frame/XFramesSupplier.hpp> -#include <com/sun/star/frame/XStorable.hpp> -#include <com/sun/star/frame/XComponentLoader.hpp> -#include <com/sun/star/frame/XDispatch.hpp> #include <com/sun/star/frame/Desktop.hpp> -#include <com/sun/star/util/XModifiable.hpp> -#include <com/sun/star/util/XChangesBatch.hpp> +#include <com/sun/star/frame/FeatureStateEvent.hpp> +#include <com/sun/star/frame/XDispatch.hpp> +#include <com/sun/star/frame/XSessionManagerListener2.hpp> +#include <com/sun/star/frame/XSessionManagerClient.hpp> +#include <com/sun/star/frame/XStatusListener.hpp> +#include <com/sun/star/lang/EventObject.hpp> +#include <com/sun/star/lang/XInitialization.hpp> #include <com/sun/star/util/URLTransformer.hpp> #include <com/sun/star/util/XURLTransformer.hpp> #include <com/sun/star/util/URL.hpp> -#include <osl/time.h> -#include <comphelper/processfactory.hxx> +#include <cppuhelper/implbase4.hxx> +#include <cppuhelper/supportsservice.hxx> #include <unotools/pathoptions.hxx> -#include <stdio.h> #include <com/sun/star/uno/Any.hxx> - #include <com/sun/star/uno/Sequence.hxx> +using namespace css; using namespace com::sun::star::uno; using namespace com::sun::star::util; -using namespace com::sun::star::frame; -using namespace com::sun::star::lang; using namespace com::sun::star::beans; -using namespace com::sun::star::container; +using namespace framework; + +namespace { + +/// @HTML +/** @short implements flat/deep detection of file/stream formats and provides + further read/write access to the global office type configuration. + + @descr Using of this class makes it possible to get information about the + format type of a given URL or stream. The returned internal type name + can be used to get more information about this format. Further this + class provides full access to the configuration data and following + implementations will support some special query modes. + + @author as96863 + + @docdate 10.03.2003 by as96863 + + @todo <ul> + <li>implementation of query mode</li> + <li>simple restore mechanism of last consistent cache state, + if flush failed</li> + </ul> + */ +typedef cppu::WeakImplHelper4< + css::lang::XInitialization, + css::frame::XSessionManagerListener2, + css::frame::XStatusListener, + css::lang::XServiceInfo> SessionListener_BASE; + +class SessionListener : public SessionListener_BASE +{ +private: + osl::Mutex m_aMutex; + + /** reference to the uno service manager, which created this service. + It can be used to create own needed helper services. */ + css::uno::Reference< css::uno::XComponentContext > m_xContext; + + css::uno::Reference< css::frame::XSessionManagerClient > m_rSessionManager; + + // restore handling + sal_Bool m_bRestored; + + sal_Bool m_bSessionStoreRequested; + + sal_Bool m_bAllowUserInteractionOnQuit; + sal_Bool m_bTerminated; -namespace framework{ + // in case of synchronous call the caller should do saveDone() call himself! + void StoreSession( sal_Bool bAsync ); -// XInterface, XTypeProvider, XServiceInfo + // let session quietly close the documents, remove lock files, store configuration and etc. + void QuitSessionQuietly(); -DEFINE_XSERVICEINFO_ONEINSTANCESERVICE_2( - SessionListener, - cppu::OWeakObject, - "com.sun.star.frame.SessionListener", - IMPLEMENTATIONNAME_SESSIONLISTENER) +public: + SessionListener( const css::uno::Reference< css::uno::XComponentContext >& xContext ); -DEFINE_INIT_SERVICE(SessionListener, - { - /* Add special code for initialization here, if you have to use your own instance - during your ctor is still in progress! */ - } - ) + virtual ~SessionListener(); + + virtual OUString SAL_CALL getImplementationName() + throw (css::uno::RuntimeException) + { + return OUString("com.sun.star.comp.frame.SessionListener"); + } + + 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.frame.SessionListener"); + return aSeq; + } + + virtual void SAL_CALL disposing(const com::sun::star::lang::EventObject&) throw (css::uno::RuntimeException); + + // XInitialization + virtual void SAL_CALL initialize(const css::uno::Sequence< css::uno::Any >& args) throw (css::uno::RuntimeException); + + // XSessionManagerListener + virtual void SAL_CALL doSave( sal_Bool bShutdown, sal_Bool bCancelable ) + throw (css::uno::RuntimeException); + virtual void SAL_CALL approveInteraction( sal_Bool bInteractionGranted ) + throw (css::uno::RuntimeException); + virtual void SAL_CALL shutdownCanceled() + throw (css::uno::RuntimeException); + virtual sal_Bool SAL_CALL doRestore() + throw (css::uno::RuntimeException); + + // XSessionManagerListener2 + virtual void SAL_CALL doQuit() + throw (::com::sun::star::uno::RuntimeException); + + // XStatusListener + virtual void SAL_CALL statusChanged(const com::sun::star::frame::FeatureStateEvent& event) + throw (css::uno::RuntimeException); + + void doSaveImpl( sal_Bool bShutdown, sal_Bool bCancelable ) throw (css::uno::RuntimeException); +}; SessionListener::SessionListener(const css::uno::Reference< css::uno::XComponentContext >& rxContext ) - : ThreadHelpBase (&Application::GetSolarMutex()) - , m_xContext (rxContext ) + : m_xContext( rxContext ) , m_bRestored( sal_False ) , m_bSessionStoreRequested( sal_False ) , m_bAllowUserInteractionOnQuit( sal_False ) @@ -105,15 +181,15 @@ SessionListener::~SessionListener() void SessionListener::StoreSession( sal_Bool bAsync ) { SAL_INFO("fwk.session", "SessionListener::StoreSession"); - ResetableGuard aGuard(m_aLock); + osl::MutexGuard g(m_aMutex); try { - // xd create SERVICENAME_AUTORECOVERY -> XDispatch + // xd create SERVICENAME_AUTORECOVERY -> frame::XDispatch // xd->dispatch("vnd.sun.star.autorecovery:/doSessionSave, async=bAsync // on stop event m_rSessionManager->saveDone(this); in case of asynchronous call // in case of synchronous call the caller should do saveDone() call himself! - css::uno::Reference< XDispatch > xDispatch = css::frame::theAutoRecovery::get( m_xContext ); + css::uno::Reference< frame::XDispatch > xDispatch = css::frame::theAutoRecovery::get( m_xContext ); css::uno::Reference< XURLTransformer > xURLTransformer = URLTransformer::create( m_xContext ); URL aURL; aURL.Complete = "vnd.sun.star.autorecovery:/doSessionSave"; @@ -138,14 +214,14 @@ void SessionListener::StoreSession( sal_Bool bAsync ) void SessionListener::QuitSessionQuietly() { SAL_INFO("fwk.session", "SessionListener::QuitSessionQuietly"); - ResetableGuard aGuard(m_aLock); + osl::MutexGuard g(m_aMutex); try { - // xd create SERVICENAME_AUTORECOVERY -> XDispatch + // xd create SERVICENAME_AUTORECOVERY -> frame::XDispatch // xd->dispatch("vnd.sun.star.autorecovery:/doSessionQuietQuit, async=false // it is done synchronously to avoid conflict with normal quit process - css::uno::Reference< XDispatch > xDispatch = css::frame::theAutoRecovery::get( m_xContext ); + css::uno::Reference< frame::XDispatch > xDispatch = css::frame::theAutoRecovery::get( m_xContext ); css::uno::Reference< XURLTransformer > xURLTransformer = URLTransformer::create( m_xContext ); URL aURL; aURL.Complete = "vnd.sun.star.autorecovery:/doSessionQuietQuit"; @@ -189,7 +265,7 @@ void SAL_CALL SessionListener::initialize(const Sequence< Any >& args) } } if (!m_rSessionManager.is()) - m_rSessionManager = css::uno::Reference< XSessionManagerClient > + m_rSessionManager = css::uno::Reference< frame::XSessionManagerClient > (m_xContext->getServiceManager()->createInstanceWithContext(aSMgr, m_xContext), UNO_QUERY); if (m_rSessionManager.is()) @@ -198,7 +274,7 @@ void SAL_CALL SessionListener::initialize(const Sequence< Any >& args) } } -void SAL_CALL SessionListener::statusChanged(const FeatureStateEvent& event) +void SAL_CALL SessionListener::statusChanged(const frame::FeatureStateEvent& event) throw (css::uno::RuntimeException) { SAL_INFO("fwk.session", "SessionListener::statusChanged"); @@ -223,10 +299,10 @@ sal_Bool SAL_CALL SessionListener::doRestore() throw (RuntimeException) { SAL_INFO("fwk.session", "SessionListener::doRestore"); - ResetableGuard aGuard(m_aLock); + osl::MutexGuard g(m_aMutex); m_bRestored = sal_False; try { - css::uno::Reference< XDispatch > xDispatch = css::frame::theAutoRecovery::get( m_xContext ); + css::uno::Reference< frame::XDispatch > xDispatch = css::frame::theAutoRecovery::get( m_xContext ); URL aURL; aURL.Complete = "vnd.sun.star.autorecovery:/doSessionRestore"; @@ -267,7 +343,7 @@ void SAL_CALL SessionListener::approveInteraction( sal_Bool bInteractionGranted { SAL_INFO("fwk.session", "SessionListener::approveInteraction"); // do AutoSave as the first step - ResetableGuard aGuard(m_aLock); + osl::MutexGuard g(m_aMutex); if ( bInteractionGranted ) { @@ -337,4 +413,12 @@ void SessionListener::doQuit() } +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL +com_sun_star_comp_frame_SessionListener_get_implementation( + css::uno::XComponentContext *context, + css::uno::Sequence<css::uno::Any> const &) +{ + return cppu::acquire(new SessionListener(context)); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/util/fwk.component b/framework/util/fwk.component index 0db78c8..47a817f 100644 --- a/framework/util/fwk.component +++ b/framework/util/fwk.component @@ -19,7 +19,8 @@ <component loader="com.sun.star.loader.SharedLibrary" environment="@CPPU_ENV@" prefix="fwk" xmlns="http://openoffice.org/2010/uno-components"> - <implementation name="com.sun.star.comp.frame.SessionListener"> + <implementation name="com.sun.star.comp.frame.SessionListener" + constructor="com_sun_star_comp_frame_SessionListener_get_implementation"> <service name="com.sun.star.frame.SessionListener"/> </implementation> <implementation name="com.sun.star.comp.framework.AddonsToolBarFactory"
_______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
