summaryrefslogtreecommitdiff
path: root/framework
diff options
context:
space:
mode:
authorDavid Tardon <dtardon@redhat.com>2010-11-22 09:28:34 +0100
committerDavid Tardon <dtardon@redhat.com>2010-11-22 09:50:48 +0100
commit5dfa2bcf6f4a7699c2acae87caa96de739f82636 (patch)
tree3460e0abf6362741d9d8e8abe8f407898f5806db /framework
parent43a9042c5062374d8a7d787a5df7652b1b471682 (diff)
rhbz#650170# shutdown quickstarter at end of desktop session
Diffstat (limited to 'framework')
-rw-r--r--framework/inc/services/desktop.hxx4
-rw-r--r--framework/source/services/desktop.cxx35
2 files changed, 39 insertions, 0 deletions
diff --git a/framework/inc/services/desktop.hxx b/framework/inc/services/desktop.hxx
index c1cc855323..45e91d0831 100644
--- a/framework/inc/services/desktop.hxx
+++ b/framework/inc/services/desktop.hxx
@@ -429,6 +429,8 @@ class Desktop : // interfaces
*/
::sal_Bool impl_closeFrames(::sal_Bool bAllowUI);
+ sal_Bool impl_terminate();
+
//-------------------------------------------------------------------------------------------------------------
// debug methods
// (should be private everytime!)
@@ -507,6 +509,8 @@ class Desktop : // interfaces
css::uno::Reference< css::frame::XUntitledNumbers > m_xTitleNumberGenerator;
+ bool m_bTerminating; // we are in the process of terminating already
+
}; // class Desktop
} // namespace framework
diff --git a/framework/source/services/desktop.cxx b/framework/source/services/desktop.cxx
index d0a4a8e8bb..d59b361794 100644
--- a/framework/source/services/desktop.cxx
+++ b/framework/source/services/desktop.cxx
@@ -83,6 +83,7 @@
//_________________________________________________________________________________________________________________
// includes of other projects
//_________________________________________________________________________________________________________________
+#include <cppuhelper/exc_hlp.hxx>
#include <cppuhelper/queryinterface.hxx>
#include <cppuhelper/typeprovider.hxx>
#include <cppuhelper/factory.hxx>
@@ -264,6 +265,7 @@ Desktop::Desktop( const css::uno::Reference< css::lang::XMultiServiceFactory >&
, m_xSWThreadManager ( )
, m_xSfxTerminator ( )
, m_xTitleNumberGenerator ( )
+ , m_bTerminating(false)
{
// Safe impossible cases
// We don't accept all incoming parameter.
@@ -291,6 +293,39 @@ Desktop::~Desktop()
sal_Bool SAL_CALL Desktop::terminate()
throw( css::uno::RuntimeException )
{
+ bool bTerminating(false);
+ {
+ WriteGuard aGuard(m_aLock);
+ bTerminating = m_bTerminating;
+ m_bTerminating = true;
+ }
+ if (bTerminating)
+ return false;
+
+ css::uno::Any aException;
+ sal_Bool bTerminate(false);
+ try
+ {
+ bTerminate = impl_terminate();
+ }
+ catch (const css::uno::RuntimeException& rEx)
+ {
+ aException <<= rEx;
+ }
+
+ {
+ WriteGuard aGuard(m_aLock);
+ m_bTerminating = false;
+ }
+
+ if (aException.hasValue())
+ cppu::throwException(aException);
+
+ return bTerminate;
+}
+
+sal_Bool Desktop::impl_terminate()
+{
TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
SYNCHRONIZED_START