diff options
author | Joachim Lingner <jl@openoffice.org> | 2010-05-21 09:42:27 +0200 |
---|---|---|
committer | Joachim Lingner <jl@openoffice.org> | 2010-05-21 09:42:27 +0200 |
commit | 89b704f9db9ebbff43f6a423d2a1f17314de7a5c (patch) | |
tree | 078ba9aa27a55002239e6af1db6d371c962e8114 | |
parent | 7df75b6fe4c992f61c593dc33bb84ba537f05f99 (diff) |
jl152 #i77196# XExtensionManager::synchronize now has no repository argument; adapted PackageInformationProvider to use bundled extensions
4 files changed, 109 insertions, 178 deletions
diff --git a/desktop/source/deployment/manager/dp_extensionmanager.cxx b/desktop/source/deployment/manager/dp_extensionmanager.cxx index edc414dc6f5d..2781231b8f5e 100644 --- a/desktop/source/deployment/manager/dp_extensionmanager.cxx +++ b/desktop/source/deployment/manager/dp_extensionmanager.cxx @@ -116,6 +116,29 @@ OUString CompIdentifiers::getName(::std::vector<Reference<deploy::XPackage> > co OSL_ASSERT(extension.is()); return extension->getDisplayName(); } + +void writeLastModified(OUString & url, Reference<ucb::XCommandEnvironment> const & xCmdEnv) +{ + //Write the lastmodified file + try { + ::rtl::Bootstrap::expandMacros(url); + ::ucbhelper::Content ucbStamp(url, xCmdEnv ); + dp_misc::erase_path( url, xCmdEnv ); + ::rtl::OString stamp("1" ); + Reference<css::io::XInputStream> xData( + ::xmlscript::createInputStream( + ::rtl::ByteSequence( + reinterpret_cast<sal_Int8 const *>(stamp.getStr()), + stamp.getLength() ) ) ); + ucbStamp.writeStream( xData, true /* replace existing */ ); + } + catch(...) + { + uno::Any exc(::cppu::getCaughtException()); + throw deploy::DeploymentException( + OUSTR("Failed to update") + url, 0, exc); + } +} } //end namespace namespace dp_manager { @@ -1021,7 +1044,6 @@ void ExtensionManager::reinstallDeployedExtensions( } sal_Bool ExtensionManager::synchronize( - OUString const & repository, Reference<task::XAbortChannel> const & xAbortChannel, Reference<ucb::XCommandEnvironment> const & xCmdEnv ) throw (deploy::DeploymentException, @@ -1033,37 +1055,20 @@ sal_Bool ExtensionManager::synchronize( try { sal_Bool bModified = sal_False; - Reference<deploy::XPackageManager> xPackageManager; - OUString file; - if (repository.equals(OUSTR("user"))) - { - xPackageManager = m_userRepository; - } - else if (repository.equals(OUSTR("shared"))) - { - xPackageManager = m_sharedRepository; - file = OUString ( - RTL_CONSTASCII_USTRINGPARAM( - "$SHARED_EXTENSIONS_USER/lastsynchronized")); - } - else if (repository.equals(OUSTR("bundled"))) - { - xPackageManager = m_bundledRepository; - file = OUString ( - RTL_CONSTASCII_USTRINGPARAM( - "$BUNDLED_EXTENSIONS_USER/lastsynchronized")); - } - else - throw lang::IllegalArgumentException( - OUSTR("No valid repository name provided."), - static_cast<cppu::OWeakObject*>(this), 0); ::osl::MutexGuard guard(getMutex()); - String sSynchronizing(StrSyncRepository::get()); - sSynchronizing.SearchAndReplaceAllAscii( "%NAME", repository ); - dp_misc::ProgressLevel progress(xCmdEnv, sSynchronizing); + String sSynchronizingShared(StrSyncRepository::get()); + sSynchronizingShared.SearchAndReplaceAllAscii( "%NAME", OUSTR("shared")); + dp_misc::ProgressLevel progressShared(xCmdEnv, sSynchronizingShared); + bModified = m_sharedRepository->synchronize(xAbortChannel, xCmdEnv); + progressShared.update(OUSTR("\n\n")); + + String sSynchronizingBundled(StrSyncRepository::get()); + sSynchronizingBundled.SearchAndReplaceAllAscii( "%NAME", OUSTR("bundled")); + dp_misc::ProgressLevel progressBundled(xCmdEnv, sSynchronizingBundled); + bModified |= m_bundledRepository->synchronize(xAbortChannel, xCmdEnv); + progressBundled.update(OUSTR("\n\n")); - bModified = xPackageManager->synchronize(xAbortChannel, xCmdEnv); try { const uno::Sequence<uno::Sequence<Reference<deploy::XPackage> > > @@ -1082,31 +1087,8 @@ sal_Bool ExtensionManager::synchronize( //so we will no repeat this everytime OOo starts. OSL_ENSURE(0, "Extensions Manager: synchronize"); } - - - progress.update(OUSTR("\n\n")); - - //Write the lastmodified file - try { - ::rtl::Bootstrap::expandMacros(file); - ::ucbhelper::Content ucbStamp(file, xCmdEnv ); - dp_misc::erase_path( file, xCmdEnv ); - ::rtl::OString stamp("1" ); - Reference<css::io::XInputStream> xData( - ::xmlscript::createInputStream( - ::rtl::ByteSequence( - reinterpret_cast<sal_Int8 const *>(stamp.getStr()), - stamp.getLength() ) ) ); - ucbStamp.writeStream( xData, true /* replace existing */ ); - } - catch(...) - { - uno::Any exc(::cppu::getCaughtException()); - throw deploy::DeploymentException( - OUSTR("Failed to update") + file, - static_cast<OWeakObject*>(this), exc); - - } + writeLastModified(OUSTR("$BUNDLED_EXTENSIONS_USER/lastsynchronized"), xCmdEnv); + writeLastModified(OUSTR("$SHARED_EXTENSIONS_USER/lastsynchronized"), xCmdEnv); return bModified; } catch (deploy::DeploymentException& ) { throw; diff --git a/desktop/source/deployment/manager/dp_extensionmanager.hxx b/desktop/source/deployment/manager/dp_extensionmanager.hxx index 4367770945aa..ad0e7d95df7e 100644 --- a/desktop/source/deployment/manager/dp_extensionmanager.hxx +++ b/desktop/source/deployment/manager/dp_extensionmanager.hxx @@ -186,7 +186,6 @@ public: css::uno::RuntimeException); virtual sal_Bool SAL_CALL synchronize( - ::rtl::OUString const & repository, css::uno::Reference<css::task::XAbortChannel> const & xAbortChannel, css::uno::Reference<css::ucb::XCommandEnvironment> const & xCmdEnv ) throw (css::deployment::DeploymentException, diff --git a/desktop/source/deployment/manager/dp_informationprovider.cxx b/desktop/source/deployment/manager/dp_informationprovider.cxx index 9f2e0c9e1177..537b7233ef77 100644 --- a/desktop/source/deployment/manager/dp_informationprovider.cxx +++ b/desktop/source/deployment/manager/dp_informationprovider.cxx @@ -32,11 +32,10 @@ #include "comphelper/servicedecl.hxx" -#include "com/sun/star/deployment/thePackageManagerFactory.hpp" #include "com/sun/star/deployment/UpdateInformationProvider.hpp" #include "com/sun/star/deployment/XPackage.hpp" #include "com/sun/star/deployment/XPackageInformationProvider.hpp" -#include "com/sun/star/deployment/XPackageManager.hpp" +#include "com/sun/star/deployment/ExtensionManager.hpp" #include "com/sun/star/deployment/XUpdateInformationProvider.hpp" #include "com/sun/star/lang/XServiceInfo.hpp" #include "com/sun/star/registry/XRegistryKey.hpp" @@ -104,7 +103,7 @@ private: uno::Reference< uno::XComponentContext> mxContext; - rtl::OUString getPackageLocation( const uno::Reference< deployment::XPackageManager > _xManager, + rtl::OUString getPackageLocation( const rtl::OUString& repository, const rtl::OUString& _sExtensionId ); uno::Reference< deployment::XUpdateInformationProvider > mxUpdateInformation; @@ -113,10 +112,9 @@ private: getUpdateInformation( uno::Sequence< rtl::OUString > const & urls, rtl::OUString const & identifier ) const; uno::Sequence< uno::Reference< deployment::XPackage > > - getPackages( const uno::Reference< deployment::XPackageManager > _xManager ); - uno::Sequence< uno::Sequence< rtl::OUString > > isUpdateAvailable( const uno::Reference< deployment::XPackageManager > _xManager, - const rtl::OUString& _sExtensionId ); - uno::Sequence< uno::Sequence< rtl::OUString > > getExtensionList( const uno::Reference< deployment::XPackageManager > _xManager ); + getPackages(rtl::OUString const & repository); + uno::Sequence< uno::Sequence< rtl::OUString > > isUpdateAvailable( + rtl::OUString const & repository, const rtl::OUString& _sExtensionId ); uno::Sequence< uno::Sequence< rtl::OUString > > concatLists( uno::Sequence< uno::Sequence< rtl::OUString > > aFirst, uno::Sequence< uno::Sequence< rtl::OUString > > aSecond ); }; @@ -148,15 +146,18 @@ void SAL_CALL PackageInformationProvider::handle( uno::Reference< task::XInterac //------------------------------------------------------------------------------ rtl::OUString PackageInformationProvider::getPackageLocation( - const uno::Reference< deployment::XPackageManager > _xManager, - const rtl::OUString& _rExtensionId ) + const rtl::OUString & repository, + const rtl::OUString& _rExtensionId ) { rtl::OUString aLocationURL; + uno::Reference<deployment::XExtensionManager> xManager = + deployment::ExtensionManager::get(mxContext); - if ( _xManager.is() ) + if ( xManager.is() ) { const uno::Sequence< uno::Reference< deployment::XPackage > > packages( - _xManager->getDeployedPackages( + xManager->getDeployedExtensions( + repository, uno::Reference< task::XAbortChannel >(), static_cast < XCommandEnvironment *> (this) ) ); @@ -187,32 +188,21 @@ rtl::OUString SAL_CALL PackageInformationProvider::getPackageLocation( const rtl::OUString& _sExtensionId ) throw ( uno::RuntimeException ) { - uno::Reference< deployment::XPackageManager > xManager; - try { - xManager = deployment::thePackageManagerFactory::get( mxContext )->getPackageManager( UNISTRING("user") ); - } - catch ( css_ucb::CommandFailedException & ){} - catch ( uno::RuntimeException & ) {} - - rtl::OUString aLocationURL = getPackageLocation( xManager, _sExtensionId ); + rtl::OUString aLocationURL = getPackageLocation( UNISTRING("user"), _sExtensionId ); if ( aLocationURL.getLength() == 0 ) { - try { - xManager = deployment::thePackageManagerFactory::get( mxContext )->getPackageManager( UNISTRING("shared") ); - } - catch ( css_ucb::CommandFailedException & ){} - catch ( uno::RuntimeException & ) {} - - aLocationURL = getPackageLocation( xManager, _sExtensionId ); + aLocationURL = getPackageLocation( UNISTRING("shared"), _sExtensionId ); + } + if ( aLocationURL.getLength() == 0 ) + { + aLocationURL = getPackageLocation( UNISTRING("bundled"), _sExtensionId ); } - if ( aLocationURL.getLength() ) { ::ucbhelper::Content aContent( aLocationURL, NULL ); aLocationURL = aContent.getURL(); } - return aLocationURL; } @@ -222,75 +212,76 @@ uno::Sequence< uno::Sequence< rtl::OUString > > SAL_CALL PackageInformationProvider::isUpdateAvailable( const rtl::OUString& _sExtensionId ) throw ( uno::RuntimeException ) { - uno::Sequence< uno::Sequence< rtl::OUString > > aUpdateListUser; + uno::Sequence< uno::Sequence< rtl::OUString > > + aUpdateListUser = isUpdateAvailable( UNISTRING("user"), _sExtensionId ); - uno::Reference< deployment::XPackageManager > xManager; - try { - xManager = deployment::thePackageManagerFactory::get( mxContext )->getPackageManager( UNISTRING("user") ); - } - catch ( css_ucb::CommandFailedException & ){} - catch ( uno::RuntimeException & ) {} + uno::Sequence< uno::Sequence< rtl::OUString > > + aUpdateListShared = isUpdateAvailable( UNISTRING("shared"), _sExtensionId ); - aUpdateListUser = isUpdateAvailable( xManager, _sExtensionId ); + uno::Sequence< uno::Sequence< rtl::OUString > > + aUpdateListBundled = isUpdateAvailable( UNISTRING("bundled"), _sExtensionId ); - uno::Sequence< uno::Sequence< rtl::OUString > > aUpdateListShared; - try { - xManager = deployment::thePackageManagerFactory::get( mxContext )->getPackageManager( UNISTRING("shared") ); - } - catch ( css_ucb::CommandFailedException & ){} - catch ( uno::RuntimeException & ) {} - - aUpdateListShared = isUpdateAvailable( xManager, _sExtensionId ); - - if ( !aUpdateListUser.hasElements() ) - return aUpdateListShared; - else if ( !aUpdateListShared.hasElements() ) - return aUpdateListUser; - else - return concatLists( aUpdateListUser, aUpdateListShared ); + uno::Sequence< uno::Sequence< rtl::OUString > > user_shared = + concatLists( aUpdateListUser, aUpdateListShared ); + return concatLists(user_shared, aUpdateListBundled); } //------------------------------------------------------------------------------ uno::Sequence< uno::Sequence< rtl::OUString > > SAL_CALL PackageInformationProvider::getExtensionList() throw ( uno::RuntimeException ) { - uno::Sequence< uno::Sequence< rtl::OUString > > aListUser; + const uno::Reference<deployment::XExtensionManager> mgr = + deployment::ExtensionManager::get(mxContext); - uno::Reference< deployment::XPackageManager > xManager; - try { - xManager = deployment::thePackageManagerFactory::get( mxContext )->getPackageManager( UNISTRING("user") ); - } - catch ( css_ucb::CommandFailedException & ){} - catch ( uno::RuntimeException & ) {} + if (!mgr.is()) + return uno::Sequence< uno::Sequence< rtl::OUString > >(); - aListUser = getExtensionList( xManager ); + const uno::Sequence< uno::Sequence< uno::Reference<deployment::XPackage > > > + allExt = mgr->getAllExtensions( + uno::Reference< task::XAbortChannel >(), + static_cast < XCommandEnvironment *> (this) ); - uno::Sequence< uno::Sequence< rtl::OUString > > aListShared; - try { - xManager = deployment::thePackageManagerFactory::get( mxContext )->getPackageManager( UNISTRING("shared") ); - } - catch ( css_ucb::CommandFailedException & ){} - catch ( uno::RuntimeException & ) {} + uno::Sequence< uno::Sequence< rtl::OUString > > retList; - aListShared = getExtensionList( xManager ); + sal_Int32 cAllIds = allExt.getLength(); + retList.realloc(cAllIds); - if ( !aListUser.hasElements() ) - return aListShared; - else if ( !aListShared.hasElements() ) - return aListUser; - else - return concatLists( aListUser, aListShared ); + for (sal_Int32 i = 0; i < cAllIds; i++) + { + //The inner sequence contains extensions with the same identifier from + //all the different repositories, that is user, share, bundled. + const uno::Sequence< uno::Reference< deployment::XPackage > > & + seqExtension = allExt[i]; + sal_Int32 cExt = seqExtension.getLength(); + OSL_ASSERT(cExt == 3); + for (sal_Int32 j = 0; j < cExt; j++) + { + //ToDo according to the old code the first found extenions is used + //even if another one with the same id has a better version. Design flaw? + uno::Reference< deployment::XPackage > const & xExtension( seqExtension[j] ); + if (xExtension.is()) + { + rtl::OUString aNewEntry[2]; + aNewEntry[0] = dp_misc::getIdentifier(xExtension); + aNewEntry[1] = xExtension->getVersion(); + retList[i] = ::uno::Sequence< rtl::OUString >( aNewEntry, 2 ); + break; + } + } + } + return retList; } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ uno::Sequence< uno::Reference< deployment::XPackage > > - PackageInformationProvider::getPackages( const uno::Reference< deployment::XPackageManager > _xMgr ) +PackageInformationProvider::getPackages( const rtl::OUString & repository ) { uno::Sequence< uno::Reference< deployment::XPackage > > packages; try { - packages = _xMgr->getDeployedPackages( uno::Reference< task::XAbortChannel >(), + uno::Reference<deployment::XExtensionManager> xMgr = deployment::ExtensionManager::get(mxContext); + packages = xMgr->getDeployedExtensions(repository, uno::Reference< task::XAbortChannel >(), static_cast < XCommandEnvironment *> (this) ); } catch ( deployment::DeploymentException & ) @@ -329,18 +320,19 @@ uno::Sequence< uno::Reference< xml::dom::XElement > > //------------------------------------------------------------------------------ uno::Sequence< uno::Sequence< rtl::OUString > > PackageInformationProvider::isUpdateAvailable( - const uno::Reference< deployment::XPackageManager > _xManager, - const rtl::OUString& _sExtensionId ) + const rtl::OUString& repository, + const rtl::OUString& _sExtensionId ) { uno::Sequence< uno::Sequence< rtl::OUString > > aList; sal_Int32 nCount = 0; bool bPackageFound = false; + uno::Reference<deployment::XExtensionManager> xManager = deployment::ExtensionManager::get(mxContext); // If the package manager is readonly then the user cannot modify anything anyway // so we can abort the search here - if ( _xManager.is() && ! _xManager->isReadOnly() ) + if ( xManager.is() && ! xManager->isReadOnlyRepository(repository) ) { - uno::Sequence< uno::Reference< deployment::XPackage > > packages( getPackages( _xManager ) ); + uno::Sequence< uno::Reference< deployment::XPackage > > packages( getPackages( repository ) ); uno::Sequence< uno::Reference< xml::dom::XElement > > defaultInfos; for ( int pos = packages.getLength(); pos-- && !bPackageFound; ) @@ -413,32 +405,6 @@ uno::Sequence< uno::Sequence< rtl::OUString > > } //------------------------------------------------------------------------------ -uno::Sequence< uno::Sequence< rtl::OUString > > - PackageInformationProvider::getExtensionList( - const uno::Reference< deployment::XPackageManager > _xManager ) -{ - uno::Sequence< uno::Sequence< rtl::OUString > > aList; - - if ( _xManager.is() ) - { - uno::Sequence< uno::Reference< deployment::XPackage > > packages( getPackages( _xManager ) ); - - aList.realloc( packages.getLength() ); - - for ( int pos = packages.getLength(); pos--; ) - { - uno::Reference< deployment::XPackage > package( packages[ pos ] ); - rtl::OUString aNewEntry[2]; - - aNewEntry[0] = dp_misc::getIdentifier( package ); - aNewEntry[1] = package->getVersion(); - aList[ pos ] = ::uno::Sequence< rtl::OUString >( aNewEntry, 2 ); - } - } - return aList; -} - -//------------------------------------------------------------------------------ uno::Sequence< uno::Sequence< rtl::OUString > > PackageInformationProvider::concatLists( uno::Sequence< uno::Sequence< rtl::OUString > > aFirst, uno::Sequence< uno::Sequence< rtl::OUString > > aSecond ) diff --git a/desktop/source/deployment/misc/dp_misc.cxx b/desktop/source/deployment/misc/dp_misc.cxx index 3867f741f982..5269e3d8aac5 100644 --- a/desktop/source/deployment/misc/dp_misc.cxx +++ b/desktop/source/deployment/misc/dp_misc.cxx @@ -603,8 +603,8 @@ void syncRepositories(Reference<ucb::XCommandEnvironment> const & xCmdEnv) //synchronize shared before bundled otherewise there are //more revoke and registration calls. sal_Bool bModified = false; - const OUString sShared(RTL_CONSTASCII_USTRINGPARAM("shared")); - if (needToSyncRepostitory(sShared)) + if (needToSyncRepostitory(OUString(RTL_CONSTASCII_USTRINGPARAM("shared"))) + || needToSyncRepostitory(OUString(RTL_CONSTASCII_USTRINGPARAM("bundled")))) { xExtensionManager = deployment::ExtensionManager::get( @@ -613,23 +613,7 @@ void syncRepositories(Reference<ucb::XCommandEnvironment> const & xCmdEnv) if (xExtensionManager.is()) { bModified = xExtensionManager->synchronize( - sShared, Reference<task::XAbortChannel>(), xCmdEnv); - } - } - - const OUString sBundled(RTL_CONSTASCII_USTRINGPARAM("bundled")); - if (needToSyncRepostitory( sBundled)) - { - if (!xExtensionManager.is()) - { - xExtensionManager = - deployment::ExtensionManager::get( - comphelper_getProcessComponentContext()); - } - if (xExtensionManager.is()) - { - bModified |= xExtensionManager->synchronize( - sBundled, Reference<task::XAbortChannel>(), xCmdEnv); + Reference<task::XAbortChannel>(), xCmdEnv); } } |