diff options
author | Bjoern Michaelsen <bjoern.michaelsen@canonical.com> | 2012-02-28 14:29:06 +0100 |
---|---|---|
committer | Bjoern Michaelsen <bjoern.michaelsen@canonical.com> | 2012-02-28 14:30:42 +0100 |
commit | 5279616d50b0394e8ec6d8e2109471ca649412b7 (patch) | |
tree | b9109c2407254189e85e716b82bbb5aa700f72f9 /framework | |
parent | some fancy new SAL_LOG tracing for sfx2 (diff) | |
download | core-5279616d50b0394e8ec6d8e2109471ca649412b7.tar.gz core-5279616d50b0394e8ec6d8e2109471ca649412b7.zip |
lp#562027: fix logout with quickstarter
Diffstat (limited to 'framework')
-rw-r--r-- | framework/inc/services/desktop.hxx | 4 | ||||
-rw-r--r-- | framework/source/services/desktop.cxx | 30 | ||||
-rw-r--r-- | framework/source/services/sessionlistener.cxx | 15 |
3 files changed, 48 insertions, 1 deletions
diff --git a/framework/inc/services/desktop.hxx b/framework/inc/services/desktop.hxx index ac51f258d9a9..530d615c3208 100644 --- a/framework/inc/services/desktop.hxx +++ b/framework/inc/services/desktop.hxx @@ -339,6 +339,10 @@ class Desktop : // interfaces virtual ::rtl::OUString SAL_CALL getUntitledPrefix() throw (css::uno::RuntimeException); + // we need this wrapped terminate()-call to terminate even the QuickStarter + // non-virtual and non-UNO for now + bool SAL_CALL terminateQuickstarterToo() + throw( css::uno::RuntimeException ); //------------------------------------------------------------------------------------------------------------- // protected methods //------------------------------------------------------------------------------------------------------------- diff --git a/framework/source/services/desktop.cxx b/framework/source/services/desktop.cxx index eccd010df82b..6c63aea9b7ef 100644 --- a/framework/source/services/desktop.cxx +++ b/framework/source/services/desktop.cxx @@ -401,6 +401,36 @@ sal_Bool SAL_CALL Desktop::terminate() return bTerminate; } +namespace +{ + class QuickstartSuppressor + { + Desktop* const m_pDesktop; + css::uno::Reference< css::frame::XTerminateListener > m_xQuickLauncher; + public: + QuickstartSuppressor(Desktop* const pDesktop, css::uno::Reference< css::frame::XTerminateListener > xQuickLauncher) + : m_pDesktop(pDesktop) + , m_xQuickLauncher(xQuickLauncher) + { + SAL_INFO("fwk.desktop", "temporary removing Quickstarter"); + if(m_xQuickLauncher.is()) + m_pDesktop->removeTerminateListener(m_xQuickLauncher); + } + ~QuickstartSuppressor() + { + SAL_INFO("fwk.desktop", "readding Quickstarter"); + if(m_xQuickLauncher.is()) + m_pDesktop->addTerminateListener(m_xQuickLauncher); + } + }; +} + +bool SAL_CALL Desktop::terminateQuickstarterToo() + throw( css::uno::RuntimeException ) +{ + QuickstartSuppressor(this, m_xQuickLauncher); + return terminate(); +} //============================================================================= void SAL_CALL Desktop::addTerminateListener( const css::uno::Reference< css::frame::XTerminateListener >& xListener ) diff --git a/framework/source/services/sessionlistener.cxx b/framework/source/services/sessionlistener.cxx index b6c94b249c00..92b479d1bcff 100644 --- a/framework/source/services/sessionlistener.cxx +++ b/framework/source/services/sessionlistener.cxx @@ -30,6 +30,7 @@ // my own includes #include <services/sessionlistener.hxx> +#include <services/desktop.hxx> #include <threadhelp/readguard.hxx> #include <threadhelp/resetableguard.hxx> #include <protocols.h> @@ -326,7 +327,19 @@ void SAL_CALL SessionListener::approveInteraction( sal_Bool bInteractionGranted StoreSession( sal_False ); css::uno::Reference< css::frame::XDesktop > xDesktop( m_xSMGR->createInstance(SERVICENAME_DESKTOP), css::uno::UNO_QUERY_THROW); - m_bTerminated = xDesktop->terminate(); + // honestly: how many implementations of XDesktop will we ever have? + // so casting this directly to the implementation + Desktop* pDesktop(dynamic_cast<Desktop*>(xDesktop.get())); + if(pDesktop) + { + SAL_INFO("fwk.session", "XDesktop is a framework::Desktop -- good."); + m_bTerminated = pDesktop->terminateQuickstarterToo(); + } + else + { + SAL_WARN("fwk.session", "XDesktop is not a framework::Desktop -- this should never happen."); + m_bTerminated = xDesktop->terminate(); + } if ( m_rSessionManager.is() ) { |