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