summaryrefslogtreecommitdiffstats
path: root/desktop
diff options
context:
space:
mode:
Diffstat (limited to 'desktop')
-rw-r--r--desktop/source/app/app.cxx34
-rw-r--r--desktop/source/app/officeipcthread.cxx19
2 files changed, 46 insertions, 7 deletions
diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx
index f75fcac00ab8..c95674d50211 100644
--- a/desktop/source/app/app.cxx
+++ b/desktop/source/app/app.cxx
@@ -982,6 +982,15 @@ void impl_checkRecoveryState(bool& bCrashed ,
bSessionDataExists = elements && session;
}
+Reference< css::frame::XSynchronousDispatch > g_xRecoveryUI;
+
+template <class Ref>
+struct RefClearGuard
+{
+ Ref& m_Ref;
+ RefClearGuard(Ref& ref) : m_Ref(ref) {}
+ ~RefClearGuard() { m_Ref.clear(); }
+};
/* @short start the recovery wizard.
@@ -996,12 +1005,13 @@ bool impl_callRecoveryUI(bool bEmergencySave ,
css::uno::Reference< css::uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext();
- Reference< css::frame::XSynchronousDispatch > xRecoveryUI(
+ g_xRecoveryUI.set(
xContext->getServiceManager()->createInstanceWithContext("com.sun.star.comp.svx.RecoveryUI", xContext),
css::uno::UNO_QUERY_THROW);
+ RefClearGuard<Reference< css::frame::XSynchronousDispatch >> refClearGuard(g_xRecoveryUI);
Reference< css::util::XURLTransformer > xURLParser =
- css::util::URLTransformer::create(::comphelper::getProcessComponentContext());
+ css::util::URLTransformer::create(xContext);
css::util::URL aURL;
if (bEmergencySave)
@@ -1013,6 +1023,24 @@ bool impl_callRecoveryUI(bool bEmergencySave ,
xURLParser->parseStrict(aURL);
+ css::uno::Any aRet = g_xRecoveryUI->dispatchWithReturnValue(aURL, css::uno::Sequence< css::beans::PropertyValue >());
+ bool bRet = false;
+ aRet >>= bRet;
+ return bRet;
+}
+
+bool impl_bringToFrontRecoveryUI()
+{
+ Reference< css::frame::XSynchronousDispatch > xRecoveryUI(g_xRecoveryUI);
+ if (!xRecoveryUI.is())
+ return false;
+
+ css::util::URL aURL;
+ aURL.Complete = "vnd.sun.star.autorecovery:/doBringToFront";
+ Reference< css::util::XURLTransformer > xURLParser =
+ css::util::URLTransformer::create(::comphelper::getProcessComponentContext());
+ xURLParser->parseStrict(aURL);
+
css::uno::Any aRet = xRecoveryUI->dispatchWithReturnValue(aURL, css::uno::Sequence< css::beans::PropertyValue >());
bool bRet = false;
aRet >>= bRet;
@@ -2274,7 +2302,7 @@ void Desktop::HandleAppEvent( const ApplicationEvent& rAppEvent )
createAcceptor(rAppEvent.GetStringData());
break;
case ApplicationEvent::Type::Appear:
- if ( !GetCommandLineArgs().IsInvisible() )
+ if ( !GetCommandLineArgs().IsInvisible() && !impl_bringToFrontRecoveryUI() )
{
Reference< css::uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext();
diff --git a/desktop/source/app/officeipcthread.cxx b/desktop/source/app/officeipcthread.cxx
index 5bfd5ed80a23..031e027f9473 100644
--- a/desktop/source/app/officeipcthread.cxx
+++ b/desktop/source/app/officeipcthread.cxx
@@ -1310,6 +1310,12 @@ static void AddConversionsToDispatchList(
}
}
+struct ConditionSetGuard
+{
+ osl::Condition* m_pCondition;
+ ConditionSetGuard(osl::Condition* pCondition) : m_pCondition(pCondition) {}
+ ~ConditionSetGuard() { if (m_pCondition) m_pCondition->set(); }
+};
bool RequestHandler::ExecuteCmdLineRequests(
ProcessDocumentsRequest& aRequest, bool noTerminate)
@@ -1317,6 +1323,9 @@ bool RequestHandler::ExecuteCmdLineRequests(
// protect the dispatch list
osl::ClearableMutexGuard aGuard( GetMutex() );
+ // ensure that Processed flag (if exists) is signaled in any outcome
+ ConditionSetGuard(aRequest.pcProcessed);
+
static std::vector<DispatchWatcher::DispatchRequest> aDispatchList;
// Create dispatch list for dispatch watcher
@@ -1334,7 +1343,13 @@ bool RequestHandler::ExecuteCmdLineRequests(
if ( pGlobal.is() )
{
if( ! pGlobal->AreRequestsEnabled() )
+ {
+ // Either starting, or downing - do not process the request, just try to bring Office to front
+ ApplicationEvent* pAppEvent =
+ new ApplicationEvent(ApplicationEvent::Type::Appear);
+ ImplPostForeignAppEvent(pAppEvent);
return bShutdown;
+ }
pGlobal->mnPendingRequests += aDispatchList.size();
if ( !pGlobal->mpDispatchWatcher.is() )
@@ -1352,10 +1367,6 @@ bool RequestHandler::ExecuteCmdLineRequests(
// Execute dispatch requests
bShutdown = dispatchWatcher->executeDispatchRequests( aTempList, noTerminate);
-
- // set processed flag
- if (aRequest.pcProcessed != nullptr)
- aRequest.pcProcessed->set();
}
return bShutdown;