Files
libreoffice/desktop/source/deployment/manager/dp_informationprovider.cxx

335 lines
12 KiB
C++
Raw Normal View History

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
re-base on ALv2 code. Includes: Patch contributed by: Jurgen Schmidt remove onlineregistration with dependencies http://svn.apache.org/viewvc?view=revision&revision=1240245 imported patch package_eventlistener.patch http://svn.apache.org/viewvc?view=revision&revision=1172103 Patch contributed by Pedro Giffuni Accept Google Chrome OS fonts as equivalent to MS fonts. http://svn.apache.org/viewvc?view=revision&revision=1233155 http://svn.apache.org/viewvc?view=revision&revision=1233408 Patch contributed by Andre Fischer Do not add targets for junit tests when junit is disabled. http://svn.apache.org/viewvc?view=revision&revision=1241508 Patches contributed by Mathias Bauer (and others) gnumake4 work variously http://svn.apache.org/viewvc?view=revision&revision=1394707 http://svn.apache.org/viewvc?view=revision&revision=1394326 cws mba34issues01: #i114600#: remove forbidden characters from list of unencoded characters http://svn.apache.org/viewvc?view=revision&revision=1172370 Patches contributed by Oliver Rainer-Wittman some clean up in JPEGReader due to memory constraints http://svn.apache.org/viewvc?view=revision&revision=1299729 119114 - method <UpdateDialog::addSpecificError(..)> - create entry with correct type http://svn.apache.org/viewvc?view=revision&revision=1305265 Patches contributed by Ariel Constenla-Haile i118707 - make toolbar control's popup window grab focus http://svn.apache.org/viewvc?view=revision&revision=1225846 Patches contributed by Herbert Duerr #i118662# remove usage of BerkeleyDB in desktop module http://svn.apache.org/viewvc?view=revision&revision=1213171 minor cleanups in dp_persmap.* http://svn.apache.org/viewvc?view=revision&revision=1215064 flush early to prevent problem with extension manager not cleaning up its objects http://svn.apache.org/viewvc?view=revision&revision=1228147 i118726 do not flush *pmap file while reading it http://svn.apache.org/viewvc?view=revision&revision=1230614 #i119048# migrate BDB extension entries using a simple heuristic http://svn.apache.org/viewvc?view=revision&revision=1300972 #i119048# handle edge cases when importing BDB hash files http://svn.apache.org/viewvc?view=revision&revision=1301428 #i119113# fix of-by-one when importing BDB files http://svn.apache.org/viewvc?view=revision&revision=1305420 restore our encryption settings, icon themes, and dictionaries. removed wrapper hacks, kill obsolete bundled extension blob / pre-registration handling, remove duplicated quickstart code. remove OS/2 conditionals.
2012-11-15 17:28:16 +00:00
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include <cppuhelper/implbase3.hxx>
#include "comphelper/servicedecl.hxx"
#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/ExtensionManager.hpp"
#include "com/sun/star/deployment/XUpdateInformationProvider.hpp"
#include "com/sun/star/lang/XServiceInfo.hpp"
#include "com/sun/star/registry/XRegistryKey.hpp"
#include "com/sun/star/task/XAbortChannel.hpp"
#include "com/sun/star/uno/XComponentContext.hpp"
#include "com/sun/star/ucb/XCommandEnvironment.hpp"
#include "com/sun/star/xml/dom/XElement.hpp"
#include "com/sun/star/xml/dom/XNode.hpp"
#include "com/sun/star/uno/Reference.hxx"
#include "rtl/ustring.hxx"
#include "ucbhelper/content.hxx"
CWS-TOOLING: integrate CWS dv11 2009-05-13 16:50:24 +0200 dv r271863 : #i101829# Use UPGRADINGPRODUCTCODE to detect major upgrade 2009-04-17 15:55:48 +0200 dv r270953 : CWS-TOOLING: rebase CWS dv11 to trunk@270723 (milestone: DEV300:m46) 2009-04-17 09:14:21 +0200 dv r270916 : #i100915# Use better product name 2009-04-16 14:41:49 +0200 dv r270884 : #i101132# Use a waiting thread to defere update check 2009-04-07 15:46:52 +0200 dv r270599 : #i100915# Use one include file for all version.rc files 2009-04-07 13:49:56 +0200 dv r270596 : #i100915# Use one include file for all version.rc files 2009-04-03 09:04:08 +0200 dv r270447 : #100776# Added Microsoft XML file types to 'Default Applications', cleaned up Application name display in 'Default Applications' 2009-04-01 10:13:28 +0200 dv r270306 : #i100713# Remove instmsia.exe from installation set 2009-03-30 16:35:35 +0200 dv r270240 : CWS-TOOLING: rebase CWS dv11 to trunk@270033 (milestone: DEV300:m45) 2009-03-27 10:24:40 +0100 dv r270138 : #i100410# Show survey after deinstalling OpenOffice.org (Windows only) 2009-03-18 15:05:31 +0100 dv r269679 : #i98780# Use 'Desktop' folder only, if it exists 2009-03-17 11:19:47 +0100 dv r269581 : #i100082# Ignore updates with failed dependencies for automatic update check 2009-03-13 14:37:27 +0100 dv r269479 : #i100082# Use 'value' instead of 'name' to create error message 2009-03-13 10:14:48 +0100 dv r269460 : #i100082# Support better error message when extension manager update finds an incompatible update
2009-05-15 14:12:42 +00:00
#include "dp_dependencies.hxx"
#include "dp_descriptioninfoset.hxx"
#include "dp_identifier.hxx"
#include "dp_version.hxx"
#include "dp_misc.h"
#include "dp_update.hxx"
namespace beans = com::sun::star::beans ;
namespace deployment = com::sun::star::deployment ;
namespace lang = com::sun::star::lang ;
namespace registry = com::sun::star::registry ;
namespace task = com::sun::star::task ;
namespace css_ucb = com::sun::star::ucb ;
namespace uno = com::sun::star::uno ;
namespace xml = com::sun::star::xml ;
namespace dp_info {
class PackageInformationProvider :
public ::cppu::WeakImplHelper1< deployment::XPackageInformationProvider >
{
public:
PackageInformationProvider( uno::Reference< uno::XComponentContext >const& xContext);
virtual ~PackageInformationProvider();
static uno::Sequence< OUString > getServiceNames();
static OUString getImplName();
// XPackageInformationProvider
virtual OUString SAL_CALL getPackageLocation( const OUString& extensionId )
throw ( uno::RuntimeException, std::exception );
virtual uno::Sequence< uno::Sequence< OUString > > SAL_CALL isUpdateAvailable( const OUString& extensionId )
throw ( uno::RuntimeException, std::exception );
virtual uno::Sequence< uno::Sequence< OUString > > SAL_CALL getExtensionList()
throw ( uno::RuntimeException, std::exception );
private:
uno::Reference< uno::XComponentContext> mxContext;
OUString getPackageLocation( const OUString& repository,
const OUString& _sExtensionId );
uno::Reference< deployment::XUpdateInformationProvider > mxUpdateInformation;
};
PackageInformationProvider::PackageInformationProvider( uno::Reference< uno::XComponentContext > const& xContext) :
mxContext( xContext ),
mxUpdateInformation( deployment::UpdateInformationProvider::create( xContext ) )
{
}
PackageInformationProvider::~PackageInformationProvider()
{
}
OUString PackageInformationProvider::getPackageLocation(
const OUString & repository,
const OUString& _rExtensionId )
{
OUString aLocationURL;
uno::Reference<deployment::XExtensionManager> xManager =
deployment::ExtensionManager::get(mxContext);
if ( xManager.is() )
{
const uno::Sequence< uno::Reference< deployment::XPackage > > packages(
xManager->getDeployedExtensions(
repository,
uno::Reference< task::XAbortChannel >(),
uno::Reference< css_ucb::XCommandEnvironment > () ) );
for ( int pos = packages.getLength(); pos--; )
{
try
{
const beans::Optional< OUString > aID = packages[ pos ]->getIdentifier();
if ( aID.IsPresent && (aID.Value == _rExtensionId ) )
{
aLocationURL = packages[ pos ]->getURL();
break;
}
}
catch ( uno::RuntimeException & ) {}
}
}
return aLocationURL;
}
OUString SAL_CALL
PackageInformationProvider::getPackageLocation( const OUString& _sExtensionId )
throw ( uno::RuntimeException, std::exception )
{
OUString aLocationURL = getPackageLocation( OUString("user"), _sExtensionId );
if ( aLocationURL.isEmpty() )
{
aLocationURL = getPackageLocation( OUString("shared"), _sExtensionId );
}
if ( aLocationURL.isEmpty() )
{
aLocationURL = getPackageLocation( OUString("bundled"), _sExtensionId );
}
if ( !aLocationURL.isEmpty() )
{
::ucbhelper::Content aContent( aLocationURL, NULL, mxContext );
aLocationURL = aContent.getURL();
}
return aLocationURL;
}
uno::Sequence< uno::Sequence< OUString > > SAL_CALL
PackageInformationProvider::isUpdateAvailable( const OUString& _sExtensionId )
throw ( uno::RuntimeException, std::exception )
{
uno::Sequence< uno::Sequence< OUString > > aList;
uno::Reference<deployment::XExtensionManager> extMgr =
deployment::ExtensionManager::get(mxContext);
if (!extMgr.is())
{
OSL_ASSERT(false);
return aList;
}
std::vector<std::pair<uno::Reference<deployment::XPackage>, uno::Any > > errors;
dp_misc::UpdateInfoMap updateInfoMap;
if (!_sExtensionId.isEmpty())
{
std::vector<uno::Reference<deployment::XPackage> > vecExtensions;
uno::Reference<deployment::XPackage> extension;
try
{
extension = dp_misc::getExtensionWithHighestVersion(
extMgr->getExtensionsWithSameIdentifier(
_sExtensionId, _sExtensionId, uno::Reference<css_ucb::XCommandEnvironment>()));
vecExtensions.push_back(extension);
}
catch (lang::IllegalArgumentException &)
{
OSL_ASSERT(false);
}
updateInfoMap = dp_misc::getOnlineUpdateInfos(
mxContext, extMgr, mxUpdateInformation, &vecExtensions, errors);
}
else
{
updateInfoMap = dp_misc::getOnlineUpdateInfos(
mxContext, extMgr, mxUpdateInformation, NULL, errors);
}
int nCount = 0;
2010-12-23 20:58:07 +00:00
for (dp_misc::UpdateInfoMap::iterator i(updateInfoMap.begin()); i != updateInfoMap.end(); ++i)
{
dp_misc::UpdateInfo const & info = i->second;
OUString sOnlineVersion;
if (info.info.is())
{
// check, if there are unsatisfied dependencies and ignore this online update
dp_misc::DescriptionInfoset infoset(mxContext, info.info);
uno::Sequence< uno::Reference< xml::dom::XElement > >
ds( dp_misc::Dependencies::check( infoset ) );
if ( ! ds.getLength() )
sOnlineVersion = info.version;
}
OUString sVersionUser;
OUString sVersionShared;
OUString sVersionBundled;
uno::Sequence< uno::Reference< deployment::XPackage> > extensions;
try {
extensions = extMgr->getExtensionsWithSameIdentifier(
dp_misc::getIdentifier(info.extension), info.extension->getName(),
uno::Reference<css_ucb::XCommandEnvironment>());
} catch (lang::IllegalArgumentException& e) {
SAL_WARN(
"desktop.deployment",
"ignoring IllegalArgumentException \"" << e.Message << "\"");
continue;
}
OSL_ASSERT(extensions.getLength() == 3);
if (extensions[0].is() )
sVersionUser = extensions[0]->getVersion();
if (extensions[1].is() )
sVersionShared = extensions[1]->getVersion();
if (extensions[2].is() )
sVersionBundled = extensions[2]->getVersion();
bool bSharedReadOnly = extMgr->isReadOnlyRepository("shared");
dp_misc::UPDATE_SOURCE sourceUser = dp_misc::isUpdateUserExtension(
bSharedReadOnly, sVersionUser, sVersionShared, sVersionBundled, sOnlineVersion);
dp_misc::UPDATE_SOURCE sourceShared = dp_misc::isUpdateSharedExtension(
bSharedReadOnly, sVersionShared, sVersionBundled, sOnlineVersion);
OUString updateVersionUser;
OUString updateVersionShared;
if (sourceUser != dp_misc::UPDATE_SOURCE_NONE)
updateVersionUser = dp_misc::getHighestVersion(
OUString(), sVersionShared, sVersionBundled, sOnlineVersion);
if (sourceShared != dp_misc::UPDATE_SOURCE_NONE)
updateVersionShared = dp_misc::getHighestVersion(
OUString(), OUString(), sVersionBundled, sOnlineVersion);
OUString updateVersion;
if (dp_misc::compareVersions(updateVersionUser, updateVersionShared) == dp_misc::GREATER)
updateVersion = updateVersionUser;
else
updateVersion = updateVersionShared;
if (!updateVersion.isEmpty())
{
OUString aNewEntry[2];
aNewEntry[0] = i->first;
aNewEntry[1] = updateVersion;
aList.realloc( ++nCount );
aList[ nCount-1 ] = ::uno::Sequence< OUString >( aNewEntry, 2 );
}
}
return aList;
}
uno::Sequence< uno::Sequence< OUString > > SAL_CALL PackageInformationProvider::getExtensionList()
throw ( uno::RuntimeException, std::exception )
{
const uno::Reference<deployment::XExtensionManager> mgr =
deployment::ExtensionManager::get(mxContext);
if (!mgr.is())
return uno::Sequence< uno::Sequence< OUString > >();
const uno::Sequence< uno::Sequence< uno::Reference<deployment::XPackage > > >
allExt = mgr->getAllExtensions(
uno::Reference< task::XAbortChannel >(),
uno::Reference< css_ucb::XCommandEnvironment > () );
uno::Sequence< uno::Sequence< OUString > > retList;
sal_Int32 cAllIds = allExt.getLength();
retList.realloc(cAllIds);
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.
uno::Reference< deployment::XPackage > const & xExtension( seqExtension[j] );
if (xExtension.is())
{
OUString aNewEntry[2];
aNewEntry[0] = dp_misc::getIdentifier(xExtension);
aNewEntry[1] = xExtension->getVersion();
retList[i] = ::uno::Sequence< OUString >( aNewEntry, 2 );
break;
}
}
}
return retList;
}
namespace sdecl = comphelper::service_decl;
sdecl::class_<PackageInformationProvider> servicePIP;
extern sdecl::ServiceDecl const serviceDecl(
servicePIP,
// a private one:
"com.sun.star.comp.deployment.PackageInformationProvider",
"com.sun.star.comp.deployment.PackageInformationProvider" );
} // namespace dp_info
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */