20#include <config_folders.h>
23#include <com/sun/star/frame/Desktop.hpp>
24#include <com/sun/star/frame/XSynchronousDispatch.hpp>
25#include <com/sun/star/lang/XServiceInfo.hpp>
27#include <osl/file.hxx>
28#include <rtl/bootstrap.hxx>
39class RecoveryUI :
public ::cppu::WeakImplHelper< css::lang::XServiceInfo ,
40 css::frame::XSynchronousDispatch >
60 css::uno::Reference< css::uno::XComponentContext >
m_xContext;
66 RecoveryUI::EJob m_eJob;
76 explicit RecoveryUI(
const css::uno::Reference< css::uno::XComponentContext >& xContext);
87 virtual css::uno::Any SAL_CALL dispatchWithReturnValue(
const css::util::URL& aURL,
88 const css::uno::Sequence< css::beans::PropertyValue >& lArguments )
override;
98 EJob impl_classifyJob(
const css::util::URL& aURL);
100 bool impl_doEmergencySave();
102 bool impl_doRecovery();
104 void impl_showAllRecoveredDocs();
106 bool impl_doBringToFront();
109RecoveryUI::RecoveryUI(
const css::uno::Reference< css::uno::XComponentContext >& xContext)
111 , m_pParentWindow(nullptr)
112 , m_eJob(RecoveryUI::E_JOB_UNKNOWN)
117OUString SAL_CALL RecoveryUI::getImplementationName()
119 return "com.sun.star.comp.svx.RecoveryUI";
122sal_Bool SAL_CALL RecoveryUI::supportsService(
const OUString& sServiceName)
127css::uno::Sequence< OUString > SAL_CALL RecoveryUI::getSupportedServiceNames()
129 return {
"com.sun.star.dialog.RecoveryUI" };
132css::uno::Any SAL_CALL RecoveryUI::dispatchWithReturnValue(
const css::util::URL& aURL,
133 const css::uno::Sequence< css::beans::PropertyValue >& )
140 RecoveryUI::EJob eJob = impl_classifyJob(aURL);
145 case RecoveryUI::E_DO_EMERGENCY_SAVE:
147 bool bRet = impl_doEmergencySave();
152 case RecoveryUI::E_DO_RECOVERY:
154 bool bRet = impl_doRecovery();
159 case RecoveryUI::E_DO_BRINGTOFRONT:
161 bool bRet = impl_doBringToFront();
177OUString GetCrashConfigDir()
181 OUString ustrValue =
"${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER
"/bootstrap.ini:UserInstallation}";
183 OUString ustrValue =
"~";
185 OUString ustrValue =
"$SYSUSERCONFIG";
187 rtl::Bootstrap::expandMacros( ustrValue );
190 ustrValue +=
"/user/crashdata";
197#define LCKFILE "crashdat.lck"
199#define LCKFILE ".crash_report_unsent"
203OUString GetUnsentURL()
210bool delete_pending_crash()
212 OUString aUnsentURL = GetUnsentURL();
213 return ( FileBase::E_None == File::remove( aUnsentURL ) );
216RecoveryUI::EJob RecoveryUI::impl_classifyJob(
const css::util::URL& aURL)
218 m_eJob = RecoveryUI::E_JOB_UNKNOWN;
222 m_eJob = RecoveryUI::E_DO_EMERGENCY_SAVE;
224 m_eJob = RecoveryUI::E_DO_RECOVERY;
226 m_eJob = RecoveryUI::E_DO_BRINGTOFRONT;
232struct DialogReleaseGuard
234 RecoveryUI& m_rRecoveryUI;
236 DialogReleaseGuard(RecoveryUI& rRecoveryUI,
weld::Dialog* p)
237 : m_rRecoveryUI(rRecoveryUI)
239 m_rRecoveryUI.SetActiveDialog(p);
241 ~DialogReleaseGuard()
243 m_rRecoveryUI.SetActiveDialog(
nullptr);
247bool RecoveryUI::impl_doEmergencySave()
253 std::unique_ptr<svxdr::SaveDialog> xDialog(
new svxdr::SaveDialog(m_pParentWindow, pCore.get()));
254 DialogReleaseGuard dialogReleaseGuard(*
this, xDialog->getDialog());
257 short nRet = xDialog->run();
261bool RecoveryUI::impl_doRecovery()
268 std::unique_ptr<svxdr::RecoveryDialog> xDialog(
new svxdr::RecoveryDialog(m_pParentWindow, pCore.get()));
269 DialogReleaseGuard dialogReleaseGuard(*
this, xDialog->getDialog());
272 short nRet = xDialog->run();
274 impl_showAllRecoveredDocs();
276 delete_pending_crash();
281void RecoveryUI::impl_showAllRecoveredDocs()
283 css::uno::Reference< css::frame::XDesktop2 > xDesktop = css::frame::Desktop::create( m_xContext );
285 css::uno::Reference< css::container::XIndexAccess > xTaskContainer(
286 xDesktop->getFrames(),
287 css::uno::UNO_QUERY_THROW);
289 sal_Int32 c = xTaskContainer->getCount();
295 css::uno::Reference< css::frame::XFrame > xTask;
296 xTaskContainer->getByIndex(i) >>= xTask;
300 css::uno::Reference< css::awt::XWindow > xWindow = xTask->getContainerWindow();
304 xWindow->setVisible(
true);
306 catch(
const css::uno::RuntimeException&)
308 catch(
const css::uno::Exception&)
313bool RecoveryUI::impl_doBringToFront()
315 if (!m_pDialog || !m_pDialog->get_visible())
317 m_pDialog->present();
323extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
325 css::uno::XComponentContext *context,
326 css::uno::Sequence<css::uno::Any>
const &)
328 return cppu::acquire(
new RecoveryUI(context));
Reference< XComponentContext > m_xContext
#define DLG_RET_OK_AUTOLUNCH
#define RECOVERY_CMDPART_DO_EMERGENCY_SAVE
#define RECOVERY_CMDPART_DO_RECOVERY
#define RECOVERY_CMDPART_PROTOCOL
#define RECOVERY_CMDPART_DO_BRINGTOFRONT
css::uno::Sequence< OUString > getSupportedServiceNames()
OUString getImplementationName()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * com_sun_star_comp_svx_RecoveryUI_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)