diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2012-08-13 17:48:25 +0200 |
---|---|---|
committer | Petr Mladek <pmladek@suse.cz> | 2012-08-13 18:40:58 +0200 |
commit | aed059b816a1df35be33598916acf341dd1a31ac (patch) | |
tree | 957c71dc1cc073b512e9d2ede4dc5a59760c5283 /desktop | |
parent | de63d48f9b8be0f5099f054e0978f3e0d3750864 (diff) |
fdo#53006: And detect LO downgrading scenarios...
...that reinstall potentially broken prereg data but do not touch the buildid
file.
Change-Id: I1b02d2c265523dd751d8ef7f2dccb59ed048f568
Signed-off-by: Petr Mladek <pmladek@suse.cz>
Diffstat (limited to 'desktop')
-rw-r--r-- | desktop/source/app/app.cxx | 75 | ||||
-rw-r--r-- | desktop/source/deployment/registry/component/dp_component.cxx | 7 |
2 files changed, 55 insertions, 27 deletions
diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx index cb9d3c370b74..4611ef3962fd 100644 --- a/desktop/source/app/app.cxx +++ b/desktop/source/app/app.cxx @@ -211,6 +211,18 @@ void removeTree(OUString const & url) { // detected here and lead to a removal of user/extensions/bundled, so that // Desktop::SynchronizeExtensionRepositories will then definitely resync // share/extensions.) +// As a special case, if you create a UserInstallation with LO >= 3.6.1, then +// run an old LO <= 3.5.x using share/prereg/bundled on the same +// UserInstallation (so that it partially overwrites user/extensions/bundled, +// potentially duplicating component information, but not touching +// user/extensions/bundled/buildid), and then run the new LO >= 3.6.1 on the +// same UserInstallation again, it can fail to start (due to the duplicated +// component information). Even though such downgrading scenarios at best work +// by luck in general, the special token LIBO_NON_PREREG_BUNDLED_EXTENSIONS=TRUE +// is used to detect and fix that problem: The assumption is that if an old LO +// <= 3.5.x messed with user/extensions/bundled in the meantime, then it would +// have rewritten the unorc (dropping the token), and LO >= 3.6.1 can detect +// that. void refreshBundledExtensionsDir() { OUString buildId( "${$BRAND_BASE_DIR/program/" SAL_CONFIGFILE("version") ":buildid}"); @@ -218,36 +230,44 @@ void refreshBundledExtensionsDir() { OUString dir("$BUNDLED_EXTENSIONS_USER"); rtl::Bootstrap::expandMacros(dir); //TODO: detect failure OUString url(dir + "/buildid"); - osl::File f(url); - switch (f.open(osl_File_OpenFlag_Read)) { - case osl::FileBase::E_None: - { - rtl::ByteSequence s1; - osl::FileBase::RC rc = f.readLine(s1); - if (f.close() != osl::FileBase::E_None) { - SAL_WARN("desktop", "cannot close " + url + " after reading"); - } - if (rc != osl::FileBase::E_None) { - throw css::uno::RuntimeException( - "cannot read from " + url, - css::uno::Reference< css::uno::XInterface >()); - } - OUString s2( - reinterpret_cast< char const * >(s1.getConstArray()), - s1.getLength(), RTL_TEXTENCODING_ISO_8859_1); - // using ISO 8859-1 avoids any and all conversion errors; the - // content should only be a subset of ASCII, anyway - if (s2 == buildId) { - return; + OUString nonPrereg( + "${$BUNDLED_EXTENSIONS_USER/registry/" + "com.sun.star.comp.deployment.component.PackageRegistryBackend/unorc:" + "LIBO_NON_PREREG_BUNDLED_EXTENSIONS}"); + rtl::Bootstrap::expandMacros(nonPrereg); + if (nonPrereg == "TRUE") { + osl::File f(url); + switch (f.open(osl_File_OpenFlag_Read)) { + case osl::FileBase::E_None: + { + rtl::ByteSequence s1; + osl::FileBase::RC rc = f.readLine(s1); + if (f.close() != osl::FileBase::E_None) { + SAL_WARN( + "desktop", "cannot close " + url + " after reading"); + } + if (rc != osl::FileBase::E_None) { + throw css::uno::RuntimeException( + "cannot read from " + url, + css::uno::Reference< css::uno::XInterface >()); + } + OUString s2( + reinterpret_cast< char const * >(s1.getConstArray()), + s1.getLength(), RTL_TEXTENCODING_ISO_8859_1); + // using ISO 8859-1 avoids any and all conversion errors; + // the content should only be a subset of ASCII, anyway + if (s2 == buildId) { + return; + } + break; } + case osl::FileBase::E_NOENT: break; + default: + throw css::uno::RuntimeException( + "cannot open " + url + " for reading", + css::uno::Reference< css::uno::XInterface >()); } - case osl::FileBase::E_NOENT: - break; - default: - throw css::uno::RuntimeException( - "cannot open " + url + " for reading", - css::uno::Reference< css::uno::XInterface >()); } removeTree(dir); switch (osl::Directory::createPath(dir)) { @@ -259,6 +279,7 @@ void refreshBundledExtensionsDir() { "cannot create path " + dir, css::uno::Reference< css::uno::XInterface >()); } + osl::File f(url); if (f.open(osl_File_OpenFlag_Write | osl_File_OpenFlag_Create) != osl::FileBase::E_None) { diff --git a/desktop/source/deployment/registry/component/dp_component.cxx b/desktop/source/deployment/registry/component/dp_component.cxx index 071484281e9f..1243087297b7 100644 --- a/desktop/source/deployment/registry/component/dp_component.cxx +++ b/desktop/source/deployment/registry/component/dp_component.cxx @@ -1021,6 +1021,13 @@ void BackendImpl::unorc_flush( Reference<XCommandEnvironment> const & xCmdEnv ) buf.append(LF); } + // See refreshBundledExtensionsDir (desktop/source/app/app.cxx): + if (m_eContext == CONTEXT_BUNDLED) + { + buf.append("LIBO_NON_PREREG_BUNDLED_EXTENSIONS=TRUE"); + buf.append(LF); + } + // write unorc: const Reference<io::XInputStream> xData( ::xmlscript::createInputStream( |