[Libreoffice-commits] .: Branch 'libreoffice-3-6' - desktop/source

Petr Mladek pmladek at kemper.freedesktop.org
Mon Aug 13 09:41:24 PDT 2012


 desktop/source/app/app.cxx                                    |   75 ++++++----
 desktop/source/deployment/registry/component/dp_component.cxx |    7 
 2 files changed, 55 insertions(+), 27 deletions(-)

New commits:
commit aed059b816a1df35be33598916acf341dd1a31ac
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Mon Aug 13 17:48:25 2012 +0200

    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 at suse.cz>

diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx
index cb9d3c3..4611ef3 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 0714842..1243087 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(


More information about the Libreoffice-commits mailing list