|
|
35b321f |
From 5613954b275de8de9e6852738a7bfd215252d134 Mon Sep 17 00:00:00 2001
|
|
|
35b321f |
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
|
|
|
35b321f |
Date: Tue, 7 Jun 2011 17:03:52 +0100
|
|
|
35b321f |
Subject: [PATCH] Related: rhbz#652604 better survive exceptions thrown during
|
|
|
35b321f |
autorecover
|
|
|
35b321f |
|
|
|
35b321f |
---
|
|
|
35b321f |
framework/inc/services/autorecovery.hxx | 20 ++++++++++++++
|
|
|
35b321f |
framework/source/services/autorecovery.cxx | 40 +++++++++++++++++++++------
|
|
|
35b321f |
2 files changed, 51 insertions(+), 9 deletions(-)
|
|
|
35b321f |
|
|
|
35b321f |
diff --git a/framework/inc/services/autorecovery.hxx b/framework/inc/services/autorecovery.hxx
|
|
|
35b321f |
index 636ad98..6c4207e 100644
|
|
|
35b321f |
--- a/framework/inc/services/autorecovery.hxx
|
|
|
35b321f |
+++ b/framework/inc/services/autorecovery.hxx
|
|
|
35b321f |
@@ -861,6 +861,26 @@ class AutoRecovery : public css::lang::XTypeProvider
|
|
|
35b321f |
const ::rtl::OUString& sEventType,
|
|
|
35b321f |
AutoRecovery::TDocumentInfo* pInfo );
|
|
|
35b321f |
|
|
|
35b321f |
+
|
|
|
35b321f |
+ class ListenerInformer
|
|
|
35b321f |
+ {
|
|
|
35b321f |
+ private:
|
|
|
35b321f |
+ AutoRecovery &m_rRecovery;
|
|
|
35b321f |
+ sal_Int32 m_eJob;
|
|
|
35b321f |
+ bool m_bStopped;
|
|
|
35b321f |
+ public:
|
|
|
35b321f |
+ ListenerInformer(AutoRecovery &rRecovery, sal_Int32 eJob)
|
|
|
35b321f |
+ : m_rRecovery(rRecovery), m_eJob(eJob), m_bStopped(false)
|
|
|
35b321f |
+ {
|
|
|
35b321f |
+ }
|
|
|
35b321f |
+ void start();
|
|
|
35b321f |
+ void stop();
|
|
|
35b321f |
+ ~ListenerInformer()
|
|
|
35b321f |
+ {
|
|
|
35b321f |
+ stop();
|
|
|
35b321f |
+ }
|
|
|
35b321f |
+ };
|
|
|
35b321f |
+
|
|
|
35b321f |
//---------------------------------------
|
|
|
35b321f |
|
|
|
35b321f |
// TODO document me
|
|
|
35b321f |
diff --git a/framework/source/services/autorecovery.cxx b/framework/source/services/autorecovery.cxx
|
|
|
35b321f |
index efe2f17..ec60d13 100644
|
|
|
35b321f |
--- a/framework/source/services/autorecovery.cxx
|
|
|
35b321f |
+++ b/framework/source/services/autorecovery.cxx
|
|
|
35b321f |
@@ -576,6 +576,21 @@ void SAL_CALL AutoRecovery::dispatch(const css::util::URL&
|
|
|
35b321f |
implts_dispatch(aParams);
|
|
|
35b321f |
}
|
|
|
35b321f |
|
|
|
35b321f |
+void AutoRecovery::ListenerInformer::start()
|
|
|
35b321f |
+{
|
|
|
35b321f |
+ m_rRecovery.implts_informListener(m_eJob,
|
|
|
35b321f |
+ AutoRecovery::implst_createFeatureStateEvent(m_eJob, OPERATION_START, NULL));
|
|
|
35b321f |
+}
|
|
|
35b321f |
+
|
|
|
35b321f |
+void AutoRecovery::ListenerInformer::stop()
|
|
|
35b321f |
+{
|
|
|
35b321f |
+ if (m_bStopped)
|
|
|
35b321f |
+ return;
|
|
|
35b321f |
+ m_rRecovery.implts_informListener(m_eJob,
|
|
|
35b321f |
+ AutoRecovery::implst_createFeatureStateEvent(m_eJob, OPERATION_STOP, NULL));
|
|
|
35b321f |
+ m_bStopped = true;
|
|
|
35b321f |
+}
|
|
|
35b321f |
+
|
|
|
35b321f |
//-----------------------------------------------
|
|
|
35b321f |
void AutoRecovery::implts_dispatch(const DispatchParams& aParams)
|
|
|
35b321f |
{
|
|
|
35b321f |
@@ -599,8 +614,8 @@ void AutoRecovery::implts_dispatch(const DispatchParams& aParams)
|
|
|
35b321f |
implts_stopTimer();
|
|
|
35b321f |
implts_stopListening();
|
|
|
35b321f |
|
|
|
35b321f |
- implts_informListener(eJob,
|
|
|
35b321f |
- AutoRecovery::implst_createFeatureStateEvent(eJob, OPERATION_START, NULL));
|
|
|
35b321f |
+ ListenerInformer aListenerInformer(*this, eJob);
|
|
|
35b321f |
+ aListenerInformer.start();
|
|
|
35b321f |
|
|
|
35b321f |
try
|
|
|
35b321f |
{
|
|
|
35b321f |
@@ -676,13 +691,14 @@ void AutoRecovery::implts_dispatch(const DispatchParams& aParams)
|
|
|
35b321f |
)
|
|
|
35b321f |
implts_cleanUpWorkingEntry(aParams);
|
|
|
35b321f |
}
|
|
|
35b321f |
- catch(const css::uno::RuntimeException& exRun)
|
|
|
35b321f |
- { throw exRun; }
|
|
|
35b321f |
+ catch(const css::uno::RuntimeException&)
|
|
|
35b321f |
+ {
|
|
|
35b321f |
+ throw;
|
|
|
35b321f |
+ }
|
|
|
35b321f |
catch(const css::uno::Exception&)
|
|
|
35b321f |
{} // TODO better error handling
|
|
|
35b321f |
|
|
|
35b321f |
- implts_informListener(eJob,
|
|
|
35b321f |
- AutoRecovery::implst_createFeatureStateEvent(eJob, OPERATION_STOP, NULL));
|
|
|
35b321f |
+ aListenerInformer.stop();
|
|
|
35b321f |
|
|
|
35b321f |
// SAFE -> ----------------------------------
|
|
|
35b321f |
aWriteLock.lock();
|
|
|
35b321f |
@@ -1304,8 +1320,8 @@ void AutoRecovery::implts_flushConfigItem(const AutoRecovery::TDocumentInfo& rIn
|
|
|
35b321f |
xModify->insertByName(sID, css::uno::makeAny(xSet));
|
|
|
35b321f |
}
|
|
|
35b321f |
}
|
|
|
35b321f |
- catch(const css::uno::RuntimeException& exRun)
|
|
|
35b321f |
- { throw exRun; }
|
|
|
35b321f |
+ catch(const css::uno::RuntimeException&)
|
|
|
35b321f |
+ { throw; }
|
|
|
35b321f |
catch(const css::uno::Exception&)
|
|
|
35b321f |
{} // ??? can it happen that a full disc let these set of operations fail too ???
|
|
|
35b321f |
|
|
|
35b321f |
@@ -1627,7 +1643,13 @@ IMPL_LINK(AutoRecovery, implts_asyncDispatch, void*, EMPTYARG)
|
|
|
35b321f |
aWriteLock.unlock();
|
|
|
35b321f |
// <- SAFE
|
|
|
35b321f |
|
|
|
35b321f |
- implts_dispatch(aParams);
|
|
|
35b321f |
+ try
|
|
|
35b321f |
+ {
|
|
|
35b321f |
+ implts_dispatch(aParams);
|
|
|
35b321f |
+ }
|
|
|
35b321f |
+ catch (...)
|
|
|
35b321f |
+ {
|
|
|
35b321f |
+ }
|
|
|
35b321f |
return 0;
|
|
|
35b321f |
}
|
|
|
35b321f |
|
|
|
35b321f |
--
|
|
|
35b321f |
1.7.5.2
|
|
|
35b321f |
|