[PATCH] lp#562027: fix logout with quickstarter
Bjoern Michaelsen
bjoern.michaelsen at canonical.com
Tue Feb 28 05:29:06 PST 2012
lp#562027: actually give the quickstart suppressor a scope
---
framework/inc/services/desktop.hxx | 4 +++
framework/source/services/desktop.cxx | 30 +++++++++++++++++++++++++
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 8dcc872..324a056 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 5cdf44d..2f32ba8 100644
--- a/framework/source/services/desktop.cxx
+++ b/framework/source/services/desktop.cxx
@@ -427,6 +427,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 )
+{
+ QuickstartSuppressoraQuickstartSuppressor(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 6dc4877..c150aa5 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>
@@ -318,7 +319,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() )
{
--
1.7.5.4
--k1lZvvs/B4yU6o8G--
More information about the LibreOffice
mailing list