/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_desktop.hxx" #include "dp_gui_shared.hxx" #include "dp_gui.h" #include "dp_gui_theextmgr.hxx" #include "cppuhelper/implbase2.hxx" #include "cppuhelper/implementationentry.hxx" #include "unotools/configmgr.hxx" #include "comphelper/servicedecl.hxx" #include "comphelper/unwrapargs.hxx" #include #include "vcl/svapp.hxx" #include "vcl/msgbox.hxx" #include "com/sun/star/lang/XServiceInfo.hpp" #include "com/sun/star/task/XJobExecutor.hpp" #include "com/sun/star/ui/dialogs/XAsynchronousExecutableDialog.hpp" #include "boost/bind.hpp" #include "license_dialog.hxx" #include "dp_gui_dialog2.hxx" #include "dp_gui_extensioncmdqueue.hxx" using namespace ::dp_misc; using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using ::rtl::OUString; namespace css = ::com::sun::star; namespace dp_gui { //============================================================================== class MyApp : public Application, private boost::noncopyable { public: MyApp(); virtual ~MyApp(); // Application virtual void Main(); }; //______________________________________________________________________________ MyApp::~MyApp() { } //______________________________________________________________________________ MyApp::MyApp() { } //______________________________________________________________________________ void MyApp::Main() { } //############################################################################## namespace { struct ProductName : public rtl::Static< String, ProductName > {}; struct Version : public rtl::Static< String, Version > {}; struct AboutBoxVersion : public rtl::Static< String, AboutBoxVersion > {}; struct OOOVendor : public rtl::Static< String, OOOVendor > {}; struct Extension : public rtl::Static< String, Extension > {}; } void ReplaceProductNameHookProc( String& rStr ) { static int nAll = 0, nPro = 0; nAll++; if ( rStr.SearchAscii( "%PRODUCT" ) != STRING_NOTFOUND ) { String &rProductName = ProductName::get(); String &rVersion = Version::get(); String &rAboutBoxVersion = AboutBoxVersion::get(); String &rExtension = Extension::get(); String &rOOOVendor = OOOVendor::get(); if ( !rProductName.Len() ) { rtl::OUString aTmp; Any aRet = ::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::PRODUCTNAME ); aRet >>= aTmp; rProductName = aTmp; aRet = ::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::PRODUCTVERSION ); aRet >>= aTmp; rVersion = aTmp; aRet = ::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::ABOUTBOXPRODUCTVERSION ); aRet >>= aTmp; rAboutBoxVersion = aTmp; aRet = ::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::OOOVENDOR ); aRet >>= aTmp; rOOOVendor = aTmp; if ( !rExtension.Len() ) { aRet = ::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::PRODUCTEXTENSION ); aRet >>= aTmp; rExtension = aTmp; } } nPro++; rStr.SearchAndReplaceAllAscii( "%PRODUCTNAME", rProductName ); rStr.SearchAndReplaceAllAscii( "%PRODUCTVERSION", rVersion ); rStr.SearchAndReplaceAllAscii( "%ABOUTBOXPRODUCTVERSION", rAboutBoxVersion ); rStr.SearchAndReplaceAllAscii( "%OOOVENDOR", rOOOVendor ); rStr.SearchAndReplaceAllAscii( "%PRODUCTEXTENSION", rExtension ); } } //============================================================================== class ServiceImpl : public ::cppu::WeakImplHelper2 { Reference const m_xComponentContext; boost::optional< Reference > /* const */ m_parent; boost::optional /* const */ m_view; /* if true then this service is running in an unopkg process and not in an office process */ boost::optional /* const */ m_unopkg; boost::optional m_extensionURL; OUString m_initialTitle; bool m_bShowUpdateOnly; public: ServiceImpl( Sequence const & args, Reference const & xComponentContext ); // XAsynchronousExecutableDialog virtual void SAL_CALL setDialogTitle( OUString const & aTitle ) throw (RuntimeException); virtual void SAL_CALL startExecuteModal( Reference< ui::dialogs::XDialogClosedListener > const & xListener ) throw (RuntimeException); // XJobExecutor virtual void SAL_CALL trigger( OUString const & event ) throw (RuntimeException); }; //______________________________________________________________________________ ServiceImpl::ServiceImpl( Sequence const& args, Reference const& xComponentContext) : m_xComponentContext(xComponentContext), m_bShowUpdateOnly( false ) { try { comphelper::unwrapArgs( args, m_parent, m_view, m_unopkg ); return; } catch (css::lang::IllegalArgumentException & ) { } try { comphelper::unwrapArgs( args, m_extensionURL); } catch (css::lang::IllegalArgumentException & ) { } ResHookProc pProc = ResMgr::GetReadStringHook(); if ( !pProc ) ResMgr::SetReadStringHook( ReplaceProductNameHookProc ); } // XAsynchronousExecutableDialog //______________________________________________________________________________ void ServiceImpl::setDialogTitle( OUString const & title ) throw (RuntimeException) { if ( dp_gui::TheExtensionManager::s_ExtMgr.is() ) { const ::vos::OGuard guard( Application::GetSolarMutex() ); ::rtl::Reference< ::dp_gui::TheExtensionManager > dialog( ::dp_gui::TheExtensionManager::get( m_xComponentContext, m_parent ? *m_parent : Reference(), m_extensionURL ? *m_extensionURL : OUString() ) ); dialog->SetText( title ); } else m_initialTitle = title; } //______________________________________________________________________________ void ServiceImpl::startExecuteModal( Reference< ui::dialogs::XDialogClosedListener > const & xListener ) throw (RuntimeException) { bool bCloseDialog = true; // only used if m_bShowUpdateOnly is true ::std::auto_ptr app; //ToDo: synchronize access to s_dialog !!! if (! dp_gui::TheExtensionManager::s_ExtMgr.is()) { const bool bAppUp = (GetpApp() != 0); bool bOfficePipePresent; try { bOfficePipePresent = dp_misc::office_is_running(); } catch (Exception & exc) { if (bAppUp) { const vos::OGuard guard( Application::GetSolarMutex() ); std::auto_ptr box( new ErrorBox( Application::GetActiveTopWindow(), WB_OK, exc.Message ) ); box->Execute(); } throw; } if (! bOfficePipePresent) { OSL_ASSERT( ! bAppUp ); app.reset( new MyApp ); if (! InitVCL( Reference( m_xComponentContext->getServiceManager(), UNO_QUERY_THROW ) )) throw RuntimeException( OUSTR("Cannot initialize VCL!"), static_cast(this) ); AllSettings as = app->GetSettings(); OUString slang; if (! (::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::LOCALE ) >>= slang)) throw RuntimeException( OUSTR("Cannot determine language!"), static_cast(this) ); as.SetUILanguage( MsLangId::convertIsoStringToLanguage( slang ) ); app->SetSettings( as ); String sTitle = ::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::PRODUCTNAME).get() + String(static_cast(' ')) + ::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::PRODUCTVERSION).get(); app->SetDisplayName(sTitle); ExtensionCmdQueue::syncRepositories( m_xComponentContext ); } } else { // When m_bShowUpdateOnly is set, we are inside the office and the user clicked // the update notification icon in the menu bar. We must not close the extensions // dialog after displaying the update dialog when it has been visible before if ( m_bShowUpdateOnly ) bCloseDialog = ! dp_gui::TheExtensionManager::s_ExtMgr->isVisible(); } { const ::vos::OGuard guard( Application::GetSolarMutex() ); ::rtl::Reference< ::dp_gui::TheExtensionManager > myExtMgr( ::dp_gui::TheExtensionManager::get( m_xComponentContext, m_parent ? *m_parent : Reference(), m_extensionURL ? *m_extensionURL : OUString() ) ); myExtMgr->createDialog( false ); if (m_initialTitle.getLength() > 0) { myExtMgr->SetText( m_initialTitle ); m_initialTitle = OUString(); } if ( m_bShowUpdateOnly ) { myExtMgr->checkUpdates( true, !bCloseDialog ); if ( bCloseDialog ) myExtMgr->Close(); else myExtMgr->ToTop( TOTOP_RESTOREWHENMIN ); } else { myExtMgr->Show(); myExtMgr->ToTop( TOTOP_RESTOREWHENMIN ); } } if (app.get() != 0) { Application::Execute(); DeInitVCL(); } if (xListener.is()) xListener->dialogClosed( ui::dialogs::DialogClosedEvent( static_cast< ::cppu::OWeakObject * >(this), sal_Int16(0)) ); } // XJobExecutor //______________________________________________________________________________ void ServiceImpl::trigger( OUString const &rEvent ) throw (RuntimeException) { if ( rEvent == OUSTR("SHOW_UPDATE_DIALOG") ) m_bShowUpdateOnly = true; else m_bShowUpdateOnly = false; startExecuteModal( Reference< ui::dialogs::XDialogClosedListener >() ); } namespace sdecl = comphelper::service_decl; sdecl::class_ > serviceSI; sdecl::ServiceDecl const serviceDecl( serviceSI, "com.sun.star.comp.deployment.ui.PackageManagerDialog", "com.sun.star.deployment.ui.PackageManagerDialog" ); sdecl::class_ > licenseSI; sdecl::ServiceDecl const licenseDecl( licenseSI, "com.sun.star.comp.deployment.ui.LicenseDialog", "com.sun.star.deployment.ui.LicenseDialog" ); sdecl::class_ > updateSI; sdecl::ServiceDecl const updateDecl( updateSI, "com.sun.star.comp.deployment.ui.UpdateRequiredDialog", "com.sun.star.deployment.ui.UpdateRequiredDialog" ); } // namespace dp_gui extern "C" { void SAL_CALL component_getImplementationEnvironment( const sal_Char ** ppEnvTypeName, uno_Environment ** ) { *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; } sal_Bool SAL_CALL component_writeInfo( lang::XMultiServiceFactory * pServiceManager, registry::XRegistryKey * pRegistryKey ) { return component_writeInfoHelper( pServiceManager, pRegistryKey, dp_gui::serviceDecl, dp_gui::licenseDecl, dp_gui::updateDecl ); } void * SAL_CALL component_getFactory( sal_Char const * pImplName, lang::XMultiServiceFactory * pServiceManager, registry::XRegistryKey * pRegistryKey ) { return component_getFactoryHelper( pImplName, pServiceManager, pRegistryKey, dp_gui::serviceDecl, dp_gui::licenseDecl, dp_gui::updateDecl ); } } // extern "C"