1cdf0e10cSrcweir /************************************************************************* 2cdf0e10cSrcweir * 3cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4cdf0e10cSrcweir * 5cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6cdf0e10cSrcweir * 7cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8cdf0e10cSrcweir * 9cdf0e10cSrcweir * This file is part of OpenOffice.org. 10cdf0e10cSrcweir * 11cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14cdf0e10cSrcweir * 15cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20cdf0e10cSrcweir * 21cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25cdf0e10cSrcweir * 26cdf0e10cSrcweir ************************************************************************/ 27cdf0e10cSrcweir 28cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29cdf0e10cSrcweir #include "precompiled_desktop.hxx" 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include <cstdlib> 32cdf0e10cSrcweir #include <vector> 33cdf0e10cSrcweir 34cdf0e10cSrcweir #include <memory> 35cdf0e10cSrcweir #include <unistd.h> 36cdf0e10cSrcweir #include "app.hxx" 37cdf0e10cSrcweir #include "desktop.hrc" 38cdf0e10cSrcweir #include "appinit.hxx" 39cdf0e10cSrcweir #include "officeipcthread.hxx" 40cdf0e10cSrcweir #include "cmdlineargs.hxx" 41cdf0e10cSrcweir #include "desktopresid.hxx" 42cdf0e10cSrcweir #include "dispatchwatcher.hxx" 43cdf0e10cSrcweir #include "configinit.hxx" 44cdf0e10cSrcweir #include "lockfile.hxx" 45cdf0e10cSrcweir #include "checkinstall.hxx" 46cdf0e10cSrcweir #include "cmdlinehelp.hxx" 47cdf0e10cSrcweir #include "userinstall.hxx" 48cdf0e10cSrcweir #include "desktopcontext.hxx" 49cdf0e10cSrcweir #include "exithelper.hxx" 50cdf0e10cSrcweir #include "../migration/pages.hxx" 51cdf0e10cSrcweir 52cdf0e10cSrcweir #include <svtools/javacontext.hxx> 53cdf0e10cSrcweir #include <com/sun/star/frame/XSessionManagerListener.hpp> 54cdf0e10cSrcweir #include <com/sun/star/frame/XSynchronousDispatch.hpp> 55cdf0e10cSrcweir #include <com/sun/star/document/CorruptedFilterConfigurationException.hpp> 56cdf0e10cSrcweir #include <com/sun/star/configuration/CorruptedConfigurationException.hpp> 57cdf0e10cSrcweir #include <com/sun/star/frame/XStorable.hpp> 58cdf0e10cSrcweir #include <com/sun/star/util/XModifiable.hpp> 59cdf0e10cSrcweir #include <com/sun/star/util/XFlushable.hpp> 60cdf0e10cSrcweir #include <com/sun/star/system/XSystemShellExecute.hpp> 61cdf0e10cSrcweir #include <com/sun/star/system/SystemShellExecuteFlags.hpp> 62cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 63cdf0e10cSrcweir #include <com/sun/star/lang/XComponent.hpp> 64cdf0e10cSrcweir #include <com/sun/star/uno/RuntimeException.hpp> 65cdf0e10cSrcweir #include <com/sun/star/io/IOException.hpp> 66cdf0e10cSrcweir #include <com/sun/star/lang/IllegalArgumentException.hpp> 67cdf0e10cSrcweir #include <com/sun/star/lang/WrappedTargetException.hpp> 68cdf0e10cSrcweir #include <com/sun/star/frame/XDesktop.hpp> 69cdf0e10cSrcweir #include <com/sun/star/frame/XComponentLoader.hpp> 70cdf0e10cSrcweir #include <com/sun/star/view/XPrintable.hpp> 71cdf0e10cSrcweir #include <com/sun/star/lang/XInitialization.hpp> 72cdf0e10cSrcweir #include <com/sun/star/frame/XFramesSupplier.hpp> 73cdf0e10cSrcweir #include <com/sun/star/awt/XTopWindow.hpp> 74cdf0e10cSrcweir #include <com/sun/star/util/XURLTransformer.hpp> 75cdf0e10cSrcweir #include <com/sun/star/util/URL.hpp> 76cdf0e10cSrcweir #include <com/sun/star/util/XCloseable.hpp> 77cdf0e10cSrcweir #include <com/sun/star/frame/XDispatch.hpp> 78cdf0e10cSrcweir #include <com/sun/star/frame/XDispatchProvider.hpp> 79cdf0e10cSrcweir #include <com/sun/star/lang/ServiceNotRegisteredException.hpp> 80cdf0e10cSrcweir #include <com/sun/star/lang/XSingleServiceFactory.hpp> 81cdf0e10cSrcweir #include <com/sun/star/configuration/MissingBootstrapFileException.hpp> 82cdf0e10cSrcweir #include <com/sun/star/configuration/InvalidBootstrapFileException.hpp> 83cdf0e10cSrcweir #include <com/sun/star/configuration/InstallationIncompleteException.hpp> 84cdf0e10cSrcweir #include <com/sun/star/configuration/backend/BackendSetupException.hpp> 85cdf0e10cSrcweir #include <com/sun/star/configuration/backend/BackendAccessException.hpp> 86cdf0e10cSrcweir #include <com/sun/star/container/XEnumeration.hpp> 87cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp> 88cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp> 89cdf0e10cSrcweir #include <com/sun/star/task/XJobExecutor.hpp> 90cdf0e10cSrcweir #include <com/sun/star/task/XRestartManager.hpp> 91cdf0e10cSrcweir #ifndef _COM_SUN_STAR_TASK_XJOBEXECUTOR_HPP_ 92cdf0e10cSrcweir #include <com/sun/star/task/XJob.hpp> 93cdf0e10cSrcweir #endif 94cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 95cdf0e10cSrcweir #include <com/sun/star/beans/NamedValue.hpp> 96cdf0e10cSrcweir #include <com/sun/star/task/XJob.hpp> 97cdf0e10cSrcweir #include <com/sun/star/document/XEventListener.hpp> 98cdf0e10cSrcweir #include <com/sun/star/ui/XUIElementFactoryRegistration.hpp> 99cdf0e10cSrcweir #include <com/sun/star/frame/XUIControllerRegistration.hpp> 100cdf0e10cSrcweir 101cdf0e10cSrcweir #include <com/sun/star/java/XJavaVM.hpp> 102cdf0e10cSrcweir #include <tools/testtoolloader.hxx> 103cdf0e10cSrcweir #include <tools/solar.h> 104cdf0e10cSrcweir #ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_ 105cdf0e10cSrcweir #include <toolkit/unohlp.hxx> 106cdf0e10cSrcweir #endif 107cdf0e10cSrcweir #include <vos/security.hxx> 108cdf0e10cSrcweir #include <vos/ref.hxx> 109cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 110cdf0e10cSrcweir #include <comphelper/componentcontext.hxx> 111cdf0e10cSrcweir #include <comphelper/configurationhelper.hxx> 112cdf0e10cSrcweir #ifndef _UTL__HXX_ 113cdf0e10cSrcweir #include <unotools/configmgr.hxx> 114cdf0e10cSrcweir #endif 115cdf0e10cSrcweir #include <unotools/configitem.hxx> 116cdf0e10cSrcweir #include <unotools/confignode.hxx> 117cdf0e10cSrcweir #include <unotools/ucbhelper.hxx> 118cdf0e10cSrcweir #include <tools/tempfile.hxx> 119cdf0e10cSrcweir #include <tools/urlobj.hxx> 120cdf0e10cSrcweir #include <unotools/moduleoptions.hxx> 121cdf0e10cSrcweir #include <osl/module.h> 122cdf0e10cSrcweir #include <osl/file.hxx> 123cdf0e10cSrcweir #include <osl/signal.h> 124cdf0e10cSrcweir #include <osl/thread.hxx> 125cdf0e10cSrcweir #include <rtl/uuid.h> 126cdf0e10cSrcweir #include <rtl/uri.hxx> 127cdf0e10cSrcweir #include <unotools/pathoptions.hxx> 128cdf0e10cSrcweir #include <svl/languageoptions.hxx> 129cdf0e10cSrcweir #include <unotools/internaloptions.hxx> 130cdf0e10cSrcweir #include <svtools/miscopt.hxx> 131cdf0e10cSrcweir #include <svtools/menuoptions.hxx> 132cdf0e10cSrcweir #include <unotools/syslocaleoptions.hxx> 133cdf0e10cSrcweir #include <unotools/syslocale.hxx> 134cdf0e10cSrcweir #include <svl/folderrestriction.hxx> 135*2ad018beSPedro Giffuni #include <svl/eitem.hxx> 136*2ad018beSPedro Giffuni #include <svl/itemset.hxx> 137cdf0e10cSrcweir #include <unotools/tempfile.hxx> 138cdf0e10cSrcweir #include <rtl/logfile.hxx> 139cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 140cdf0e10cSrcweir #include <rtl/strbuf.hxx> 141cdf0e10cSrcweir #include <rtl/bootstrap.hxx> 142cdf0e10cSrcweir #include <rtl/instance.hxx> 143cdf0e10cSrcweir #include <unotools/configmgr.hxx> 144cdf0e10cSrcweir #include <vcl/help.hxx> 145cdf0e10cSrcweir #include <vcl/msgbox.hxx> 146cdf0e10cSrcweir #include <vcl/bitmap.hxx> 147cdf0e10cSrcweir #include <vcl/stdtext.hxx> 148cdf0e10cSrcweir #include <vcl/msgbox.hxx> 149cdf0e10cSrcweir #include <sfx2/sfx.hrc> 150*2ad018beSPedro Giffuni #include <sfx2/app.hxx> 151cdf0e10cSrcweir #include <ucbhelper/contentbroker.hxx> 152cdf0e10cSrcweir #include <unotools/bootstrap.hxx> 153cdf0e10cSrcweir #include <cppuhelper/bootstrap.hxx> 154cdf0e10cSrcweir 155cdf0e10cSrcweir #include "vos/process.hxx" 156cdf0e10cSrcweir 157cdf0e10cSrcweir #include <svtools/fontsubstconfig.hxx> 158cdf0e10cSrcweir #include <svtools/accessibilityoptions.hxx> 159cdf0e10cSrcweir #include <svtools/apearcfg.hxx> 160cdf0e10cSrcweir #include <unotools/misccfg.hxx> 161cdf0e10cSrcweir #include <svtools/filter.hxx> 162cdf0e10cSrcweir #include <unotools/regoptions.hxx> 163cdf0e10cSrcweir 164cdf0e10cSrcweir #include "langselect.hxx" 165cdf0e10cSrcweir 166cdf0e10cSrcweir #if defined MACOSX 167cdf0e10cSrcweir #include <errno.h> 168cdf0e10cSrcweir #include <sys/wait.h> 169cdf0e10cSrcweir #endif 170cdf0e10cSrcweir 171cdf0e10cSrcweir #define DEFINE_CONST_UNICODE(CONSTASCII) UniString(RTL_CONSTASCII_USTRINGPARAM(CONSTASCII)) 172cdf0e10cSrcweir #define U2S(STRING) ::rtl::OUStringToOString(STRING, RTL_TEXTENCODING_UTF8) 173cdf0e10cSrcweir 174cdf0e10cSrcweir using namespace vos; 175cdf0e10cSrcweir using namespace rtl; 176cdf0e10cSrcweir 177cdf0e10cSrcweir //Gives an ICE with MSVC6 178cdf0e10cSrcweir //namespace css = ::com::sun::star; 179cdf0e10cSrcweir 180cdf0e10cSrcweir using namespace ::com::sun::star::uno; 181cdf0e10cSrcweir using namespace ::com::sun::star::util; 182cdf0e10cSrcweir using namespace ::com::sun::star::lang; 183cdf0e10cSrcweir using namespace ::com::sun::star::beans; 184cdf0e10cSrcweir //using namespace ::com::sun::star::bridge; 185cdf0e10cSrcweir using namespace ::com::sun::star::frame; 186cdf0e10cSrcweir using namespace ::com::sun::star::document; 187cdf0e10cSrcweir using namespace ::com::sun::star::view; 188cdf0e10cSrcweir using namespace ::com::sun::star::task; 189cdf0e10cSrcweir using namespace ::com::sun::star::system; 190cdf0e10cSrcweir using namespace ::com::sun::star::ui::dialogs; 191cdf0e10cSrcweir using namespace ::com::sun::star::container; 192cdf0e10cSrcweir 193cdf0e10cSrcweir namespace css = ::com::sun::star; 194cdf0e10cSrcweir 195cdf0e10cSrcweir ResMgr* desktop::Desktop::pResMgr = 0; 196cdf0e10cSrcweir 197cdf0e10cSrcweir namespace desktop 198cdf0e10cSrcweir { 199cdf0e10cSrcweir 200cdf0e10cSrcweir static SalMainPipeExchangeSignalHandler* pSignalHandler = 0; 201cdf0e10cSrcweir static sal_Bool _bCrashReporterEnabled = sal_True; 202cdf0e10cSrcweir 203cdf0e10cSrcweir static const ::rtl::OUString CFG_PACKAGE_COMMON_HELP ( RTL_CONSTASCII_USTRINGPARAM( "org.openoffice.Office.Common/Help")); 204cdf0e10cSrcweir static const ::rtl::OUString CFG_PATH_REG ( RTL_CONSTASCII_USTRINGPARAM( "Registration" )); 205cdf0e10cSrcweir static const ::rtl::OUString CFG_ENTRY_REGURL ( RTL_CONSTASCII_USTRINGPARAM( "URL" )); 206cdf0e10cSrcweir static const ::rtl::OUString CFG_ENTRY_TEMPLATEREGURL ( RTL_CONSTASCII_USTRINGPARAM( "TemplateURL" )); 207cdf0e10cSrcweir 208cdf0e10cSrcweir static ::rtl::OUString getBrandSharePreregBundledPathURL(); 209cdf0e10cSrcweir // ---------------------------------------------------------------------------- 210cdf0e10cSrcweir 211cdf0e10cSrcweir ResMgr* Desktop::GetDesktopResManager() 212cdf0e10cSrcweir { 213cdf0e10cSrcweir if ( !Desktop::pResMgr ) 214cdf0e10cSrcweir { 215cdf0e10cSrcweir String aMgrName = String::CreateFromAscii( "dkt" ); 216cdf0e10cSrcweir 217cdf0e10cSrcweir // Create desktop resource manager and bootstrap process 218cdf0e10cSrcweir // was successful. Use default way to get language specific message. 219cdf0e10cSrcweir if ( Application::IsInExecute() ) 220cdf0e10cSrcweir Desktop::pResMgr = ResMgr::CreateResMgr( U2S( aMgrName )); 221cdf0e10cSrcweir 222cdf0e10cSrcweir if ( !Desktop::pResMgr ) 223cdf0e10cSrcweir { 224cdf0e10cSrcweir // Use VCL to get the correct language specific message as we 225cdf0e10cSrcweir // are in the bootstrap process and not able to get the installed 226cdf0e10cSrcweir // language!! 227cdf0e10cSrcweir /* 228cdf0e10cSrcweir LanguageType aLanguageType = LANGUAGE_DONTKNOW; 229cdf0e10cSrcweir 230cdf0e10cSrcweir Desktop::pResMgr = ResMgr::SearchCreateResMgr( U2S( aMgrName ), aLanguageType ); 231cdf0e10cSrcweir AllSettings as = GetSettings(); 232cdf0e10cSrcweir as.SetUILanguage(aLanguageType); 233cdf0e10cSrcweir SetSettings(as); 234cdf0e10cSrcweir */ 235cdf0e10cSrcweir // LanguageSelection langselect; 236cdf0e10cSrcweir OUString aUILocaleString = LanguageSelection::getLanguageString(); 237cdf0e10cSrcweir sal_Int32 nIndex = 0; 238cdf0e10cSrcweir OUString aLanguage = aUILocaleString.getToken( 0, '-', nIndex); 239cdf0e10cSrcweir OUString aCountry = aUILocaleString.getToken( 0, '-', nIndex); 240cdf0e10cSrcweir OUString aVariant = aUILocaleString.getToken( 0, '-', nIndex); 241cdf0e10cSrcweir 242cdf0e10cSrcweir ::com::sun::star::lang::Locale aLocale( aLanguage, aCountry, aVariant ); 243cdf0e10cSrcweir 244cdf0e10cSrcweir Desktop::pResMgr = ResMgr::SearchCreateResMgr( U2S( aMgrName ), aLocale); 245cdf0e10cSrcweir AllSettings as = GetSettings(); 246cdf0e10cSrcweir as.SetUILocale(aLocale); 247cdf0e10cSrcweir SetSettings(as); 248cdf0e10cSrcweir } 249cdf0e10cSrcweir } 250cdf0e10cSrcweir 251cdf0e10cSrcweir return Desktop::pResMgr; 252cdf0e10cSrcweir } 253cdf0e10cSrcweir 254cdf0e10cSrcweir // ---------------------------------------------------------------------------- 255cdf0e10cSrcweir // Get a message string securely. There is a fallback string if the resource 256cdf0e10cSrcweir // is not available. 257cdf0e10cSrcweir 258cdf0e10cSrcweir OUString Desktop::GetMsgString( sal_uInt16 nId, const OUString& aFaultBackMsg ) 259cdf0e10cSrcweir { 260cdf0e10cSrcweir ResMgr* resMgr = GetDesktopResManager(); 261cdf0e10cSrcweir if ( !resMgr ) 262cdf0e10cSrcweir return aFaultBackMsg; 263cdf0e10cSrcweir else 264cdf0e10cSrcweir return OUString( String( ResId( nId, *resMgr ))); 265cdf0e10cSrcweir } 266cdf0e10cSrcweir 267cdf0e10cSrcweir OUString MakeStartupErrorMessage(OUString const & aErrorMessage) 268cdf0e10cSrcweir { 269cdf0e10cSrcweir OUStringBuffer aDiagnosticMessage( 100 ); 270cdf0e10cSrcweir 271cdf0e10cSrcweir ResMgr* pResMgr = Desktop::GetDesktopResManager(); 272cdf0e10cSrcweir if ( pResMgr ) 273cdf0e10cSrcweir aDiagnosticMessage.append( OUString(String(ResId(STR_BOOTSTRAP_ERR_CANNOT_START, *pResMgr))) ); 274cdf0e10cSrcweir else 275cdf0e10cSrcweir aDiagnosticMessage.appendAscii( "The program cannot be started." ); 276cdf0e10cSrcweir 277cdf0e10cSrcweir aDiagnosticMessage.appendAscii( "\n" ); 278cdf0e10cSrcweir 279cdf0e10cSrcweir aDiagnosticMessage.append( aErrorMessage ); 280cdf0e10cSrcweir 281cdf0e10cSrcweir return aDiagnosticMessage.makeStringAndClear(); 282cdf0e10cSrcweir } 283cdf0e10cSrcweir 284cdf0e10cSrcweir OUString MakeStartupConfigAccessErrorMessage( OUString const & aInternalErrMsg ) 285cdf0e10cSrcweir { 286cdf0e10cSrcweir OUStringBuffer aDiagnosticMessage( 200 ); 287cdf0e10cSrcweir 288cdf0e10cSrcweir ResMgr* pResMgr = Desktop::GetDesktopResManager(); 289cdf0e10cSrcweir if ( pResMgr ) 290cdf0e10cSrcweir aDiagnosticMessage.append( OUString(String(ResId(STR_BOOTSTRAP_ERR_CFG_DATAACCESS, *pResMgr ))) ); 291cdf0e10cSrcweir else 292cdf0e10cSrcweir aDiagnosticMessage.appendAscii( "The program cannot be started." ); 293cdf0e10cSrcweir 294cdf0e10cSrcweir if ( aInternalErrMsg.getLength() > 0 ) 295cdf0e10cSrcweir { 296cdf0e10cSrcweir aDiagnosticMessage.appendAscii( "\n\n" ); 297cdf0e10cSrcweir if ( pResMgr ) 298cdf0e10cSrcweir aDiagnosticMessage.append( OUString(String(ResId(STR_INTERNAL_ERRMSG, *pResMgr ))) ); 299cdf0e10cSrcweir else 300cdf0e10cSrcweir aDiagnosticMessage.appendAscii( "The following internal error has occured:\n\n" ); 301cdf0e10cSrcweir aDiagnosticMessage.append( aInternalErrMsg ); 302cdf0e10cSrcweir } 303cdf0e10cSrcweir 304cdf0e10cSrcweir return aDiagnosticMessage.makeStringAndClear(); 305cdf0e10cSrcweir } 306cdf0e10cSrcweir 307cdf0e10cSrcweir //============================================================================= 308cdf0e10cSrcweir // shows a simple error box with the given message ... but exits from these process ! 309cdf0e10cSrcweir // 310cdf0e10cSrcweir // Fatal errors cant be solved by the process ... nor any recovery can help. 311cdf0e10cSrcweir // Mostly the installation was damaged and must be repaired manually .. or by calling 312cdf0e10cSrcweir // setup again. 313cdf0e10cSrcweir // 314cdf0e10cSrcweir // On the other side we must make sure that no further actions will be possible within 315cdf0e10cSrcweir // the current office process ! No pipe requests, no menu/toolbar/shortuct actions 316cdf0e10cSrcweir // are allowed. Otherwise we will force a "crash inside a crash". 317cdf0e10cSrcweir // 318cdf0e10cSrcweir // Thats why we have to use a special native message box here which does not use yield :-) 319cdf0e10cSrcweir //============================================================================= 320cdf0e10cSrcweir void FatalError(const ::rtl::OUString& sMessage) 321cdf0e10cSrcweir { 322cdf0e10cSrcweir ::rtl::OUString sProductKey = ::utl::Bootstrap::getProductKey(); 323cdf0e10cSrcweir if ( ! sProductKey.getLength()) 324cdf0e10cSrcweir { 325cdf0e10cSrcweir ::vos::OStartupInfo aInfo; 326cdf0e10cSrcweir aInfo.getExecutableFile( sProductKey ); 327cdf0e10cSrcweir 328cdf0e10cSrcweir ::sal_uInt32 nLastIndex = sProductKey.lastIndexOf('/'); 329cdf0e10cSrcweir if ( nLastIndex > 0 ) 330cdf0e10cSrcweir sProductKey = sProductKey.copy( nLastIndex+1 ); 331cdf0e10cSrcweir } 332cdf0e10cSrcweir 333cdf0e10cSrcweir ::rtl::OUStringBuffer sTitle (128); 334cdf0e10cSrcweir sTitle.append (sProductKey ); 335cdf0e10cSrcweir sTitle.appendAscii (" - Fatal Error"); 336cdf0e10cSrcweir 337cdf0e10cSrcweir Application::ShowNativeErrorBox (sTitle.makeStringAndClear (), sMessage); 338cdf0e10cSrcweir _exit(ExitHelper::E_FATAL_ERROR); 339cdf0e10cSrcweir } 340cdf0e10cSrcweir 341cdf0e10cSrcweir static bool ShouldSuppressUI(CommandLineArgs* pCmdLine) 342cdf0e10cSrcweir { 343cdf0e10cSrcweir return pCmdLine->IsInvisible() || 344cdf0e10cSrcweir pCmdLine->IsHeadless() || 345cdf0e10cSrcweir pCmdLine->IsQuickstart(); 346cdf0e10cSrcweir } 347cdf0e10cSrcweir 348cdf0e10cSrcweir CommandLineArgs* Desktop::GetCommandLineArgs() 349cdf0e10cSrcweir { 350cdf0e10cSrcweir static CommandLineArgs* pArgs = 0; 351cdf0e10cSrcweir if ( !pArgs ) 352cdf0e10cSrcweir { 353cdf0e10cSrcweir ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); 354cdf0e10cSrcweir if ( !pArgs ) 355cdf0e10cSrcweir pArgs = new CommandLineArgs; 356cdf0e10cSrcweir } 357cdf0e10cSrcweir 358cdf0e10cSrcweir return pArgs; 359cdf0e10cSrcweir } 360cdf0e10cSrcweir 361cdf0e10cSrcweir sal_Bool InitConfiguration() 362cdf0e10cSrcweir { 363cdf0e10cSrcweir RTL_LOGFILE_CONTEXT( aLog, "desktop (jb99855) ::InitConfiguration" ); 364cdf0e10cSrcweir 365cdf0e10cSrcweir Reference< XMultiServiceFactory > xProvider( CreateApplicationConfigurationProvider( ) ); 366cdf0e10cSrcweir return xProvider.is(); 367cdf0e10cSrcweir } 368cdf0e10cSrcweir 369cdf0e10cSrcweir namespace 370cdf0e10cSrcweir { 371cdf0e10cSrcweir struct BrandName 372cdf0e10cSrcweir : public rtl::Static< String, BrandName > {}; 373cdf0e10cSrcweir struct Version 374cdf0e10cSrcweir : public rtl::Static< String, Version > {}; 375cdf0e10cSrcweir struct AboutBoxVersion 376cdf0e10cSrcweir : public rtl::Static< String, AboutBoxVersion > {}; 377cdf0e10cSrcweir struct OOOVendor 378cdf0e10cSrcweir : public rtl::Static< String, OOOVendor > {}; 379cdf0e10cSrcweir struct Extension 380cdf0e10cSrcweir : public rtl::Static< String, Extension > {}; 381cdf0e10cSrcweir struct XMLFileFormatName 382cdf0e10cSrcweir : public rtl::Static< String, XMLFileFormatName > {}; 383cdf0e10cSrcweir struct XMLFileFormatVersion 384cdf0e10cSrcweir : public rtl::Static< String, XMLFileFormatVersion > {}; 385cdf0e10cSrcweir struct WriterCompatibilityVersionOOo11 386cdf0e10cSrcweir : public rtl::Static< String, WriterCompatibilityVersionOOo11 > {}; 387cdf0e10cSrcweir } 388cdf0e10cSrcweir 389cdf0e10cSrcweir void ReplaceStringHookProc( UniString& rStr ) 390cdf0e10cSrcweir { 391cdf0e10cSrcweir static int nAll = 0, nPro = 0; 392cdf0e10cSrcweir 393cdf0e10cSrcweir nAll++; 394cdf0e10cSrcweir if ( rStr.SearchAscii( "%PRODUCT" ) != STRING_NOTFOUND ) 395cdf0e10cSrcweir { 396cdf0e10cSrcweir String &rBrandName = BrandName::get(); 397cdf0e10cSrcweir String &rVersion = Version::get(); 398cdf0e10cSrcweir String &rAboutBoxVersion = AboutBoxVersion::get(); 399cdf0e10cSrcweir String &rExtension = Extension::get(); 400cdf0e10cSrcweir String &rXMLFileFormatName = XMLFileFormatName::get(); 401cdf0e10cSrcweir String &rXMLFileFormatVersion = XMLFileFormatVersion::get(); 402cdf0e10cSrcweir 403cdf0e10cSrcweir if ( !rBrandName.Len() ) 404cdf0e10cSrcweir { 405cdf0e10cSrcweir rtl::OUString aTmp; 406cdf0e10cSrcweir Any aRet = ::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::PRODUCTNAME ); 407cdf0e10cSrcweir aRet >>= aTmp; 408cdf0e10cSrcweir rBrandName = aTmp; 409cdf0e10cSrcweir 410cdf0e10cSrcweir aRet = ::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::PRODUCTXMLFILEFORMATNAME ); 411cdf0e10cSrcweir aRet >>= aTmp; 412cdf0e10cSrcweir rXMLFileFormatName = aTmp; 413cdf0e10cSrcweir 414cdf0e10cSrcweir aRet = ::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::PRODUCTXMLFILEFORMATVERSION ); 415cdf0e10cSrcweir aRet >>= aTmp; 416cdf0e10cSrcweir rXMLFileFormatVersion = aTmp; 417cdf0e10cSrcweir 418cdf0e10cSrcweir aRet = ::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::PRODUCTVERSION ); 419cdf0e10cSrcweir aRet >>= aTmp; 420cdf0e10cSrcweir rVersion = aTmp; 421cdf0e10cSrcweir 422cdf0e10cSrcweir aRet = ::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::ABOUTBOXPRODUCTVERSION ); 423cdf0e10cSrcweir aRet >>= aTmp; 424cdf0e10cSrcweir rAboutBoxVersion = aTmp; 425cdf0e10cSrcweir 426cdf0e10cSrcweir if ( !rExtension.Len() ) 427cdf0e10cSrcweir { 428cdf0e10cSrcweir aRet = ::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::PRODUCTEXTENSION ); 429cdf0e10cSrcweir aRet >>= aTmp; 430cdf0e10cSrcweir rExtension = aTmp; 431cdf0e10cSrcweir } 432cdf0e10cSrcweir } 433cdf0e10cSrcweir 434cdf0e10cSrcweir nPro++; 435cdf0e10cSrcweir rStr.SearchAndReplaceAllAscii( "%PRODUCTNAME", rBrandName ); 436cdf0e10cSrcweir rStr.SearchAndReplaceAllAscii( "%PRODUCTVERSION", rVersion ); 437cdf0e10cSrcweir rStr.SearchAndReplaceAllAscii( "%ABOUTBOXPRODUCTVERSION", rAboutBoxVersion ); 438cdf0e10cSrcweir rStr.SearchAndReplaceAllAscii( "%PRODUCTEXTENSION", rExtension ); 439cdf0e10cSrcweir rStr.SearchAndReplaceAllAscii( "%PRODUCTXMLFILEFORMATNAME", rXMLFileFormatName ); 440cdf0e10cSrcweir rStr.SearchAndReplaceAllAscii( "%PRODUCTXMLFILEFORMATVERSION", rXMLFileFormatVersion ); 441cdf0e10cSrcweir } 442cdf0e10cSrcweir if ( rStr.SearchAscii( "%OOOVENDOR" ) != STRING_NOTFOUND ) 443cdf0e10cSrcweir { 444cdf0e10cSrcweir String &rOOOVendor = OOOVendor::get(); 445cdf0e10cSrcweir 446cdf0e10cSrcweir if ( !rOOOVendor.Len() ) 447cdf0e10cSrcweir { 448cdf0e10cSrcweir rtl::OUString aTmp; 449cdf0e10cSrcweir Any aRet = ::utl::ConfigManager::GetDirectConfigProperty( 450cdf0e10cSrcweir ::utl::ConfigManager::OOOVENDOR ); 451cdf0e10cSrcweir aRet >>= aTmp; 452cdf0e10cSrcweir rOOOVendor = aTmp; 453cdf0e10cSrcweir 454cdf0e10cSrcweir } 455cdf0e10cSrcweir rStr.SearchAndReplaceAllAscii( "%OOOVENDOR" ,rOOOVendor ); 456cdf0e10cSrcweir } 457cdf0e10cSrcweir 458cdf0e10cSrcweir if ( rStr.SearchAscii( "%WRITERCOMPATIBILITYVERSIONOOO11" ) != STRING_NOTFOUND ) 459cdf0e10cSrcweir { 460cdf0e10cSrcweir String &rWriterCompatibilityVersionOOo11 = WriterCompatibilityVersionOOo11::get(); 461cdf0e10cSrcweir if ( !rWriterCompatibilityVersionOOo11.Len() ) 462cdf0e10cSrcweir { 463cdf0e10cSrcweir rtl::OUString aTmp; 464cdf0e10cSrcweir Any aRet = ::utl::ConfigManager::GetDirectConfigProperty( 465cdf0e10cSrcweir ::utl::ConfigManager::WRITERCOMPATIBILITYVERSIONOOO11 ); 466cdf0e10cSrcweir aRet >>= aTmp; 467cdf0e10cSrcweir rWriterCompatibilityVersionOOo11 = aTmp; 468cdf0e10cSrcweir } 469cdf0e10cSrcweir 470cdf0e10cSrcweir rStr.SearchAndReplaceAllAscii( "%WRITERCOMPATIBILITYVERSIONOOO11", 471cdf0e10cSrcweir rWriterCompatibilityVersionOOo11 ); 472cdf0e10cSrcweir } 473cdf0e10cSrcweir } 474cdf0e10cSrcweir 475cdf0e10cSrcweir static const char pLastSyncFileName[] = "lastsynchronized"; 476cdf0e10cSrcweir static const sal_Int32 nStrLenLastSync = 16; 477cdf0e10cSrcweir 478cdf0e10cSrcweir static bool needsSynchronization( 479cdf0e10cSrcweir ::rtl::OUString const & baseSynchronizedURL, ::rtl::OUString const & userSynchronizedURL ) 480cdf0e10cSrcweir { 481cdf0e10cSrcweir bool bNeedsSync( false ); 482cdf0e10cSrcweir 483cdf0e10cSrcweir ::osl::DirectoryItem itemUserFile; 484cdf0e10cSrcweir ::osl::File::RC err1 = 485cdf0e10cSrcweir ::osl::DirectoryItem::get(userSynchronizedURL, itemUserFile); 486cdf0e10cSrcweir 487cdf0e10cSrcweir //If it does not exist, then there is nothing to be done 488cdf0e10cSrcweir if (err1 == ::osl::File::E_NOENT) 489cdf0e10cSrcweir { 490cdf0e10cSrcweir return true; 491cdf0e10cSrcweir } 492cdf0e10cSrcweir else if (err1 != ::osl::File::E_None) 493cdf0e10cSrcweir { 494cdf0e10cSrcweir OSL_ENSURE(0, "Cannot access lastsynchronized in user layer"); 495cdf0e10cSrcweir return true; //sync just in case 496cdf0e10cSrcweir } 497cdf0e10cSrcweir 498cdf0e10cSrcweir //If last synchronized does not exist in base layer, then do nothing 499cdf0e10cSrcweir ::osl::DirectoryItem itemBaseFile; 500cdf0e10cSrcweir ::osl::File::RC err2 = ::osl::DirectoryItem::get(baseSynchronizedURL, itemBaseFile); 501cdf0e10cSrcweir if (err2 == ::osl::File::E_NOENT) 502cdf0e10cSrcweir { 503cdf0e10cSrcweir return true; 504cdf0e10cSrcweir 505cdf0e10cSrcweir } 506cdf0e10cSrcweir else if (err2 != ::osl::File::E_None) 507cdf0e10cSrcweir { 508cdf0e10cSrcweir OSL_ENSURE(0, "Cannot access file lastsynchronized in base layer"); 509cdf0e10cSrcweir return true; //sync just in case 510cdf0e10cSrcweir } 511cdf0e10cSrcweir 512cdf0e10cSrcweir //compare the modification time of the extension folder and the last 513cdf0e10cSrcweir //modified file 514cdf0e10cSrcweir ::osl::FileStatus statUser(FileStatusMask_ModifyTime); 515cdf0e10cSrcweir ::osl::FileStatus statBase(FileStatusMask_ModifyTime); 516cdf0e10cSrcweir if (itemUserFile.getFileStatus(statUser) == ::osl::File::E_None) 517cdf0e10cSrcweir { 518cdf0e10cSrcweir if (itemBaseFile.getFileStatus(statBase) == ::osl::File::E_None) 519cdf0e10cSrcweir { 520cdf0e10cSrcweir TimeValue timeUser = statUser.getModifyTime(); 521cdf0e10cSrcweir TimeValue timeBase = statBase.getModifyTime(); 522cdf0e10cSrcweir 523cdf0e10cSrcweir if (timeUser.Seconds < timeBase.Seconds) 524cdf0e10cSrcweir bNeedsSync = true; 525cdf0e10cSrcweir } 526cdf0e10cSrcweir else 527cdf0e10cSrcweir { 528cdf0e10cSrcweir OSL_ASSERT(0); 529cdf0e10cSrcweir bNeedsSync = true; 530cdf0e10cSrcweir } 531cdf0e10cSrcweir } 532cdf0e10cSrcweir else 533cdf0e10cSrcweir { 534cdf0e10cSrcweir OSL_ASSERT(0); 535cdf0e10cSrcweir bNeedsSync = true; 536cdf0e10cSrcweir } 537cdf0e10cSrcweir 538cdf0e10cSrcweir return bNeedsSync; 539cdf0e10cSrcweir } 540cdf0e10cSrcweir 541cdf0e10cSrcweir static ::rtl::OUString getBrandSharePreregBundledPathURL() 542cdf0e10cSrcweir { 543cdf0e10cSrcweir ::rtl::OUString url( 544cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM("$BRAND_BASE_DIR/share/prereg/bundled")); 545cdf0e10cSrcweir 546cdf0e10cSrcweir ::rtl::Bootstrap::expandMacros(url); 547cdf0e10cSrcweir return url; 548cdf0e10cSrcweir } 549cdf0e10cSrcweir 550cdf0e10cSrcweir static ::rtl::OUString getUserBundledExtPathURL() 551cdf0e10cSrcweir { 552cdf0e10cSrcweir ::rtl::OUString folder( RTL_CONSTASCII_USTRINGPARAM( "$BUNDLED_EXTENSIONS_USER" )); 553cdf0e10cSrcweir ::rtl::Bootstrap::expandMacros(folder); 554cdf0e10cSrcweir 555cdf0e10cSrcweir return folder; 556cdf0e10cSrcweir } 557cdf0e10cSrcweir 558cdf0e10cSrcweir static ::rtl::OUString getLastSyncFileURLFromBrandInstallation() 559cdf0e10cSrcweir { 560cdf0e10cSrcweir ::rtl::OUString aURL = getBrandSharePreregBundledPathURL(); 561cdf0e10cSrcweir ::sal_Int32 nLastIndex = aURL.lastIndexOf('/'); 562cdf0e10cSrcweir 563cdf0e10cSrcweir ::rtl::OUStringBuffer aTmp( aURL ); 564cdf0e10cSrcweir 565cdf0e10cSrcweir if ( nLastIndex != aURL.getLength()-1 ) 566cdf0e10cSrcweir aTmp.appendAscii( "/" ); 567cdf0e10cSrcweir aTmp.appendAscii( pLastSyncFileName ); 568cdf0e10cSrcweir 569cdf0e10cSrcweir return aTmp.makeStringAndClear(); 570cdf0e10cSrcweir } 571cdf0e10cSrcweir 572cdf0e10cSrcweir static ::rtl::OUString getLastSyncFileURLFromUserInstallation() 573cdf0e10cSrcweir { 574cdf0e10cSrcweir ::rtl::OUString aUserBundledPathURL = getUserBundledExtPathURL(); 575cdf0e10cSrcweir ::sal_Int32 nLastIndex = aUserBundledPathURL.lastIndexOf('/'); 576cdf0e10cSrcweir 577cdf0e10cSrcweir ::rtl::OUStringBuffer aTmp( aUserBundledPathURL ); 578cdf0e10cSrcweir 579cdf0e10cSrcweir if ( nLastIndex != aUserBundledPathURL.getLength()-1 ) 580cdf0e10cSrcweir aTmp.appendAscii( "/" ); 581cdf0e10cSrcweir aTmp.appendAscii( pLastSyncFileName ); 582cdf0e10cSrcweir 583cdf0e10cSrcweir return aTmp.makeStringAndClear(); 584cdf0e10cSrcweir } 585cdf0e10cSrcweir //Checks if the argument src is the folder of the help or configuration 586cdf0e10cSrcweir //backend in the prereg folder 587cdf0e10cSrcweir static bool excludeTmpFilesAndFolders(const rtl::OUString & src) 588cdf0e10cSrcweir { 589cdf0e10cSrcweir const char helpBackend[] = "com.sun.star.comp.deployment.help.PackageRegistryBackend"; 590cdf0e10cSrcweir const char configBackend[] = "com.sun.star.comp.deployment.configuration.PackageRegistryBackend"; 591cdf0e10cSrcweir if (src.endsWithAsciiL(helpBackend, sizeof(helpBackend) - 1 ) 592cdf0e10cSrcweir || src.endsWithAsciiL(configBackend, sizeof(configBackend) - 1)) 593cdf0e10cSrcweir { 594cdf0e10cSrcweir return true; 595cdf0e10cSrcweir } 596cdf0e10cSrcweir return false; 597cdf0e10cSrcweir } 598cdf0e10cSrcweir 599cdf0e10cSrcweir //If we are about to copy the contents of some special folder as determined 600cdf0e10cSrcweir //by excludeTmpFilesAndFolders, then we omit those files or folders with a name 601cdf0e10cSrcweir //derived from temporary folders. 602cdf0e10cSrcweir static bool isExcludedFileOrFolder( const rtl::OUString & name) 603cdf0e10cSrcweir { 604cdf0e10cSrcweir char const * allowed[] = { 605cdf0e10cSrcweir "backenddb.xml", 606cdf0e10cSrcweir "configmgr.ini", 607cdf0e10cSrcweir "registered_packages.db" 608cdf0e10cSrcweir }; 609cdf0e10cSrcweir 610cdf0e10cSrcweir const unsigned int size = sizeof(allowed) / sizeof (char const *); 611cdf0e10cSrcweir bool bExclude = true; 612cdf0e10cSrcweir for (unsigned int i= 0; i < size; i ++) 613cdf0e10cSrcweir { 614cdf0e10cSrcweir ::rtl::OUString allowedName = ::rtl::OUString::createFromAscii(allowed[i]); 615cdf0e10cSrcweir if (allowedName.equals(name)) 616cdf0e10cSrcweir { 617cdf0e10cSrcweir bExclude = false; 618cdf0e10cSrcweir break; 619cdf0e10cSrcweir } 620cdf0e10cSrcweir } 621cdf0e10cSrcweir return bExclude; 622cdf0e10cSrcweir } 623cdf0e10cSrcweir 624cdf0e10cSrcweir static osl::FileBase::RC copy_bundled_recursive( 625cdf0e10cSrcweir const rtl::OUString& srcUnqPath, 626cdf0e10cSrcweir const rtl::OUString& dstUnqPath, 627cdf0e10cSrcweir sal_Int32 TypeToCopy ) 628cdf0e10cSrcweir throw() 629cdf0e10cSrcweir { 630cdf0e10cSrcweir osl::FileBase::RC err = osl::FileBase::E_None; 631cdf0e10cSrcweir 632cdf0e10cSrcweir if( TypeToCopy == -1 ) // Document 633cdf0e10cSrcweir { 634cdf0e10cSrcweir err = osl::File::copy( srcUnqPath,dstUnqPath ); 635cdf0e10cSrcweir } 636cdf0e10cSrcweir else if( TypeToCopy == +1 ) // Folder 637cdf0e10cSrcweir { 638cdf0e10cSrcweir osl::Directory aDir( srcUnqPath ); 639cdf0e10cSrcweir err = aDir.open(); 640cdf0e10cSrcweir if ( err != osl::FileBase::E_None ) 641cdf0e10cSrcweir return err; 642cdf0e10cSrcweir 643cdf0e10cSrcweir err = osl::Directory::create( dstUnqPath ); 644cdf0e10cSrcweir osl::FileBase::RC next = err; 645cdf0e10cSrcweir if( err == osl::FileBase::E_None || 646cdf0e10cSrcweir err == osl::FileBase::E_EXIST ) 647cdf0e10cSrcweir { 648cdf0e10cSrcweir err = osl::FileBase::E_None; 649cdf0e10cSrcweir sal_Int32 n_Mask = FileStatusMask_FileURL | FileStatusMask_FileName | FileStatusMask_Type; 650cdf0e10cSrcweir 651cdf0e10cSrcweir osl::DirectoryItem aDirItem; 652cdf0e10cSrcweir bool bExcludeFiles = excludeTmpFilesAndFolders(srcUnqPath); 653cdf0e10cSrcweir 654cdf0e10cSrcweir while( err == osl::FileBase::E_None && ( next = aDir.getNextItem( aDirItem ) ) == osl::FileBase::E_None ) 655cdf0e10cSrcweir { 656cdf0e10cSrcweir sal_Bool IsDoc = false; 657cdf0e10cSrcweir sal_Bool bFilter = false; 658cdf0e10cSrcweir osl::FileStatus aFileStatus( n_Mask ); 659cdf0e10cSrcweir aDirItem.getFileStatus( aFileStatus ); 660cdf0e10cSrcweir if( aFileStatus.isValid( FileStatusMask_Type ) ) 661cdf0e10cSrcweir IsDoc = aFileStatus.getFileType() == osl::FileStatus::Regular; 662cdf0e10cSrcweir 663cdf0e10cSrcweir // Getting the information for the next recursive copy 664cdf0e10cSrcweir sal_Int32 newTypeToCopy = IsDoc ? -1 : +1; 665cdf0e10cSrcweir 666cdf0e10cSrcweir rtl::OUString newSrcUnqPath; 667cdf0e10cSrcweir if( aFileStatus.isValid( FileStatusMask_FileURL ) ) 668cdf0e10cSrcweir newSrcUnqPath = aFileStatus.getFileURL(); 669cdf0e10cSrcweir 670cdf0e10cSrcweir rtl::OUString newDstUnqPath = dstUnqPath; 671cdf0e10cSrcweir rtl::OUString tit; 672cdf0e10cSrcweir if( aFileStatus.isValid( FileStatusMask_FileName ) ) 673cdf0e10cSrcweir { 674cdf0e10cSrcweir ::rtl::OUString aFileName = aFileStatus.getFileName(); 675cdf0e10cSrcweir tit = rtl::Uri::encode( aFileName, 676cdf0e10cSrcweir rtl_UriCharClassPchar, 677cdf0e10cSrcweir rtl_UriEncodeIgnoreEscapes, 678cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ); 679cdf0e10cSrcweir 680cdf0e10cSrcweir // Special treatment for "lastsychronized" file. Must not be 681cdf0e10cSrcweir // copied from the bundled folder! 682cdf0e10cSrcweir //Also do not copy *.tmp files and *.tmp_ folders. This affects the files/folders 683cdf0e10cSrcweir //from the help and configuration backend 684cdf0e10cSrcweir if ( IsDoc && (aFileName.equalsAscii( pLastSyncFileName ) 685cdf0e10cSrcweir || bExcludeFiles && isExcludedFileOrFolder(aFileName))) 686cdf0e10cSrcweir bFilter = true; 687cdf0e10cSrcweir else if (!IsDoc && bExcludeFiles && isExcludedFileOrFolder(aFileName)) 688cdf0e10cSrcweir bFilter = true; 689cdf0e10cSrcweir } 690cdf0e10cSrcweir 691cdf0e10cSrcweir if( newDstUnqPath.lastIndexOf( sal_Unicode('/') ) != newDstUnqPath.getLength()-1 ) 692cdf0e10cSrcweir newDstUnqPath += rtl::OUString::createFromAscii( "/" ); 693cdf0e10cSrcweir 694cdf0e10cSrcweir newDstUnqPath += tit; 695cdf0e10cSrcweir 696cdf0e10cSrcweir if (( newSrcUnqPath != dstUnqPath ) && !bFilter ) 697cdf0e10cSrcweir err = copy_bundled_recursive( newSrcUnqPath,newDstUnqPath, newTypeToCopy ); 698cdf0e10cSrcweir } 699cdf0e10cSrcweir 700cdf0e10cSrcweir if( err == osl::FileBase::E_None && next != osl::FileBase::E_NOENT ) 701cdf0e10cSrcweir err = next; 702cdf0e10cSrcweir } 703cdf0e10cSrcweir aDir.close(); 704cdf0e10cSrcweir } 705cdf0e10cSrcweir 706cdf0e10cSrcweir return err; 707cdf0e10cSrcweir } 708cdf0e10cSrcweir 709cdf0e10cSrcweir Desktop::Desktop() 710cdf0e10cSrcweir : m_bServicesRegistered( false ) 711cdf0e10cSrcweir , m_aBootstrapError( BE_OK ) 712cdf0e10cSrcweir , m_pLockfile( NULL ) 713cdf0e10cSrcweir { 714cdf0e10cSrcweir RTL_LOGFILE_TRACE( "desktop (cd100003) ::Desktop::Desktop" ); 715cdf0e10cSrcweir } 716cdf0e10cSrcweir 717cdf0e10cSrcweir Desktop::~Desktop() 718cdf0e10cSrcweir { 719cdf0e10cSrcweir } 720cdf0e10cSrcweir 721cdf0e10cSrcweir void Desktop::Init() 722cdf0e10cSrcweir { 723cdf0e10cSrcweir RTL_LOGFILE_CONTEXT( aLog, "desktop (cd100003) ::Desktop::Init" ); 724cdf0e10cSrcweir SetBootstrapStatus(BS_OK); 725cdf0e10cSrcweir 726cdf0e10cSrcweir // Check for lastsynchronized file for bundled extensions in the user directory 727cdf0e10cSrcweir // and test if synchronzation is necessary! 728cdf0e10cSrcweir { 729cdf0e10cSrcweir ::rtl::OUString aUserLastSyncFilePathURL = getLastSyncFileURLFromUserInstallation(); 730cdf0e10cSrcweir ::rtl::OUString aPreregSyncFilePathURL = getLastSyncFileURLFromBrandInstallation(); 731cdf0e10cSrcweir 732cdf0e10cSrcweir if ( needsSynchronization( aPreregSyncFilePathURL, aUserLastSyncFilePathURL )) 733cdf0e10cSrcweir { 734cdf0e10cSrcweir rtl::OUString aUserPath = getUserBundledExtPathURL(); 735cdf0e10cSrcweir rtl::OUString aPreregBundledPath = getBrandSharePreregBundledPathURL(); 736cdf0e10cSrcweir 737cdf0e10cSrcweir // copy bundled folder to the user directory 738cdf0e10cSrcweir osl::FileBase::RC rc = osl::Directory::createPath(aUserPath); 739cdf0e10cSrcweir (void) rc; 740cdf0e10cSrcweir copy_bundled_recursive( aPreregBundledPath, aUserPath, +1 ); 741cdf0e10cSrcweir } 742cdf0e10cSrcweir } 743cdf0e10cSrcweir 744cdf0e10cSrcweir // create service factory... 745cdf0e10cSrcweir Reference < XMultiServiceFactory > rSMgr = CreateApplicationServiceManager(); 746cdf0e10cSrcweir if( rSMgr.is() ) 747cdf0e10cSrcweir { 748cdf0e10cSrcweir ::comphelper::setProcessServiceFactory( rSMgr ); 749cdf0e10cSrcweir } 750cdf0e10cSrcweir else 751cdf0e10cSrcweir { 752cdf0e10cSrcweir SetBootstrapError( BE_UNO_SERVICEMANAGER ); 753cdf0e10cSrcweir } 754cdf0e10cSrcweir 755cdf0e10cSrcweir if ( GetBootstrapError() == BE_OK ) 756cdf0e10cSrcweir { 757cdf0e10cSrcweir // prepare language 758cdf0e10cSrcweir if ( !LanguageSelection::prepareLanguage() ) 759cdf0e10cSrcweir { 760cdf0e10cSrcweir if ( LanguageSelection::getStatus() == LanguageSelection::LS_STATUS_CANNOT_DETERMINE_LANGUAGE ) 761cdf0e10cSrcweir SetBootstrapError( BE_LANGUAGE_MISSING ); 762cdf0e10cSrcweir else 763cdf0e10cSrcweir SetBootstrapError( BE_OFFICECONFIG_BROKEN ); 764cdf0e10cSrcweir } 765cdf0e10cSrcweir } 766cdf0e10cSrcweir 767cdf0e10cSrcweir if ( GetBootstrapError() == BE_OK ) 768cdf0e10cSrcweir { 769cdf0e10cSrcweir CommandLineArgs* pCmdLineArgs = GetCommandLineArgs(); 770cdf0e10cSrcweir #ifdef UNX 771cdf0e10cSrcweir // check whether we need to print cmdline help 772cdf0e10cSrcweir if ( pCmdLineArgs->IsHelp() ) { 773cdf0e10cSrcweir displayCmdlineHelp(); 774cdf0e10cSrcweir SetBootstrapStatus(BS_TERMINATE); 775cdf0e10cSrcweir } 776cdf0e10cSrcweir #endif 777cdf0e10cSrcweir // start ipc thread only for non-remote offices 778cdf0e10cSrcweir RTL_LOGFILE_CONTEXT( aLog2, "desktop (cd100003) ::OfficeIPCThread::EnableOfficeIPCThread" ); 779cdf0e10cSrcweir OfficeIPCThread::Status aStatus = OfficeIPCThread::EnableOfficeIPCThread(); 780cdf0e10cSrcweir if ( aStatus == OfficeIPCThread::IPC_STATUS_BOOTSTRAP_ERROR ) 781cdf0e10cSrcweir { 782cdf0e10cSrcweir SetBootstrapError( BE_PATHINFO_MISSING ); 783cdf0e10cSrcweir } 784cdf0e10cSrcweir else if ( aStatus == OfficeIPCThread::IPC_STATUS_2ND_OFFICE ) 785cdf0e10cSrcweir { 786cdf0e10cSrcweir // 2nd office startup should terminate after sending cmdlineargs through pipe 787cdf0e10cSrcweir SetBootstrapStatus(BS_TERMINATE); 788cdf0e10cSrcweir } 789cdf0e10cSrcweir else if ( pCmdLineArgs->IsHelp() ) 790cdf0e10cSrcweir { 791cdf0e10cSrcweir // disable IPC thread in an instance that is just showing a help message 792cdf0e10cSrcweir OfficeIPCThread::DisableOfficeIPCThread(); 793cdf0e10cSrcweir } 794cdf0e10cSrcweir pSignalHandler = new SalMainPipeExchangeSignalHandler; 795cdf0e10cSrcweir } 796cdf0e10cSrcweir } 797cdf0e10cSrcweir 798cdf0e10cSrcweir void Desktop::DeInit() 799cdf0e10cSrcweir { 800cdf0e10cSrcweir RTL_LOGFILE_CONTEXT( aLog, "desktop (cd100003) ::Desktop::DeInit" ); 801cdf0e10cSrcweir 802cdf0e10cSrcweir try { 803cdf0e10cSrcweir // instead of removing of the configManager just let it commit all the changes 804cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "<- store config items" ); 805cdf0e10cSrcweir utl::ConfigManager::GetConfigManager()->StoreConfigItems(); 806cdf0e10cSrcweir FlushConfiguration(); 807cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "<- store config items" ); 808cdf0e10cSrcweir 809cdf0e10cSrcweir // close splashscreen if it's still open 810cdf0e10cSrcweir CloseSplashScreen(); 811cdf0e10cSrcweir Reference<XMultiServiceFactory> xXMultiServiceFactory(::comphelper::getProcessServiceFactory()); 812cdf0e10cSrcweir DestroyApplicationServiceManager( xXMultiServiceFactory ); 813cdf0e10cSrcweir // nobody should get a destroyd service factory... 814cdf0e10cSrcweir ::comphelper::setProcessServiceFactory( NULL ); 815cdf0e10cSrcweir 816cdf0e10cSrcweir // clear lockfile 817cdf0e10cSrcweir if (m_pLockfile != NULL) 818cdf0e10cSrcweir m_pLockfile->clean(); 819cdf0e10cSrcweir 820cdf0e10cSrcweir OfficeIPCThread::DisableOfficeIPCThread(); 821cdf0e10cSrcweir if( pSignalHandler ) 822cdf0e10cSrcweir DELETEZ( pSignalHandler ); 823cdf0e10cSrcweir } catch (RuntimeException&) { 824cdf0e10cSrcweir // someone threw an exception during shutdown 825cdf0e10cSrcweir // this will leave some garbage behind.. 826cdf0e10cSrcweir } 827cdf0e10cSrcweir 828cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "FINISHED WITH Destop::DeInit" ); 829cdf0e10cSrcweir } 830cdf0e10cSrcweir 831cdf0e10cSrcweir sal_Bool Desktop::QueryExit() 832cdf0e10cSrcweir { 833cdf0e10cSrcweir try 834cdf0e10cSrcweir { 835cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "<- store config items" ); 836cdf0e10cSrcweir utl::ConfigManager::GetConfigManager()->StoreConfigItems(); 837cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "<- store config items" ); 838cdf0e10cSrcweir } 839cdf0e10cSrcweir catch ( RuntimeException& ) 840cdf0e10cSrcweir { 841cdf0e10cSrcweir } 842cdf0e10cSrcweir 843cdf0e10cSrcweir const sal_Char SUSPEND_QUICKSTARTVETO[] = "SuspendQuickstartVeto"; 844cdf0e10cSrcweir 845cdf0e10cSrcweir Reference< ::com::sun::star::frame::XDesktop > 846cdf0e10cSrcweir xDesktop( ::comphelper::getProcessServiceFactory()->createInstance( OUSTRING(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.Desktop")) ), 847cdf0e10cSrcweir UNO_QUERY ); 848cdf0e10cSrcweir 849cdf0e10cSrcweir Reference < ::com::sun::star::beans::XPropertySet > xPropertySet( xDesktop, UNO_QUERY ); 850cdf0e10cSrcweir if ( xPropertySet.is() ) 851cdf0e10cSrcweir { 852cdf0e10cSrcweir Any a; 853cdf0e10cSrcweir a <<= (sal_Bool)sal_True; 854cdf0e10cSrcweir xPropertySet->setPropertyValue( OUSTRING(RTL_CONSTASCII_USTRINGPARAM( SUSPEND_QUICKSTARTVETO )), a ); 855cdf0e10cSrcweir } 856cdf0e10cSrcweir 857cdf0e10cSrcweir sal_Bool bExit = ( !xDesktop.is() || xDesktop->terminate() ); 858cdf0e10cSrcweir 859cdf0e10cSrcweir 860cdf0e10cSrcweir if ( !bExit && xPropertySet.is() ) 861cdf0e10cSrcweir { 862cdf0e10cSrcweir Any a; 863cdf0e10cSrcweir a <<= (sal_Bool)sal_False; 864cdf0e10cSrcweir xPropertySet->setPropertyValue( OUSTRING(RTL_CONSTASCII_USTRINGPARAM( SUSPEND_QUICKSTARTVETO )), a ); 865cdf0e10cSrcweir } 866cdf0e10cSrcweir else 867cdf0e10cSrcweir { 868cdf0e10cSrcweir FlushConfiguration(); 869cdf0e10cSrcweir try 870cdf0e10cSrcweir { 871cdf0e10cSrcweir // it is no problem to call DisableOfficeIPCThread() more than once 872cdf0e10cSrcweir // it also looks to be threadsafe 873cdf0e10cSrcweir OfficeIPCThread::DisableOfficeIPCThread(); 874cdf0e10cSrcweir } 875cdf0e10cSrcweir catch ( RuntimeException& ) 876cdf0e10cSrcweir { 877cdf0e10cSrcweir } 878cdf0e10cSrcweir 879cdf0e10cSrcweir if (m_pLockfile != NULL) m_pLockfile->clean(); 880cdf0e10cSrcweir } 881cdf0e10cSrcweir 882cdf0e10cSrcweir return bExit; 883cdf0e10cSrcweir } 884cdf0e10cSrcweir 885cdf0e10cSrcweir void Desktop::HandleBootstrapPathErrors( ::utl::Bootstrap::Status aBootstrapStatus, const OUString& aDiagnosticMessage ) 886cdf0e10cSrcweir { 887cdf0e10cSrcweir if ( aBootstrapStatus != ::utl::Bootstrap::DATA_OK ) 888cdf0e10cSrcweir { 889cdf0e10cSrcweir sal_Bool bWorkstationInstallation = sal_False; 890cdf0e10cSrcweir ::rtl::OUString aBaseInstallURL; 891cdf0e10cSrcweir ::rtl::OUString aUserInstallURL; 892cdf0e10cSrcweir ::rtl::OUString aProductKey; 893cdf0e10cSrcweir ::rtl::OUString aTemp; 894cdf0e10cSrcweir ::vos::OStartupInfo aInfo; 895cdf0e10cSrcweir 896cdf0e10cSrcweir aInfo.getExecutableFile( aProductKey ); 897cdf0e10cSrcweir sal_uInt32 lastIndex = aProductKey.lastIndexOf('/'); 898cdf0e10cSrcweir if ( lastIndex > 0 ) 899cdf0e10cSrcweir aProductKey = aProductKey.copy( lastIndex+1 ); 900cdf0e10cSrcweir 901cdf0e10cSrcweir aTemp = ::utl::Bootstrap::getProductKey( aProductKey ); 902cdf0e10cSrcweir if ( aTemp.getLength() > 0 ) 903cdf0e10cSrcweir aProductKey = aTemp; 904cdf0e10cSrcweir 905cdf0e10cSrcweir ::utl::Bootstrap::PathStatus aBaseInstallStatus = ::utl::Bootstrap::locateBaseInstallation( aBaseInstallURL ); 906cdf0e10cSrcweir ::utl::Bootstrap::PathStatus aUserInstallStatus = ::utl::Bootstrap::locateUserInstallation( aUserInstallURL ); 907cdf0e10cSrcweir 908cdf0e10cSrcweir if (( aBaseInstallStatus == ::utl::Bootstrap::PATH_EXISTS && 909cdf0e10cSrcweir aUserInstallStatus == ::utl::Bootstrap::PATH_EXISTS )) 910cdf0e10cSrcweir { 911cdf0e10cSrcweir if ( aBaseInstallURL != aUserInstallURL ) 912cdf0e10cSrcweir bWorkstationInstallation = sal_True; 913cdf0e10cSrcweir } 914cdf0e10cSrcweir 915cdf0e10cSrcweir OUString aMessage; 916cdf0e10cSrcweir OUStringBuffer aBuffer( 100 ); 917cdf0e10cSrcweir aBuffer.append( aDiagnosticMessage ); 918cdf0e10cSrcweir 919cdf0e10cSrcweir aBuffer.appendAscii( "\n" ); 920cdf0e10cSrcweir 921cdf0e10cSrcweir ErrorBox aBootstrapFailedBox( NULL, WB_OK, aMessage ); 922cdf0e10cSrcweir aBootstrapFailedBox.SetText( aProductKey ); 923cdf0e10cSrcweir aBootstrapFailedBox.Execute(); 924cdf0e10cSrcweir } 925cdf0e10cSrcweir } 926cdf0e10cSrcweir 927cdf0e10cSrcweir // Create a error message depending on bootstrap failure code and an optional file url 928cdf0e10cSrcweir ::rtl::OUString Desktop::CreateErrorMsgString( 929cdf0e10cSrcweir utl::Bootstrap::FailureCode nFailureCode, 930cdf0e10cSrcweir const ::rtl::OUString& aFileURL ) 931cdf0e10cSrcweir { 932cdf0e10cSrcweir OUString aMsg; 933cdf0e10cSrcweir OUString aFilePath; 934cdf0e10cSrcweir sal_Bool bFileInfo = sal_True; 935cdf0e10cSrcweir 936cdf0e10cSrcweir switch ( nFailureCode ) 937cdf0e10cSrcweir { 938cdf0e10cSrcweir /// the shared installation directory could not be located 939cdf0e10cSrcweir case ::utl::Bootstrap::MISSING_INSTALL_DIRECTORY: 940cdf0e10cSrcweir { 941cdf0e10cSrcweir aMsg = GetMsgString( STR_BOOTSTRAP_ERR_PATH_INVALID, 942cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( "The installation path is not available." )) ); 943cdf0e10cSrcweir bFileInfo = sal_False; 944cdf0e10cSrcweir } 945cdf0e10cSrcweir break; 946cdf0e10cSrcweir 947cdf0e10cSrcweir /// the bootstrap INI file could not be found or read 948cdf0e10cSrcweir case ::utl::Bootstrap::MISSING_BOOTSTRAP_FILE: 949cdf0e10cSrcweir { 950cdf0e10cSrcweir aMsg = GetMsgString( STR_BOOTSTRAP_ERR_FILE_MISSING, 951cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( "The configuration file \"$1\" is missing." )) ); 952cdf0e10cSrcweir } 953cdf0e10cSrcweir break; 954cdf0e10cSrcweir 955cdf0e10cSrcweir /// the bootstrap INI is missing a required entry 956cdf0e10cSrcweir /// the bootstrap INI contains invalid data 957cdf0e10cSrcweir case ::utl::Bootstrap::MISSING_BOOTSTRAP_FILE_ENTRY: 958cdf0e10cSrcweir case ::utl::Bootstrap::INVALID_BOOTSTRAP_FILE_ENTRY: 959cdf0e10cSrcweir { 960cdf0e10cSrcweir aMsg = GetMsgString( STR_BOOTSTRAP_ERR_FILE_CORRUPT, 961cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( "The configuration file \"$1\" is corrupt." )) ); 962cdf0e10cSrcweir } 963cdf0e10cSrcweir break; 964cdf0e10cSrcweir 965cdf0e10cSrcweir /// the version locator INI file could not be found or read 966cdf0e10cSrcweir case ::utl::Bootstrap::MISSING_VERSION_FILE: 967cdf0e10cSrcweir { 968cdf0e10cSrcweir aMsg = GetMsgString( STR_BOOTSTRAP_ERR_FILE_MISSING, 969cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( "The configuration file \"$1\" is missing." )) ); 970cdf0e10cSrcweir } 971cdf0e10cSrcweir break; 972cdf0e10cSrcweir 973cdf0e10cSrcweir /// the version locator INI has no entry for this version 974cdf0e10cSrcweir case ::utl::Bootstrap::MISSING_VERSION_FILE_ENTRY: 975cdf0e10cSrcweir { 976cdf0e10cSrcweir aMsg = GetMsgString( STR_BOOTSTRAP_ERR_NO_SUPPORT, 977cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( "The main configuration file \"$1\" does not support the current version." )) ); 978cdf0e10cSrcweir } 979cdf0e10cSrcweir break; 980cdf0e10cSrcweir 981cdf0e10cSrcweir /// the user installation directory does not exist 982cdf0e10cSrcweir case ::utl::Bootstrap::MISSING_USER_DIRECTORY: 983cdf0e10cSrcweir { 984cdf0e10cSrcweir aMsg = GetMsgString( STR_BOOTSTRAP_ERR_DIR_MISSING, 985cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( "The configuration directory \"$1\" is missing." )) ); 986cdf0e10cSrcweir } 987cdf0e10cSrcweir break; 988cdf0e10cSrcweir 989cdf0e10cSrcweir /// some bootstrap data was invalid in unexpected ways 990cdf0e10cSrcweir case ::utl::Bootstrap::INVALID_BOOTSTRAP_DATA: 991cdf0e10cSrcweir { 992cdf0e10cSrcweir aMsg = GetMsgString( STR_BOOTSTRAP_ERR_INTERNAL, 993cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( "An internal failure occurred." )) ); 994cdf0e10cSrcweir bFileInfo = sal_False; 995cdf0e10cSrcweir } 996cdf0e10cSrcweir break; 997cdf0e10cSrcweir 998cdf0e10cSrcweir case ::utl::Bootstrap::INVALID_VERSION_FILE_ENTRY: 999cdf0e10cSrcweir { 1000cdf0e10cSrcweir // This needs to be improved, see #i67575#: 1001cdf0e10cSrcweir aMsg = OUString( 1002cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( "Invalid version file entry" ) ); 1003cdf0e10cSrcweir bFileInfo = sal_False; 1004cdf0e10cSrcweir } 1005cdf0e10cSrcweir break; 1006cdf0e10cSrcweir 1007cdf0e10cSrcweir case ::utl::Bootstrap::NO_FAILURE: 1008cdf0e10cSrcweir { 1009cdf0e10cSrcweir OSL_ASSERT(false); 1010cdf0e10cSrcweir } 1011cdf0e10cSrcweir break; 1012cdf0e10cSrcweir } 1013cdf0e10cSrcweir 1014cdf0e10cSrcweir if ( bFileInfo ) 1015cdf0e10cSrcweir { 1016cdf0e10cSrcweir String aMsgString( aMsg ); 1017cdf0e10cSrcweir 1018cdf0e10cSrcweir osl::File::getSystemPathFromFileURL( aFileURL, aFilePath ); 1019cdf0e10cSrcweir 1020cdf0e10cSrcweir aMsgString.SearchAndReplaceAscii( "$1", aFilePath ); 1021cdf0e10cSrcweir aMsg = aMsgString; 1022cdf0e10cSrcweir } 1023cdf0e10cSrcweir 1024cdf0e10cSrcweir return MakeStartupErrorMessage( aMsg ); 1025cdf0e10cSrcweir } 1026cdf0e10cSrcweir 1027cdf0e10cSrcweir void Desktop::HandleBootstrapErrors( BootstrapError aBootstrapError ) 1028cdf0e10cSrcweir { 1029cdf0e10cSrcweir if ( aBootstrapError == BE_PATHINFO_MISSING ) 1030cdf0e10cSrcweir { 1031cdf0e10cSrcweir OUString aErrorMsg; 1032cdf0e10cSrcweir OUString aBuffer; 1033cdf0e10cSrcweir utl::Bootstrap::Status aBootstrapStatus; 1034cdf0e10cSrcweir utl::Bootstrap::FailureCode nFailureCode; 1035cdf0e10cSrcweir 1036cdf0e10cSrcweir aBootstrapStatus = ::utl::Bootstrap::checkBootstrapStatus( aBuffer, nFailureCode ); 1037cdf0e10cSrcweir if ( aBootstrapStatus != ::utl::Bootstrap::DATA_OK ) 1038cdf0e10cSrcweir { 1039cdf0e10cSrcweir switch ( nFailureCode ) 1040cdf0e10cSrcweir { 1041cdf0e10cSrcweir case ::utl::Bootstrap::MISSING_INSTALL_DIRECTORY: 1042cdf0e10cSrcweir case ::utl::Bootstrap::INVALID_BOOTSTRAP_DATA: 1043cdf0e10cSrcweir { 1044cdf0e10cSrcweir aErrorMsg = CreateErrorMsgString( nFailureCode, OUString() ); 1045cdf0e10cSrcweir } 1046cdf0e10cSrcweir break; 1047cdf0e10cSrcweir 1048cdf0e10cSrcweir /// the bootstrap INI file could not be found or read 1049cdf0e10cSrcweir /// the bootstrap INI is missing a required entry 1050cdf0e10cSrcweir /// the bootstrap INI contains invalid data 1051cdf0e10cSrcweir case ::utl::Bootstrap::MISSING_BOOTSTRAP_FILE_ENTRY: 1052cdf0e10cSrcweir case ::utl::Bootstrap::INVALID_BOOTSTRAP_FILE_ENTRY: 1053cdf0e10cSrcweir case ::utl::Bootstrap::MISSING_BOOTSTRAP_FILE: 1054cdf0e10cSrcweir { 1055cdf0e10cSrcweir OUString aBootstrapFileURL; 1056cdf0e10cSrcweir 1057cdf0e10cSrcweir utl::Bootstrap::locateBootstrapFile( aBootstrapFileURL ); 1058cdf0e10cSrcweir aErrorMsg = CreateErrorMsgString( nFailureCode, aBootstrapFileURL ); 1059cdf0e10cSrcweir } 1060cdf0e10cSrcweir break; 1061cdf0e10cSrcweir 1062cdf0e10cSrcweir /// the version locator INI file could not be found or read 1063cdf0e10cSrcweir /// the version locator INI has no entry for this version 1064cdf0e10cSrcweir /// the version locator INI entry is not a valid directory URL 1065cdf0e10cSrcweir case ::utl::Bootstrap::INVALID_VERSION_FILE_ENTRY: 1066cdf0e10cSrcweir case ::utl::Bootstrap::MISSING_VERSION_FILE_ENTRY: 1067cdf0e10cSrcweir case ::utl::Bootstrap::MISSING_VERSION_FILE: 1068cdf0e10cSrcweir { 1069cdf0e10cSrcweir OUString aVersionFileURL; 1070cdf0e10cSrcweir 1071cdf0e10cSrcweir utl::Bootstrap::locateVersionFile( aVersionFileURL ); 1072cdf0e10cSrcweir aErrorMsg = CreateErrorMsgString( nFailureCode, aVersionFileURL ); 1073cdf0e10cSrcweir } 1074cdf0e10cSrcweir break; 1075cdf0e10cSrcweir 1076cdf0e10cSrcweir /// the user installation directory does not exist 1077cdf0e10cSrcweir case ::utl::Bootstrap::MISSING_USER_DIRECTORY: 1078cdf0e10cSrcweir { 1079cdf0e10cSrcweir OUString aUserInstallationURL; 1080cdf0e10cSrcweir 1081cdf0e10cSrcweir utl::Bootstrap::locateUserInstallation( aUserInstallationURL ); 1082cdf0e10cSrcweir aErrorMsg = CreateErrorMsgString( nFailureCode, aUserInstallationURL ); 1083cdf0e10cSrcweir } 1084cdf0e10cSrcweir break; 1085cdf0e10cSrcweir 1086cdf0e10cSrcweir case ::utl::Bootstrap::NO_FAILURE: 1087cdf0e10cSrcweir { 1088cdf0e10cSrcweir OSL_ASSERT(false); 1089cdf0e10cSrcweir } 1090cdf0e10cSrcweir break; 1091cdf0e10cSrcweir } 1092cdf0e10cSrcweir 1093cdf0e10cSrcweir HandleBootstrapPathErrors( aBootstrapStatus, aErrorMsg ); 1094cdf0e10cSrcweir } 1095cdf0e10cSrcweir } 1096cdf0e10cSrcweir else if ( aBootstrapError == BE_UNO_SERVICEMANAGER || aBootstrapError == BE_UNO_SERVICE_CONFIG_MISSING ) 1097cdf0e10cSrcweir { 1098cdf0e10cSrcweir // Uno service manager is not available. VCL needs a uno service manager to display a message box!!! 1099cdf0e10cSrcweir // Currently we are not able to display a message box with a service manager due to this limitations inside VCL. 1100cdf0e10cSrcweir 1101cdf0e10cSrcweir // When UNO is not properly initialized, all kinds of things can fail 1102cdf0e10cSrcweir // and cause the process to crash (e.g., a call to GetMsgString may 1103cdf0e10cSrcweir // crash when somewhere deep within that call Any::operator <= is used 1104cdf0e10cSrcweir // with a PropertyValue, and no binary UNO type description for 1105cdf0e10cSrcweir // PropertyValue is available). To give the user a hint even if 1106cdf0e10cSrcweir // generating and displaying a message box below crashes, print a 1107cdf0e10cSrcweir // hard-coded message on stderr first: 1108cdf0e10cSrcweir fputs( 1109cdf0e10cSrcweir aBootstrapError == BE_UNO_SERVICEMANAGER 1110cdf0e10cSrcweir ? ("The application cannot be started. " "\n" 1111cdf0e10cSrcweir "The component manager is not available." "\n") 1112cdf0e10cSrcweir // STR_BOOTSTRAP_ERR_CANNOT_START, STR_BOOTSTRAP_ERR_NO_SERVICE 1113cdf0e10cSrcweir : ("The application cannot be started. " "\n" 1114cdf0e10cSrcweir "The configuration service is not available." "\n"), 1115cdf0e10cSrcweir // STR_BOOTSTRAP_ERR_CANNOT_START, 1116cdf0e10cSrcweir // STR_BOOTSTRAP_ERR_NO_CFG_SERVICE 1117cdf0e10cSrcweir stderr); 1118cdf0e10cSrcweir 1119cdf0e10cSrcweir // First sentence. We cannot bootstrap office further! 1120cdf0e10cSrcweir OUString aMessage; 1121cdf0e10cSrcweir OUStringBuffer aDiagnosticMessage( 100 ); 1122cdf0e10cSrcweir 1123cdf0e10cSrcweir OUString aErrorMsg; 1124cdf0e10cSrcweir 1125cdf0e10cSrcweir if ( aBootstrapError == BE_UNO_SERVICEMANAGER ) 1126cdf0e10cSrcweir aErrorMsg = GetMsgString( STR_BOOTSTRAP_ERR_NO_SERVICE, 1127cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( "The service manager is not available." )) ); 1128cdf0e10cSrcweir else 1129cdf0e10cSrcweir aErrorMsg = GetMsgString( STR_BOOTSTRAP_ERR_NO_CFG_SERVICE, 1130cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( "The configuration service is not available." )) ); 1131cdf0e10cSrcweir 1132cdf0e10cSrcweir aDiagnosticMessage.append( aErrorMsg ); 1133cdf0e10cSrcweir aDiagnosticMessage.appendAscii( "\n" ); 1134cdf0e10cSrcweir 1135cdf0e10cSrcweir // Due to the fact the we haven't a backup applicat.rdb file anymore it is not possible to 1136cdf0e10cSrcweir // repair the installation with the setup executable besides the office executable. Now 1137cdf0e10cSrcweir // we have to ask the user to start the setup on CD/installation directory manually!! 1138cdf0e10cSrcweir OUString aStartSetupManually( GetMsgString( 1139cdf0e10cSrcweir STR_ASK_START_SETUP_MANUALLY, 1140cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( "Start setup application to repair the installation from CD, or the folder containing the installation packages." )) )); 1141cdf0e10cSrcweir 1142cdf0e10cSrcweir aDiagnosticMessage.append( aStartSetupManually ); 1143cdf0e10cSrcweir aMessage = MakeStartupErrorMessage( aDiagnosticMessage.makeStringAndClear() ); 1144cdf0e10cSrcweir 1145cdf0e10cSrcweir FatalError( aMessage); 1146cdf0e10cSrcweir } 1147cdf0e10cSrcweir else if ( aBootstrapError == BE_OFFICECONFIG_BROKEN ) 1148cdf0e10cSrcweir { 1149cdf0e10cSrcweir OUString aMessage; 1150cdf0e10cSrcweir OUStringBuffer aDiagnosticMessage( 100 ); 1151cdf0e10cSrcweir OUString aErrorMsg; 1152cdf0e10cSrcweir aErrorMsg = GetMsgString( STR_CONFIG_ERR_ACCESS_GENERAL, 1153cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( "A general error occurred while accessing your central configuration." )) ); 1154cdf0e10cSrcweir aDiagnosticMessage.append( aErrorMsg ); 1155cdf0e10cSrcweir aMessage = MakeStartupErrorMessage( aDiagnosticMessage.makeStringAndClear() ); 1156cdf0e10cSrcweir FatalError(aMessage); 1157cdf0e10cSrcweir } 1158cdf0e10cSrcweir else if ( aBootstrapError == BE_USERINSTALL_FAILED ) 1159cdf0e10cSrcweir { 1160cdf0e10cSrcweir OUString aMessage; 1161cdf0e10cSrcweir OUStringBuffer aDiagnosticMessage( 100 ); 1162cdf0e10cSrcweir OUString aErrorMsg; 1163cdf0e10cSrcweir aErrorMsg = GetMsgString( STR_BOOTSTRAP_ERR_INTERNAL, 1164cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( "User installation could not be completed" )) ); 1165cdf0e10cSrcweir aDiagnosticMessage.append( aErrorMsg ); 1166cdf0e10cSrcweir aMessage = MakeStartupErrorMessage( aDiagnosticMessage.makeStringAndClear() ); 1167cdf0e10cSrcweir FatalError(aMessage); 1168cdf0e10cSrcweir } 1169cdf0e10cSrcweir else if ( aBootstrapError == BE_LANGUAGE_MISSING ) 1170cdf0e10cSrcweir { 1171cdf0e10cSrcweir OUString aMessage; 1172cdf0e10cSrcweir OUStringBuffer aDiagnosticMessage( 100 ); 1173cdf0e10cSrcweir OUString aErrorMsg; 1174cdf0e10cSrcweir aErrorMsg = GetMsgString( 1175cdf0e10cSrcweir //@@@ FIXME: should use an own resource string => #i36213# 1176cdf0e10cSrcweir STR_BOOTSTRAP_ERR_LANGUAGE_MISSING, 1177cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( 1178cdf0e10cSrcweir "Language could not be determined." )) ); 1179cdf0e10cSrcweir aDiagnosticMessage.append( aErrorMsg ); 1180cdf0e10cSrcweir aMessage = MakeStartupErrorMessage( 1181cdf0e10cSrcweir aDiagnosticMessage.makeStringAndClear() ); 1182cdf0e10cSrcweir FatalError(aMessage); 1183cdf0e10cSrcweir } 1184cdf0e10cSrcweir else if (( aBootstrapError == BE_USERINSTALL_NOTENOUGHDISKSPACE ) || 1185cdf0e10cSrcweir ( aBootstrapError == BE_USERINSTALL_NOWRITEACCESS )) 1186cdf0e10cSrcweir { 1187cdf0e10cSrcweir OUString aUserInstallationURL; 1188cdf0e10cSrcweir OUString aUserInstallationPath; 1189cdf0e10cSrcweir OUString aMessage; 1190cdf0e10cSrcweir OUString aErrorMsg; 1191cdf0e10cSrcweir OUStringBuffer aDiagnosticMessage( 100 ); 1192cdf0e10cSrcweir 1193cdf0e10cSrcweir utl::Bootstrap::locateUserInstallation( aUserInstallationURL ); 1194cdf0e10cSrcweir 1195cdf0e10cSrcweir if ( aBootstrapError == BE_USERINSTALL_NOTENOUGHDISKSPACE ) 1196cdf0e10cSrcweir aErrorMsg = GetMsgString( 1197cdf0e10cSrcweir STR_BOOSTRAP_ERR_NOTENOUGHDISKSPACE, 1198cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( 1199cdf0e10cSrcweir "User installation could not be completed due to insufficient free disk space." )) ); 1200cdf0e10cSrcweir else 1201cdf0e10cSrcweir aErrorMsg = GetMsgString( 1202cdf0e10cSrcweir STR_BOOSTRAP_ERR_NOACCESSRIGHTS, 1203cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( 1204cdf0e10cSrcweir "User installation could not be processed due to missing access rights." )) ); 1205cdf0e10cSrcweir 1206cdf0e10cSrcweir osl::File::getSystemPathFromFileURL( aUserInstallationURL, aUserInstallationPath ); 1207cdf0e10cSrcweir 1208cdf0e10cSrcweir aDiagnosticMessage.append( aErrorMsg ); 1209cdf0e10cSrcweir aDiagnosticMessage.append( aUserInstallationPath ); 1210cdf0e10cSrcweir aMessage = MakeStartupErrorMessage( 1211cdf0e10cSrcweir aDiagnosticMessage.makeStringAndClear() ); 1212cdf0e10cSrcweir FatalError(aMessage); 1213cdf0e10cSrcweir } 1214cdf0e10cSrcweir 1215cdf0e10cSrcweir return; 1216cdf0e10cSrcweir } 1217cdf0e10cSrcweir 1218cdf0e10cSrcweir 1219cdf0e10cSrcweir void Desktop::retrieveCrashReporterState() 1220cdf0e10cSrcweir { 1221cdf0e10cSrcweir static const ::rtl::OUString CFG_PACKAGE_RECOVERY = ::rtl::OUString::createFromAscii("org.openoffice.Office.Recovery/"); 1222cdf0e10cSrcweir static const ::rtl::OUString CFG_PATH_CRASHREPORTER = ::rtl::OUString::createFromAscii("CrashReporter" ); 1223cdf0e10cSrcweir static const ::rtl::OUString CFG_ENTRY_ENABLED = ::rtl::OUString::createFromAscii("Enabled" ); 1224cdf0e10cSrcweir 1225cdf0e10cSrcweir css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = ::comphelper::getProcessServiceFactory(); 1226cdf0e10cSrcweir 1227cdf0e10cSrcweir sal_Bool bEnabled( sal_True ); 1228cdf0e10cSrcweir if ( xSMGR.is() ) 1229cdf0e10cSrcweir { 1230cdf0e10cSrcweir css::uno::Any aVal = ::comphelper::ConfigurationHelper::readDirectKey( 1231cdf0e10cSrcweir xSMGR, 1232cdf0e10cSrcweir CFG_PACKAGE_RECOVERY, 1233cdf0e10cSrcweir CFG_PATH_CRASHREPORTER, 1234cdf0e10cSrcweir CFG_ENTRY_ENABLED, 1235cdf0e10cSrcweir ::comphelper::ConfigurationHelper::E_READONLY); 1236cdf0e10cSrcweir aVal >>= bEnabled; 1237cdf0e10cSrcweir } 1238cdf0e10cSrcweir _bCrashReporterEnabled = bEnabled; 1239cdf0e10cSrcweir } 1240cdf0e10cSrcweir 1241cdf0e10cSrcweir sal_Bool Desktop::isUIOnSessionShutdownAllowed() 1242cdf0e10cSrcweir { 1243cdf0e10cSrcweir static const ::rtl::OUString CFG_PACKAGE_RECOVERY = ::rtl::OUString::createFromAscii("org.openoffice.Office.Recovery/"); 1244cdf0e10cSrcweir static const ::rtl::OUString CFG_PATH_SESSION = ::rtl::OUString::createFromAscii("SessionShutdown" ); 1245cdf0e10cSrcweir static const ::rtl::OUString CFG_ENTRY_UIENABLED = ::rtl::OUString::createFromAscii("DocumentStoreUIEnabled" ); 1246cdf0e10cSrcweir 1247cdf0e10cSrcweir css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = ::comphelper::getProcessServiceFactory(); 1248cdf0e10cSrcweir 1249cdf0e10cSrcweir sal_Bool bResult = sal_False; 1250cdf0e10cSrcweir if ( xSMGR.is() ) 1251cdf0e10cSrcweir { 1252cdf0e10cSrcweir css::uno::Any aVal = ::comphelper::ConfigurationHelper::readDirectKey( 1253cdf0e10cSrcweir xSMGR, 1254cdf0e10cSrcweir CFG_PACKAGE_RECOVERY, 1255cdf0e10cSrcweir CFG_PATH_SESSION, 1256cdf0e10cSrcweir CFG_ENTRY_UIENABLED, 1257cdf0e10cSrcweir ::comphelper::ConfigurationHelper::E_READONLY); 1258cdf0e10cSrcweir aVal >>= bResult; 1259cdf0e10cSrcweir } 1260cdf0e10cSrcweir 1261cdf0e10cSrcweir return bResult; 1262cdf0e10cSrcweir } 1263cdf0e10cSrcweir 1264cdf0e10cSrcweir //----------------------------------------------- 1265cdf0e10cSrcweir /** @short check if crash reporter feature is enabled or 1266cdf0e10cSrcweir disabled. 1267cdf0e10cSrcweir */ 1268cdf0e10cSrcweir sal_Bool Desktop::isCrashReporterEnabled() 1269cdf0e10cSrcweir { 1270cdf0e10cSrcweir return _bCrashReporterEnabled; 1271cdf0e10cSrcweir } 1272cdf0e10cSrcweir 1273cdf0e10cSrcweir //----------------------------------------------- 1274cdf0e10cSrcweir /** @short check if recovery must be started or not. 1275cdf0e10cSrcweir 1276cdf0e10cSrcweir @param bCrashed [boolean ... out!] 1277cdf0e10cSrcweir the office crashed last times. 1278cdf0e10cSrcweir But may be there are no recovery data. 1279cdf0e10cSrcweir Usefull to trigger the error report tool without 1280cdf0e10cSrcweir showing the recovery UI. 1281cdf0e10cSrcweir 1282cdf0e10cSrcweir @param bRecoveryDataExists [boolean ... out!] 1283cdf0e10cSrcweir there exists some recovery data. 1284cdf0e10cSrcweir 1285cdf0e10cSrcweir @param bSessionDataExists [boolean ... out!] 1286cdf0e10cSrcweir there exists some session data. 1287cdf0e10cSrcweir Because the user may be logged out last time from it's 1288cdf0e10cSrcweir unix session... 1289cdf0e10cSrcweir */ 1290cdf0e10cSrcweir void impl_checkRecoveryState(sal_Bool& bCrashed , 1291cdf0e10cSrcweir sal_Bool& bRecoveryDataExists, 1292cdf0e10cSrcweir sal_Bool& bSessionDataExists ) 1293cdf0e10cSrcweir { 1294cdf0e10cSrcweir static const ::rtl::OUString SERVICENAME_RECOVERYCORE = ::rtl::OUString::createFromAscii("com.sun.star.frame.AutoRecovery"); 1295cdf0e10cSrcweir static const ::rtl::OUString PROP_CRASHED = ::rtl::OUString::createFromAscii("Crashed" ); 1296cdf0e10cSrcweir static const ::rtl::OUString PROP_EXISTSRECOVERY = ::rtl::OUString::createFromAscii("ExistsRecoveryData" ); 1297cdf0e10cSrcweir static const ::rtl::OUString PROP_EXISTSSESSION = ::rtl::OUString::createFromAscii("ExistsSessionData" ); 1298cdf0e10cSrcweir static const ::rtl::OUString CFG_PACKAGE_RECOVERY = ::rtl::OUString::createFromAscii("org.openoffice.Office.Recovery/"); 1299cdf0e10cSrcweir static const ::rtl::OUString CFG_PATH_RECOVERYINFO = ::rtl::OUString::createFromAscii("RecoveryInfo" ); 1300cdf0e10cSrcweir 1301cdf0e10cSrcweir bCrashed = sal_False; 1302cdf0e10cSrcweir bRecoveryDataExists = sal_False; 1303cdf0e10cSrcweir bSessionDataExists = sal_False; 1304cdf0e10cSrcweir 1305cdf0e10cSrcweir css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = ::comphelper::getProcessServiceFactory(); 1306cdf0e10cSrcweir try 1307cdf0e10cSrcweir { 1308cdf0e10cSrcweir css::uno::Reference< css::beans::XPropertySet > xRecovery( 1309cdf0e10cSrcweir xSMGR->createInstance(SERVICENAME_RECOVERYCORE), 1310cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 1311cdf0e10cSrcweir 1312cdf0e10cSrcweir xRecovery->getPropertyValue(PROP_CRASHED ) >>= bCrashed ; 1313cdf0e10cSrcweir xRecovery->getPropertyValue(PROP_EXISTSRECOVERY) >>= bRecoveryDataExists; 1314cdf0e10cSrcweir xRecovery->getPropertyValue(PROP_EXISTSSESSION ) >>= bSessionDataExists ; 1315cdf0e10cSrcweir } 1316cdf0e10cSrcweir catch(const css::uno::Exception&) {} 1317cdf0e10cSrcweir } 1318cdf0e10cSrcweir 1319cdf0e10cSrcweir //----------------------------------------------- 1320cdf0e10cSrcweir /* @short start the recovery wizard. 1321cdf0e10cSrcweir 1322cdf0e10cSrcweir @param bEmergencySave 1323cdf0e10cSrcweir differs between EMERGENCY_SAVE and RECOVERY 1324cdf0e10cSrcweir */ 1325cdf0e10cSrcweir sal_Bool impl_callRecoveryUI(sal_Bool bEmergencySave , 1326cdf0e10cSrcweir sal_Bool bCrashed , 1327cdf0e10cSrcweir sal_Bool bExistsRecoveryData) 1328cdf0e10cSrcweir { 1329cdf0e10cSrcweir static ::rtl::OUString SERVICENAME_RECOVERYUI = ::rtl::OUString::createFromAscii("com.sun.star.comp.svx.RecoveryUI" ); 1330cdf0e10cSrcweir static ::rtl::OUString SERVICENAME_URLPARSER = ::rtl::OUString::createFromAscii("com.sun.star.util.URLTransformer" ); 1331cdf0e10cSrcweir static ::rtl::OUString COMMAND_EMERGENCYSAVE = ::rtl::OUString::createFromAscii("vnd.sun.star.autorecovery:/doEmergencySave"); 1332cdf0e10cSrcweir static ::rtl::OUString COMMAND_RECOVERY = ::rtl::OUString::createFromAscii("vnd.sun.star.autorecovery:/doAutoRecovery" ); 1333cdf0e10cSrcweir static ::rtl::OUString COMMAND_CRASHREPORT = ::rtl::OUString::createFromAscii("vnd.sun.star.autorecovery:/doCrashReport" ); 1334cdf0e10cSrcweir 1335cdf0e10cSrcweir css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = ::comphelper::getProcessServiceFactory(); 1336cdf0e10cSrcweir 1337cdf0e10cSrcweir css::uno::Reference< css::frame::XSynchronousDispatch > xRecoveryUI( 1338cdf0e10cSrcweir xSMGR->createInstance(SERVICENAME_RECOVERYUI), 1339cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 1340cdf0e10cSrcweir 1341cdf0e10cSrcweir css::uno::Reference< css::util::XURLTransformer > xURLParser( 1342cdf0e10cSrcweir xSMGR->createInstance(SERVICENAME_URLPARSER), 1343cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 1344cdf0e10cSrcweir 1345cdf0e10cSrcweir css::util::URL aURL; 1346cdf0e10cSrcweir if (bEmergencySave) 1347cdf0e10cSrcweir aURL.Complete = COMMAND_EMERGENCYSAVE; 1348cdf0e10cSrcweir else 1349cdf0e10cSrcweir { 1350cdf0e10cSrcweir if (bExistsRecoveryData) 1351cdf0e10cSrcweir aURL.Complete = COMMAND_RECOVERY; 1352cdf0e10cSrcweir else 1353cdf0e10cSrcweir if (bCrashed && Desktop::isCrashReporterEnabled() ) 1354cdf0e10cSrcweir aURL.Complete = COMMAND_CRASHREPORT; 1355cdf0e10cSrcweir } 1356cdf0e10cSrcweir 1357cdf0e10cSrcweir sal_Bool bRet = sal_False; 1358cdf0e10cSrcweir if ( aURL.Complete.getLength() > 0 ) 1359cdf0e10cSrcweir { 1360cdf0e10cSrcweir xURLParser->parseStrict(aURL); 1361cdf0e10cSrcweir 1362cdf0e10cSrcweir css::uno::Any aRet = xRecoveryUI->dispatchWithReturnValue(aURL, css::uno::Sequence< css::beans::PropertyValue >()); 1363cdf0e10cSrcweir aRet >>= bRet; 1364cdf0e10cSrcweir } 1365cdf0e10cSrcweir return bRet; 1366cdf0e10cSrcweir } 1367cdf0e10cSrcweir 1368cdf0e10cSrcweir /* 1369cdf0e10cSrcweir * Save all open documents so they will be reopened 1370cdf0e10cSrcweir * the next time the application ist started 1371cdf0e10cSrcweir * 1372cdf0e10cSrcweir * returns sal_True if at least one document could be saved... 1373cdf0e10cSrcweir * 1374cdf0e10cSrcweir */ 1375cdf0e10cSrcweir 1376cdf0e10cSrcweir sal_Bool Desktop::_bTasksSaved = sal_False; 1377cdf0e10cSrcweir 1378cdf0e10cSrcweir sal_Bool Desktop::SaveTasks() 1379cdf0e10cSrcweir { 1380cdf0e10cSrcweir return impl_callRecoveryUI( 1381cdf0e10cSrcweir sal_True , // sal_True => force emergency save 1382cdf0e10cSrcweir sal_False, // 2. and 3. param not used if 1. = true! 1383cdf0e10cSrcweir sal_False); 1384cdf0e10cSrcweir } 1385cdf0e10cSrcweir 1386cdf0e10cSrcweir namespace { 1387cdf0e10cSrcweir 1388cdf0e10cSrcweir void restartOnMac(bool passArguments) { 1389cdf0e10cSrcweir #if defined MACOSX 1390cdf0e10cSrcweir OfficeIPCThread::DisableOfficeIPCThread(); 1391cdf0e10cSrcweir rtl::OUString execUrl; 1392cdf0e10cSrcweir OSL_VERIFY(osl_getExecutableFile(&execUrl.pData) == osl_Process_E_None); 1393cdf0e10cSrcweir rtl::OUString execPath; 1394cdf0e10cSrcweir rtl::OString execPath8; 1395cdf0e10cSrcweir if ((osl::FileBase::getSystemPathFromFileURL(execUrl, execPath) 1396cdf0e10cSrcweir != osl::FileBase::E_None) || 1397cdf0e10cSrcweir !execPath.convertToString( 1398cdf0e10cSrcweir &execPath8, osl_getThreadTextEncoding(), 1399cdf0e10cSrcweir (RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR | 1400cdf0e10cSrcweir RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR))) 1401cdf0e10cSrcweir { 1402cdf0e10cSrcweir std::abort(); 1403cdf0e10cSrcweir } 1404cdf0e10cSrcweir std::vector< rtl::OString > args; 1405cdf0e10cSrcweir args.push_back(execPath8); 1406cdf0e10cSrcweir bool wait = false; 1407cdf0e10cSrcweir if (passArguments) { 1408cdf0e10cSrcweir sal_uInt32 n = osl_getCommandArgCount(); 1409cdf0e10cSrcweir for (sal_uInt32 i = 0; i < n; ++i) { 1410cdf0e10cSrcweir rtl::OUString arg; 1411cdf0e10cSrcweir OSL_VERIFY(osl_getCommandArg(i, &arg.pData) == osl_Process_E_None); 1412cdf0e10cSrcweir if (arg.matchAsciiL(RTL_CONSTASCII_STRINGPARAM("-accept="))) { 1413cdf0e10cSrcweir wait = true; 1414cdf0e10cSrcweir } 1415cdf0e10cSrcweir rtl::OString arg8; 1416cdf0e10cSrcweir if (!arg.convertToString( 1417cdf0e10cSrcweir &arg8, osl_getThreadTextEncoding(), 1418cdf0e10cSrcweir (RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR | 1419cdf0e10cSrcweir RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR))) 1420cdf0e10cSrcweir { 1421cdf0e10cSrcweir std::abort(); 1422cdf0e10cSrcweir } 1423cdf0e10cSrcweir args.push_back(arg8); 1424cdf0e10cSrcweir } 1425cdf0e10cSrcweir } 1426cdf0e10cSrcweir std::vector< char const * > argPtrs; 1427cdf0e10cSrcweir for (std::vector< rtl::OString >::iterator i(args.begin()); i != args.end(); 1428cdf0e10cSrcweir ++i) 1429cdf0e10cSrcweir { 1430cdf0e10cSrcweir argPtrs.push_back(i->getStr()); 1431cdf0e10cSrcweir } 1432cdf0e10cSrcweir argPtrs.push_back(0); 1433cdf0e10cSrcweir execv(execPath8.getStr(), const_cast< char ** >(&argPtrs[0])); 1434cdf0e10cSrcweir if (errno == ENOTSUP) { // happens when multithreaded on OS X < 10.6 1435cdf0e10cSrcweir pid_t pid = fork(); 1436cdf0e10cSrcweir if (pid == 0) { 1437cdf0e10cSrcweir execv(execPath8.getStr(), const_cast< char ** >(&argPtrs[0])); 1438cdf0e10cSrcweir } else if (pid > 0) { 1439cdf0e10cSrcweir // Two simultaneously running soffice processes lead to two dock 1440cdf0e10cSrcweir // icons, so avoid waiting here unless it must be assumed that the 1441cdf0e10cSrcweir // process invoking soffice itself wants to wait for soffice to 1442cdf0e10cSrcweir // finish: 1443cdf0e10cSrcweir if (!wait) { 1444cdf0e10cSrcweir return; 1445cdf0e10cSrcweir } 1446cdf0e10cSrcweir int stat; 1447cdf0e10cSrcweir if (waitpid(pid, &stat, 0) == pid && WIFEXITED(stat)) { 1448cdf0e10cSrcweir _exit(WEXITSTATUS(stat)); 1449cdf0e10cSrcweir } 1450cdf0e10cSrcweir } 1451cdf0e10cSrcweir } 1452cdf0e10cSrcweir std::abort(); 1453cdf0e10cSrcweir #else 1454cdf0e10cSrcweir (void) passArguments; // avoid warnings 1455cdf0e10cSrcweir #endif 1456cdf0e10cSrcweir } 1457cdf0e10cSrcweir 1458cdf0e10cSrcweir } 1459cdf0e10cSrcweir 1460cdf0e10cSrcweir sal_uInt16 Desktop::Exception(sal_uInt16 nError) 1461cdf0e10cSrcweir { 1462cdf0e10cSrcweir // protect against recursive calls 1463cdf0e10cSrcweir static sal_Bool bInException = sal_False; 1464cdf0e10cSrcweir 1465cdf0e10cSrcweir sal_uInt16 nOldMode = Application::GetSystemWindowMode(); 1466cdf0e10cSrcweir Application::SetSystemWindowMode( nOldMode & ~SYSTEMWINDOW_MODE_NOAUTOMODE ); 1467cdf0e10cSrcweir Application::SetDefDialogParent( NULL ); 1468cdf0e10cSrcweir 1469cdf0e10cSrcweir if ( bInException ) 1470cdf0e10cSrcweir { 1471cdf0e10cSrcweir String aDoubleExceptionString; 1472cdf0e10cSrcweir Application::Abort( aDoubleExceptionString ); 1473cdf0e10cSrcweir } 1474cdf0e10cSrcweir 1475cdf0e10cSrcweir bInException = sal_True; 1476cdf0e10cSrcweir CommandLineArgs* pArgs = GetCommandLineArgs(); 1477cdf0e10cSrcweir 1478cdf0e10cSrcweir // save all modified documents ... if it's allowed doing so. 1479cdf0e10cSrcweir sal_Bool bRestart = sal_False; 1480cdf0e10cSrcweir sal_Bool bAllowRecoveryAndSessionManagement = ( 1481cdf0e10cSrcweir ( !pArgs->IsNoRestore() ) && // some use cases of office must work without recovery 1482cdf0e10cSrcweir ( !pArgs->IsHeadless() ) && 1483cdf0e10cSrcweir ( !pArgs->IsServer() ) && 1484cdf0e10cSrcweir (( nError & EXC_MAJORTYPE ) != EXC_DISPLAY ) && // recovery cant work without UI ... but UI layer seams to be the reason for this crash 1485cdf0e10cSrcweir ( Application::IsInExecute() ) // crashes during startup and shutdown should be ignored (they indicates a corrupt installation ...) 1486cdf0e10cSrcweir ); 1487cdf0e10cSrcweir if ( bAllowRecoveryAndSessionManagement ) 1488cdf0e10cSrcweir bRestart = SaveTasks(); 1489cdf0e10cSrcweir 1490cdf0e10cSrcweir FlushConfiguration(); 1491cdf0e10cSrcweir 1492cdf0e10cSrcweir switch( nError & EXC_MAJORTYPE ) 1493cdf0e10cSrcweir { 1494cdf0e10cSrcweir case EXC_RSCNOTLOADED: 1495cdf0e10cSrcweir { 1496cdf0e10cSrcweir String aResExceptionString; 1497cdf0e10cSrcweir Application::Abort( aResExceptionString ); 1498cdf0e10cSrcweir break; 1499cdf0e10cSrcweir } 1500cdf0e10cSrcweir 1501cdf0e10cSrcweir case EXC_SYSOBJNOTCREATED: 1502cdf0e10cSrcweir { 1503cdf0e10cSrcweir String aSysResExceptionString; 1504cdf0e10cSrcweir Application::Abort( aSysResExceptionString ); 1505cdf0e10cSrcweir break; 1506cdf0e10cSrcweir } 1507cdf0e10cSrcweir 1508cdf0e10cSrcweir default: 1509cdf0e10cSrcweir { 1510cdf0e10cSrcweir if (m_pLockfile != NULL) { 1511cdf0e10cSrcweir m_pLockfile->clean(); 1512cdf0e10cSrcweir } 1513cdf0e10cSrcweir if( bRestart ) 1514cdf0e10cSrcweir { 1515cdf0e10cSrcweir OfficeIPCThread::DisableOfficeIPCThread(); 1516cdf0e10cSrcweir if( pSignalHandler ) 1517cdf0e10cSrcweir DELETEZ( pSignalHandler ); 1518cdf0e10cSrcweir restartOnMac(false); 1519cdf0e10cSrcweir _exit( ExitHelper::E_CRASH_WITH_RESTART ); 1520cdf0e10cSrcweir } 1521cdf0e10cSrcweir else 1522cdf0e10cSrcweir { 1523cdf0e10cSrcweir Application::Abort( String() ); 1524cdf0e10cSrcweir } 1525cdf0e10cSrcweir 1526cdf0e10cSrcweir break; 1527cdf0e10cSrcweir } 1528cdf0e10cSrcweir } 1529cdf0e10cSrcweir 1530cdf0e10cSrcweir OSL_ASSERT(false); // unreachable 1531cdf0e10cSrcweir return 0; 1532cdf0e10cSrcweir } 1533cdf0e10cSrcweir 1534cdf0e10cSrcweir void Desktop::AppEvent( const ApplicationEvent& rAppEvent ) 1535cdf0e10cSrcweir { 1536cdf0e10cSrcweir HandleAppEvent( rAppEvent ); 1537cdf0e10cSrcweir } 1538cdf0e10cSrcweir 1539cdf0e10cSrcweir struct ExecuteGlobals 1540cdf0e10cSrcweir { 1541cdf0e10cSrcweir Reference < css::document::XEventListener > xGlobalBroadcaster; 1542cdf0e10cSrcweir sal_Bool bRestartRequested; 1543cdf0e10cSrcweir sal_Bool bUseSystemFileDialog; 1544cdf0e10cSrcweir std::auto_ptr<SvtLanguageOptions> pLanguageOptions; 1545cdf0e10cSrcweir std::auto_ptr<SvtPathOptions> pPathOptions; 1546cdf0e10cSrcweir 1547cdf0e10cSrcweir ExecuteGlobals() 1548cdf0e10cSrcweir : bRestartRequested( sal_False ) 1549cdf0e10cSrcweir , bUseSystemFileDialog( sal_True ) 1550cdf0e10cSrcweir {} 1551cdf0e10cSrcweir }; 1552cdf0e10cSrcweir 1553cdf0e10cSrcweir static ExecuteGlobals* pExecGlobals = NULL; 1554cdf0e10cSrcweir 1555cdf0e10cSrcweir void Desktop::Main() 1556cdf0e10cSrcweir { 1557cdf0e10cSrcweir pExecGlobals = new ExecuteGlobals(); 1558cdf0e10cSrcweir 1559cdf0e10cSrcweir RTL_LOGFILE_CONTEXT( aLog, "desktop (cd100003) ::Desktop::Main" ); 1560cdf0e10cSrcweir 1561cdf0e10cSrcweir // Remember current context object 1562cdf0e10cSrcweir com::sun::star::uno::ContextLayer layer( 1563cdf0e10cSrcweir com::sun::star::uno::getCurrentContext() ); 1564cdf0e10cSrcweir 1565cdf0e10cSrcweir BootstrapError eError = GetBootstrapError(); 1566cdf0e10cSrcweir if ( eError != BE_OK ) 1567cdf0e10cSrcweir { 1568cdf0e10cSrcweir HandleBootstrapErrors( eError ); 1569cdf0e10cSrcweir return; 1570cdf0e10cSrcweir } 1571cdf0e10cSrcweir 1572cdf0e10cSrcweir BootstrapStatus eStatus = GetBootstrapStatus(); 1573cdf0e10cSrcweir if (eStatus == BS_TERMINATE) { 1574cdf0e10cSrcweir return; 1575cdf0e10cSrcweir } 1576cdf0e10cSrcweir 1577cdf0e10cSrcweir // Detect desktop environment - need to do this as early as possible 1578cdf0e10cSrcweir com::sun::star::uno::setCurrentContext( 1579cdf0e10cSrcweir new DesktopContext( com::sun::star::uno::getCurrentContext() ) ); 1580cdf0e10cSrcweir 1581cdf0e10cSrcweir CommandLineArgs* pCmdLineArgs = GetCommandLineArgs(); 1582cdf0e10cSrcweir 1583cdf0e10cSrcweir // setup configuration error handling 1584cdf0e10cSrcweir ConfigurationErrorHandler aConfigErrHandler; 1585cdf0e10cSrcweir if (!ShouldSuppressUI(pCmdLineArgs)) 1586cdf0e10cSrcweir aConfigErrHandler.activate(); 1587cdf0e10cSrcweir 1588cdf0e10cSrcweir ResMgr::SetReadStringHook( ReplaceStringHookProc ); 1589cdf0e10cSrcweir 1590cdf0e10cSrcweir // Startup screen 1591cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "desktop (lo119109) Desktop::Main { OpenSplashScreen" ); 1592cdf0e10cSrcweir OpenSplashScreen(); 1593cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "desktop (lo119109) Desktop::Main } OpenSplashScreen" ); 1594cdf0e10cSrcweir 1595cdf0e10cSrcweir { 1596cdf0e10cSrcweir UserInstall::UserInstallError instErr_fin = UserInstall::finalize(); 1597cdf0e10cSrcweir if ( instErr_fin != UserInstall::E_None) 1598cdf0e10cSrcweir { 1599cdf0e10cSrcweir OSL_ENSURE(sal_False, "userinstall failed"); 1600cdf0e10cSrcweir if ( instErr_fin == UserInstall::E_NoDiskSpace ) 1601cdf0e10cSrcweir HandleBootstrapErrors( BE_USERINSTALL_NOTENOUGHDISKSPACE ); 1602cdf0e10cSrcweir else if ( instErr_fin == UserInstall::E_NoWriteAccess ) 1603cdf0e10cSrcweir HandleBootstrapErrors( BE_USERINSTALL_NOWRITEACCESS ); 1604cdf0e10cSrcweir else 1605cdf0e10cSrcweir HandleBootstrapErrors( BE_USERINSTALL_FAILED ); 1606cdf0e10cSrcweir return; 1607cdf0e10cSrcweir } 1608cdf0e10cSrcweir // refresh path information 1609cdf0e10cSrcweir utl::Bootstrap::reloadData(); 1610cdf0e10cSrcweir SetSplashScreenProgress(25); 1611cdf0e10cSrcweir } 1612cdf0e10cSrcweir 1613cdf0e10cSrcweir Reference< XMultiServiceFactory > xSMgr = 1614cdf0e10cSrcweir ::comphelper::getProcessServiceFactory(); 1615cdf0e10cSrcweir 1616cdf0e10cSrcweir Reference< ::com::sun::star::task::XRestartManager > xRestartManager; 1617cdf0e10cSrcweir int nAcquireCount( 0 ); 1618cdf0e10cSrcweir try 1619cdf0e10cSrcweir { 1620cdf0e10cSrcweir RegisterServices( xSMgr ); 1621cdf0e10cSrcweir 1622cdf0e10cSrcweir //SetSplashScreenProgress(15); 1623cdf0e10cSrcweir 1624cdf0e10cSrcweir #ifndef UNX 1625cdf0e10cSrcweir if ( pCmdLineArgs->IsHelp() ) { 1626cdf0e10cSrcweir displayCmdlineHelp(); 1627cdf0e10cSrcweir return; 1628cdf0e10cSrcweir } 1629cdf0e10cSrcweir #endif 1630cdf0e10cSrcweir 1631cdf0e10cSrcweir // check user installation directory for lockfile so we can be sure 1632cdf0e10cSrcweir // there is no other instance using our data files from a remote host 1633cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "desktop (lo119109) Desktop::Main -> Lockfile" ); 1634cdf0e10cSrcweir m_pLockfile = new Lockfile; 1635cdf0e10cSrcweir if ( !pCmdLineArgs->IsHeadless() && !pCmdLineArgs->IsInvisible() && 1636cdf0e10cSrcweir !pCmdLineArgs->IsNoLockcheck() && !m_pLockfile->check( Lockfile_execWarning )) { 1637cdf0e10cSrcweir // Lockfile exists, and user clicked 'no' 1638cdf0e10cSrcweir return; 1639cdf0e10cSrcweir } 1640cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "desktop (lo119109) Desktop::Main <- Lockfile" ); 1641cdf0e10cSrcweir 1642cdf0e10cSrcweir // check if accessibility is enabled but not working and allow to quit 1643cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "{ GetEnableATToolSupport" ); 1644cdf0e10cSrcweir if( Application::GetSettings().GetMiscSettings().GetEnableATToolSupport() ) 1645cdf0e10cSrcweir { 1646cdf0e10cSrcweir sal_Bool bQuitApp; 1647cdf0e10cSrcweir 1648cdf0e10cSrcweir if( !InitAccessBridge( true, bQuitApp ) ) 1649cdf0e10cSrcweir if( bQuitApp ) 1650cdf0e10cSrcweir return; 1651cdf0e10cSrcweir } 1652cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "} GetEnableATToolSupport" ); 1653cdf0e10cSrcweir 1654cdf0e10cSrcweir // terminate if requested... 1655cdf0e10cSrcweir if( pCmdLineArgs->IsTerminateAfterInit() ) return; 1656cdf0e10cSrcweir 1657cdf0e10cSrcweir 1658cdf0e10cSrcweir // Read the common configuration items for optimization purpose 1659cdf0e10cSrcweir if ( !InitializeConfiguration() ) return; 1660cdf0e10cSrcweir 1661cdf0e10cSrcweir //SetSplashScreenProgress(20); 1662cdf0e10cSrcweir 1663cdf0e10cSrcweir // set static variable to enabled/disable crash reporter 1664cdf0e10cSrcweir retrieveCrashReporterState(); 1665cdf0e10cSrcweir if ( !isCrashReporterEnabled() ) 1666cdf0e10cSrcweir { 1667cdf0e10cSrcweir osl_setErrorReporting( sal_False ); 1668cdf0e10cSrcweir // disable stack trace feature 1669cdf0e10cSrcweir } 1670cdf0e10cSrcweir 1671cdf0e10cSrcweir // create title string 1672cdf0e10cSrcweir sal_Bool bCheckOk = sal_False; 1673cdf0e10cSrcweir ::com::sun::star::lang::Locale aLocale; 1674cdf0e10cSrcweir String aMgrName = String::CreateFromAscii( "ofa" ); 1675cdf0e10cSrcweir ResMgr* pLabelResMgr = ResMgr::SearchCreateResMgr( U2S( aMgrName ), aLocale ); 1676cdf0e10cSrcweir String aTitle = pLabelResMgr ? String( ResId( RID_APPTITLE, *pLabelResMgr ) ) : String(); 1677cdf0e10cSrcweir delete pLabelResMgr; 1678cdf0e10cSrcweir 1679cdf0e10cSrcweir // Check for StarOffice/Suite specific extensions runs also with OpenOffice installation sets 1680cdf0e10cSrcweir OUString aTitleString( aTitle ); 1681cdf0e10cSrcweir bCheckOk = CheckInstallation( aTitleString ); 1682cdf0e10cSrcweir if ( !bCheckOk ) 1683cdf0e10cSrcweir return; 1684cdf0e10cSrcweir else 1685cdf0e10cSrcweir aTitle = aTitleString; 1686cdf0e10cSrcweir 1687cdf0e10cSrcweir #ifdef DBG_UTIL 1688cdf0e10cSrcweir //include version ID in non product builds 1689cdf0e10cSrcweir ::rtl::OUString aDefault; 1690cdf0e10cSrcweir aTitle += DEFINE_CONST_UNICODE(" ["); 1691cdf0e10cSrcweir String aVerId( utl::Bootstrap::getBuildIdData( aDefault )); 1692cdf0e10cSrcweir aTitle += aVerId; 1693cdf0e10cSrcweir aTitle += ']'; 1694cdf0e10cSrcweir #endif 1695cdf0e10cSrcweir 1696cdf0e10cSrcweir SetDisplayName( aTitle ); 1697cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "{ create SvtPathOptions and SvtLanguageOptions" ); 1698cdf0e10cSrcweir pExecGlobals->pPathOptions.reset( new SvtPathOptions); 1699cdf0e10cSrcweir SetSplashScreenProgress(40); 1700cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "} create SvtPathOptions and SvtLanguageOptions" ); 1701cdf0e10cSrcweir 1702cdf0e10cSrcweir // Check special env variable #111015# 1703cdf0e10cSrcweir std::vector< String > aUnrestrictedFolders; 1704cdf0e10cSrcweir svt::getUnrestrictedFolders( aUnrestrictedFolders ); 1705cdf0e10cSrcweir 1706cdf0e10cSrcweir if ( aUnrestrictedFolders.size() > 0 ) 1707cdf0e10cSrcweir { 1708cdf0e10cSrcweir // Set different working directory. The first entry is 1709cdf0e10cSrcweir // the new work path. 1710cdf0e10cSrcweir String aWorkPath = aUnrestrictedFolders[0]; 1711cdf0e10cSrcweir SvtPathOptions().SetWorkPath( aWorkPath ); 1712cdf0e10cSrcweir } 1713cdf0e10cSrcweir 1714cdf0e10cSrcweir // create service for loadin SFX (still needed in startup) 1715cdf0e10cSrcweir pExecGlobals->xGlobalBroadcaster = Reference < css::document::XEventListener > 1716cdf0e10cSrcweir ( xSMgr->createInstance( 1717cdf0e10cSrcweir DEFINE_CONST_UNICODE( "com.sun.star.frame.GlobalEventBroadcaster" ) ), UNO_QUERY ); 1718cdf0e10cSrcweir 1719cdf0e10cSrcweir /* ensure existance of a default window that messages can be dispatched to 1720cdf0e10cSrcweir This is for the benefit of testtool which uses PostUserEvent extensively 1721cdf0e10cSrcweir and else can deadlock while creating this window from another tread while 1722cdf0e10cSrcweir the main thread is not yet in the event loop. 1723cdf0e10cSrcweir */ 1724cdf0e10cSrcweir Application::GetDefaultDevice(); 1725cdf0e10cSrcweir 1726cdf0e10cSrcweir // initialize test-tool library (if available) 1727cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "{ tools::InitTestToolLib" ); 1728cdf0e10cSrcweir tools::InitTestToolLib(); 1729cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "} tools::InitTestToolLib" ); 1730cdf0e10cSrcweir 1731cdf0e10cSrcweir // Check if bundled or shared extensions were added /removed 1732cdf0e10cSrcweir // and process those extensions (has to be done before checking 1733cdf0e10cSrcweir // the extension dependencies! 1734cdf0e10cSrcweir SynchronizeExtensionRepositories(); 1735cdf0e10cSrcweir bool bAbort = CheckExtensionDependencies(); 1736cdf0e10cSrcweir if ( bAbort ) 1737cdf0e10cSrcweir return; 1738cdf0e10cSrcweir 1739cdf0e10cSrcweir { 1740cdf0e10cSrcweir ::comphelper::ComponentContext aContext( xSMgr ); 1741cdf0e10cSrcweir xRestartManager.set( aContext.getSingleton( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.task.OfficeRestartManager" ) ) ), UNO_QUERY ); 1742cdf0e10cSrcweir } 1743cdf0e10cSrcweir 1744cdf0e10cSrcweir // check whether the shutdown is caused by restart 1745cdf0e10cSrcweir pExecGlobals->bRestartRequested = ( xRestartManager.is() && xRestartManager->isRestartRequested( sal_True ) ); 1746cdf0e10cSrcweir 1747cdf0e10cSrcweir // First Start Wizard allowed ? 1748cdf0e10cSrcweir if ( ! pCmdLineArgs->IsNoFirstStartWizard() && !pExecGlobals->bRestartRequested ) 1749cdf0e10cSrcweir { 1750cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "{ FirstStartWizard" ); 1751cdf0e10cSrcweir 1752cdf0e10cSrcweir if (IsFirstStartWizardNeeded()) 1753cdf0e10cSrcweir { 1754cdf0e10cSrcweir ::utl::RegOptions().removeReminder(); // remove patch registration reminder 1755cdf0e10cSrcweir Reference< XJob > xFirstStartJob( xSMgr->createInstance( 1756cdf0e10cSrcweir DEFINE_CONST_UNICODE( "com.sun.star.comp.desktop.FirstStart" ) ), UNO_QUERY ); 1757cdf0e10cSrcweir if (xFirstStartJob.is()) 1758cdf0e10cSrcweir { 1759288ab9e2SHerbert Dürr #if 0 // license acceptance is not needed for ASL 1760cdf0e10cSrcweir sal_Bool bDone = sal_False; 1761cdf0e10cSrcweir Sequence< NamedValue > lArgs(2); 1762cdf0e10cSrcweir lArgs[0].Name = ::rtl::OUString::createFromAscii("LicenseNeedsAcceptance"); 1763cdf0e10cSrcweir lArgs[0].Value <<= LicenseNeedsAcceptance(); 1764cdf0e10cSrcweir lArgs[1].Name = ::rtl::OUString::createFromAscii("LicensePath"); 1765cdf0e10cSrcweir lArgs[1].Value <<= GetLicensePath(); 1766cdf0e10cSrcweir 1767cdf0e10cSrcweir xFirstStartJob->execute(lArgs) >>= bDone; 1768cdf0e10cSrcweir if ( !bDone ) 1769cdf0e10cSrcweir { 1770cdf0e10cSrcweir return; 1771cdf0e10cSrcweir } 1772288ab9e2SHerbert Dürr #endif // license acceptance is not needed for ASL 1773cdf0e10cSrcweir } 1774cdf0e10cSrcweir } 1775cdf0e10cSrcweir 1776cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "} FirstStartWizard" ); 1777cdf0e10cSrcweir } 1778cdf0e10cSrcweir 1779cdf0e10cSrcweir // keep a language options instance... 1780cdf0e10cSrcweir pExecGlobals->pLanguageOptions.reset( new SvtLanguageOptions(sal_True)); 1781cdf0e10cSrcweir 1782cdf0e10cSrcweir if (pExecGlobals->xGlobalBroadcaster.is()) 1783cdf0e10cSrcweir { 1784cdf0e10cSrcweir css::document::EventObject aEvent; 1785cdf0e10cSrcweir aEvent.EventName = ::rtl::OUString::createFromAscii("OnStartApp"); 1786cdf0e10cSrcweir pExecGlobals->xGlobalBroadcaster->notifyEvent(aEvent); 1787cdf0e10cSrcweir } 1788cdf0e10cSrcweir 1789cdf0e10cSrcweir SetSplashScreenProgress(50); 1790cdf0e10cSrcweir 1791cdf0e10cSrcweir // Backing Component 1792cdf0e10cSrcweir sal_Bool bCrashed = sal_False; 1793cdf0e10cSrcweir sal_Bool bExistsRecoveryData = sal_False; 1794cdf0e10cSrcweir sal_Bool bExistsSessionData = sal_False; 1795cdf0e10cSrcweir 1796cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "{ impl_checkRecoveryState" ); 1797cdf0e10cSrcweir impl_checkRecoveryState(bCrashed, bExistsRecoveryData, bExistsSessionData); 1798cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "} impl_checkRecoveryState" ); 1799cdf0e10cSrcweir 1800cdf0e10cSrcweir { 1801cdf0e10cSrcweir ::comphelper::ComponentContext aContext( xSMgr ); 1802cdf0e10cSrcweir xRestartManager.set( aContext.getSingleton( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.task.OfficeRestartManager" ) ) ), UNO_QUERY ); 1803cdf0e10cSrcweir } 1804cdf0e10cSrcweir 1805cdf0e10cSrcweir // check whether the shutdown is caused by restart 1806cdf0e10cSrcweir pExecGlobals->bRestartRequested = ( xRestartManager.is() && xRestartManager->isRestartRequested( sal_True ) ); 1807cdf0e10cSrcweir 1808cdf0e10cSrcweir if ( pCmdLineArgs->IsHeadless() ) 1809cdf0e10cSrcweir { 1810cdf0e10cSrcweir // Ensure that we use not the system file dialogs as 1811cdf0e10cSrcweir // headless mode relies on Application::EnableHeadlessMode() 1812cdf0e10cSrcweir // which does only work for VCL dialogs!! 1813cdf0e10cSrcweir SvtMiscOptions aMiscOptions; 1814cdf0e10cSrcweir pExecGlobals->bUseSystemFileDialog = aMiscOptions.UseSystemFileDialog(); 1815cdf0e10cSrcweir aMiscOptions.SetUseSystemFileDialog( sal_False ); 1816cdf0e10cSrcweir } 1817cdf0e10cSrcweir 1818cdf0e10cSrcweir if ( !pExecGlobals->bRestartRequested ) 1819cdf0e10cSrcweir { 1820cdf0e10cSrcweir if ((!pCmdLineArgs->WantsToLoadDocument() && !pCmdLineArgs->IsInvisible() && !pCmdLineArgs->IsHeadless() ) && 1821cdf0e10cSrcweir (SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SSTARTMODULE)) && 1822cdf0e10cSrcweir (!bExistsRecoveryData ) && 1823cdf0e10cSrcweir (!bExistsSessionData ) && 1824cdf0e10cSrcweir (!Application::AnyInput( INPUT_APPEVENT ) )) 1825cdf0e10cSrcweir { 1826cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "{ create BackingComponent" ); 1827cdf0e10cSrcweir Reference< XFrame > xDesktopFrame( xSMgr->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.Desktop" ))), UNO_QUERY ); 1828cdf0e10cSrcweir if (xDesktopFrame.is()) 1829cdf0e10cSrcweir { 1830cdf0e10cSrcweir Reference< XFrame > xBackingFrame; 1831cdf0e10cSrcweir Reference< ::com::sun::star::awt::XWindow > xContainerWindow; 1832cdf0e10cSrcweir 1833cdf0e10cSrcweir xBackingFrame = xDesktopFrame->findFrame(OUString( RTL_CONSTASCII_USTRINGPARAM( "_blank" )), 0); 1834cdf0e10cSrcweir if (xBackingFrame.is()) 1835cdf0e10cSrcweir xContainerWindow = xBackingFrame->getContainerWindow(); 1836cdf0e10cSrcweir if (xContainerWindow.is()) 1837cdf0e10cSrcweir { 1838cdf0e10cSrcweir // set the WB_EXT_DOCUMENT style. Normally, this is done by the TaskCreator service when a "_blank" 1839cdf0e10cSrcweir // frame/window is created. Since we do not use the TaskCreator here, we need to mimic its behavior, 1840cdf0e10cSrcweir // otherwise documents loaded into this frame will later on miss functionality depending on the style. 1841cdf0e10cSrcweir Window* pContainerWindow = VCLUnoHelper::GetWindow( xContainerWindow ); 1842cdf0e10cSrcweir OSL_ENSURE( pContainerWindow, "Desktop::Main: no implementation access to the frame's container window!" ); 1843cdf0e10cSrcweir pContainerWindow->SetExtendedStyle( pContainerWindow->GetExtendedStyle() | WB_EXT_DOCUMENT ); 1844cdf0e10cSrcweir 1845cdf0e10cSrcweir SetSplashScreenProgress(75); 1846cdf0e10cSrcweir Sequence< Any > lArgs(1); 1847cdf0e10cSrcweir lArgs[0] <<= xContainerWindow; 1848cdf0e10cSrcweir 1849cdf0e10cSrcweir Reference< XController > xBackingComp( 1850cdf0e10cSrcweir xSMgr->createInstanceWithArguments(OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.StartModule") ), lArgs), UNO_QUERY); 1851cdf0e10cSrcweir if (xBackingComp.is()) 1852cdf0e10cSrcweir { 1853cdf0e10cSrcweir Reference< ::com::sun::star::awt::XWindow > xBackingWin(xBackingComp, UNO_QUERY); 1854cdf0e10cSrcweir // Attention: You MUST(!) call setComponent() before you call attachFrame(). 1855cdf0e10cSrcweir // Because the backing component set the property "IsBackingMode" of the frame 1856cdf0e10cSrcweir // to true inside attachFrame(). But setComponent() reset this state everytimes ... 1857cdf0e10cSrcweir xBackingFrame->setComponent(xBackingWin, xBackingComp); 1858cdf0e10cSrcweir SetSplashScreenProgress(100); 1859cdf0e10cSrcweir xBackingComp->attachFrame(xBackingFrame); 1860cdf0e10cSrcweir CloseSplashScreen(); 1861cdf0e10cSrcweir xContainerWindow->setVisible(sal_True); 1862cdf0e10cSrcweir } 1863cdf0e10cSrcweir } 1864cdf0e10cSrcweir } 1865cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "} create BackingComponent" ); 1866cdf0e10cSrcweir } 1867cdf0e10cSrcweir } 1868cdf0e10cSrcweir } 1869cdf0e10cSrcweir catch ( com::sun::star::lang::WrappedTargetException& wte ) 1870cdf0e10cSrcweir { 1871cdf0e10cSrcweir com::sun::star::uno::Exception te; 1872cdf0e10cSrcweir wte.TargetException >>= te; 1873cdf0e10cSrcweir FatalError( MakeStartupConfigAccessErrorMessage(wte.Message + te.Message) ); 1874cdf0e10cSrcweir return; 1875cdf0e10cSrcweir } 1876cdf0e10cSrcweir catch ( com::sun::star::uno::Exception& e ) 1877cdf0e10cSrcweir { 1878cdf0e10cSrcweir FatalError( MakeStartupErrorMessage(e.Message) ); 1879cdf0e10cSrcweir return; 1880cdf0e10cSrcweir } 1881cdf0e10cSrcweir 1882cdf0e10cSrcweir SvtFontSubstConfig().Apply(); 1883cdf0e10cSrcweir 1884cdf0e10cSrcweir SvtTabAppearanceCfg aAppearanceCfg; 1885cdf0e10cSrcweir aAppearanceCfg.SetInitialized(); 1886cdf0e10cSrcweir aAppearanceCfg.SetApplicationDefaults( this ); 1887cdf0e10cSrcweir SvtAccessibilityOptions aOptions; 1888cdf0e10cSrcweir aOptions.SetVCLSettings(); 1889cdf0e10cSrcweir 1890cdf0e10cSrcweir if ( !pExecGlobals->bRestartRequested ) 1891cdf0e10cSrcweir { 1892cdf0e10cSrcweir Application::SetFilterHdl( LINK( this, Desktop, ImplInitFilterHdl ) ); 1893cdf0e10cSrcweir sal_Bool bTerminateRequested = sal_False; 1894cdf0e10cSrcweir 1895cdf0e10cSrcweir // Preload function depends on an initialized sfx application! 1896cdf0e10cSrcweir SetSplashScreenProgress(75); 1897cdf0e10cSrcweir 1898cdf0e10cSrcweir // use system window dialogs 1899cdf0e10cSrcweir Application::SetSystemWindowMode( SYSTEMWINDOW_MODE_DIALOG ); 1900cdf0e10cSrcweir 1901cdf0e10cSrcweir // SetSplashScreenProgress(80); 1902cdf0e10cSrcweir 1903cdf0e10cSrcweir if ( !bTerminateRequested && !pCmdLineArgs->IsInvisible() && 1904cdf0e10cSrcweir !pCmdLineArgs->IsNoQuickstart() ) 1905cdf0e10cSrcweir InitializeQuickstartMode( xSMgr ); 1906cdf0e10cSrcweir 1907cdf0e10cSrcweir RTL_LOGFILE_CONTEXT( aLog2, "desktop (cd100003) createInstance com.sun.star.frame.Desktop" ); 1908cdf0e10cSrcweir try 1909cdf0e10cSrcweir { 1910cdf0e10cSrcweir Reference< XDesktop > xDesktop( xSMgr->createInstance( 1911cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.Desktop" ))), UNO_QUERY ); 1912cdf0e10cSrcweir if ( xDesktop.is() ) 1913cdf0e10cSrcweir xDesktop->addTerminateListener( new OfficeIPCThreadController ); 1914cdf0e10cSrcweir SetSplashScreenProgress(100); 1915cdf0e10cSrcweir } 1916cdf0e10cSrcweir catch ( com::sun::star::uno::Exception& e ) 1917cdf0e10cSrcweir { 1918cdf0e10cSrcweir FatalError( MakeStartupErrorMessage(e.Message) ); 1919cdf0e10cSrcweir return; 1920cdf0e10cSrcweir } 1921cdf0e10cSrcweir 1922cdf0e10cSrcweir // Post user event to startup first application component window 1923cdf0e10cSrcweir // We have to send this OpenClients message short before execute() to 1924cdf0e10cSrcweir // minimize the risk that this message overtakes type detection contruction!! 1925cdf0e10cSrcweir Application::PostUserEvent( LINK( this, Desktop, OpenClients_Impl ) ); 1926cdf0e10cSrcweir 1927cdf0e10cSrcweir // Post event to enable acceptors 1928cdf0e10cSrcweir Application::PostUserEvent( LINK( this, Desktop, EnableAcceptors_Impl) ); 1929cdf0e10cSrcweir 1930cdf0e10cSrcweir // The configuration error handler currently is only for startup 1931cdf0e10cSrcweir aConfigErrHandler.deactivate(); 1932cdf0e10cSrcweir 1933cdf0e10cSrcweir // Acquire solar mutex just before we enter our message loop 1934cdf0e10cSrcweir if ( nAcquireCount ) 1935cdf0e10cSrcweir Application::AcquireSolarMutex( nAcquireCount ); 1936cdf0e10cSrcweir 1937cdf0e10cSrcweir // call Application::Execute to process messages in vcl message loop 1938cdf0e10cSrcweir RTL_LOGFILE_PRODUCT_TRACE( "PERFORMANCE - enter Application::Execute()" ); 1939cdf0e10cSrcweir 1940cdf0e10cSrcweir try 1941cdf0e10cSrcweir { 1942cdf0e10cSrcweir // The JavaContext contains an interaction handler which is used when 1943cdf0e10cSrcweir // the creation of a Java Virtual Machine fails 1944cdf0e10cSrcweir com::sun::star::uno::ContextLayer layer2( 1945cdf0e10cSrcweir new svt::JavaContext( com::sun::star::uno::getCurrentContext() ) ); 1946cdf0e10cSrcweir 1947cdf0e10cSrcweir // check whether the shutdown is caused by restart just before entering the Execute 1948cdf0e10cSrcweir pExecGlobals->bRestartRequested = pExecGlobals->bRestartRequested || ( xRestartManager.is() && xRestartManager->isRestartRequested( sal_True ) ); 1949cdf0e10cSrcweir 1950cdf0e10cSrcweir if ( !pExecGlobals->bRestartRequested ) 1951cdf0e10cSrcweir { 1952cdf0e10cSrcweir // if this run of the office is triggered by restart, some additional actions should be done 1953cdf0e10cSrcweir DoRestartActionsIfNecessary( !pCmdLineArgs->IsInvisible() && !pCmdLineArgs->IsNoQuickstart() ); 1954cdf0e10cSrcweir 1955cdf0e10cSrcweir Execute(); 1956cdf0e10cSrcweir } 1957cdf0e10cSrcweir } 1958cdf0e10cSrcweir catch(const com::sun::star::document::CorruptedFilterConfigurationException& exFilterCfg) 1959cdf0e10cSrcweir { 1960cdf0e10cSrcweir OfficeIPCThread::SetDowning(); 1961cdf0e10cSrcweir FatalError( MakeStartupErrorMessage(exFilterCfg.Message) ); 1962cdf0e10cSrcweir } 1963cdf0e10cSrcweir catch(const com::sun::star::configuration::CorruptedConfigurationException& exAnyCfg) 1964cdf0e10cSrcweir { 1965cdf0e10cSrcweir OfficeIPCThread::SetDowning(); 1966cdf0e10cSrcweir FatalError( MakeStartupErrorMessage(exAnyCfg.Message) ); 1967cdf0e10cSrcweir } 1968cdf0e10cSrcweir } 1969cdf0e10cSrcweir // CAUTION: you do not necessarily get here e.g. on the Mac. 1970cdf0e10cSrcweir // please put all deinitialization code into doShutdown 1971cdf0e10cSrcweir doShutdown(); 1972cdf0e10cSrcweir } 1973cdf0e10cSrcweir 1974cdf0e10cSrcweir void Desktop::doShutdown() 1975cdf0e10cSrcweir { 1976cdf0e10cSrcweir if( ! pExecGlobals ) 1977cdf0e10cSrcweir return; 1978cdf0e10cSrcweir 1979cdf0e10cSrcweir if ( pExecGlobals->bRestartRequested ) 1980cdf0e10cSrcweir SetRestartState(); 1981cdf0e10cSrcweir 1982cdf0e10cSrcweir if (pExecGlobals->xGlobalBroadcaster.is()) 1983cdf0e10cSrcweir { 1984cdf0e10cSrcweir css::document::EventObject aEvent; 1985cdf0e10cSrcweir aEvent.EventName = ::rtl::OUString::createFromAscii("OnCloseApp"); 1986cdf0e10cSrcweir pExecGlobals->xGlobalBroadcaster->notifyEvent(aEvent); 1987cdf0e10cSrcweir } 1988cdf0e10cSrcweir 1989cdf0e10cSrcweir delete pResMgr, pResMgr = NULL; 1990cdf0e10cSrcweir // Restore old value 1991cdf0e10cSrcweir CommandLineArgs* pCmdLineArgs = GetCommandLineArgs(); 1992cdf0e10cSrcweir if ( pCmdLineArgs->IsHeadless() ) 1993cdf0e10cSrcweir SvtMiscOptions().SetUseSystemFileDialog( pExecGlobals->bUseSystemFileDialog ); 1994cdf0e10cSrcweir 1995cdf0e10cSrcweir // remove temp directory 1996cdf0e10cSrcweir RemoveTemporaryDirectory(); 1997cdf0e10cSrcweir FlushConfiguration(); 1998cdf0e10cSrcweir // The acceptors in the AcceptorMap must be released (in DeregisterServices) 1999cdf0e10cSrcweir // with the solar mutex unlocked, to avoid deadlock: 2000cdf0e10cSrcweir sal_uLong nAcquireCount = Application::ReleaseSolarMutex(); 2001cdf0e10cSrcweir DeregisterServices(); 2002cdf0e10cSrcweir Application::AcquireSolarMutex(nAcquireCount); 2003cdf0e10cSrcweir tools::DeInitTestToolLib(); 2004cdf0e10cSrcweir // be sure that path/language options gets destroyed before 2005cdf0e10cSrcweir // UCB is deinitialized 2006cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "-> dispose path/language options" ); 2007cdf0e10cSrcweir pExecGlobals->pLanguageOptions.reset( 0 ); 2008cdf0e10cSrcweir pExecGlobals->pPathOptions.reset( 0 ); 2009cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "<- dispose path/language options" ); 2010cdf0e10cSrcweir 2011cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "-> deinit ucb" ); 2012cdf0e10cSrcweir ::ucbhelper::ContentBroker::deinitialize(); 2013cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "<- deinit ucb" ); 2014cdf0e10cSrcweir 2015cdf0e10cSrcweir sal_Bool bRR = pExecGlobals->bRestartRequested; 2016cdf0e10cSrcweir delete pExecGlobals, pExecGlobals = NULL; 2017cdf0e10cSrcweir 2018cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE( aLog, "FINISHED WITH Destop::Main" ); 2019cdf0e10cSrcweir if ( bRR ) 2020cdf0e10cSrcweir { 2021cdf0e10cSrcweir restartOnMac(true); 2022cdf0e10cSrcweir // wouldn't the solution be more clean if SalMain returns the exit code to the system? 2023cdf0e10cSrcweir _exit( ExitHelper::E_NORMAL_RESTART ); 2024cdf0e10cSrcweir } 2025cdf0e10cSrcweir } 2026cdf0e10cSrcweir 2027cdf0e10cSrcweir IMPL_LINK( Desktop, ImplInitFilterHdl, ConvertData*, pData ) 2028cdf0e10cSrcweir { 2029cdf0e10cSrcweir return GraphicFilter::GetGraphicFilter()->GetFilterCallback().Call( pData ); 2030cdf0e10cSrcweir } 2031cdf0e10cSrcweir 2032cdf0e10cSrcweir sal_Bool Desktop::InitializeConfiguration() 2033cdf0e10cSrcweir { 2034cdf0e10cSrcweir sal_Bool bOk = sal_False; 2035cdf0e10cSrcweir 2036cdf0e10cSrcweir try 2037cdf0e10cSrcweir { 2038cdf0e10cSrcweir bOk = InitConfiguration(); 2039cdf0e10cSrcweir } 2040cdf0e10cSrcweir catch( ::com::sun::star::lang::ServiceNotRegisteredException& ) 2041cdf0e10cSrcweir { 2042cdf0e10cSrcweir this->HandleBootstrapErrors( Desktop::BE_UNO_SERVICE_CONFIG_MISSING ); 2043cdf0e10cSrcweir } 2044cdf0e10cSrcweir catch( ::com::sun::star::configuration::MissingBootstrapFileException& e ) 2045cdf0e10cSrcweir { 2046cdf0e10cSrcweir OUString aMsg( CreateErrorMsgString( utl::Bootstrap::MISSING_BOOTSTRAP_FILE, 2047cdf0e10cSrcweir e.BootstrapFileURL )); 2048cdf0e10cSrcweir HandleBootstrapPathErrors( ::utl::Bootstrap::INVALID_USER_INSTALL, aMsg ); 2049cdf0e10cSrcweir } 2050cdf0e10cSrcweir catch( ::com::sun::star::configuration::InvalidBootstrapFileException& e ) 2051cdf0e10cSrcweir { 2052cdf0e10cSrcweir OUString aMsg( CreateErrorMsgString( utl::Bootstrap::INVALID_BOOTSTRAP_FILE_ENTRY, 2053cdf0e10cSrcweir e.BootstrapFileURL )); 2054cdf0e10cSrcweir HandleBootstrapPathErrors( ::utl::Bootstrap::INVALID_BASE_INSTALL, aMsg ); 2055cdf0e10cSrcweir } 2056cdf0e10cSrcweir catch( ::com::sun::star::configuration::InstallationIncompleteException& ) 2057cdf0e10cSrcweir { 2058cdf0e10cSrcweir OUString aVersionFileURL; 2059cdf0e10cSrcweir OUString aMsg; 2060cdf0e10cSrcweir utl::Bootstrap::PathStatus aPathStatus = utl::Bootstrap::locateVersionFile( aVersionFileURL ); 2061cdf0e10cSrcweir if ( aPathStatus == utl::Bootstrap::PATH_EXISTS ) 2062cdf0e10cSrcweir aMsg = CreateErrorMsgString( utl::Bootstrap::MISSING_VERSION_FILE_ENTRY, aVersionFileURL ); 2063cdf0e10cSrcweir else 2064cdf0e10cSrcweir aMsg = CreateErrorMsgString( utl::Bootstrap::MISSING_VERSION_FILE, aVersionFileURL ); 2065cdf0e10cSrcweir 2066cdf0e10cSrcweir HandleBootstrapPathErrors( ::utl::Bootstrap::MISSING_USER_INSTALL, aMsg ); 2067cdf0e10cSrcweir } 2068cdf0e10cSrcweir catch ( com::sun::star::configuration::backend::BackendAccessException& exception) 2069cdf0e10cSrcweir { 2070cdf0e10cSrcweir // [cm122549] It is assumed in this case that the message 2071cdf0e10cSrcweir // coming from InitConfiguration (in fact CreateApplicationConf...) 2072cdf0e10cSrcweir // is suitable for display directly. 2073cdf0e10cSrcweir FatalError( MakeStartupErrorMessage( exception.Message ) ); 2074cdf0e10cSrcweir } 2075cdf0e10cSrcweir catch ( com::sun::star::configuration::backend::BackendSetupException& exception) 2076cdf0e10cSrcweir { 2077cdf0e10cSrcweir // [cm122549] It is assumed in this case that the message 2078cdf0e10cSrcweir // coming from InitConfiguration (in fact CreateApplicationConf...) 2079cdf0e10cSrcweir // is suitable for display directly. 2080cdf0e10cSrcweir FatalError( MakeStartupErrorMessage( exception.Message ) ); 2081cdf0e10cSrcweir } 2082cdf0e10cSrcweir catch ( ::com::sun::star::configuration::CannotLoadConfigurationException& ) 2083cdf0e10cSrcweir { 2084cdf0e10cSrcweir OUString aMsg( CreateErrorMsgString( utl::Bootstrap::INVALID_BOOTSTRAP_DATA, 2085cdf0e10cSrcweir OUString() )); 2086cdf0e10cSrcweir HandleBootstrapPathErrors( ::utl::Bootstrap::INVALID_BASE_INSTALL, aMsg ); 2087cdf0e10cSrcweir } 2088cdf0e10cSrcweir catch( ::com::sun::star::uno::Exception& ) 2089cdf0e10cSrcweir { 2090cdf0e10cSrcweir OUString aMsg( CreateErrorMsgString( utl::Bootstrap::INVALID_BOOTSTRAP_DATA, 2091cdf0e10cSrcweir OUString() )); 2092cdf0e10cSrcweir HandleBootstrapPathErrors( ::utl::Bootstrap::INVALID_BASE_INSTALL, aMsg ); 2093cdf0e10cSrcweir } 2094cdf0e10cSrcweir 2095cdf0e10cSrcweir return bOk; 2096cdf0e10cSrcweir } 2097cdf0e10cSrcweir 2098cdf0e10cSrcweir void Desktop::FlushConfiguration() 2099cdf0e10cSrcweir { 2100cdf0e10cSrcweir Reference < XFlushable > xCFGFlush( ::utl::ConfigManager::GetConfigManager()->GetConfigurationProvider(), UNO_QUERY ); 2101cdf0e10cSrcweir if (xCFGFlush.is()) 2102cdf0e10cSrcweir { 2103cdf0e10cSrcweir xCFGFlush->flush(); 2104cdf0e10cSrcweir } 2105cdf0e10cSrcweir else 2106cdf0e10cSrcweir { 2107cdf0e10cSrcweir // because there is no method to flush the condiguration data, we must dispose the ConfigManager 2108cdf0e10cSrcweir Reference < XComponent > xCFGDispose( ::utl::ConfigManager::GetConfigManager()->GetConfigurationProvider(), UNO_QUERY ); 2109cdf0e10cSrcweir if (xCFGDispose.is()) 2110cdf0e10cSrcweir xCFGDispose->dispose(); 2111cdf0e10cSrcweir } 2112cdf0e10cSrcweir } 2113cdf0e10cSrcweir 2114cdf0e10cSrcweir sal_Bool Desktop::InitializeQuickstartMode( Reference< XMultiServiceFactory >& rSMgr ) 2115cdf0e10cSrcweir { 2116cdf0e10cSrcweir try 2117cdf0e10cSrcweir { 2118cdf0e10cSrcweir // the shutdown icon sits in the systray and allows the user to keep 2119cdf0e10cSrcweir // the office instance running for quicker restart 2120cdf0e10cSrcweir // this will only be activated if -quickstart was specified on cmdline 2121cdf0e10cSrcweir RTL_LOGFILE_CONTEXT( aLog, "desktop (cd100003) createInstance com.sun.star.office.Quickstart" ); 2122cdf0e10cSrcweir 2123cdf0e10cSrcweir sal_Bool bQuickstart = GetCommandLineArgs()->IsQuickstart(); 2124*2ad018beSPedro Giffuni if ( !bQuickstart ) 2125*2ad018beSPedro Giffuni { 2126*2ad018beSPedro Giffuni SfxItemSet aOptSet( SFX_APP()->GetPool(), SID_ATTR_QUICKLAUNCHER, SID_ATTR_QUICKLAUNCHER ); 2127*2ad018beSPedro Giffuni SFX_APP()->GetOptions(aOptSet); 2128*2ad018beSPedro Giffuni const SfxPoolItem* pItem; 2129*2ad018beSPedro Giffuni if ( SFX_ITEM_SET == aOptSet.GetItemState( SID_ATTR_QUICKLAUNCHER, sal_False, &pItem ) ) 2130*2ad018beSPedro Giffuni bQuickstart = ((const SfxBoolItem*)pItem)->GetValue(); 2131*2ad018beSPedro Giffuni } 2132*2ad018beSPedro Giffuni 2133cdf0e10cSrcweir Sequence< Any > aSeq( 1 ); 2134cdf0e10cSrcweir aSeq[0] <<= bQuickstart; 2135cdf0e10cSrcweir 2136cdf0e10cSrcweir // Try to instanciate quickstart service. This service is not mandatory, so 2137cdf0e10cSrcweir // do nothing if service is not available 2138cdf0e10cSrcweir 2139cdf0e10cSrcweir // #i105753# the following if was invented for performance 2140cdf0e10cSrcweir // unfortunately this broke the QUARTZ behavior which is to always run 2141cdf0e10cSrcweir // in quickstart mode since Mac applications do not usually quit 2142cdf0e10cSrcweir // when the last document closes 2143cdf0e10cSrcweir #ifndef QUARTZ 2144cdf0e10cSrcweir if ( bQuickstart ) 2145cdf0e10cSrcweir #endif 2146cdf0e10cSrcweir { 2147cdf0e10cSrcweir Reference < XComponent > xQuickstart( rSMgr->createInstanceWithArguments( 2148cdf0e10cSrcweir DEFINE_CONST_UNICODE( "com.sun.star.office.Quickstart" ), aSeq ), 2149cdf0e10cSrcweir UNO_QUERY ); 2150cdf0e10cSrcweir } 2151cdf0e10cSrcweir return sal_True; 2152cdf0e10cSrcweir } 2153cdf0e10cSrcweir catch( ::com::sun::star::uno::Exception& ) 2154cdf0e10cSrcweir { 2155cdf0e10cSrcweir return sal_False; 2156cdf0e10cSrcweir } 2157cdf0e10cSrcweir } 2158cdf0e10cSrcweir 2159cdf0e10cSrcweir void Desktop::SystemSettingsChanging( AllSettings& rSettings, Window* ) 2160cdf0e10cSrcweir { 2161cdf0e10cSrcweir if ( !SvtTabAppearanceCfg::IsInitialized () ) 2162cdf0e10cSrcweir return; 2163cdf0e10cSrcweir 2164cdf0e10cSrcweir # define DRAGFULL_OPTION_ALL \ 2165cdf0e10cSrcweir ( DRAGFULL_OPTION_WINDOWMOVE | DRAGFULL_OPTION_WINDOWSIZE \ 2166cdf0e10cSrcweir | DRAGFULL_OPTION_OBJECTMOVE | DRAGFULL_OPTION_OBJECTSIZE \ 2167cdf0e10cSrcweir | DRAGFULL_OPTION_DOCKING | DRAGFULL_OPTION_SPLIT \ 2168cdf0e10cSrcweir | DRAGFULL_OPTION_SCROLL ) 2169cdf0e10cSrcweir # define DRAGFULL_OPTION_NONE ((sal_uInt32)~DRAGFULL_OPTION_ALL) 2170cdf0e10cSrcweir 2171cdf0e10cSrcweir StyleSettings hStyleSettings = rSettings.GetStyleSettings(); 2172cdf0e10cSrcweir MouseSettings hMouseSettings = rSettings.GetMouseSettings(); 2173cdf0e10cSrcweir 2174cdf0e10cSrcweir sal_uInt32 nDragFullOptions = hStyleSettings.GetDragFullOptions(); 2175cdf0e10cSrcweir 2176cdf0e10cSrcweir SvtTabAppearanceCfg aAppearanceCfg; 2177cdf0e10cSrcweir sal_uInt16 nGet = aAppearanceCfg.GetDragMode(); 2178cdf0e10cSrcweir switch ( nGet ) 2179cdf0e10cSrcweir { 2180cdf0e10cSrcweir case DragFullWindow: 2181cdf0e10cSrcweir nDragFullOptions |= DRAGFULL_OPTION_ALL; 2182cdf0e10cSrcweir break; 2183cdf0e10cSrcweir case DragFrame: 2184cdf0e10cSrcweir nDragFullOptions &= DRAGFULL_OPTION_NONE; 2185cdf0e10cSrcweir break; 2186cdf0e10cSrcweir case DragSystemDep: 2187cdf0e10cSrcweir default: 2188cdf0e10cSrcweir break; 2189cdf0e10cSrcweir } 2190cdf0e10cSrcweir 2191cdf0e10cSrcweir sal_uInt32 nFollow = hMouseSettings.GetFollow(); 2192cdf0e10cSrcweir hMouseSettings.SetFollow( aAppearanceCfg.IsMenuMouseFollow() ? (nFollow|MOUSE_FOLLOW_MENU) : (nFollow&~MOUSE_FOLLOW_MENU)); 2193cdf0e10cSrcweir rSettings.SetMouseSettings(hMouseSettings); 2194cdf0e10cSrcweir 2195cdf0e10cSrcweir sal_Bool bUseImagesInMenus = hStyleSettings.GetUseImagesInMenus(); 2196cdf0e10cSrcweir 2197cdf0e10cSrcweir SvtMenuOptions aMenuOpt; 2198cdf0e10cSrcweir nGet = aMenuOpt.GetMenuIconsState(); 2199cdf0e10cSrcweir switch ( nGet ) 2200cdf0e10cSrcweir { 2201cdf0e10cSrcweir case 0: 2202cdf0e10cSrcweir bUseImagesInMenus = sal_False; 2203cdf0e10cSrcweir break; 2204cdf0e10cSrcweir case 1: 2205cdf0e10cSrcweir bUseImagesInMenus = sal_True; 2206cdf0e10cSrcweir break; 2207cdf0e10cSrcweir case 2: 2208cdf0e10cSrcweir default: 2209cdf0e10cSrcweir break; 2210cdf0e10cSrcweir } 2211cdf0e10cSrcweir hStyleSettings.SetUseImagesInMenus(bUseImagesInMenus); 2212cdf0e10cSrcweir 2213cdf0e10cSrcweir hStyleSettings.SetDragFullOptions( nDragFullOptions ); 2214cdf0e10cSrcweir rSettings.SetStyleSettings ( hStyleSettings ); 2215cdf0e10cSrcweir } 2216cdf0e10cSrcweir 2217cdf0e10cSrcweir // ======================================================================== 2218cdf0e10cSrcweir IMPL_LINK( Desktop, AsyncInitFirstRun, void*, EMPTYARG ) 2219cdf0e10cSrcweir { 2220cdf0e10cSrcweir DoFirstRunInitializations(); 2221cdf0e10cSrcweir return 0L; 2222cdf0e10cSrcweir } 2223cdf0e10cSrcweir 2224cdf0e10cSrcweir // ======================================================================== 2225cdf0e10cSrcweir 2226cdf0e10cSrcweir class ExitTimer : public Timer 2227cdf0e10cSrcweir { 2228cdf0e10cSrcweir public: 2229cdf0e10cSrcweir ExitTimer() 2230cdf0e10cSrcweir { 2231cdf0e10cSrcweir SetTimeout(500); 2232cdf0e10cSrcweir Start(); 2233cdf0e10cSrcweir } 2234cdf0e10cSrcweir virtual void Timeout() 2235cdf0e10cSrcweir { 2236cdf0e10cSrcweir exit(42); 2237cdf0e10cSrcweir } 2238cdf0e10cSrcweir }; 2239cdf0e10cSrcweir 2240cdf0e10cSrcweir IMPL_LINK( Desktop, OpenClients_Impl, void*, EMPTYARG ) 2241cdf0e10cSrcweir { 2242cdf0e10cSrcweir RTL_LOGFILE_PRODUCT_CONTEXT( aLog, "PERFORMANCE - DesktopOpenClients_Impl()" ); 2243cdf0e10cSrcweir 2244cdf0e10cSrcweir OpenClients(); 2245cdf0e10cSrcweir 2246cdf0e10cSrcweir OfficeIPCThread::SetReady(); 2247cdf0e10cSrcweir 2248cdf0e10cSrcweir // CloseStartupScreen(); 2249cdf0e10cSrcweir CloseSplashScreen(); 2250cdf0e10cSrcweir CheckFirstRun( ); 2251cdf0e10cSrcweir EnableOleAutomation(); 2252cdf0e10cSrcweir 2253cdf0e10cSrcweir if (getenv ("OOO_EXIT_POST_STARTUP")) 2254cdf0e10cSrcweir new ExitTimer(); 2255cdf0e10cSrcweir return 0; 2256cdf0e10cSrcweir } 2257cdf0e10cSrcweir 2258cdf0e10cSrcweir // enable acceptos 2259cdf0e10cSrcweir IMPL_LINK( Desktop, EnableAcceptors_Impl, void*, EMPTYARG ) 2260cdf0e10cSrcweir { 2261cdf0e10cSrcweir enableAcceptors(); 2262cdf0e10cSrcweir return 0; 2263cdf0e10cSrcweir } 2264cdf0e10cSrcweir 2265cdf0e10cSrcweir 2266cdf0e10cSrcweir // Registers a COM class factory of the service manager with the windows operating system. 2267cdf0e10cSrcweir void Desktop::EnableOleAutomation() 2268cdf0e10cSrcweir { 2269cdf0e10cSrcweir RTL_LOGFILE_CONTEXT( aLog, "desktop (jl97489) ::Desktop::EnableOleAutomation" ); 2270cdf0e10cSrcweir #ifdef WNT 2271cdf0e10cSrcweir Reference< XMultiServiceFactory > xSMgr= comphelper::getProcessServiceFactory(); 2272cdf0e10cSrcweir xSMgr->createInstance(DEFINE_CONST_UNICODE("com.sun.star.bridge.OleApplicationRegistration")); 2273cdf0e10cSrcweir xSMgr->createInstance(DEFINE_CONST_UNICODE("com.sun.star.comp.ole.EmbedServer")); 2274cdf0e10cSrcweir #endif 2275cdf0e10cSrcweir } 2276cdf0e10cSrcweir 2277cdf0e10cSrcweir sal_Bool Desktop::CheckOEM() 2278cdf0e10cSrcweir { 2279cdf0e10cSrcweir Reference<XMultiServiceFactory> rFactory = ::comphelper::getProcessServiceFactory(); 2280cdf0e10cSrcweir Reference<XJob> rOemJob(rFactory->createInstance( 2281cdf0e10cSrcweir OUString::createFromAscii("com.sun.star.office.OEMPreloadJob")), 2282cdf0e10cSrcweir UNO_QUERY ); 2283cdf0e10cSrcweir Sequence<NamedValue> args; 2284cdf0e10cSrcweir sal_Bool bResult = sal_False; 2285cdf0e10cSrcweir if (rOemJob.is()) { 2286cdf0e10cSrcweir Any aResult = rOemJob->execute(args); 2287cdf0e10cSrcweir aResult >>= bResult; 2288cdf0e10cSrcweir return bResult; 2289cdf0e10cSrcweir } else { 2290cdf0e10cSrcweir return sal_True; 2291cdf0e10cSrcweir } 2292cdf0e10cSrcweir } 2293cdf0e10cSrcweir 2294cdf0e10cSrcweir void Desktop::PreloadModuleData( CommandLineArgs* pArgs ) 2295cdf0e10cSrcweir { 2296cdf0e10cSrcweir Reference< XMultiServiceFactory > rFactory = ::comphelper::getProcessServiceFactory(); 2297cdf0e10cSrcweir 2298cdf0e10cSrcweir Sequence < com::sun::star::beans::PropertyValue > args(1); 2299cdf0e10cSrcweir args[0].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Hidden")); 2300cdf0e10cSrcweir args[0].Value <<= sal_True; 2301cdf0e10cSrcweir Reference < XComponentLoader > xLoader( ::comphelper::getProcessServiceFactory()->createInstance( 2302cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.Desktop")) ), UNO_QUERY ); 2303cdf0e10cSrcweir 2304cdf0e10cSrcweir if ( !xLoader.is() ) 2305cdf0e10cSrcweir return; 2306cdf0e10cSrcweir 2307cdf0e10cSrcweir if ( pArgs->IsWriter() ) 2308cdf0e10cSrcweir { 2309cdf0e10cSrcweir try 2310cdf0e10cSrcweir { 2311cdf0e10cSrcweir Reference < ::com::sun::star::util::XCloseable > xDoc( xLoader->loadComponentFromURL( DEFINE_CONST_UNICODE("private:factory/swriter"), 2312cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_blank")), 0, args ), UNO_QUERY_THROW ); 2313cdf0e10cSrcweir xDoc->close( sal_False ); 2314cdf0e10cSrcweir } 2315cdf0e10cSrcweir catch ( com::sun::star::uno::Exception& ) 2316cdf0e10cSrcweir { 2317cdf0e10cSrcweir } 2318cdf0e10cSrcweir } 2319cdf0e10cSrcweir if ( pArgs->IsCalc() ) 2320cdf0e10cSrcweir { 2321cdf0e10cSrcweir try 2322cdf0e10cSrcweir { 2323cdf0e10cSrcweir Reference < ::com::sun::star::util::XCloseable > xDoc( xLoader->loadComponentFromURL( DEFINE_CONST_UNICODE("private:factory/scalc"), 2324cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_blank")), 0, args ), UNO_QUERY_THROW ); 2325cdf0e10cSrcweir xDoc->close( sal_False ); 2326cdf0e10cSrcweir } 2327cdf0e10cSrcweir catch ( com::sun::star::uno::Exception& ) 2328cdf0e10cSrcweir { 2329cdf0e10cSrcweir } 2330cdf0e10cSrcweir } 2331cdf0e10cSrcweir if ( pArgs->IsDraw() ) 2332cdf0e10cSrcweir { 2333cdf0e10cSrcweir try 2334cdf0e10cSrcweir { 2335cdf0e10cSrcweir Reference < ::com::sun::star::util::XCloseable > xDoc( xLoader->loadComponentFromURL( DEFINE_CONST_UNICODE("private:factory/sdraw"), 2336cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_blank")), 0, args ), UNO_QUERY_THROW ); 2337cdf0e10cSrcweir xDoc->close( sal_False ); 2338cdf0e10cSrcweir } 2339cdf0e10cSrcweir catch ( com::sun::star::uno::Exception& ) 2340cdf0e10cSrcweir { 2341cdf0e10cSrcweir } 2342cdf0e10cSrcweir } 2343cdf0e10cSrcweir if ( pArgs->IsImpress() ) 2344cdf0e10cSrcweir { 2345cdf0e10cSrcweir try 2346cdf0e10cSrcweir { 2347cdf0e10cSrcweir Reference < ::com::sun::star::util::XCloseable > xDoc( xLoader->loadComponentFromURL( DEFINE_CONST_UNICODE("private:factory/simpress"), 2348cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_blank")), 0, args ), UNO_QUERY_THROW ); 2349cdf0e10cSrcweir xDoc->close( sal_False ); 2350cdf0e10cSrcweir } 2351cdf0e10cSrcweir catch ( com::sun::star::uno::Exception& ) 2352cdf0e10cSrcweir { 2353cdf0e10cSrcweir } 2354cdf0e10cSrcweir } 2355cdf0e10cSrcweir } 2356cdf0e10cSrcweir 2357cdf0e10cSrcweir void Desktop::PreloadConfigurationData() 2358cdf0e10cSrcweir { 2359cdf0e10cSrcweir Reference< XMultiServiceFactory > rFactory = ::comphelper::getProcessServiceFactory(); 2360cdf0e10cSrcweir Reference< XNameAccess > xNameAccess( rFactory->createInstance( 2361cdf0e10cSrcweir DEFINE_CONST_UNICODE( "com.sun.star.frame.UICommandDescription" )), UNO_QUERY ); 2362cdf0e10cSrcweir 2363cdf0e10cSrcweir rtl::OUString aWriterDoc( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.text.TextDocument" )); 2364cdf0e10cSrcweir rtl::OUString aCalcDoc( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sheet.SpreadsheetDocument" )); 2365cdf0e10cSrcweir rtl::OUString aDrawDoc( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.DrawingDocument" )); 2366cdf0e10cSrcweir rtl::OUString aImpressDoc( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.presentation.PresentationDocument" )); 2367cdf0e10cSrcweir 2368cdf0e10cSrcweir // preload commands configuration 2369cdf0e10cSrcweir if ( xNameAccess.is() ) 2370cdf0e10cSrcweir { 2371cdf0e10cSrcweir Any a; 2372cdf0e10cSrcweir Reference< XNameAccess > xCmdAccess; 2373cdf0e10cSrcweir 2374cdf0e10cSrcweir try 2375cdf0e10cSrcweir { 2376cdf0e10cSrcweir a = xNameAccess->getByName( aWriterDoc ); 2377cdf0e10cSrcweir a >>= xCmdAccess; 2378cdf0e10cSrcweir if ( xCmdAccess.is() ) 2379cdf0e10cSrcweir { 2380cdf0e10cSrcweir xCmdAccess->getByName( DEFINE_CONST_UNICODE( ".uno:BasicShapes" )); 2381cdf0e10cSrcweir xCmdAccess->getByName( DEFINE_CONST_UNICODE( ".uno:EditGlossary" )); 2382cdf0e10cSrcweir } 2383cdf0e10cSrcweir } 2384cdf0e10cSrcweir catch ( ::com::sun::star::uno::Exception& ) 2385cdf0e10cSrcweir { 2386cdf0e10cSrcweir } 2387cdf0e10cSrcweir 2388cdf0e10cSrcweir try 2389cdf0e10cSrcweir { 2390cdf0e10cSrcweir a = xNameAccess->getByName( aCalcDoc ); 2391cdf0e10cSrcweir a >>= xCmdAccess; 2392cdf0e10cSrcweir if ( xCmdAccess.is() ) 2393cdf0e10cSrcweir xCmdAccess->getByName( DEFINE_CONST_UNICODE( ".uno:InsertObjectStarMath" )); 2394cdf0e10cSrcweir } 2395cdf0e10cSrcweir catch ( ::com::sun::star::uno::Exception& ) 2396cdf0e10cSrcweir { 2397cdf0e10cSrcweir } 2398cdf0e10cSrcweir 2399cdf0e10cSrcweir try 2400cdf0e10cSrcweir { 2401cdf0e10cSrcweir // draw and impress share the same configuration file (DrawImpressCommands.xcu) 2402cdf0e10cSrcweir a = xNameAccess->getByName( aDrawDoc ); 2403cdf0e10cSrcweir a >>= xCmdAccess; 2404cdf0e10cSrcweir if ( xCmdAccess.is() ) 2405cdf0e10cSrcweir xCmdAccess->getByName( DEFINE_CONST_UNICODE( ".uno:Polygon" )); 2406cdf0e10cSrcweir } 2407cdf0e10cSrcweir catch ( ::com::sun::star::uno::Exception& ) 2408cdf0e10cSrcweir { 2409cdf0e10cSrcweir } 2410cdf0e10cSrcweir } 2411cdf0e10cSrcweir 2412cdf0e10cSrcweir // preload window state configuration 2413cdf0e10cSrcweir xNameAccess = Reference< XNameAccess >( rFactory->createInstance( 2414cdf0e10cSrcweir DEFINE_CONST_UNICODE( "com.sun.star.ui.WindowStateConfiguration" )), UNO_QUERY ); 2415cdf0e10cSrcweir if ( xNameAccess.is() ) 2416cdf0e10cSrcweir { 2417cdf0e10cSrcweir Any a; 2418cdf0e10cSrcweir Reference< XNameAccess > xWindowAccess; 2419cdf0e10cSrcweir try 2420cdf0e10cSrcweir { 2421cdf0e10cSrcweir a = xNameAccess->getByName( aWriterDoc ); 2422cdf0e10cSrcweir a >>= xWindowAccess; 2423cdf0e10cSrcweir if ( xWindowAccess.is() ) 2424cdf0e10cSrcweir xWindowAccess->getByName( DEFINE_CONST_UNICODE( "private:resource/toolbar/standardbar" )); 2425cdf0e10cSrcweir } 2426cdf0e10cSrcweir catch ( ::com::sun::star::uno::Exception& ) 2427cdf0e10cSrcweir { 2428cdf0e10cSrcweir } 2429cdf0e10cSrcweir try 2430cdf0e10cSrcweir { 2431cdf0e10cSrcweir a = xNameAccess->getByName( aCalcDoc ); 2432cdf0e10cSrcweir a >>= xWindowAccess; 2433cdf0e10cSrcweir if ( xWindowAccess.is() ) 2434cdf0e10cSrcweir xWindowAccess->getByName( DEFINE_CONST_UNICODE( "private:resource/toolbar/standardbar" )); 2435cdf0e10cSrcweir } 2436cdf0e10cSrcweir catch ( ::com::sun::star::uno::Exception& ) 2437cdf0e10cSrcweir { 2438cdf0e10cSrcweir } 2439cdf0e10cSrcweir try 2440cdf0e10cSrcweir { 2441cdf0e10cSrcweir a = xNameAccess->getByName( aDrawDoc ); 2442cdf0e10cSrcweir a >>= xWindowAccess; 2443cdf0e10cSrcweir if ( xWindowAccess.is() ) 2444cdf0e10cSrcweir xWindowAccess->getByName( DEFINE_CONST_UNICODE( "private:resource/toolbar/standardbar" )); 2445cdf0e10cSrcweir } 2446cdf0e10cSrcweir catch ( ::com::sun::star::uno::Exception& ) 2447cdf0e10cSrcweir { 2448cdf0e10cSrcweir } 2449cdf0e10cSrcweir try 2450cdf0e10cSrcweir { 2451cdf0e10cSrcweir a = xNameAccess->getByName( aImpressDoc ); 2452cdf0e10cSrcweir a >>= xWindowAccess; 2453cdf0e10cSrcweir if ( xWindowAccess.is() ) 2454cdf0e10cSrcweir xWindowAccess->getByName( DEFINE_CONST_UNICODE( "private:resource/toolbar/standardbar" )); 2455cdf0e10cSrcweir } 2456cdf0e10cSrcweir catch ( ::com::sun::star::uno::Exception& ) 2457cdf0e10cSrcweir { 2458cdf0e10cSrcweir } 2459cdf0e10cSrcweir } 2460cdf0e10cSrcweir 2461cdf0e10cSrcweir // preload user interface element factories 2462cdf0e10cSrcweir Sequence< Sequence< css::beans::PropertyValue > > aSeqSeqPropValue; 2463cdf0e10cSrcweir Reference< ::com::sun::star::ui::XUIElementFactoryRegistration > xUIElementFactory( 2464cdf0e10cSrcweir rFactory->createInstance( 2465cdf0e10cSrcweir DEFINE_CONST_UNICODE( "com.sun.star.ui.UIElementFactoryManager" )), 2466cdf0e10cSrcweir UNO_QUERY ); 2467cdf0e10cSrcweir if ( xUIElementFactory.is() ) 2468cdf0e10cSrcweir { 2469cdf0e10cSrcweir try 2470cdf0e10cSrcweir { 2471cdf0e10cSrcweir aSeqSeqPropValue = xUIElementFactory->getRegisteredFactories(); 2472cdf0e10cSrcweir } 2473cdf0e10cSrcweir catch ( ::com::sun::star::uno::Exception& ) 2474cdf0e10cSrcweir { 2475cdf0e10cSrcweir } 2476cdf0e10cSrcweir } 2477cdf0e10cSrcweir 2478cdf0e10cSrcweir // preload popup menu controller factories. As all controllers are in the same 2479cdf0e10cSrcweir // configuration file they also get preloaded! 2480cdf0e10cSrcweir Reference< ::com::sun::star::frame::XUIControllerRegistration > xPopupMenuControllerFactory( 2481cdf0e10cSrcweir rFactory->createInstance( 2482cdf0e10cSrcweir DEFINE_CONST_UNICODE( "com.sun.star.frame.PopupMenuControllerFactory" )), 2483cdf0e10cSrcweir UNO_QUERY ); 2484cdf0e10cSrcweir if ( xPopupMenuControllerFactory.is() ) 2485cdf0e10cSrcweir { 2486cdf0e10cSrcweir try 2487cdf0e10cSrcweir { 2488cdf0e10cSrcweir xPopupMenuControllerFactory->hasController( 2489cdf0e10cSrcweir DEFINE_CONST_UNICODE( ".uno:CharFontName" ), 2490cdf0e10cSrcweir OUString() ); 2491cdf0e10cSrcweir } 2492cdf0e10cSrcweir catch ( ::com::sun::star::uno::Exception& ) 2493cdf0e10cSrcweir { 2494cdf0e10cSrcweir } 2495cdf0e10cSrcweir } 2496cdf0e10cSrcweir 2497cdf0e10cSrcweir // preload filter configuration 2498cdf0e10cSrcweir Sequence< OUString > aSeq; 2499cdf0e10cSrcweir xNameAccess = Reference< XNameAccess >( rFactory->createInstance( 2500cdf0e10cSrcweir DEFINE_CONST_UNICODE( "com.sun.star.document.FilterFactory" )), UNO_QUERY ); 2501cdf0e10cSrcweir if ( xNameAccess.is() ) 2502cdf0e10cSrcweir { 2503cdf0e10cSrcweir try 2504cdf0e10cSrcweir { 2505cdf0e10cSrcweir aSeq = xNameAccess->getElementNames(); 2506cdf0e10cSrcweir } 2507cdf0e10cSrcweir catch ( ::com::sun::star::uno::Exception& ) 2508cdf0e10cSrcweir { 2509cdf0e10cSrcweir } 2510cdf0e10cSrcweir } 2511cdf0e10cSrcweir 2512cdf0e10cSrcweir // preload type detection configuration 2513cdf0e10cSrcweir xNameAccess = Reference< XNameAccess >( rFactory->createInstance( 2514cdf0e10cSrcweir DEFINE_CONST_UNICODE( "com.sun.star.document.TypeDetection" )), UNO_QUERY ); 2515cdf0e10cSrcweir if ( xNameAccess.is() ) 2516cdf0e10cSrcweir { 2517cdf0e10cSrcweir try 2518cdf0e10cSrcweir { 2519cdf0e10cSrcweir aSeq = xNameAccess->getElementNames(); 2520cdf0e10cSrcweir } 2521cdf0e10cSrcweir catch ( ::com::sun::star::uno::Exception& ) 2522cdf0e10cSrcweir { 2523cdf0e10cSrcweir } 2524cdf0e10cSrcweir } 2525cdf0e10cSrcweir 2526cdf0e10cSrcweir static const OUString sConfigSrvc( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationProvider" ) ); 2527cdf0e10cSrcweir static const OUString sAccessSrvc( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationAccess" ) ); 2528cdf0e10cSrcweir 2529cdf0e10cSrcweir // get configuration provider 2530cdf0e10cSrcweir Reference< XMultiServiceFactory > xConfigProvider; 2531cdf0e10cSrcweir xConfigProvider = Reference< XMultiServiceFactory > ( 2532cdf0e10cSrcweir rFactory->createInstance( sConfigSrvc ),UNO_QUERY ); 2533cdf0e10cSrcweir 2534cdf0e10cSrcweir if ( xConfigProvider.is() ) 2535cdf0e10cSrcweir { 2536cdf0e10cSrcweir // preload writer configuration 2537cdf0e10cSrcweir Sequence< Any > theArgs(1); 2538cdf0e10cSrcweir theArgs[ 0 ] <<= OUString::createFromAscii( "org.openoffice.Office.Writer/MailMergeWizard" ); 2539cdf0e10cSrcweir try 2540cdf0e10cSrcweir { 2541cdf0e10cSrcweir xNameAccess = Reference< XNameAccess >( 2542cdf0e10cSrcweir xConfigProvider->createInstanceWithArguments( sAccessSrvc, theArgs ), UNO_QUERY ); 2543cdf0e10cSrcweir } 2544cdf0e10cSrcweir catch (::com::sun::star::uno::Exception& ) 2545cdf0e10cSrcweir { 2546cdf0e10cSrcweir } 2547cdf0e10cSrcweir 2548cdf0e10cSrcweir // WriterWeb 2549cdf0e10cSrcweir theArgs[ 0 ] <<= OUString::createFromAscii( "org.openoffice.Office.WriterWeb/Content" ); 2550cdf0e10cSrcweir try 2551cdf0e10cSrcweir { 2552cdf0e10cSrcweir xNameAccess = Reference< XNameAccess >( 2553cdf0e10cSrcweir xConfigProvider->createInstanceWithArguments( sAccessSrvc, theArgs ), UNO_QUERY ); 2554cdf0e10cSrcweir } 2555cdf0e10cSrcweir catch (::com::sun::star::uno::Exception& ) 2556cdf0e10cSrcweir { 2557cdf0e10cSrcweir } 2558cdf0e10cSrcweir 2559cdf0e10cSrcweir // preload compatibility 2560cdf0e10cSrcweir theArgs[ 0 ] <<= OUString::createFromAscii( "org.openoffice.Office.Compatibility/WriterCompatibilityVersion" ); 2561cdf0e10cSrcweir try 2562cdf0e10cSrcweir { 2563cdf0e10cSrcweir xNameAccess = Reference< XNameAccess >( 2564cdf0e10cSrcweir xConfigProvider->createInstanceWithArguments( sAccessSrvc, theArgs ), UNO_QUERY ); 2565cdf0e10cSrcweir } 2566cdf0e10cSrcweir catch (::com::sun::star::uno::Exception& ) 2567cdf0e10cSrcweir { 2568cdf0e10cSrcweir } 2569cdf0e10cSrcweir 2570cdf0e10cSrcweir // preload calc configuration 2571cdf0e10cSrcweir theArgs[ 0 ] <<= OUString::createFromAscii( "org.openoffice.Office.Calc/Content" ); 2572cdf0e10cSrcweir try 2573cdf0e10cSrcweir { 2574cdf0e10cSrcweir xNameAccess = Reference< XNameAccess >( 2575cdf0e10cSrcweir xConfigProvider->createInstanceWithArguments( sAccessSrvc, theArgs ), UNO_QUERY ); 2576cdf0e10cSrcweir } 2577cdf0e10cSrcweir catch (::com::sun::star::uno::Exception& ) 2578cdf0e10cSrcweir { 2579cdf0e10cSrcweir } 2580cdf0e10cSrcweir 2581cdf0e10cSrcweir // preload impress configuration 2582cdf0e10cSrcweir theArgs[ 0 ] <<= OUString::createFromAscii( "org.openoffice.Office.UI.Effects/UserInterface" ); 2583cdf0e10cSrcweir try 2584cdf0e10cSrcweir { 2585cdf0e10cSrcweir xNameAccess = Reference< XNameAccess >( 2586cdf0e10cSrcweir xConfigProvider->createInstanceWithArguments( sAccessSrvc, theArgs ), UNO_QUERY ); 2587cdf0e10cSrcweir } 2588cdf0e10cSrcweir catch (::com::sun::star::uno::Exception& ) 2589cdf0e10cSrcweir { 2590cdf0e10cSrcweir } 2591cdf0e10cSrcweir 2592cdf0e10cSrcweir theArgs[ 0 ] <<= OUString::createFromAscii( "org.openoffice.Office.Impress/Layout" ); 2593cdf0e10cSrcweir try 2594cdf0e10cSrcweir { 2595cdf0e10cSrcweir xNameAccess = Reference< XNameAccess >( 2596cdf0e10cSrcweir xConfigProvider->createInstanceWithArguments( sAccessSrvc, theArgs ), UNO_QUERY ); 2597cdf0e10cSrcweir } 2598cdf0e10cSrcweir catch (::com::sun::star::uno::Exception& ) 2599cdf0e10cSrcweir { 2600cdf0e10cSrcweir } 2601cdf0e10cSrcweir 2602cdf0e10cSrcweir // preload draw configuration 2603cdf0e10cSrcweir theArgs[ 0 ] <<= OUString::createFromAscii( "org.openoffice.Office.Draw/Layout" ); 2604cdf0e10cSrcweir try 2605cdf0e10cSrcweir { 2606cdf0e10cSrcweir xNameAccess = Reference< XNameAccess >( 2607cdf0e10cSrcweir xConfigProvider->createInstanceWithArguments( sAccessSrvc, theArgs ), UNO_QUERY ); 2608cdf0e10cSrcweir } 2609cdf0e10cSrcweir catch (::com::sun::star::uno::Exception& ) 2610cdf0e10cSrcweir { 2611cdf0e10cSrcweir } 2612cdf0e10cSrcweir 2613cdf0e10cSrcweir // preload ui configuration 2614cdf0e10cSrcweir theArgs[ 0 ] <<= OUString::createFromAscii( "org.openoffice.Office.UI/FilterClassification" ); 2615cdf0e10cSrcweir try 2616cdf0e10cSrcweir { 2617cdf0e10cSrcweir xNameAccess = Reference< XNameAccess >( 2618cdf0e10cSrcweir xConfigProvider->createInstanceWithArguments( sAccessSrvc, theArgs ), UNO_QUERY ); 2619cdf0e10cSrcweir } 2620cdf0e10cSrcweir catch (::com::sun::star::uno::Exception& ) 2621cdf0e10cSrcweir { 2622cdf0e10cSrcweir } 2623cdf0e10cSrcweir 2624cdf0e10cSrcweir // preload addons configuration 2625cdf0e10cSrcweir theArgs[ 0 ] <<= OUString::createFromAscii( "org.openoffice.Office.Addons/AddonUI" ); 2626cdf0e10cSrcweir try 2627cdf0e10cSrcweir { 2628cdf0e10cSrcweir xNameAccess = Reference< XNameAccess >( 2629cdf0e10cSrcweir xConfigProvider->createInstanceWithArguments( sAccessSrvc, theArgs ), UNO_QUERY ); 2630cdf0e10cSrcweir } 2631cdf0e10cSrcweir catch (::com::sun::star::uno::Exception& ) 2632cdf0e10cSrcweir { 2633cdf0e10cSrcweir } 2634cdf0e10cSrcweir } 2635cdf0e10cSrcweir } 2636cdf0e10cSrcweir 2637cdf0e10cSrcweir void Desktop::OpenClients() 2638cdf0e10cSrcweir { 2639cdf0e10cSrcweir 2640cdf0e10cSrcweir // check if a document has been recovered - if there is one of if a document was loaded by cmdline, no default document 2641cdf0e10cSrcweir // should be created 2642cdf0e10cSrcweir Reference < XComponent > xFirst; 2643cdf0e10cSrcweir sal_Bool bLoaded = sal_False; 2644cdf0e10cSrcweir 2645cdf0e10cSrcweir CommandLineArgs* pArgs = GetCommandLineArgs(); 2646cdf0e10cSrcweir SvtInternalOptions aInternalOptions; 2647cdf0e10cSrcweir 2648cdf0e10cSrcweir Reference<XMultiServiceFactory> rFactory = ::comphelper::getProcessServiceFactory(); 2649cdf0e10cSrcweir 2650cdf0e10cSrcweir if (!pArgs->IsQuickstart()) { 2651cdf0e10cSrcweir sal_Bool bShowHelp = sal_False; 2652cdf0e10cSrcweir ::rtl::OUStringBuffer aHelpURLBuffer; 2653cdf0e10cSrcweir if (pArgs->IsHelpWriter()) { 2654cdf0e10cSrcweir bShowHelp = sal_True; 2655cdf0e10cSrcweir aHelpURLBuffer.appendAscii("vnd.sun.star.help://swriter/start"); 2656cdf0e10cSrcweir } else if (pArgs->IsHelpCalc()) { 2657cdf0e10cSrcweir bShowHelp = sal_True; 2658cdf0e10cSrcweir aHelpURLBuffer.appendAscii("vnd.sun.star.help://scalc/start"); 2659cdf0e10cSrcweir } else if (pArgs->IsHelpDraw()) { 2660cdf0e10cSrcweir bShowHelp = sal_True; 2661cdf0e10cSrcweir aHelpURLBuffer.appendAscii("vnd.sun.star.help://sdraw/start"); 2662cdf0e10cSrcweir } else if (pArgs->IsHelpImpress()) { 2663cdf0e10cSrcweir bShowHelp = sal_True; 2664cdf0e10cSrcweir aHelpURLBuffer.appendAscii("vnd.sun.star.help://simpress/start"); 2665cdf0e10cSrcweir } else if (pArgs->IsHelpBase()) { 2666cdf0e10cSrcweir bShowHelp = sal_True; 2667cdf0e10cSrcweir aHelpURLBuffer.appendAscii("vnd.sun.star.help://sdatabase/start"); 2668cdf0e10cSrcweir } else if (pArgs->IsHelpBasic()) { 2669cdf0e10cSrcweir bShowHelp = sal_True; 2670cdf0e10cSrcweir aHelpURLBuffer.appendAscii("vnd.sun.star.help://sbasic/start"); 2671cdf0e10cSrcweir } else if (pArgs->IsHelpMath()) { 2672cdf0e10cSrcweir bShowHelp = sal_True; 2673cdf0e10cSrcweir aHelpURLBuffer.appendAscii("vnd.sun.star.help://smath/start"); 2674cdf0e10cSrcweir } 2675cdf0e10cSrcweir if (bShowHelp) { 2676cdf0e10cSrcweir Help *pHelp = Application::GetHelp(); 2677cdf0e10cSrcweir 2678cdf0e10cSrcweir Any aRet = ::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::LOCALE ); 2679cdf0e10cSrcweir rtl::OUString aTmp; 2680cdf0e10cSrcweir aRet >>= aTmp; 2681cdf0e10cSrcweir aHelpURLBuffer.appendAscii("?Language="); 2682cdf0e10cSrcweir aHelpURLBuffer.append(aTmp); 2683cdf0e10cSrcweir #if defined UNX 2684cdf0e10cSrcweir aHelpURLBuffer.appendAscii("&System=UNX"); 2685cdf0e10cSrcweir #elif defined WNT 2686cdf0e10cSrcweir aHelpURLBuffer.appendAscii("&System=WIN"); 2687cdf0e10cSrcweir #elif defined OS2 2688cdf0e10cSrcweir aHelpURLBuffer.appendAscii("&System=OS2"); 2689cdf0e10cSrcweir #endif 2690cdf0e10cSrcweir pHelp->Start(aHelpURLBuffer.makeStringAndClear(), NULL); 2691cdf0e10cSrcweir return; 2692cdf0e10cSrcweir } 2693cdf0e10cSrcweir } 2694cdf0e10cSrcweir else 2695cdf0e10cSrcweir { 2696cdf0e10cSrcweir OUString aIniName; 2697cdf0e10cSrcweir ::vos::OStartupInfo aInfo; 2698cdf0e10cSrcweir 2699cdf0e10cSrcweir aInfo.getExecutableFile( aIniName ); 2700cdf0e10cSrcweir sal_uInt32 lastIndex = aIniName.lastIndexOf('/'); 2701cdf0e10cSrcweir if ( lastIndex > 0 ) 2702cdf0e10cSrcweir { 2703cdf0e10cSrcweir aIniName = aIniName.copy( 0, lastIndex+1 ); 2704cdf0e10cSrcweir aIniName += OUString( RTL_CONSTASCII_USTRINGPARAM( "perftune" )); 2705cdf0e10cSrcweir #if defined(WNT) || defined(OS2) 2706cdf0e10cSrcweir aIniName += OUString( RTL_CONSTASCII_USTRINGPARAM( ".ini" )); 2707cdf0e10cSrcweir #else 2708cdf0e10cSrcweir aIniName += OUString( RTL_CONSTASCII_USTRINGPARAM( "rc" )); 2709cdf0e10cSrcweir #endif 2710cdf0e10cSrcweir } 2711cdf0e10cSrcweir 2712cdf0e10cSrcweir rtl::Bootstrap aPerfTuneIniFile( aIniName ); 2713cdf0e10cSrcweir 2714cdf0e10cSrcweir OUString aDefault( RTL_CONSTASCII_USTRINGPARAM( "0" )); 2715cdf0e10cSrcweir OUString aPreloadData; 2716cdf0e10cSrcweir 2717cdf0e10cSrcweir aPerfTuneIniFile.getFrom( OUString( RTL_CONSTASCII_USTRINGPARAM( "QuickstartPreloadConfiguration" )), aPreloadData, aDefault ); 2718cdf0e10cSrcweir if ( aPreloadData.equalsAscii( "1" )) 2719cdf0e10cSrcweir { 2720cdf0e10cSrcweir if ( pArgs->IsWriter() || 2721cdf0e10cSrcweir pArgs->IsCalc() || 2722cdf0e10cSrcweir pArgs->IsDraw() || 2723cdf0e10cSrcweir pArgs->IsImpress() ) 2724cdf0e10cSrcweir { 2725cdf0e10cSrcweir PreloadModuleData( pArgs ); 2726cdf0e10cSrcweir } 2727cdf0e10cSrcweir 2728cdf0e10cSrcweir PreloadConfigurationData(); 2729cdf0e10cSrcweir } 2730cdf0e10cSrcweir } 2731cdf0e10cSrcweir 2732cdf0e10cSrcweir // Disable AutoSave feature in case "-norestore" or a similare command line switch is set on the command line. 2733cdf0e10cSrcweir // The reason behind: AutoSave/EmergencySave/AutoRecovery share the same data. 2734cdf0e10cSrcweir // But the require that all documents, which are saved as backup should exists inside 2735cdf0e10cSrcweir // memory. May be this mechanism will be inconsistent if the configuration exists ... 2736cdf0e10cSrcweir // but no document inside memory corrspond to this data. 2737cdf0e10cSrcweir // Furter it's not acceptable to recover such documents without any UI. It can 2738cdf0e10cSrcweir // need some time, where the user wont see any results and wait for finishing the office startup ... 2739cdf0e10cSrcweir sal_Bool bAllowRecoveryAndSessionManagement = ( 2740cdf0e10cSrcweir ( !pArgs->IsNoRestore() ) && 2741cdf0e10cSrcweir ( !pArgs->IsHeadless() ) && 2742cdf0e10cSrcweir ( !pArgs->IsServer() ) 2743cdf0e10cSrcweir ); 2744cdf0e10cSrcweir 2745cdf0e10cSrcweir if ( ! bAllowRecoveryAndSessionManagement ) 2746cdf0e10cSrcweir { 2747cdf0e10cSrcweir try 2748cdf0e10cSrcweir { 2749cdf0e10cSrcweir Reference< XDispatch > xRecovery( 2750cdf0e10cSrcweir ::comphelper::getProcessServiceFactory()->createInstance( OUSTRING(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.AutoRecovery")) ), 2751cdf0e10cSrcweir ::com::sun::star::uno::UNO_QUERY_THROW ); 2752cdf0e10cSrcweir 2753cdf0e10cSrcweir Reference< XURLTransformer > xParser( 2754cdf0e10cSrcweir ::comphelper::getProcessServiceFactory()->createInstance( OUSTRING(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.util.URLTransformer")) ), 2755cdf0e10cSrcweir ::com::sun::star::uno::UNO_QUERY_THROW ); 2756cdf0e10cSrcweir 2757cdf0e10cSrcweir css::util::URL aCmd; 2758cdf0e10cSrcweir aCmd.Complete = ::rtl::OUString::createFromAscii("vnd.sun.star.autorecovery:/disableRecovery"); 2759cdf0e10cSrcweir xParser->parseStrict(aCmd); 2760cdf0e10cSrcweir 2761cdf0e10cSrcweir xRecovery->dispatch(aCmd, css::uno::Sequence< css::beans::PropertyValue >()); 2762cdf0e10cSrcweir } 2763cdf0e10cSrcweir catch(const css::uno::Exception& e) 2764cdf0e10cSrcweir { 2765cdf0e10cSrcweir OUString aMessage = OUString::createFromAscii("Could not disable AutoRecovery.\n") 2766cdf0e10cSrcweir + e.Message; 2767cdf0e10cSrcweir OSL_ENSURE(sal_False, OUStringToOString(aMessage, RTL_TEXTENCODING_ASCII_US).getStr()); 2768cdf0e10cSrcweir } 2769cdf0e10cSrcweir } 2770cdf0e10cSrcweir else 2771cdf0e10cSrcweir { 2772cdf0e10cSrcweir sal_Bool bCrashed = sal_False; 2773cdf0e10cSrcweir sal_Bool bExistsRecoveryData = sal_False; 2774cdf0e10cSrcweir sal_Bool bExistsSessionData = sal_False; 2775cdf0e10cSrcweir 2776cdf0e10cSrcweir impl_checkRecoveryState(bCrashed, bExistsRecoveryData, bExistsSessionData); 2777cdf0e10cSrcweir 2778cdf0e10cSrcweir if ( !getenv ("OOO_DISABLE_RECOVERY") && 2779cdf0e10cSrcweir ( ! bLoaded ) && 2780cdf0e10cSrcweir ( 2781cdf0e10cSrcweir ( bExistsRecoveryData ) || // => crash with files => recovery 2782cdf0e10cSrcweir ( bCrashed ) // => crash without files => error report 2783cdf0e10cSrcweir ) 2784cdf0e10cSrcweir ) 2785cdf0e10cSrcweir { 2786cdf0e10cSrcweir try 2787cdf0e10cSrcweir { 2788cdf0e10cSrcweir impl_callRecoveryUI( 2789cdf0e10cSrcweir sal_False , // false => force recovery instead of emergency save 2790cdf0e10cSrcweir bCrashed , 2791cdf0e10cSrcweir bExistsRecoveryData); 2792cdf0e10cSrcweir /* TODO we cant be shure, that at least one document could be recovered here successfully 2793cdf0e10cSrcweir So we set bLoaded=sal_True to supress opening of the default document. 2794cdf0e10cSrcweir But we should make it more safe. Otherwhise we have an office without an UI ... 2795cdf0e10cSrcweir ... 2796cdf0e10cSrcweir May be we can check the desktop if some documents are existing there. 2797cdf0e10cSrcweir */ 2798cdf0e10cSrcweir Reference< XFramesSupplier > xTasksSupplier( 2799cdf0e10cSrcweir ::comphelper::getProcessServiceFactory()->createInstance( OUSTRING(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.Desktop")) ), 2800cdf0e10cSrcweir ::com::sun::star::uno::UNO_QUERY_THROW ); 2801cdf0e10cSrcweir Reference< XElementAccess > xList( xTasksSupplier->getFrames(), UNO_QUERY_THROW ); 2802cdf0e10cSrcweir if ( xList->hasElements() ) 2803cdf0e10cSrcweir bLoaded = sal_True; 2804cdf0e10cSrcweir } 2805cdf0e10cSrcweir catch(const css::uno::Exception& e) 2806cdf0e10cSrcweir { 2807cdf0e10cSrcweir OUString aMessage = OUString::createFromAscii("Error during recovery\n") 2808cdf0e10cSrcweir + e.Message; 2809cdf0e10cSrcweir OSL_ENSURE(sal_False, OUStringToOString(aMessage, RTL_TEXTENCODING_ASCII_US).getStr()); 2810cdf0e10cSrcweir } 2811cdf0e10cSrcweir } 2812cdf0e10cSrcweir 2813cdf0e10cSrcweir Reference< XInitialization > xSessionListener; 2814cdf0e10cSrcweir try 2815cdf0e10cSrcweir { 2816cdf0e10cSrcweir xSessionListener = Reference< XInitialization >(::comphelper::getProcessServiceFactory()->createInstance( 2817cdf0e10cSrcweir OUString::createFromAscii("com.sun.star.frame.SessionListener")), UNO_QUERY_THROW); 2818cdf0e10cSrcweir 2819cdf0e10cSrcweir // specifies whether the UI-interaction on Session shutdown is allowed 2820cdf0e10cSrcweir sal_Bool bAllowUI = isUIOnSessionShutdownAllowed(); 2821cdf0e10cSrcweir css::beans::NamedValue aProperty( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "AllowUserInteractionOnQuit" ) ), 2822cdf0e10cSrcweir css::uno::makeAny( bAllowUI ) ); 2823cdf0e10cSrcweir css::uno::Sequence< css::uno::Any > aArgs( 1 ); 2824cdf0e10cSrcweir aArgs[0] <<= aProperty; 2825cdf0e10cSrcweir 2826cdf0e10cSrcweir xSessionListener->initialize( aArgs ); 2827cdf0e10cSrcweir } 2828cdf0e10cSrcweir catch(const com::sun::star::uno::Exception& e) 2829cdf0e10cSrcweir { 2830cdf0e10cSrcweir OUString aMessage = OUString::createFromAscii("Registration of session listener failed\n") 2831cdf0e10cSrcweir + e.Message; 2832cdf0e10cSrcweir OSL_ENSURE(sal_False, OUStringToOString(aMessage, RTL_TEXTENCODING_ASCII_US).getStr()); 2833cdf0e10cSrcweir } 2834cdf0e10cSrcweir 2835cdf0e10cSrcweir if ( 2836cdf0e10cSrcweir ( ! bLoaded ) && 2837cdf0e10cSrcweir ( bExistsSessionData ) 2838cdf0e10cSrcweir ) 2839cdf0e10cSrcweir { 2840cdf0e10cSrcweir // session management 2841cdf0e10cSrcweir try 2842cdf0e10cSrcweir { 2843cdf0e10cSrcweir Reference< XSessionManagerListener > r(xSessionListener, UNO_QUERY_THROW); 2844cdf0e10cSrcweir bLoaded = r->doRestore(); 2845cdf0e10cSrcweir } 2846cdf0e10cSrcweir catch(const com::sun::star::uno::Exception& e) 2847cdf0e10cSrcweir { 2848cdf0e10cSrcweir OUString aMessage = OUString::createFromAscii("Error in session management\n") 2849cdf0e10cSrcweir + e.Message; 2850cdf0e10cSrcweir OSL_ENSURE(sal_False, OUStringToOString(aMessage, RTL_TEXTENCODING_ASCII_US).getStr()); 2851cdf0e10cSrcweir } 2852cdf0e10cSrcweir } 2853cdf0e10cSrcweir } 2854cdf0e10cSrcweir 2855cdf0e10cSrcweir OfficeIPCThread::EnableRequests(); 2856cdf0e10cSrcweir 2857cdf0e10cSrcweir sal_Bool bShutdown( sal_False ); 2858cdf0e10cSrcweir if ( !pArgs->IsServer() ) 2859cdf0e10cSrcweir { 2860cdf0e10cSrcweir ProcessDocumentsRequest aRequest(pArgs->getCwdUrl()); 2861cdf0e10cSrcweir aRequest.pcProcessed = NULL; 2862cdf0e10cSrcweir 2863cdf0e10cSrcweir pArgs->GetOpenList( aRequest.aOpenList ); 2864cdf0e10cSrcweir pArgs->GetViewList( aRequest.aViewList ); 2865cdf0e10cSrcweir pArgs->GetStartList( aRequest.aStartList ); 2866cdf0e10cSrcweir pArgs->GetPrintList( aRequest.aPrintList ); 2867cdf0e10cSrcweir pArgs->GetPrintToList( aRequest.aPrintToList ); 2868cdf0e10cSrcweir pArgs->GetPrinterName( aRequest.aPrinterName ); 2869cdf0e10cSrcweir pArgs->GetForceOpenList( aRequest.aForceOpenList ); 2870cdf0e10cSrcweir pArgs->GetForceNewList( aRequest.aForceNewList ); 2871cdf0e10cSrcweir 2872cdf0e10cSrcweir if ( aRequest.aOpenList.getLength() > 0 || 2873cdf0e10cSrcweir aRequest.aViewList.getLength() > 0 || 2874cdf0e10cSrcweir aRequest.aStartList.getLength() > 0 || 2875cdf0e10cSrcweir aRequest.aPrintList.getLength() > 0 || 2876cdf0e10cSrcweir aRequest.aForceOpenList.getLength() > 0 || 2877cdf0e10cSrcweir aRequest.aForceNewList.getLength() > 0 || 2878cdf0e10cSrcweir ( aRequest.aPrintToList.getLength() > 0 && aRequest.aPrinterName.getLength() > 0 )) 2879cdf0e10cSrcweir { 2880cdf0e10cSrcweir bLoaded = sal_True; 2881cdf0e10cSrcweir 2882cdf0e10cSrcweir if ( pArgs->HasModuleParam() ) 2883cdf0e10cSrcweir { 2884cdf0e10cSrcweir SvtModuleOptions aOpt; 2885cdf0e10cSrcweir 2886cdf0e10cSrcweir // Support command line parameters to start a module (as preselection) 2887cdf0e10cSrcweir if ( pArgs->IsWriter() && aOpt.IsModuleInstalled( SvtModuleOptions::E_SWRITER ) ) 2888cdf0e10cSrcweir aRequest.aModule = aOpt.GetFactoryName( SvtModuleOptions::E_WRITER ); 2889cdf0e10cSrcweir else if ( pArgs->IsCalc() && aOpt.IsModuleInstalled( SvtModuleOptions::E_SCALC ) ) 2890cdf0e10cSrcweir aRequest.aModule = aOpt.GetFactoryName( SvtModuleOptions::E_CALC ); 2891cdf0e10cSrcweir else if ( pArgs->IsImpress() && aOpt.IsModuleInstalled( SvtModuleOptions::E_SIMPRESS ) ) 2892cdf0e10cSrcweir aRequest.aModule= aOpt.GetFactoryName( SvtModuleOptions::E_IMPRESS ); 2893cdf0e10cSrcweir else if ( pArgs->IsDraw() && aOpt.IsModuleInstalled( SvtModuleOptions::E_SDRAW ) ) 2894cdf0e10cSrcweir aRequest.aModule= aOpt.GetFactoryName( SvtModuleOptions::E_DRAW ); 2895cdf0e10cSrcweir } 2896cdf0e10cSrcweir 2897cdf0e10cSrcweir // check for printing disabled 2898cdf0e10cSrcweir if( ( aRequest.aPrintList.getLength() || aRequest.aPrintToList.getLength() ) 2899cdf0e10cSrcweir && Application::GetSettings().GetMiscSettings().GetDisablePrinting() ) 2900cdf0e10cSrcweir { 2901cdf0e10cSrcweir aRequest.aPrintList = rtl::OUString(); 2902cdf0e10cSrcweir aRequest.aPrintToList = rtl::OUString(); 2903cdf0e10cSrcweir ResMgr* pDtResMgr = GetDesktopResManager(); 2904cdf0e10cSrcweir if( pDtResMgr ) 2905cdf0e10cSrcweir { 2906cdf0e10cSrcweir ErrorBox aBox( NULL, ResId( EBX_ERR_PRINTDISABLED, *pDtResMgr ) ); 2907cdf0e10cSrcweir aBox.Execute(); 2908cdf0e10cSrcweir } 2909cdf0e10cSrcweir } 2910cdf0e10cSrcweir 2911cdf0e10cSrcweir // Process request 2912cdf0e10cSrcweir bShutdown = OfficeIPCThread::ExecuteCmdLineRequests( aRequest ); 2913cdf0e10cSrcweir } 2914cdf0e10cSrcweir } 2915cdf0e10cSrcweir 2916cdf0e10cSrcweir // Don't do anything if we have successfully called terminate at desktop 2917cdf0e10cSrcweir if ( bShutdown ) 2918cdf0e10cSrcweir return; 2919cdf0e10cSrcweir 2920cdf0e10cSrcweir // no default document if a document was loaded by recovery or by command line or if soffice is used as server 2921cdf0e10cSrcweir Reference< XFramesSupplier > xTasksSupplier( 2922cdf0e10cSrcweir ::comphelper::getProcessServiceFactory()->createInstance( OUSTRING(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.Desktop")) ), 2923cdf0e10cSrcweir ::com::sun::star::uno::UNO_QUERY_THROW ); 2924cdf0e10cSrcweir Reference< XElementAccess > xList( xTasksSupplier->getFrames(), UNO_QUERY_THROW ); 2925cdf0e10cSrcweir if ( xList->hasElements() || pArgs->IsServer() ) 2926cdf0e10cSrcweir return; 2927cdf0e10cSrcweir 2928cdf0e10cSrcweir if ( pArgs->IsQuickstart() || pArgs->IsInvisible() || pArgs->IsBean() || Application::AnyInput( INPUT_APPEVENT ) ) 2929cdf0e10cSrcweir // soffice was started as tray icon ... 2930cdf0e10cSrcweir return; 2931cdf0e10cSrcweir { 2932cdf0e10cSrcweir OpenDefault(); 2933cdf0e10cSrcweir } 2934cdf0e10cSrcweir } 2935cdf0e10cSrcweir 2936cdf0e10cSrcweir void Desktop::OpenDefault() 2937cdf0e10cSrcweir { 2938cdf0e10cSrcweir 2939cdf0e10cSrcweir RTL_LOGFILE_CONTEXT( aLog, "desktop (cd100003) ::Desktop::OpenDefault" ); 2940cdf0e10cSrcweir 2941cdf0e10cSrcweir ::rtl::OUString aName; 2942cdf0e10cSrcweir SvtModuleOptions aOpt; 2943cdf0e10cSrcweir 2944cdf0e10cSrcweir CommandLineArgs* pArgs = GetCommandLineArgs(); 2945cdf0e10cSrcweir if ( pArgs->IsNoDefault() ) return; 2946cdf0e10cSrcweir if ( pArgs->HasModuleParam() ) 2947cdf0e10cSrcweir { 2948cdf0e10cSrcweir // Support new command line parameters to start a module 2949cdf0e10cSrcweir if ( pArgs->IsWriter() && aOpt.IsModuleInstalled( SvtModuleOptions::E_SWRITER ) ) 2950cdf0e10cSrcweir aName = aOpt.GetFactoryEmptyDocumentURL( SvtModuleOptions::E_WRITER ); 2951cdf0e10cSrcweir else if ( pArgs->IsCalc() && aOpt.IsModuleInstalled( SvtModuleOptions::E_SCALC ) ) 2952cdf0e10cSrcweir aName = aOpt.GetFactoryEmptyDocumentURL( SvtModuleOptions::E_CALC ); 2953cdf0e10cSrcweir else if ( pArgs->IsImpress() && aOpt.IsModuleInstalled( SvtModuleOptions::E_SIMPRESS ) ) 2954cdf0e10cSrcweir aName = aOpt.GetFactoryEmptyDocumentURL( SvtModuleOptions::E_IMPRESS ); 2955cdf0e10cSrcweir else if ( pArgs->IsBase() && aOpt.IsModuleInstalled( SvtModuleOptions::E_SDATABASE ) ) 2956cdf0e10cSrcweir aName = aOpt.GetFactoryEmptyDocumentURL( SvtModuleOptions::E_DATABASE ); 2957cdf0e10cSrcweir else if ( pArgs->IsDraw() && aOpt.IsModuleInstalled( SvtModuleOptions::E_SDRAW ) ) 2958cdf0e10cSrcweir aName = aOpt.GetFactoryEmptyDocumentURL( SvtModuleOptions::E_DRAW ); 2959cdf0e10cSrcweir else if ( pArgs->IsMath() && aOpt.IsModuleInstalled( SvtModuleOptions::E_SMATH ) ) 2960cdf0e10cSrcweir aName = aOpt.GetFactoryEmptyDocumentURL( SvtModuleOptions::E_MATH ); 2961cdf0e10cSrcweir else if ( pArgs->IsGlobal() && aOpt.IsModuleInstalled( SvtModuleOptions::E_SWRITER ) ) 2962cdf0e10cSrcweir aName = aOpt.GetFactoryEmptyDocumentURL( SvtModuleOptions::E_WRITERGLOBAL ); 2963cdf0e10cSrcweir else if ( pArgs->IsWeb() && aOpt.IsModuleInstalled( SvtModuleOptions::E_SWRITER ) ) 2964cdf0e10cSrcweir aName = aOpt.GetFactoryEmptyDocumentURL( SvtModuleOptions::E_WRITERWEB ); 2965cdf0e10cSrcweir } 2966cdf0e10cSrcweir 2967cdf0e10cSrcweir if ( !aName.getLength() ) 2968cdf0e10cSrcweir { 2969cdf0e10cSrcweir // Old way to create a default document 2970cdf0e10cSrcweir if ( aOpt.IsModuleInstalled( SvtModuleOptions::E_SWRITER ) ) 2971cdf0e10cSrcweir aName = aOpt.GetFactoryEmptyDocumentURL( SvtModuleOptions::E_WRITER ); 2972cdf0e10cSrcweir else if ( aOpt.IsModuleInstalled( SvtModuleOptions::E_SCALC ) ) 2973cdf0e10cSrcweir aName = aOpt.GetFactoryEmptyDocumentURL( SvtModuleOptions::E_CALC ); 2974cdf0e10cSrcweir else if ( aOpt.IsModuleInstalled( SvtModuleOptions::E_SIMPRESS ) ) 2975cdf0e10cSrcweir aName = aOpt.GetFactoryEmptyDocumentURL( SvtModuleOptions::E_IMPRESS ); 2976cdf0e10cSrcweir else if ( aOpt.IsModuleInstalled( SvtModuleOptions::E_SDATABASE ) ) 2977cdf0e10cSrcweir aName = aOpt.GetFactoryEmptyDocumentURL( SvtModuleOptions::E_DATABASE ); 2978cdf0e10cSrcweir else if ( aOpt.IsModuleInstalled( SvtModuleOptions::E_SDRAW ) ) 2979cdf0e10cSrcweir aName = aOpt.GetFactoryEmptyDocumentURL( SvtModuleOptions::E_DRAW ); 2980cdf0e10cSrcweir else 2981cdf0e10cSrcweir return; 2982cdf0e10cSrcweir } 2983cdf0e10cSrcweir 2984cdf0e10cSrcweir ProcessDocumentsRequest aRequest(pArgs->getCwdUrl()); 2985cdf0e10cSrcweir aRequest.pcProcessed = NULL; 2986cdf0e10cSrcweir aRequest.aOpenList = aName; 2987cdf0e10cSrcweir OfficeIPCThread::ExecuteCmdLineRequests( aRequest ); 2988cdf0e10cSrcweir } 2989cdf0e10cSrcweir 2990cdf0e10cSrcweir 2991cdf0e10cSrcweir String GetURL_Impl( 2992cdf0e10cSrcweir const String& rName, boost::optional< rtl::OUString > const & cwdUrl ) 2993cdf0e10cSrcweir { 2994cdf0e10cSrcweir // if rName is a vnd.sun.star.script URL do not attempt to parse it 2995cdf0e10cSrcweir // as INetURLObj does not handle handle there URLs 2996cdf0e10cSrcweir if (rName.CompareToAscii("vnd.sun.star.script" , 19) == COMPARE_EQUAL) 2997cdf0e10cSrcweir { 2998cdf0e10cSrcweir return rName; 2999cdf0e10cSrcweir } 3000cdf0e10cSrcweir 3001cdf0e10cSrcweir // dont touch file urls, those should already be in internal form 3002cdf0e10cSrcweir // they won't get better here (#112849#) 3003cdf0e10cSrcweir if (rName.CompareToAscii("file:" , 5) == COMPARE_EQUAL) 3004cdf0e10cSrcweir { 3005cdf0e10cSrcweir return rName; 3006cdf0e10cSrcweir } 3007cdf0e10cSrcweir 3008cdf0e10cSrcweir if ( rName.CompareToAscii("service:" , 8) == COMPARE_EQUAL ) 3009cdf0e10cSrcweir { 3010cdf0e10cSrcweir return rName; 3011cdf0e10cSrcweir } 3012cdf0e10cSrcweir 3013cdf0e10cSrcweir // Add path seperator to these directory and make given URL (rName) absolute by using of current working directory 3014cdf0e10cSrcweir // Attention: "setFianlSlash()" is neccessary for calling "smartRel2Abs()"!!! 3015cdf0e10cSrcweir // Otherwhise last part will be ignored and wrong result will be returned!!! 3016cdf0e10cSrcweir // "smartRel2Abs()" interpret given URL as file not as path. So he truncate last element to get the base path ... 3017cdf0e10cSrcweir // But if we add a seperator - he doesn't do it anymore. 3018cdf0e10cSrcweir INetURLObject aObj; 3019cdf0e10cSrcweir if (cwdUrl) { 3020cdf0e10cSrcweir aObj.SetURL(*cwdUrl); 3021cdf0e10cSrcweir aObj.setFinalSlash(); 3022cdf0e10cSrcweir } 3023cdf0e10cSrcweir 3024cdf0e10cSrcweir // Use the provided parameters for smartRel2Abs to support the usage of '%' in system paths. 3025cdf0e10cSrcweir // Otherwise this char won't get encoded and we are not able to load such files later, 3026cdf0e10cSrcweir // see #110156# 3027cdf0e10cSrcweir bool bWasAbsolute; 3028cdf0e10cSrcweir INetURLObject aURL = aObj.smartRel2Abs( rName, bWasAbsolute, false, INetURLObject::WAS_ENCODED, 3029cdf0e10cSrcweir RTL_TEXTENCODING_UTF8, true ); 3030cdf0e10cSrcweir String aFileURL = aURL.GetMainURL(INetURLObject::NO_DECODE); 3031cdf0e10cSrcweir 3032cdf0e10cSrcweir ::osl::FileStatus aStatus( FileStatusMask_FileURL ); 3033cdf0e10cSrcweir ::osl::DirectoryItem aItem; 3034cdf0e10cSrcweir if( ::osl::FileBase::E_None == ::osl::DirectoryItem::get( aFileURL, aItem ) && 3035cdf0e10cSrcweir ::osl::FileBase::E_None == aItem.getFileStatus( aStatus ) ) 3036cdf0e10cSrcweir aFileURL = aStatus.getFileURL(); 3037cdf0e10cSrcweir 3038cdf0e10cSrcweir return aFileURL; 3039cdf0e10cSrcweir } 3040cdf0e10cSrcweir 3041cdf0e10cSrcweir void Desktop::HandleAppEvent( const ApplicationEvent& rAppEvent ) 3042cdf0e10cSrcweir { 3043cdf0e10cSrcweir if ( rAppEvent.GetEvent() == "APPEAR" && !GetCommandLineArgs()->IsInvisible() ) 3044cdf0e10cSrcweir { 3045cdf0e10cSrcweir css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = ::comphelper::getProcessServiceFactory(); 3046cdf0e10cSrcweir 3047cdf0e10cSrcweir // find active task - the active task is always a visible task 3048cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFramesSupplier > 3049cdf0e10cSrcweir xDesktop( xSMGR->createInstance( OUSTRING(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.Desktop")) ), 3050cdf0e10cSrcweir ::com::sun::star::uno::UNO_QUERY ); 3051cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > xTask = xDesktop->getActiveFrame(); 3052cdf0e10cSrcweir if ( !xTask.is() ) 3053cdf0e10cSrcweir { 3054cdf0e10cSrcweir // get any task if there is no active one 3055cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > xList( xDesktop->getFrames(), ::com::sun::star::uno::UNO_QUERY ); 3056cdf0e10cSrcweir if ( xList->getCount()>0 ) 3057cdf0e10cSrcweir xList->getByIndex(0) >>= xTask; 3058cdf0e10cSrcweir } 3059cdf0e10cSrcweir 3060cdf0e10cSrcweir if ( xTask.is() ) 3061cdf0e10cSrcweir { 3062cdf0e10cSrcweir Reference< com::sun::star::awt::XTopWindow > xTop( xTask->getContainerWindow(), UNO_QUERY ); 3063cdf0e10cSrcweir xTop->toFront(); 3064cdf0e10cSrcweir } 3065cdf0e10cSrcweir else 3066cdf0e10cSrcweir { 3067cdf0e10cSrcweir // no visible task that could be activated found 3068cdf0e10cSrcweir Reference< XFrame > xBackingFrame; 3069cdf0e10cSrcweir Reference< ::com::sun::star::awt::XWindow > xContainerWindow; 3070cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > xDesktopFrame( xDesktop, UNO_QUERY ); 3071cdf0e10cSrcweir 3072cdf0e10cSrcweir xBackingFrame = xDesktopFrame->findFrame(OUString( RTL_CONSTASCII_USTRINGPARAM( "_blank" )), 0); 3073cdf0e10cSrcweir if (xBackingFrame.is()) 3074cdf0e10cSrcweir xContainerWindow = xBackingFrame->getContainerWindow(); 3075cdf0e10cSrcweir if (xContainerWindow.is()) 3076cdf0e10cSrcweir { 3077cdf0e10cSrcweir Sequence< Any > lArgs(1); 3078cdf0e10cSrcweir lArgs[0] <<= xContainerWindow; 3079cdf0e10cSrcweir Reference< XController > xBackingComp( 3080cdf0e10cSrcweir xSMGR->createInstanceWithArguments(OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.StartModule") ), lArgs), 3081cdf0e10cSrcweir UNO_QUERY); 3082cdf0e10cSrcweir if (xBackingComp.is()) 3083cdf0e10cSrcweir { 3084cdf0e10cSrcweir Reference< ::com::sun::star::awt::XWindow > xBackingWin(xBackingComp, UNO_QUERY); 3085cdf0e10cSrcweir // Attention: You MUST(!) call setComponent() before you call attachFrame(). 3086cdf0e10cSrcweir // Because the backing component set the property "IsBackingMode" of the frame 3087cdf0e10cSrcweir // to true inside attachFrame(). But setComponent() reset this state everytimes ... 3088cdf0e10cSrcweir xBackingFrame->setComponent(xBackingWin, xBackingComp); 3089cdf0e10cSrcweir xBackingComp->attachFrame(xBackingFrame); 3090cdf0e10cSrcweir xContainerWindow->setVisible(sal_True); 3091cdf0e10cSrcweir 3092cdf0e10cSrcweir Window* pCompWindow = VCLUnoHelper::GetWindow(xBackingFrame->getComponentWindow()); 3093cdf0e10cSrcweir if (pCompWindow) 3094cdf0e10cSrcweir pCompWindow->Update(); 3095cdf0e10cSrcweir } 3096cdf0e10cSrcweir } 3097cdf0e10cSrcweir } 3098cdf0e10cSrcweir } 3099cdf0e10cSrcweir else if ( rAppEvent.GetEvent() == "QUICKSTART" && !GetCommandLineArgs()->IsInvisible() ) 3100cdf0e10cSrcweir { 3101cdf0e10cSrcweir // If the office has been started the second time its command line arguments are sent through a pipe 3102cdf0e10cSrcweir // connection to the first office. We want to reuse the quickstart option for the first office. 3103cdf0e10cSrcweir // NOTICE: The quickstart service must be initialized inside the "main thread", so we use the 3104cdf0e10cSrcweir // application events to do this (they are executed inside main thread)!!! 3105cdf0e10cSrcweir // Don't start quickstart service if the user specified "-invisible" on the command line! 3106cdf0e10cSrcweir sal_Bool bQuickstart( sal_True ); 3107cdf0e10cSrcweir Sequence< Any > aSeq( 1 ); 3108cdf0e10cSrcweir aSeq[0] <<= bQuickstart; 3109cdf0e10cSrcweir 3110cdf0e10cSrcweir Reference < XInitialization > xQuickstart( ::comphelper::getProcessServiceFactory()->createInstance( 3111cdf0e10cSrcweir DEFINE_CONST_UNICODE( "com.sun.star.office.Quickstart" )), 3112cdf0e10cSrcweir UNO_QUERY ); 3113cdf0e10cSrcweir if ( xQuickstart.is() ) 3114cdf0e10cSrcweir xQuickstart->initialize( aSeq ); 3115cdf0e10cSrcweir } 3116cdf0e10cSrcweir else if ( rAppEvent.GetEvent() == "ACCEPT" ) 3117cdf0e10cSrcweir { 3118cdf0e10cSrcweir // every time an accept parameter is used we create an acceptor 3119cdf0e10cSrcweir // with the corresponding accept-string 3120cdf0e10cSrcweir OUString aAcceptString(rAppEvent.GetData().GetBuffer()); 3121cdf0e10cSrcweir createAcceptor(aAcceptString); 3122cdf0e10cSrcweir } 3123cdf0e10cSrcweir else if ( rAppEvent.GetEvent() == "UNACCEPT" ) 3124cdf0e10cSrcweir { 3125cdf0e10cSrcweir // try to remove corresponding acceptor 3126cdf0e10cSrcweir OUString aUnAcceptString(rAppEvent.GetData().GetBuffer()); 3127cdf0e10cSrcweir destroyAcceptor(aUnAcceptString); 3128cdf0e10cSrcweir } 3129cdf0e10cSrcweir else if ( rAppEvent.GetEvent() == "SaveDocuments" ) 3130cdf0e10cSrcweir { 3131cdf0e10cSrcweir Desktop::_bTasksSaved = sal_False; 3132cdf0e10cSrcweir Desktop::_bTasksSaved = SaveTasks(); 3133cdf0e10cSrcweir } 3134cdf0e10cSrcweir else if ( rAppEvent.GetEvent() == "OPENHELPURL" ) 3135cdf0e10cSrcweir { 3136cdf0e10cSrcweir // start help for a specific URL 3137cdf0e10cSrcweir OUString aHelpURL(rAppEvent.GetData().GetBuffer()); 3138cdf0e10cSrcweir Help *pHelp = Application::GetHelp(); 3139cdf0e10cSrcweir pHelp->Start(aHelpURL, NULL); 3140cdf0e10cSrcweir } 3141cdf0e10cSrcweir else if ( rAppEvent.GetEvent() == APPEVENT_OPEN_STRING ) 3142cdf0e10cSrcweir { 3143cdf0e10cSrcweir OUString aOpenURL(rAppEvent.GetData().GetBuffer()); 3144cdf0e10cSrcweir 3145cdf0e10cSrcweir CommandLineArgs* pCmdLine = GetCommandLineArgs(); 3146cdf0e10cSrcweir if ( !pCmdLine->IsInvisible() && !pCmdLine->IsTerminateAfterInit() ) 3147cdf0e10cSrcweir { 3148cdf0e10cSrcweir ProcessDocumentsRequest* pDocsRequest = new ProcessDocumentsRequest( 3149cdf0e10cSrcweir pCmdLine->getCwdUrl()); 3150cdf0e10cSrcweir pDocsRequest->aOpenList = aOpenURL; 3151cdf0e10cSrcweir pDocsRequest->pcProcessed = NULL; 3152cdf0e10cSrcweir 3153cdf0e10cSrcweir OfficeIPCThread::ExecuteCmdLineRequests( *pDocsRequest ); 3154cdf0e10cSrcweir delete pDocsRequest; 3155cdf0e10cSrcweir } 3156cdf0e10cSrcweir } 3157cdf0e10cSrcweir else if ( rAppEvent.GetEvent() == APPEVENT_PRINT_STRING ) 3158cdf0e10cSrcweir { 3159cdf0e10cSrcweir OUString aPrintURL(rAppEvent.GetData().GetBuffer()); 3160cdf0e10cSrcweir 3161cdf0e10cSrcweir CommandLineArgs* pCmdLine = GetCommandLineArgs(); 3162cdf0e10cSrcweir if ( !pCmdLine->IsInvisible() && !pCmdLine->IsTerminateAfterInit() ) 3163cdf0e10cSrcweir { 3164cdf0e10cSrcweir ProcessDocumentsRequest* pDocsRequest = new ProcessDocumentsRequest( 3165cdf0e10cSrcweir pCmdLine->getCwdUrl()); 3166cdf0e10cSrcweir pDocsRequest->aPrintList = aPrintURL; 3167cdf0e10cSrcweir pDocsRequest->pcProcessed = NULL; 3168cdf0e10cSrcweir 3169cdf0e10cSrcweir OfficeIPCThread::ExecuteCmdLineRequests( *pDocsRequest ); 3170cdf0e10cSrcweir delete pDocsRequest; 3171cdf0e10cSrcweir } 3172cdf0e10cSrcweir } 3173cdf0e10cSrcweir #ifndef UNX 3174cdf0e10cSrcweir else if ( rAppEvent.GetEvent() == "HELP" ) 3175cdf0e10cSrcweir { 3176cdf0e10cSrcweir // in non unix version allow showing of cmdline help window 3177cdf0e10cSrcweir displayCmdlineHelp(); 3178cdf0e10cSrcweir } 3179cdf0e10cSrcweir #endif 3180cdf0e10cSrcweir else if ( rAppEvent.GetEvent() == "SHOWDIALOG" ) 3181cdf0e10cSrcweir { 3182cdf0e10cSrcweir // ignore all errors here. It's clicking a menu entry only ... 3183cdf0e10cSrcweir // The user will try it again, in case nothing happens .-) 3184cdf0e10cSrcweir try 3185cdf0e10cSrcweir { 3186cdf0e10cSrcweir css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = ::comphelper::getProcessServiceFactory(); 3187cdf0e10cSrcweir 3188cdf0e10cSrcweir com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider > 3189cdf0e10cSrcweir xDesktop( xSMGR->createInstance( OUSTRING(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.Desktop")) ), 3190cdf0e10cSrcweir ::com::sun::star::uno::UNO_QUERY ); 3191cdf0e10cSrcweir 3192cdf0e10cSrcweir // check provider ... we know it's weak reference only 3193cdf0e10cSrcweir if ( ! xDesktop.is()) 3194cdf0e10cSrcweir return; 3195cdf0e10cSrcweir 3196cdf0e10cSrcweir css::uno::Reference< css::util::XURLTransformer > xParser(xSMGR->createInstance(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.util.URLTransformer"))), css::uno::UNO_QUERY_THROW); 3197cdf0e10cSrcweir css::util::URL aCommand; 3198cdf0e10cSrcweir if( rAppEvent.GetData().EqualsAscii( "PREFERENCES" ) ) 3199cdf0e10cSrcweir aCommand.Complete = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:OptionsTreeDialog" ) ); 3200cdf0e10cSrcweir else if( rAppEvent.GetData().EqualsAscii( "ABOUT" ) ) 3201cdf0e10cSrcweir aCommand.Complete = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:About" ) ); 3202cdf0e10cSrcweir if( aCommand.Complete.getLength() ) 3203cdf0e10cSrcweir { 3204cdf0e10cSrcweir xParser->parseStrict(aCommand); 3205cdf0e10cSrcweir 3206cdf0e10cSrcweir css::uno::Reference< css::frame::XDispatch > xDispatch = xDesktop->queryDispatch(aCommand, rtl::OUString(), 0); 3207cdf0e10cSrcweir if (xDispatch.is()) 3208cdf0e10cSrcweir xDispatch->dispatch(aCommand, css::uno::Sequence< css::beans::PropertyValue >()); 3209cdf0e10cSrcweir } 3210cdf0e10cSrcweir } 3211cdf0e10cSrcweir catch(const css::uno::Exception&) 3212cdf0e10cSrcweir {} 3213cdf0e10cSrcweir } 3214cdf0e10cSrcweir else if( rAppEvent.GetEvent() == "PRIVATE:DOSHUTDOWN" ) 3215cdf0e10cSrcweir { 3216cdf0e10cSrcweir Desktop* pD = dynamic_cast<Desktop*>(GetpApp()); 3217cdf0e10cSrcweir OSL_ENSURE( pD, "no desktop ?!?" ); 3218cdf0e10cSrcweir if( pD ) 3219cdf0e10cSrcweir pD->doShutdown(); 3220cdf0e10cSrcweir } 3221cdf0e10cSrcweir } 3222cdf0e10cSrcweir 3223cdf0e10cSrcweir void Desktop::OpenSplashScreen() 3224cdf0e10cSrcweir { 3225cdf0e10cSrcweir ::rtl::OUString aTmpString; 3226cdf0e10cSrcweir CommandLineArgs* pCmdLine = GetCommandLineArgs(); 3227cdf0e10cSrcweir sal_Bool bVisible = sal_False; 3228cdf0e10cSrcweir // Show intro only if this is normal start (e.g. no server, no quickstart, no printing ) 3229cdf0e10cSrcweir if ( !pCmdLine->IsInvisible() && 3230cdf0e10cSrcweir !pCmdLine->IsHeadless() && 3231cdf0e10cSrcweir !pCmdLine->IsQuickstart() && 3232cdf0e10cSrcweir !pCmdLine->IsMinimized() && 3233cdf0e10cSrcweir !pCmdLine->IsNoLogo() && 3234cdf0e10cSrcweir !pCmdLine->IsTerminateAfterInit() && 3235cdf0e10cSrcweir !pCmdLine->GetPrintList( aTmpString ) && 3236cdf0e10cSrcweir !pCmdLine->GetPrintToList( aTmpString ) ) 3237cdf0e10cSrcweir { 3238cdf0e10cSrcweir // Determine application name from command line parameters 3239cdf0e10cSrcweir OUString aAppName; 3240cdf0e10cSrcweir if ( pCmdLine->IsWriter() ) 3241cdf0e10cSrcweir aAppName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "writer" )); 3242cdf0e10cSrcweir else if ( pCmdLine->IsCalc() ) 3243cdf0e10cSrcweir aAppName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "calc" )); 3244cdf0e10cSrcweir else if ( pCmdLine->IsDraw() ) 3245cdf0e10cSrcweir aAppName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "draw" )); 3246cdf0e10cSrcweir else if ( pCmdLine->IsImpress() ) 3247cdf0e10cSrcweir aAppName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "impress" )); 3248cdf0e10cSrcweir else if ( pCmdLine->IsBase() ) 3249cdf0e10cSrcweir aAppName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "base" )); 3250cdf0e10cSrcweir else if ( pCmdLine->IsGlobal() ) 3251cdf0e10cSrcweir aAppName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "global" )); 3252cdf0e10cSrcweir else if ( pCmdLine->IsMath() ) 3253cdf0e10cSrcweir aAppName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "math" )); 3254cdf0e10cSrcweir else if ( pCmdLine->IsWeb() ) 3255cdf0e10cSrcweir aAppName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "web" )); 3256cdf0e10cSrcweir 3257cdf0e10cSrcweir bVisible = sal_True; 3258cdf0e10cSrcweir Sequence< Any > aSeq( 2 ); 3259cdf0e10cSrcweir aSeq[0] <<= bVisible; 3260cdf0e10cSrcweir aSeq[1] <<= aAppName; 3261cdf0e10cSrcweir m_rSplashScreen = Reference<XStatusIndicator>( 3262cdf0e10cSrcweir comphelper::getProcessServiceFactory()->createInstanceWithArguments( 3263cdf0e10cSrcweir OUString::createFromAscii("com.sun.star.office.SplashScreen"), 3264cdf0e10cSrcweir aSeq), UNO_QUERY); 3265cdf0e10cSrcweir 3266cdf0e10cSrcweir if(m_rSplashScreen.is()) 3267cdf0e10cSrcweir m_rSplashScreen->start(OUString::createFromAscii("SplashScreen"), 100); 3268cdf0e10cSrcweir } 3269cdf0e10cSrcweir 3270cdf0e10cSrcweir } 3271cdf0e10cSrcweir 3272cdf0e10cSrcweir void Desktop::SetSplashScreenProgress(sal_Int32 iProgress) 3273cdf0e10cSrcweir { 3274cdf0e10cSrcweir if(m_rSplashScreen.is()) 3275cdf0e10cSrcweir { 3276cdf0e10cSrcweir m_rSplashScreen->setValue(iProgress); 3277cdf0e10cSrcweir } 3278cdf0e10cSrcweir } 3279cdf0e10cSrcweir 3280cdf0e10cSrcweir void Desktop::SetSplashScreenText( const ::rtl::OUString& rText ) 3281cdf0e10cSrcweir { 3282cdf0e10cSrcweir if( m_rSplashScreen.is() ) 3283cdf0e10cSrcweir { 3284cdf0e10cSrcweir m_rSplashScreen->setText( rText ); 3285cdf0e10cSrcweir } 3286cdf0e10cSrcweir } 3287cdf0e10cSrcweir 3288cdf0e10cSrcweir void Desktop::CloseSplashScreen() 3289cdf0e10cSrcweir { 3290cdf0e10cSrcweir if(m_rSplashScreen.is()) 3291cdf0e10cSrcweir { 3292cdf0e10cSrcweir m_rSplashScreen->end(); 3293cdf0e10cSrcweir m_rSplashScreen = NULL; 3294cdf0e10cSrcweir } 3295cdf0e10cSrcweir } 3296cdf0e10cSrcweir 3297cdf0e10cSrcweir // ======================================================================== 3298cdf0e10cSrcweir void Desktop::DoFirstRunInitializations() 3299cdf0e10cSrcweir { 3300cdf0e10cSrcweir try 3301cdf0e10cSrcweir { 3302cdf0e10cSrcweir Reference< XJobExecutor > xExecutor( ::comphelper::getProcessServiceFactory()->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.task.JobExecutor" ) ), UNO_QUERY ); 3303cdf0e10cSrcweir if( xExecutor.is() ) 3304cdf0e10cSrcweir xExecutor->trigger( ::rtl::OUString::createFromAscii("onFirstRunInitialization") ); 3305cdf0e10cSrcweir } 3306cdf0e10cSrcweir catch(const ::com::sun::star::uno::Exception&) 3307cdf0e10cSrcweir { 3308cdf0e10cSrcweir OSL_ENSURE( sal_False, "Desktop::DoFirstRunInitializations: caught an exception while trigger job executor ..." ); 3309cdf0e10cSrcweir } 3310cdf0e10cSrcweir } 3311cdf0e10cSrcweir 3312cdf0e10cSrcweir // ======================================================================== 3313cdf0e10cSrcweir void Desktop::CheckFirstRun( ) 3314cdf0e10cSrcweir { 3315cdf0e10cSrcweir const ::rtl::OUString sCommonMiscNodeName = ::rtl::OUString::createFromAscii( "/org.openoffice.Office.Common/Misc" ); 3316cdf0e10cSrcweir const ::rtl::OUString sFirstRunNodeName = ::rtl::OUString::createFromAscii( "FirstRun" ); 3317cdf0e10cSrcweir 3318cdf0e10cSrcweir // -------------------------------------------------------------------- 3319cdf0e10cSrcweir // check if this is the first office start 3320cdf0e10cSrcweir 3321cdf0e10cSrcweir // for this, open the Common/Misc node where this info is stored 3322cdf0e10cSrcweir ::utl::OConfigurationTreeRoot aCommonMisc = ::utl::OConfigurationTreeRoot::createWithServiceFactory( 3323cdf0e10cSrcweir ::comphelper::getProcessServiceFactory( ), 3324cdf0e10cSrcweir sCommonMiscNodeName, 3325cdf0e10cSrcweir 2, 3326cdf0e10cSrcweir ::utl::OConfigurationTreeRoot::CM_UPDATABLE 3327cdf0e10cSrcweir ); 3328cdf0e10cSrcweir 3329cdf0e10cSrcweir // read the flag 3330cdf0e10cSrcweir OSL_ENSURE( aCommonMisc.isValid(), "Desktop::CheckFirstRun: could not open the config node needed!" ); 3331cdf0e10cSrcweir sal_Bool bIsFirstRun = sal_False; 3332cdf0e10cSrcweir aCommonMisc.getNodeValue( sFirstRunNodeName ) >>= bIsFirstRun; 3333cdf0e10cSrcweir 3334cdf0e10cSrcweir if ( !bIsFirstRun ) 3335cdf0e10cSrcweir // nothing to do .... 3336cdf0e10cSrcweir return; 3337cdf0e10cSrcweir 3338cdf0e10cSrcweir // -------------------------------------------------------------------- 3339cdf0e10cSrcweir // it is the first run 3340cdf0e10cSrcweir // this has once been done using a vos timer. this could lead to problems when 3341cdf0e10cSrcweir // the timer would trigger when the app is already going down again, since VCL would 3342cdf0e10cSrcweir // no longer be available. Since the old handler would do a postUserEvent to the main 3343cdf0e10cSrcweir // thread anyway, we can use a vcl timer here to prevent the race contition (#107197#) 3344cdf0e10cSrcweir m_firstRunTimer.SetTimeout(3000); // 3 sec. 3345cdf0e10cSrcweir m_firstRunTimer.SetTimeoutHdl(LINK(this, Desktop, AsyncInitFirstRun)); 3346cdf0e10cSrcweir m_firstRunTimer.Start(); 3347cdf0e10cSrcweir 3348cdf0e10cSrcweir // -------------------------------------------------------------------- 3349cdf0e10cSrcweir // reset the config flag 3350cdf0e10cSrcweir 3351cdf0e10cSrcweir // set the value 3352cdf0e10cSrcweir aCommonMisc.setNodeValue( sFirstRunNodeName, makeAny( (sal_Bool)sal_False ) ); 3353cdf0e10cSrcweir // commit the changes 3354cdf0e10cSrcweir aCommonMisc.commit(); 3355cdf0e10cSrcweir } 3356cdf0e10cSrcweir 3357cdf0e10cSrcweir } 3358