summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
authorRĂ¼diger Timm <rt@openoffice.org>2008-07-07 11:27:03 +0000
committerRĂ¼diger Timm <rt@openoffice.org>2008-07-07 11:27:03 +0000
commit2184f97c8e395e842e9eafbb0582fafd9cdf7fdb (patch)
treee55c3a06675f49c359950c39f0cb69de791d408f /desktop
parentd2f87fa3a6fb0033576ca185c2410b8e53b1bf8d (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.cxx290
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();
}
}