summaryrefslogtreecommitdiff
path: root/svx
diff options
context:
space:
mode:
authorRüdiger Timm <rt@openoffice.org>2004-11-26 13:22:49 +0000
committerRüdiger Timm <rt@openoffice.org>2004-11-26 13:22:49 +0000
commit17e80835b75e2973ab15919d82437a9af4bd70dd (patch)
tree40714660b48da833f78bb6f64f63c1dd9b1845ad /svx
parentd2c01de120cff71f50db30d694ced24c095e28d3 (diff)
INTEGRATION: CWS recovery04 (1.1.2); FILE ADDED
2004/11/16 16:47:58 hro 1.1.2.14: #i37268# #i36960# Rework crash detection 2004/11/12 12:10:36 hro 1.1.2.13: #i36960# Test for windows dump file too 2004/11/08 23:52:13 hro 1.1.2.12: #i34683# Test of generated crash report files 2004/11/01 12:18:21 hro 1.1.2.11: #i34683# Commited missing changes 2004/10/01 06:59:23 as 1.1.2.10: #i33868# fix some crashes on finish dialogs 2004/09/29 10:06:49 as 1.1.2.9: #i33868# use tab dialog instead of different modal dialogs 2004/09/03 04:53:51 hro 1.1.2.8: #i28480# Sending only mode for crash reporter 2004/09/02 08:07:35 as 1.1.2.7: #i27726# dont set recovery dialog as top most one 2004/09/01 09:01:51 as 1.1.2.6: #i27726# show save dialog as sub-modal one 2004/08/23 13:47:00 mba 1.1.2.5: #i27726#: some minor bugfixes 2004/08/20 11:48:43 hro 1.1.2.4: #i27780# Added Crash Reporter dialogs 2004/08/08 13:22:11 as 1.1.2.3: #i27726# new options to know if office crashed but may be without recovery data - because no document was open 2004/08/05 11:26:29 as 1.1.2.2: #27726# make auto recovery aynchron; implement progress 2004/08/02 10:58:43 as 1.1.2.1: #27726# new recovery UI service
Diffstat (limited to 'svx')
-rw-r--r--svx/source/unodraw/recoveryui.cxx423
1 files changed, 423 insertions, 0 deletions
diff --git a/svx/source/unodraw/recoveryui.cxx b/svx/source/unodraw/recoveryui.cxx
new file mode 100644
index 000000000000..fa1c2c23b03f
--- /dev/null
+++ b/svx/source/unodraw/recoveryui.cxx
@@ -0,0 +1,423 @@
+/*************************************************************************
+ *
+ * $RCSfile: recoveryui.cxx,v $
+ *
+ * $Revision: 1.2 $
+ *
+ * last change: $Author: rt $ $Date: 2004-11-26 14:22:49 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+//===============================================
+// includes
+
+#ifndef _RECOVERYUI_HXX
+#include "recoveryui.hxx"
+#endif
+
+#ifndef _SVX_DOCRECOVERY_HXX
+#include "docrecovery.hxx"
+#endif
+
+#ifndef _COM_SUN_STAR_LANG_XINITIALIZATION_HPP_
+#include <com/sun/star/lang/XInitialization.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XFRAMESSUPPLIER_HPP_
+#include <com/sun/star/frame/XFramesSupplier.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_BEANS_NAMEDVALUE_HPP_
+#include <com/sun/star/beans/NamedValue.hpp>
+#endif
+
+#ifndef _OSL_FILE_HXX_
+#include <osl/file.hxx>
+#endif
+
+#ifndef _RTL_BOOTSTRAP_HXX_
+#include <rtl/bootstrap.hxx>
+#endif
+
+//===============================================
+// const
+
+#define IMPLEMENTATIONNAME_RECOVERYUI ::rtl::OUString::createFromAscii("com.sun.star.comp.svx.RecoveryUI")
+#define SERVICENAME_RECOVERYUI ::rtl::OUString::createFromAscii("com.sun.star.dialog.RecoveryUI")
+
+//===============================================
+// namespace
+
+namespace svx
+{
+
+namespace css = ::com::sun::star;
+namespace svxdr = ::svx::DocRecovery;
+
+using namespace ::rtl;
+using namespace ::osl;
+
+//===============================================
+RecoveryUI::RecoveryUI(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR)
+ : m_xSMGR (xSMGR )
+ , m_eJob (RecoveryUI::E_JOB_UNKNOWN)
+ , m_pParentWindow(0 )
+{
+}
+
+//===============================================
+RecoveryUI::~RecoveryUI()
+{
+}
+
+//===============================================
+::rtl::OUString SAL_CALL RecoveryUI::getImplementationName()
+ throw(css::uno::RuntimeException)
+{
+ return RecoveryUI::st_getImplementationName();
+}
+
+//===============================================
+sal_Bool SAL_CALL RecoveryUI::supportsService(const ::rtl::OUString& sServiceName)
+ throw(css::uno::RuntimeException)
+{
+ const css::uno::Sequence< ::rtl::OUString > lServices = RecoveryUI::st_getSupportedServiceNames();
+ sal_Int32 c = lServices.getLength();
+ sal_Int32 i = 0;
+ for (i=0; i<c; ++i)
+ {
+ const ::rtl::OUString& sSupportedService = lServices[i];
+ if (sSupportedService.equals(sServiceName))
+ return sal_True;
+ }
+ return sal_False;
+}
+
+//===============================================
+css::uno::Sequence< ::rtl::OUString > SAL_CALL RecoveryUI::getSupportedServiceNames()
+ throw(css::uno::RuntimeException)
+{
+ return RecoveryUI::st_getSupportedServiceNames();
+}
+
+//===============================================
+css::uno::Any SAL_CALL RecoveryUI::dispatchWithReturnValue(const css::util::URL& aURL,
+ const css::uno::Sequence< css::beans::PropertyValue >& lArguments )
+ throw(css::uno::RuntimeException)
+{
+ css::uno::Any aRet;
+ RecoveryUI::EJob eJob = impl_classifyJob(aURL);
+ // TODO think about outside arguments
+
+ switch(eJob)
+ {
+ case RecoveryUI::E_DO_EMERGENCY_SAVE :
+ {
+ sal_Bool bRet = impl_doEmergencySave();
+ aRet <<= bRet;
+ break;
+ }
+
+ case RecoveryUI::E_DO_RECOVERY :
+ impl_doRecovery();
+ break;
+
+ case RecoveryUI::E_DO_CRASHREPORT :
+ impl_doCrashReport();
+ break;
+
+ default :
+ break;
+ }
+
+ return aRet;
+}
+
+//===============================================
+void SAL_CALL RecoveryUI::dispatch(const css::util::URL& aURL ,
+ const css::uno::Sequence< css::beans::PropertyValue >& lArguments)
+ throw(css::uno::RuntimeException)
+{
+ // recycle this method :-)
+ dispatchWithReturnValue(aURL, lArguments);
+}
+
+//===============================================
+void SAL_CALL RecoveryUI::addStatusListener(const css::uno::Reference< css::frame::XStatusListener >& xListener,
+ const css::util::URL& aURL )
+ throw(css::uno::RuntimeException)
+{
+ // TODO
+ OSL_ENSURE(sal_False, "RecoveryUI::addStatusListener()\nNot implemented yet!");
+}
+
+//===============================================
+void SAL_CALL RecoveryUI::removeStatusListener(const css::uno::Reference< css::frame::XStatusListener >& xListener,
+ const css::util::URL& aURL )
+ throw(css::uno::RuntimeException)
+{
+ // TODO
+ OSL_ENSURE(sal_False, "RecoveryUI::removeStatusListener()\nNot implemented yet!");
+}
+
+//===============================================
+::rtl::OUString RecoveryUI::st_getImplementationName()
+{
+ static ::rtl::OUString IMPLEMENTATIONNAME = IMPLEMENTATIONNAME_RECOVERYUI;
+ return IMPLEMENTATIONNAME;
+}
+
+//===============================================
+css::uno::Sequence< ::rtl::OUString > RecoveryUI::st_getSupportedServiceNames()
+{
+ css::uno::Sequence< ::rtl::OUString > lServiceNames(1); lServiceNames.getArray() [0] = SERVICENAME_RECOVERYUI;
+ return lServiceNames;
+}
+
+//===============================================
+css::uno::Reference< css::uno::XInterface > SAL_CALL RecoveryUI::st_createInstance(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR)
+{
+ RecoveryUI* pNew = new RecoveryUI(xSMGR);
+ return css::uno::Reference< css::uno::XInterface >(static_cast< css::lang::XServiceInfo* >(pNew));
+}
+
+//===============================================
+
+static OUString GetCrashConfigDir()
+{
+
+#ifdef WNT
+ OUString ustrValue = OUString::createFromAscii("${$SYSBINDIR/bootstrap.ini:UserInstallation}");
+#else
+ OUString ustrValue = OUString::createFromAscii("$SYSUSERCONFIG");
+#endif
+ Bootstrap::expandMacros( ustrValue );
+
+#ifdef WNT
+ ustrValue += OUString::createFromAscii("/user/crashdata");
+#endif
+ return ustrValue;
+}
+
+//===============================================
+
+#ifdef WNT
+#define LCKFILE "crashdat.lck"
+#else
+#define LCKFILE ".crash_report_unsent"
+#endif
+
+
+static OUString GetUnsentURL()
+{
+ OUString aURL = GetCrashConfigDir();
+
+ aURL += OUString( RTL_CONSTASCII_USTRINGPARAM( "/" ) );
+ aURL += OUString( RTL_CONSTASCII_USTRINGPARAM( LCKFILE ) );
+
+ return aURL;
+}
+
+//===============================================
+
+static bool new_crash_pending()
+{
+ OUString aUnsentURL = GetUnsentURL();
+ File aFile( aUnsentURL );
+
+ if ( FileBase::E_None == aFile.open( OpenFlag_Read ) )
+ {
+ aFile.close();
+ return true;
+ }
+
+ return false;
+}
+//===============================================
+
+static bool delete_pending_crash()
+{
+ OUString aUnsentURL = GetUnsentURL();
+ return ( FileBase::E_None == File::remove( aUnsentURL ) );
+}
+
+RecoveryUI::EJob RecoveryUI::impl_classifyJob(const css::util::URL& aURL)
+{
+ m_eJob = RecoveryUI::E_JOB_UNKNOWN;
+ if (aURL.Protocol.equals(RECOVERY_CMDPART_PROTOCOL))
+ {
+ if (aURL.Path.equals(RECOVERY_CMDPART_DO_EMERGENCY_SAVE))
+ m_eJob = RecoveryUI::E_DO_EMERGENCY_SAVE;
+ else
+ if (aURL.Path.equals(RECOVERY_CMDPART_DO_RECOVERY))
+ m_eJob = RecoveryUI::E_DO_RECOVERY;
+ else
+ if (aURL.Path.equals(RECOVERY_CMDPART_DO_CRASHREPORT))
+ m_eJob = RecoveryUI::E_DO_CRASHREPORT;
+ }
+
+ return m_eJob;
+}
+
+//===============================================
+sal_Bool RecoveryUI::impl_doEmergencySave()
+{
+ // create core service, which implements the real "emergency save" algorithm.
+ svxdr::RecoveryCore* pCore = new svxdr::RecoveryCore(m_xSMGR);
+ css::uno::Reference< css::frame::XStatusListener > xCore(pCore);
+
+ // create all needed dialogs for this operation
+ // and bind it to the used core service
+ svxdr::TabDialog4Recovery* pWizard = new svxdr::TabDialog4Recovery(m_pParentWindow);
+ svxdr::IExtendedTabPage* pPage1 = new svxdr::SaveDialog (pWizard, pCore );
+ pWizard->addTabPage(pPage1);
+
+ // start the wizard
+ short nRet = pWizard->Execute();
+
+ delete pPage1 ;
+ delete pWizard;
+
+ return (nRet==DLG_RET_OK_AUTOLUNCH);
+}
+
+//===============================================
+void RecoveryUI::impl_doRecovery()
+{
+ // create core service, which implements the real "emergency save" algorithm.
+ svxdr::RecoveryCore* pCore = new svxdr::RecoveryCore(m_xSMGR);
+ css::uno::Reference< css::frame::XStatusListener > xCore(pCore);
+
+ // create all needed dialogs for this operation
+ // and bind it to the used core service
+ svxdr::TabDialog4Recovery* pWizard = new svxdr::TabDialog4Recovery (m_pParentWindow);
+ svxdr::IExtendedTabPage* pPage1 = new svxdr::RecoveryDialog (pWizard, pCore );
+ svxdr::IExtendedTabPage* pPage2 = new svxdr::ErrorRepWelcomeDialog(pWizard );
+ svxdr::IExtendedTabPage* pPage3 = new svxdr::ErrorRepSendDialog (pWizard );
+ pWizard->addTabPage(pPage1);
+ pWizard->addTabPage(pPage2);
+ pWizard->addTabPage(pPage3);
+
+ // start the wizard
+ short nRet = pWizard->Execute();
+
+ impl_showAllRecoveredDocs();
+
+ delete pPage3 ;
+ delete pPage2 ;
+ delete pPage1 ;
+ delete pWizard;
+
+ delete_pending_crash();
+}
+
+//===============================================
+
+void RecoveryUI::impl_doCrashReport()
+{
+ if ( new_crash_pending() )
+ {
+ svxdr::TabDialog4Recovery* pWizard = new svxdr::TabDialog4Recovery (m_pParentWindow );
+ svxdr::IExtendedTabPage* pPage1 = new svxdr::ErrorRepWelcomeDialog(pWizard, sal_False);
+ svxdr::IExtendedTabPage* pPage2 = new svxdr::ErrorRepSendDialog (pWizard );
+ pWizard->addTabPage(pPage1);
+ pWizard->addTabPage(pPage2);
+
+ // start the wizard
+ short nRet = pWizard->Execute();
+
+ delete pPage2 ;
+ delete pPage1 ;
+ delete pWizard;
+
+ delete_pending_crash();
+ }
+}
+
+//===============================================
+void RecoveryUI::impl_showAllRecoveredDocs()
+{
+ css::uno::Reference< css::frame::XFramesSupplier > xDesktop(
+ m_xSMGR->createInstance(SERVICENAME_DESKTOP),
+ css::uno::UNO_QUERY_THROW);
+
+ css::uno::Reference< css::container::XIndexAccess > xTaskContainer(
+ xDesktop->getFrames(),
+ css::uno::UNO_QUERY_THROW);
+
+ sal_Int32 c = xTaskContainer->getCount();
+ sal_Int32 i = 0;
+ for (i=0; i<c; ++i)
+ {
+ try
+ {
+ css::uno::Reference< css::frame::XFrame > xTask;
+ xTaskContainer->getByIndex(i) >>= xTask;
+ if (!xTask.is())
+ continue;
+
+ css::uno::Reference< css::awt::XWindow > xWindow = xTask->getContainerWindow();
+ if (!xWindow.is())
+ continue;
+
+ xWindow->setVisible(sal_True);
+ }
+ catch(const css::uno::RuntimeException& exRun)
+ { throw exRun; }
+ catch(const css::uno::Exception&)
+ { continue; }
+ }
+}
+
+} // namespace svx