diff options
author | RĂ¼diger Timm <rt@openoffice.org> | 2008-07-07 11:27:03 +0000 |
---|---|---|
committer | RĂ¼diger Timm <rt@openoffice.org> | 2008-07-07 11:27:03 +0000 |
commit | 2184f97c8e395e842e9eafbb0582fafd9cdf7fdb (patch) | |
tree | e55c3a06675f49c359950c39f0cb69de791d408f /desktop | |
parent | d2f87fa3a6fb0033576ca185c2410b8e53b1bf8d (diff) |
INTEGRATION: CWS ab53 (1.14.42); FILE MERGED
2008/06/25 16:07:08 ab 1.14.42.1: #i70283# #i80433# Changed Script/Dialog extension handling
Diffstat (limited to 'desktop')
-rw-r--r-- | desktop/source/deployment/registry/script/dp_script.cxx | 290 |
1 files changed, 175 insertions, 115 deletions
diff --git a/desktop/source/deployment/registry/script/dp_script.cxx b/desktop/source/deployment/registry/script/dp_script.cxx index cc589bc973..1a8a0e4d1b 100644 --- a/desktop/source/deployment/registry/script/dp_script.cxx +++ b/desktop/source/deployment/registry/script/dp_script.cxx @@ -7,7 +7,7 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: dp_script.cxx,v $ - * $Revision: 1.14 $ + * $Revision: 1.15 $ * * This file is part of OpenOffice.org. * @@ -43,6 +43,10 @@ #include "svtools/inettype.hxx" #include "com/sun/star/util/XUpdatable.hpp" #include "com/sun/star/script/XLibraryContainer.hpp" +#include <com/sun/star/ucb/XSimpleFileAccess.hpp> +#include <com/sun/star/util/XMacroExpander.hpp> +#include <com/sun/star/uri/XUriReferenceFactory.hpp> +#include <com/sun/star/uri/XVndSunStarExpandUrl.hpp> #include <memory> using namespace ::dp_misc; @@ -96,10 +100,10 @@ class BackendImpl : public t_helper OUString const & url, OUString const & mediaType, Reference<XCommandEnvironment> const & xCmdEnv ); - Reference<css::script::XLibraryContainer> m_xScriptLibs; - Reference<css::script::XLibraryContainer> m_xDialogLibs; - ::std::auto_ptr<LibraryContainer> m_basic_script_libs; - ::std::auto_ptr<LibraryContainer> m_dialog_libs; + rtl::OUString getRegisteredFlagFileURL( Reference< deployment::XPackage > xPackage ); + rtl::OUString expandURL( const rtl::OUString& aURL ); + Reference< ucb::XSimpleFileAccess > getFileAccess( void ); + Reference< ucb::XSimpleFileAccess > m_xSFA; const Reference<deployment::XPackageTypeInfo> m_xBasicLibTypeInfo; const Reference<deployment::XPackageTypeInfo> m_xDialogLibTypeInfo; @@ -167,73 +171,13 @@ BackendImpl::BackendImpl( m_typeInfos[ 1 ] = m_xDialogLibTypeInfo; OSL_ASSERT( ! transientMode() ); - if (office_is_running()) - { - m_xScriptLibs.set( - xComponentContext->getServiceManager()->createInstanceWithContext( - OUSTR("com.sun.star.script.ApplicationScriptLibraryContainer"), - xComponentContext ), UNO_QUERY_THROW ); - m_xDialogLibs.set( - xComponentContext->getServiceManager()->createInstanceWithContext( - OUSTR("com.sun.star.script.ApplicationDialogLibraryContainer"), - xComponentContext ), UNO_QUERY_THROW ); - } - else - { - OUString basic_path( - m_eContext == CONTEXT_USER - ? OUSTR("vnd.sun.star.expand:${$BRAND_BASE_DIR/program/" - SAL_CONFIGFILE("bootstrap") - ":UserInstallation}/user/basic") - : OUSTR("vnd.sun.star.expand:${$BRAND_BASE_DIR/program/" - SAL_CONFIGFILE("bootstrap") - ":BaseInstallation}/share/basic") ); - m_basic_script_libs.reset( - new LibraryContainer( - makeURL( basic_path, OUSTR("script.xlc") ), - getMutex(), - xComponentContext ) ); - m_dialog_libs.reset( - new LibraryContainer( - makeURL( basic_path, OUSTR("dialog.xlc") ), - getMutex(), - xComponentContext ) ); - } } // XUpdatable //______________________________________________________________________________ void BackendImpl::update() throw (RuntimeException) { - const Reference<XCommandEnvironment> xCmdEnv; - if (m_basic_script_libs.get() != 0) { - try { - m_basic_script_libs->init(xCmdEnv); - m_basic_script_libs->flush(xCmdEnv); - } - catch (RuntimeException &) { - throw; - } - catch (Exception & exc) { - (void) exc; - OSL_ENSURE( 0, ::rtl::OUStringToOString( - exc.Message, RTL_TEXTENCODING_UTF8 ).getStr() ); - } - } - if (m_dialog_libs.get() != 0) { - try { - m_dialog_libs->init(xCmdEnv); - m_dialog_libs->flush(xCmdEnv); - } - catch (RuntimeException &) { - throw; - } - catch (Exception & exc) { - (void) exc; - OSL_ENSURE( 0, ::rtl::OUStringToOString( - exc.Message, RTL_TEXTENCODING_UTF8 ).getStr() ); - } - } + // Nothing to do here after fixing i70283!? } // XPackageRegistry @@ -306,6 +250,90 @@ Reference<deployment::XPackage> BackendImpl::bindPackage_( static_cast<sal_Int16>(-1) ); } +rtl::OUString BackendImpl::getRegisteredFlagFileURL( Reference< deployment::XPackage > xPackage ) +{ + rtl::OUString aRetURL; + if( !xPackage.is() ) + return aRetURL; + rtl::OUString aHelpURL = xPackage->getURL(); + aRetURL = expandURL( aHelpURL ); + aRetURL += rtl::OUString::createFromAscii( "/RegisteredFlag" ); + return aRetURL; +} + +rtl::OUString BackendImpl::expandURL( const rtl::OUString& aURL ) +{ + static Reference< util::XMacroExpander > xMacroExpander; + static Reference< uri::XUriReferenceFactory > xFac; + + if( !xMacroExpander.is() || !xFac.is() ) + { + Reference<XComponentContext> const & xContext = getComponentContext(); + if( xContext.is() ) + { + xFac = Reference< uri::XUriReferenceFactory >( + xContext->getServiceManager()->createInstanceWithContext( rtl::OUString::createFromAscii( + "com.sun.star.uri.UriReferenceFactory"), xContext ) , UNO_QUERY ); + } + if( !xFac.is() ) + { + throw RuntimeException( + ::rtl::OUString::createFromAscii( + "dp_registry::backend::help::BackendImpl::expandURL(), " + "could not instatiate UriReferenceFactory." ), + Reference< XInterface >() ); + } + + xMacroExpander = Reference< util::XMacroExpander >( + xContext->getValueByName( + ::rtl::OUString::createFromAscii( "/singletons/com.sun.star.util.theMacroExpander" ) ), + UNO_QUERY_THROW ); + } + + rtl::OUString aRetURL = aURL; + if( xMacroExpander.is() ) + { + Reference< uri::XUriReference > uriRef; + for (;;) + { + uriRef = Reference< uri::XUriReference >( xFac->parse( aRetURL ), UNO_QUERY ); + if ( uriRef.is() ) + { + Reference < uri::XVndSunStarExpandUrl > sxUri( uriRef, UNO_QUERY ); + if( !sxUri.is() ) + break; + + aRetURL = sxUri->expand( xMacroExpander ); + } + } + } + return aRetURL; +} + +Reference< ucb::XSimpleFileAccess > BackendImpl::getFileAccess( void ) +{ + if( !m_xSFA.is() ) + { + Reference<XComponentContext> const & xContext = getComponentContext(); + if( xContext.is() ) + { + m_xSFA = Reference< ucb::XSimpleFileAccess >( + xContext->getServiceManager()->createInstanceWithContext( + rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ), + xContext ), UNO_QUERY ); + } + if( !m_xSFA.is() ) + { + throw RuntimeException( + ::rtl::OUString::createFromAscii( + "dp_registry::backend::help::BackendImpl::getFileAccess(), " + "could not instatiate SimpleFileAccess." ), + Reference< XInterface >() ); + } + } + return m_xSFA; +} + //############################################################################## // Package @@ -330,23 +358,18 @@ BackendImpl::PackageImpl::isRegistered_( ::rtl::Reference<AbortChannel> const &, Reference<XCommandEnvironment> const & xCmdEnv ) { + (void)xCmdEnv; + BackendImpl * that = getMyBackend(); - bool reg = false; - if (m_scriptURL.getLength() > 0) { - if (that->m_xScriptLibs.is()) - reg = that->m_xScriptLibs->hasByName( m_name ); - else - reg = that->m_basic_script_libs->has( m_name, xCmdEnv ); - } - else { - if (that->m_xDialogLibs.is()) - reg = that->m_xDialogLibs->hasByName( m_dialogName ); - else - reg = that->m_dialog_libs->has( m_dialogName, xCmdEnv ); - } + Reference< deployment::XPackage > xThisPackage( this ); + rtl::OUString aRegisteredFlagFile = that->getRegisteredFlagFileURL( xThisPackage ); + + Reference< ucb::XSimpleFileAccess > xSFA = that->getFileAccess(); + bool bReg = xSFA->exists( aRegisteredFlagFile ); + return beans::Optional< beans::Ambiguous<sal_Bool> >( true /* IsPresent */, - beans::Ambiguous<sal_Bool>( reg, false /* IsAmbiguous */ ) ); + beans::Ambiguous<sal_Bool>( bReg, false /* IsAmbiguous */ ) ); } //______________________________________________________________________________ @@ -356,48 +379,85 @@ void BackendImpl::PackageImpl::processPackage_( ::rtl::Reference<AbortChannel> const &, Reference<XCommandEnvironment> const & xCmdEnv ) { + (void)xCmdEnv; + BackendImpl * that = getMyBackend(); - if (doRegisterPackage) + + Reference< deployment::XPackage > xThisPackage( this ); + rtl::OUString aRegisteredFlagFile = that->getRegisteredFlagFileURL( xThisPackage ); + Reference< ucb::XSimpleFileAccess > xSFA = that->getFileAccess(); + Reference<XComponentContext> const & xComponentContext = that->getComponentContext(); + + bool bScript = (m_scriptURL.getLength() > 0); + Reference<css::script::XLibraryContainer> xScriptLibs; + + bool bDialog = (m_dialogURL.getLength() > 0); + Reference<css::script::XLibraryContainer> xDialogLibs; + + bool bRunning = office_is_running(); + if( bRunning ) { - if (m_scriptURL.getLength() > 0) { - if (that->m_xScriptLibs.is()) - that->m_xScriptLibs->createLibraryLink( - m_name, m_scriptURL, false /* ! read-only */ ); - else - that->m_basic_script_libs->insert( - m_name, m_scriptURL, xCmdEnv ); + if( bScript ) + { + xScriptLibs.set( + xComponentContext->getServiceManager()->createInstanceWithContext( + OUSTR("com.sun.star.script.ApplicationScriptLibraryContainer"), + xComponentContext ), UNO_QUERY_THROW ); } - if (m_dialogURL.getLength() > 0) { - if (that->m_xDialogLibs.is()) - that->m_xDialogLibs->createLibraryLink( - m_dialogName, m_dialogURL, false /* ! read-only */ ); - else - that->m_dialog_libs->insert( - m_dialogName, m_dialogURL, xCmdEnv ); + + if( bDialog ) + { + xDialogLibs.set( + xComponentContext->getServiceManager()->createInstanceWithContext( + OUSTR("com.sun.star.script.ApplicationDialogLibraryContainer"), + xComponentContext ), UNO_QUERY_THROW ); } } - else // revokePackage() + + if( !doRegisterPackage ) { - try { - if (m_scriptURL.getLength() > 0) { - if (that->m_xScriptLibs.is()) - that->m_xScriptLibs->removeLibrary( m_name ); - else - that->m_basic_script_libs->remove( - m_name, m_scriptURL, xCmdEnv ); - } - if (m_dialogURL.getLength() > 0) { - if (that->m_xDialogLibs.is()) - that->m_xDialogLibs->removeLibrary( m_dialogName ); - else - that->m_dialog_libs->remove( - m_dialogName, m_dialogURL, xCmdEnv ); - } - } - catch (lang::WrappedTargetException & exc) { - // unwrap WrappedTargetException: - ::cppu::throwException( exc.TargetException ); + if( xSFA->exists( aRegisteredFlagFile ) ) + { + xSFA->kill( aRegisteredFlagFile ); + + if( bScript && xScriptLibs.is() && xScriptLibs->hasByName( m_name ) ) + xScriptLibs->removeLibrary( m_name ); + + if( bDialog && xDialogLibs.is() && xDialogLibs->hasByName( m_dialogName ) ) + xDialogLibs->removeLibrary( m_dialogName ); } + return; + } + + if( xSFA->exists( aRegisteredFlagFile ) ) + return; // Already registered + + // Update LibraryContainer + bool bScriptSuccess = false; + const bool bReadOnly = false; + if( bScript && xScriptLibs.is() && !xScriptLibs->hasByName( m_name ) ) + { + xScriptLibs->createLibraryLink( m_name, m_scriptURL, bReadOnly ); + bScriptSuccess = xScriptLibs->hasByName( m_name ); + } + + bool bDialogSuccess = false; + if( bDialog && xDialogLibs.is() && !xDialogLibs->hasByName( m_dialogName ) ) + { + xDialogLibs->createLibraryLink( m_dialogName, m_dialogURL, bReadOnly ); + bDialogSuccess = xDialogLibs->hasByName( m_dialogName ); + } + + bool bSuccess = bScript || bDialog; // Something must have happened + if( bRunning ) + if( (bScript && !bScriptSuccess) || (bDialog && !bDialogSuccess) ) + bSuccess = false; + + if( bSuccess && !xSFA->exists( aRegisteredFlagFile ) ) + { + Reference< io::XOutputStream > xOutputStream = xSFA->openFileWrite( aRegisteredFlagFile ); + if( xOutputStream.is() ) + xOutputStream->closeOutput(); } } |