diff options
Diffstat (limited to 'desktop')
-rw-r--r-- | desktop/source/app/app.cxx | 34 | ||||
-rw-r--r-- | desktop/source/app/officeipcthread.cxx | 19 |
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; |