[arch-commits] Commit in libreoffice/trunk (4 files)

andyrtr at archlinux.org andyrtr at archlinux.org
Mon Sep 3 20:31:11 UTC 2012


    Date: Monday, September 3, 2012 @ 16:31:11
  Author: andyrtr
Revision: 165917

upgpkg: libreoffice 3.6.1-4

add some post release upstream git commits to solve starting issues when no extensions are installed and langpacks are used - FS#31360; add some vcl presettings to the profile files

Added:
  libreoffice/trunk/git_fixes.diff
Modified:
  libreoffice/trunk/PKGBUILD
  libreoffice/trunk/libreoffice-common.csh
  libreoffice/trunk/libreoffice-common.sh

------------------------+
 PKGBUILD               |   15 
 git_fixes.diff         |  743 +++++++++++++++++++++++++++++++++++++++++++++++
 libreoffice-common.csh |    7 
 libreoffice-common.sh  |    7 
 4 files changed, 766 insertions(+), 6 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2012-09-03 20:30:41 UTC (rev 165916)
+++ PKGBUILD	2012-09-03 20:31:11 UTC (rev 165917)
@@ -26,7 +26,7 @@
 	'libreoffice-extension-nlpsolver') # svn up -r 142692 (last one with all extensions built
 _LOver=3.6.1.2
 pkgver=3.6.1
-pkgrel=3
+pkgrel=4
 arch=('i686' 'x86_64')
 license=('LGPL3')
 url="http://www.libreoffice.org/"
@@ -82,6 +82,7 @@
 	${_additional_source_url}/ce5a1def34578b75959ac31210f031f6-libcdr-0.0.8.tar.bz2
 	${_additional_source_url2}/185d60944ea767075d27247c3162b3bc-unowinreg.dll
 	buildfix.diff
+	git_fixes.diff
 	libreoffice-common.sh libreoffice-common.csh)
 noextract=(94e7f271e38c976462558b4278590178-libvisio-0.0.19.tar.bz2
 	18f577b374d60b3c760a3a3350407632-STLport-4.5.tar.gz
@@ -147,8 +148,9 @@
          'ce5a1def34578b75959ac31210f031f6'
          '185d60944ea767075d27247c3162b3bc'
          '234e91ac65945ce1ab1e3839780e90f7'
-         'f0e72d0e1bc93a50a3aa9d31350b156c'
-         '867c682b45f477f916786e00c45d7ab7')
+         '2445aca137bdbf0cf7526e91f768a1d0'
+         'abcb1b0a7deaffe13ab3d7ca70becb49'
+         '72790a4103da259a55cadd66db931d00')
 
 build() {
 
@@ -170,6 +172,7 @@
 
 	# buildfixes & bugfixes
     patch -Np1 -i ${srcdir}/buildfix.diff
+    patch -Np1 -i ${srcdir}/git_fixes.diff
     
 	#use the CFLAGS but remove the LibO overridden ones
 	for i in $CFLAGS; do
@@ -383,12 +386,12 @@
 # for directory in `grep ^%dir ${srcdir}/libreoffice-core-$_LOver/file-lists/postgresql_list.txt`; do
 #   install -dm755 ${pkgdir}/${directory/\%dir/}
 # done
-# # install files into the pkg from fakeinstall dir
+ # install files into the pkg from fakeinstall dir
 # for file in `grep -v ^%dir $srcdir/libreoffice-core-$_LOver/file-lists/postgresql_list.txt`; do
 #   dirname=`dirname $file`
-#   # check if directory has been already been created - some are missing like manpages
+   # check if directory has been already been created - some are missing like manpages
 #   [ -d ${pkgdir}/$dirname ] || install -dm755 ${pkgdir}/$dirname
-#   # mv file from fakeinstall to pkgdir
+   # mv file from fakeinstall to pkgdir
 #   mv ${srcdir}/fakeinstall${file} ${pkgdir}$file
 # done
 }

Added: git_fixes.diff
===================================================================
--- git_fixes.diff	                        (rev 0)
+++ git_fixes.diff	2012-09-03 20:31:11 UTC (rev 165917)
@@ -0,0 +1,743 @@
+From 427529801dee122250e44d2311b34651db92bbdb Mon Sep 17 00:00:00 2001
+From: Stephan Bergmann <sbergman at redhat.com>
+Date: Tue, 21 Aug 2012 16:55:11 +0000
+Subject: Typo
+
+Change-Id: I41fd1463b6432818ee36e7f90e920a5fd98c7106
+(cherry picked from commit 1316cfe8a72f7c7bc2f5ad7644a2d4c54b77fc8b)
+
+Signed-off-by: Eike Rathke <erack at redhat.com>
+---
+diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx
+index d929787..55ebaca 100644
+--- a/desktop/source/app/app.cxx
++++ b/desktop/source/app/app.cxx
+@@ -194,7 +194,7 @@ void removeTree(OUString const & url) {
+     osl::FileBase::RC rc = osl::Directory::remove(url);
+     SAL_WARN_IF(
+         rc != osl::FileBase::E_None, "desktop",
+-        "cannot remove directory " << url << ": " +rc);
++        "cannot remove directory " << url << ": " << +rc);
+         // at least on Windows XP removing some existing directories fails with
+         // osl::FileBase::E_ACCESS because they are read-only; but keeping those
+         // directories around should be harmless once they are empty
+--
+cgit v0.9.0.2-2-gbebe
+From b4f8acb41165a28b2db47acd3c6b624a4c507c54 Mon Sep 17 00:00:00 2001
+From: Stephan Bergmann <sbergman at redhat.com>
+Date: Fri, 24 Aug 2012 14:06:15 +0000
+Subject: Fix removeRdbFiles (caused extension update to fail)
+
+removeRdbFiles suffered from a confusion that ImplementationInfo.uri denotes the
+corresponding component (.so, .jar, etc.), but not the .rdb file.  So removing
+an .rdb file silently failed to remove the corresponding implementations, so re-
+installing a similar enough .rdb (as typically happens during extension update)
+would fail due to duplicate implementation names.
+
+Change-Id: I25d4ff72656c99a3af509eef09e89c18cfd0aabe
+Reviewed-on: https://gerrit.libreoffice.org/476
+Reviewed-by: Norbert Thiebaud <nthiebaud at gmail.com>
+Tested-by: Norbert Thiebaud <nthiebaud at gmail.com>
+---
+diff --git a/cppuhelper/source/defaultbootstrap.cxx b/cppuhelper/source/defaultbootstrap.cxx
+index c3bdba3..7fd1e4a 100644
+--- a/cppuhelper/source/defaultbootstrap.cxx
++++ b/cppuhelper/source/defaultbootstrap.cxx
+@@ -130,9 +130,10 @@ struct ImplementationInfo: private boost::noncopyable {
+         rtl::OUString const & theName, rtl::OUString const & theLoader,
+         rtl::OUString const & theUri, rtl::OUString const & thePrefix,
+         css::uno::Reference< css::uno::XComponentContext > const &
+-            theAlienContext):
++            theAlienContext,
++        rtl::OUString const & theRdbFile):
+         name(theName), loader(theLoader), uri(theUri), prefix(thePrefix),
+-        alienContext(theAlienContext)
++        alienContext(theAlienContext), rdbFile(theRdbFile)
+     {}
+ 
+     explicit ImplementationInfo(rtl::OUString const & theName): name(theName) {}
+@@ -142,6 +143,7 @@ struct ImplementationInfo: private boost::noncopyable {
+     rtl::OUString const uri;
+     rtl::OUString const prefix;
+     css::uno::Reference< css::uno::XComponentContext > const alienContext;
++    rtl::OUString const rdbFile;
+     std::vector< rtl::OUString > services;
+     std::vector< rtl::OUString > singletons;
+ };
+@@ -149,12 +151,12 @@ struct ImplementationInfo: private boost::noncopyable {
+ struct Implementation: private boost::noncopyable {
+     Implementation(
+         rtl::OUString const & name, rtl::OUString const & loader,
+-        rtl::OUString const & uri,
+-        rtl::OUString const & prefix = rtl::OUString(),
+-        css::uno::Reference< css::uno::XComponentContext > const &
+-            alienContext
+-                = css::uno::Reference< css::uno::XComponentContext >()):
+-        info(new ImplementationInfo(name, loader, uri, prefix, alienContext)),
++        rtl::OUString const & uri, rtl::OUString const & prefix,
++        css::uno::Reference< css::uno::XComponentContext > const & alienContext,
++        rtl::OUString const & rdbFile):
++        info(
++            new ImplementationInfo(
++                name, loader, uri, prefix, alienContext, rdbFile)),
+         loaded(false)
+     {}
+ 
+@@ -466,7 +468,7 @@ void Parser::handleImplementation() {
+     implementation_.reset(
+         new Implementation(
+             attrImplementation_, attrLoader_, attrUri_, attrPrefix_,
+-            alienContext_));
++            alienContext_, reader_.getUrl()));
+     if (!data_->namedImplementations.insert(
+             NamedImplementations::value_type(
+                 attrImplementation_, implementation_)).
+@@ -1502,7 +1504,9 @@ bool ServiceManager::readLegacyRdbFile(rtl::OUString const & uri) {
+         boost::shared_ptr< Implementation > impl(
+             new Implementation(
+                 name, readLegacyRdbString(uri, implKey, "UNO/ACTIVATOR"),
+-                readLegacyRdbString(uri, implKey, "UNO/LOCATION")));
++                readLegacyRdbString(uri, implKey, "UNO/LOCATION"),
++                rtl::OUString(),
++                css::uno::Reference< css::uno::XComponentContext >(), uri));
+         if (!data_.namedImplementations.insert(
+                 NamedImplementations::value_type(name, impl)).
+             second)
+@@ -1744,7 +1748,7 @@ void ServiceManager::removeRdbFiles(std::vector< rtl::OUString > const & uris) {
+                  j != data_.namedImplementations.end();)
+             {
+                 assert(j->second.get() != 0);
+-                if (j->second->info->uri == *i) {
++                if (j->second->info->rdbFile == *i) {
+                     clear.push_back(j->second);
+                     //TODO: The below leaves data_ in an inconsistent state upon
+                     // exceptions:
+--
+cgit v0.9.0.2-2-gbebe
+From 6d261e7aac12a876acb6496085e5329632595d39 Mon Sep 17 00:00:00 2001
+From: Stephan Bergmann <sbergman at redhat.com>
+Date: Fri, 24 Aug 2012 14:45:20 +0000
+Subject: fdo#53968 etc.: Fix more "doesn't start after upgrade" problems
+
+* fdo#53968 revealed that multiple soffice.bin instances can run removeTree in
+  parallel.  Therefore, demoted failures from exceptions to SAL_WARNs.  (And
+  keeping fingers crossed.)
+
+* a8cdce148c76c93c5d41820610d6e6ac175e03a7 "fdo#53655: Ignore failure to remove
+  directories (as happens on Windows XP)" was due to a forgotten
+  osl::Directory::close before calling osl::Directory::remove after all.
+
+* UserInstallations have been seen in the wild where no extensions were
+  installed per-user (any longer), but user/uno_packages/cache/registry/
+  com.sun.star.comp.deployment.component.PackageRegistryBackend/*.rdb files
+  contained data nevertheless.  To reliably clean out any old junk,
+  refreshBundledExtensionsDir has been extended to cleanExtensionsCache which in
+  tandem with an extended Desktop::SynchronizeExtensionRepositories now cleanly
+  re-installs all bundled, shared, and per-user extensions after a LO upgrade.
+
+Change-Id: Ic6b5b6c1945d76eb3a65b6cd4512a657b7a835a0
+Reviewed-on: https://gerrit.libreoffice.org/477
+Reviewed-by: Norbert Thiebaud <nthiebaud at gmail.com>
+Tested-by: Norbert Thiebaud <nthiebaud at gmail.com>
+---
+diff --git a/desktop/inc/app.hxx b/desktop/inc/app.hxx
+index 25b6352..c830b02 100644
+--- a/desktop/inc/app.hxx
++++ b/desktop/inc/app.hxx
+@@ -203,6 +203,7 @@ class Desktop : public Application
+ 
+         sal_Bool                        m_bMinimized;
+         sal_Bool                        m_bInvisible;
++        bool                            m_bCleanedExtensionCache;
+         bool                            m_bServicesRegistered;
+         sal_uInt16                          m_nAppEvents;
+         BootstrapError                  m_aBootstrapError;
+diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx
+index 55ebaca..5fb653b 100644
+--- a/desktop/source/app/app.cxx
++++ b/desktop/source/app/app.cxx
+@@ -147,77 +147,81 @@ namespace {
+ 
+ void removeTree(OUString const & url) {
+     osl::Directory dir(url);
+-    switch (dir.open()) {
++    osl::FileBase::RC rc = dir.open();
++    switch (rc) {
+     case osl::FileBase::E_None:
+         break;
+     case osl::FileBase::E_NOENT:
+         return; //TODO: SAL_WARN if recursive
+     default:
+-        throw css::uno::RuntimeException(
+-            "cannot open directory " + url,
+-            css::uno::Reference< css::uno::XInterface >());
++        SAL_WARN("desktop", "cannot open directory " << url << ": " << +rc);
++        return;
+     }
+     for (;;) {
+         osl::DirectoryItem i;
+-        osl::FileBase::RC rc = dir.getNextItem(i, SAL_MAX_UINT32);
++        rc = dir.getNextItem(i, SAL_MAX_UINT32);
+         if (rc == osl::FileBase::E_NOENT) {
+             break;
+         }
+         if (rc != osl::FileBase::E_None) {
+-            throw css::uno::RuntimeException(
+-                ("cannot iterate directory " + url + ": "
+-                 + OUString::valueOf(static_cast< sal_Int32 >(rc))),
+-                css::uno::Reference< css::uno::XInterface >());
++            SAL_WARN(
++                "desktop","cannot iterate directory " << url << ": " << +rc);
++            break;
+         }
+         osl::FileStatus stat(
+             osl_FileStatus_Mask_Type | osl_FileStatus_Mask_FileName |
+             osl_FileStatus_Mask_FileURL);
+         rc = i.getFileStatus(stat);
+         if (rc != osl::FileBase::E_None) {
+-            throw css::uno::RuntimeException(
+-                ("cannot stat in directory " + url + ": "
+-                 + OUString::valueOf(static_cast< sal_Int32 >(rc))),
+-                css::uno::Reference< css::uno::XInterface >());
++            SAL_WARN(
++                "desktop", "cannot stat in directory " << url << ": " << +rc);
++            continue;
+         }
+         if (stat.getFileType() == osl::FileStatus::Directory) { //TODO: symlinks
+             removeTree(stat.getFileURL());
+         } else {
+             rc = osl::File::remove(stat.getFileURL());
+-            if (rc != osl::FileBase::E_None) {
+-                throw css::uno::RuntimeException(
+-                    ("cannot remove file " + stat.getFileURL() + ": "
+-                     + OUString::valueOf(static_cast< sal_Int32 >(rc))),
+-                    css::uno::Reference< css::uno::XInterface >());
+-            }
++            SAL_WARN_IF(
++                rc != osl::FileBase::E_None, "desktop",
++                "cannot remove file " << stat.getFileURL() << ": " << +rc);
+         }
+     }
+-    osl::FileBase::RC rc = osl::Directory::remove(url);
++    if (dir.isOpen()) {
++        rc = dir.close();
++        SAL_WARN_IF(
++            rc != osl::FileBase::E_None, "desktop",
++            "cannot close directory " << url << ": " << +rc);
++    }
++    rc = osl::Directory::remove(url);
+     SAL_WARN_IF(
+         rc != osl::FileBase::E_None, "desktop",
+         "cannot remove directory " << url << ": " << +rc);
+-        // at least on Windows XP removing some existing directories fails with
+-        // osl::FileBase::E_ACCESS because they are read-only; but keeping those
+-        // directories around should be harmless once they are empty
+ }
+ 
+-// Remove any existing UserInstallation's user/extensions/bundled cache
+-// remaining from old installations.  Apparently due to the old
+-// share/prereg/bundled mechanism (disabled since
+-// 5c47e5f63a79a9e72ec4a100786b1bbf65137ed4 "fdo#51252 Disable copying
+-// share/prereg/bundled to avoid startup crashes"), that cache could contain
+-// corrupted information (like a UNO component registered twice, which got
+-// changed from active to passive registration in one LO version, but the
+-// version of the corresponding bundled extension only incremented in a later LO
+-// version).  At least in theory, this function could be removed again once no
+-// UserInstallation can be poisoned by that old share/prereg/bundled mechanism
+-// any more.  (But then Desktop::SynchronizeExtensionRepositories might need to
+-// be revisited, see 2d2b19dea1ab401b1b4971ff5b12b87bb11fd666 "Force
+-// ExtensionManager resync when the implementation changes" which effectively
+-// got reverted again now.  Now, a mismatch between a UserInstallation's
+-// user/extensions/bundled and an installation's share/extensions will always be
+-// detected here and lead to a removal of user/extensions/bundled, so that
+-// Desktop::SynchronizeExtensionRepositories will then definitely resync
+-// share/extensions.)
++// Remove any existing UserInstallation's extensions cache data remaining from
++// old installations.  This addresses at least two problems:
++//
++// For one, apparently due to the old share/prereg/bundled mechanism (disabled
++// since 5c47e5f63a79a9e72ec4a100786b1bbf65137ed4 "fdo#51252 Disable copying
++// share/prereg/bundled to avoid startup crashes"), the user/extensions/bundled
++// cache could contain corrupted information (like a UNO component registered
++// twice, which got changed from active to passive registration in one LO
++// version, but the version of the corresponding bundled extension only
++// incremented in a later LO version).
++//
++// For another, UserInstallations have been seen in the wild where no extensions
++// were installed per-user (any longer), but user/uno_packages/cache/registry/
++// com.sun.star.comp.deployment.component.PackageRegistryBackend/*.rdb files
++// contained data nevertheless.
++//
++// When a LO upgrade is detected (i.e., no/ user/extensions/bundled/buildid or
++// one containing an old build ID), then user/extensions/bundled,
++// user/extensions/shared, and user/uno_packages/cache/registry/
++// com.sun.star.comp.deployment.component.PackageRegistryBackend/unorc are
++// removed.  That should prevent any problems starting the service manager due
++// to old junk.  Later on in Desktop::SynchronizeExtensionRepositories, the
++// removed cache data is recreated.
++//
+ // 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,
+@@ -230,33 +234,50 @@ void removeTree(OUString const & url) {
+ // <= 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() {
++//
++// Multiple instances of soffice.bin can execute this code in parallel for a
++// single UserInstallation, as it is called before OfficeIPCThread is set up.
++// Therefore, any errors here only lead to SAL_WARNs.
++//
++// At least in theory, this function could be removed again once no
++// UserInstallation can be poisoned by old junk any more.
++bool cleanExtensionCache() {
+     OUString buildId(
+         "${$BRAND_BASE_DIR/program/" SAL_CONFIGFILE("version") ":buildid}");
+     rtl::Bootstrap::expandMacros(buildId); //TODO: detect failure
+-    OUString dir("$BUNDLED_EXTENSIONS_USER");
+-    rtl::Bootstrap::expandMacros(dir); //TODO: detect failure
+-    OUString url(dir + "/buildid");
+-    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)) {
++    OUString extDir(
++        "${$BRAND_BASE_DIR/program/" SAL_CONFIGFILE("bootstrap")
++        ":UserInstallation}/user/extensions");
++    rtl::Bootstrap::expandMacros(extDir); //TODO: detect failure
++    OUString bundledDir = extDir + "/bundled";
++    OUString buildIdFile(bundledDir + "/buildid");
++    OUString bundledRcFile(
++        "$BUNDLED_EXTENSIONS_USER/registry/"
++        "com.sun.star.comp.deployment.component.PackageRegistryBackend/unorc");
++    rtl::Bootstrap::expandMacros(bundledRcFile); //TODO: detect failure
++    rtl::Bootstrap bundledRc(bundledRcFile);
++    OUString nonPrereg;
++    if (bundledRc.getHandle() == 0
++        || (bundledRc.getFrom("LIBO_NON_PREREG_BUNDLED_EXTENSIONS", nonPrereg)
++            && nonPrereg == "TRUE"))
++    {
++        osl::File f(buildIdFile);
++        osl::FileBase::RC rc = f.open(osl_File_OpenFlag_Read);
++        switch (rc) {
+         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");
+-                }
++                rc = f.readLine(s1);
++                osl::FileBase::RC rc2 = f.close();
++                SAL_WARN_IF(
++                    rc2 != osl::FileBase::E_None, "desktop",
++                    "cannot close " << buildIdFile << " after reading: "
++                        << +rc2);
+                 if (rc != osl::FileBase::E_None) {
+-                    throw css::uno::RuntimeException(
+-                        "cannot read from " + url,
+-                        css::uno::Reference< css::uno::XInterface >());
++                    SAL_WARN(
++                        "desktop",
++                        "cannot read from " << buildIdFile << ": " << +rc);
++                    break;
+                 }
+                 OUString s2(
+                     reinterpret_cast< char const * >(s1.getConstArray()),
+@@ -264,53 +285,56 @@ void refreshBundledExtensionsDir() {
+                     // using ISO 8859-1 avoids any and all conversion errors;
+                     // the content should only be a subset of ASCII, anyway
+                 if (s2 == buildId) {
+-                    return;
++                    return false;
+                 }
+                 break;
+             }
+         case osl::FileBase::E_NOENT:
+             break;
+         default:
+-            throw css::uno::RuntimeException(
+-                "cannot open " + url + " for reading",
+-                css::uno::Reference< css::uno::XInterface >());
++            SAL_WARN(
++                "desktop",
++                "cannot open " << buildIdFile << " for reading: " << +rc);
++            break;
+         }
+     }
+-    removeTree(dir);
+-    switch (osl::Directory::createPath(dir)) {
+-    case osl::FileBase::E_None:
+-    case osl::FileBase::E_EXIST:
+-        break;
+-    default:
+-        throw css::uno::RuntimeException(
+-            "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)
+-    {
+-        throw css::uno::RuntimeException(
+-            "cannot open " + url + " for writing",
+-            css::uno::Reference< css::uno::XInterface >());
++    removeTree(extDir);
++    OUString userRcFile(
++        "$UNO_USER_PACKAGES_CACHE/registry/"
++        "com.sun.star.comp.deployment.component.PackageRegistryBackend/unorc");
++    rtl::Bootstrap::expandMacros(userRcFile); //TODO: detect failure
++    osl::FileBase::RC rc = osl::File::remove(userRcFile);
++    SAL_WARN_IF(
++        rc != osl::FileBase::E_None && rc != osl::FileBase::E_NOENT, "desktop",
++        "cannot remove file " << userRcFile << ": " << +rc);
++    rc = osl::Directory::createPath(bundledDir);
++    SAL_WARN_IF(
++        rc != osl::FileBase::E_None && rc != osl::FileBase::E_EXIST, "desktop",
++        "cannot create path " << bundledDir << ": " << +rc);
++    osl::File f(buildIdFile);
++    rc = f.open(osl_File_OpenFlag_Write | osl_File_OpenFlag_Create);
++    if (rc != osl::FileBase::E_None) {
++        SAL_WARN(
++            "desktop",
++            "cannot open " << buildIdFile << " for writing: " << +rc);
++        return true;
+     }
+     rtl::OString buf(OUStringToOString(buildId, RTL_TEXTENCODING_UTF8));
+         // using UTF-8 avoids almost all conversion errors (and buildid
+         // containing single surrogate halves should never happen, anyway); the
+         // content should only be a subset of ASCII, anyway
+-    sal_uInt64 n;
+-    if (f.write(buf.getStr(), buf.getLength(), n) != osl::FileBase::E_None
+-        || n != static_cast< sal_uInt32 >(buf.getLength()))
+-    {
+-        throw css::uno::RuntimeException(
+-            "cannot write to " + url,
+-            css::uno::Reference< css::uno::XInterface >());
+-    }
+-    if (f.close() != osl::FileBase::E_None) {
+-        throw css::uno::RuntimeException(
+-            "cannot close " + url + " after writing",
+-            css::uno::Reference< css::uno::XInterface >());
+-    }
++    sal_uInt64 n = 0;
++    rc = f.write(buf.getStr(), buf.getLength(), n);
++    SAL_WARN_IF(
++        (rc != osl::FileBase::E_None
++         || n != static_cast< sal_uInt32 >(buf.getLength())),
++        "desktop",
++        "cannot write to " << buildIdFile << ": " << +rc << ", " << n);
++    rc = f.close();
++    SAL_WARN_IF(
++        rc != osl::FileBase::E_None, "desktop",
++        "cannot close " << buildIdFile << " after writing: " << +rc);
++    return true;
+ }
+ 
+ }
+@@ -538,7 +562,8 @@ rtl::OUString ReplaceStringHookProc( const rtl::OUString& rStr )
+ }
+ 
+ Desktop::Desktop()
+-: m_bServicesRegistered( false )
++: m_bCleanedExtensionCache( false )
++, m_bServicesRegistered( false )
+ , m_aBootstrapError( BE_OK )
+ {
+     RTL_LOGFILE_TRACE( "desktop (cd100003) ::Desktop::Desktop" );
+@@ -553,7 +578,7 @@ void Desktop::Init()
+     RTL_LOGFILE_CONTEXT( aLog, "desktop (cd100003) ::Desktop::Init" );
+     SetBootstrapStatus(BS_OK);
+ 
+-    refreshBundledExtensionsDir();
++    m_bCleanedExtensionCache = cleanExtensionCache();
+ 
+     // We need to have service factory before going further, but see fdo#37195.
+     // Doing this will mmap common.rdb, making it not overwritable on windows,
+diff --git a/desktop/source/app/check_ext_deps.cxx b/desktop/source/app/check_ext_deps.cxx
+index dd01d9b..a6221a9 100644
+--- a/desktop/source/app/check_ext_deps.cxx
++++ b/desktop/source/app/check_ext_deps.cxx
+@@ -51,6 +51,7 @@
+ #include "com/sun/star/deployment/ExtensionManager.hpp"
+ #include "com/sun/star/deployment/LicenseException.hpp"
+ #include "com/sun/star/deployment/ui/LicenseDialog.hpp"
++#include <com/sun/star/task/OfficeRestartManager.hpp>
+ #include <com/sun/star/task/XJob.hpp>
+ #include <com/sun/star/task/XJobExecutor.hpp>
+ #include <com/sun/star/task/XInteractionApprove.hpp>
+@@ -77,12 +78,15 @@ class SilentCommandEnv
+                                       task::XInteractionHandler,
+                                       ucb::XProgressHandler >
+ {
++    uno::Reference<uno::XComponentContext> mxContext;
+     Desktop    *mpDesktop;
+     sal_Int32   mnLevel;
+     sal_Int32   mnProgress;
+ 
+ public:
+-             SilentCommandEnv( Desktop* pDesktop );
++    SilentCommandEnv(
++        uno::Reference<uno::XComponentContext> const & xContext,
++        Desktop* pDesktop );
+     virtual ~SilentCommandEnv();
+ 
+     // XCommandEnvironment
+@@ -105,12 +109,14 @@ public:
+ };
+ 
+ //-----------------------------------------------------------------------------
+-SilentCommandEnv::SilentCommandEnv( Desktop* pDesktop )
+-{
+-    mpDesktop = pDesktop;
+-    mnLevel = 0;
+-    mnProgress = 25;
+-}
++SilentCommandEnv::SilentCommandEnv(
++    uno::Reference<uno::XComponentContext> const & xContext,
++    Desktop* pDesktop ):
++    mxContext( xContext ),
++    mpDesktop( pDesktop ),
++    mnLevel( 0 ),
++    mnProgress( 25 )
++{}
+ 
+ //-----------------------------------------------------------------------------
+ SilentCommandEnv::~SilentCommandEnv()
+@@ -144,10 +150,9 @@ void SilentCommandEnv::handle( Reference< task::XInteractionRequest> const & xRe
+ 
+     if ( request >>= licExc )
+     {
+-        uno::Reference< uno::XComponentContext > xContext = comphelper_getProcessComponentContext();
+         uno::Reference< ui::dialogs::XExecutableDialog > xDialog(
+             deployment::ui::LicenseDialog::create(
+-            xContext, VCLUnoHelper::GetInterface( NULL ),
++            mxContext, VCLUnoHelper::GetInterface( NULL ),
+             licExc.ExtensionName, licExc.Text ) );
+         sal_Int16 res = xDialog->execute();
+         if ( res == ui::dialogs::ExecutableDialogResults::CANCEL )
+@@ -416,7 +421,20 @@ sal_Bool Desktop::CheckExtensionDependencies()
+ void Desktop::SynchronizeExtensionRepositories()
+ {
+     RTL_LOGFILE_CONTEXT(aLog,"desktop (jl) ::Desktop::SynchronizeExtensionRepositories");
+-    dp_misc::syncRepositories( new SilentCommandEnv( this ) );
++    uno::Reference< uno::XComponentContext > context(
++        comphelper_getProcessComponentContext());
++    uno::Reference< ucb::XCommandEnvironment > silent(
++        new SilentCommandEnv(context, this));
++    if (m_bCleanedExtensionCache) {
++        deployment::ExtensionManager::get(context)->reinstallDeployedExtensions(
++            true, "user", Reference<task::XAbortChannel>(), silent);
++        task::OfficeRestartManager::get(context)->requestRestart(
++            silent->getInteractionHandler());
++    } else {
++        // reinstallDeployedExtensions above already calls syncRepositories
++        // internally:
++        dp_misc::syncRepositories(m_bCleanedExtensionCache, silent);
++    }
+ }
+ 
+ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+diff --git a/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx b/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx
+index 29ded17..7795e309 100644
+--- a/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx
++++ b/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx
+@@ -1124,7 +1124,7 @@ void ExtensionCmdQueue::acceptLicense( const uno::Reference< deployment::XPackag
+ 
+ void ExtensionCmdQueue::syncRepositories( const uno::Reference< uno::XComponentContext > &xContext )
+ {
+-    dp_misc::syncRepositories( new ProgressCmdEnv( xContext, NULL, OUSTR("Extension Manager") ) );
++    dp_misc::syncRepositories( false, new ProgressCmdEnv( xContext, NULL, OUSTR("Extension Manager") ) );
+ }
+ 
+ void ExtensionCmdQueue::stop()
+diff --git a/desktop/source/deployment/inc/dp_misc.h b/desktop/source/deployment/inc/dp_misc.h
+index 29fd140..06e67aa 100644
+--- a/desktop/source/deployment/inc/dp_misc.h
++++ b/desktop/source/deployment/inc/dp_misc.h
+@@ -154,8 +154,10 @@ void TRACE(::rtl::OUString const & sText);
+     recently added or removed.
+ */
+ DESKTOP_DEPLOYMENTMISC_DLLPUBLIC
+-void syncRepositories(::com::sun::star::uno::Reference<
+-                      ::com::sun::star::ucb::XCommandEnvironment> const & xCmdEnv);
++void syncRepositories(
++    bool force,
++    ::com::sun::star::uno::Reference<
++        ::com::sun::star::ucb::XCommandEnvironment> const & xCmdEnv);
+ 
+ }
+ 
+diff --git a/desktop/source/deployment/manager/dp_extensionmanager.cxx b/desktop/source/deployment/manager/dp_extensionmanager.cxx
+index 68403f1..b3c21b4 100644
+--- a/desktop/source/deployment/manager/dp_extensionmanager.cxx
++++ b/desktop/source/deployment/manager/dp_extensionmanager.cxx
+@@ -1205,9 +1205,10 @@ uno::Sequence< uno::Sequence<Reference<deploy::XPackage> > >
+    }
+ }
+ 
+-//only to be called from unopkg!!!
++// Only to be called from unopkg or soffice bootstrap (with force=true in the
++// latter case):
+ void ExtensionManager::reinstallDeployedExtensions(
+-    OUString const & repository,
++    sal_Bool force, OUString const & repository,
+     Reference<task::XAbortChannel> const & xAbortChannel,
+     Reference<ucb::XCommandEnvironment> const & xCmdEnv )
+     throw (deploy::DeploymentException,
+@@ -1220,10 +1221,11 @@ void ExtensionManager::reinstallDeployedExtensions(
+             xPackageManager = getPackageManager(repository);
+ 
+         ::osl::MutexGuard guard(getMutex());
+-        xPackageManager->reinstallDeployedPackages(xAbortChannel, xCmdEnv);
++        xPackageManager->reinstallDeployedPackages(
++            force, xAbortChannel, xCmdEnv);
+         //We must sync here, otherwise we will get exceptions when extensions
+         //are removed.
+-        dp_misc::syncRepositories(xCmdEnv);
++        dp_misc::syncRepositories(force, xCmdEnv);
+         const uno::Sequence< Reference<deploy::XPackage> > extensions(
+             xPackageManager->getDeployedPackages(xAbortChannel, xCmdEnv));
+ 
+diff --git a/desktop/source/deployment/manager/dp_extensionmanager.hxx b/desktop/source/deployment/manager/dp_extensionmanager.hxx
+index 22e2d41..ec1edbc 100644
+--- a/desktop/source/deployment/manager/dp_extensionmanager.hxx
++++ b/desktop/source/deployment/manager/dp_extensionmanager.hxx
+@@ -182,7 +182,7 @@ public:
+             css::uno::RuntimeException);
+ 
+     virtual void SAL_CALL reinstallDeployedExtensions(
+-        ::rtl::OUString const & repository,
++        sal_Bool force, ::rtl::OUString const & repository,
+         css::uno::Reference< css::task::XAbortChannel> const & xAbortChannel,
+         css::uno::Reference< css::ucb::XCommandEnvironment> const & xCmdEnv )
+         throw (
+diff --git a/desktop/source/deployment/manager/dp_manager.cxx b/desktop/source/deployment/manager/dp_manager.cxx
+index 8a08320c..8e3d109 100644
+--- a/desktop/source/deployment/manager/dp_manager.cxx
++++ b/desktop/source/deployment/manager/dp_manager.cxx
+@@ -1164,14 +1164,14 @@ PackageManagerImpl::getDeployedPackages(
+ //ToDo: the function must not call registerPackage, do this in
+ //XExtensionManager.reinstallDeployedExtensions
+ void PackageManagerImpl::reinstallDeployedPackages(
+-    Reference<task::XAbortChannel> const &  /*xAbortChannel*/,
++    sal_Bool force, Reference<task::XAbortChannel> const &  /*xAbortChannel*/,
+     Reference<XCommandEnvironment> const & xCmdEnv_ )
+     throw (deployment::DeploymentException,
+            CommandFailedException, CommandAbortedException,
+            lang::IllegalArgumentException, RuntimeException)
+ {
+     check();
+-    if (office_is_running())
++    if (!force && office_is_running())
+         throw RuntimeException(
+             OUSTR("You must close any running Office process before "
+                   "reinstalling packages!"), static_cast<OWeakObject *>(this) );
+diff --git a/desktop/source/deployment/manager/dp_manager.h b/desktop/source/deployment/manager/dp_manager.h
+index 3b335d7..3c7f8d9 100644
+--- a/desktop/source/deployment/manager/dp_manager.h
++++ b/desktop/source/deployment/manager/dp_manager.h
+@@ -236,6 +236,7 @@ public:
+                css::uno::RuntimeException);
+ 
+     virtual void SAL_CALL reinstallDeployedPackages(
++        sal_Bool force,
+         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/misc/dp_misc.cxx b/desktop/source/deployment/misc/dp_misc.cxx
+index b225db6..9ed579f 100644
+--- a/desktop/source/deployment/misc/dp_misc.cxx
++++ b/desktop/source/deployment/misc/dp_misc.cxx
+@@ -591,7 +591,7 @@ void TRACE(::rtl::OString const & sText)
+ }
+ 
+ void syncRepositories(
+-    Reference<ucb::XCommandEnvironment> const & xCmdEnv)
++    bool force, Reference<ucb::XCommandEnvironment> const & xCmdEnv)
+ {
+     OUString sDisable;
+     ::rtl::Bootstrap::get( OUSTR( "DISABLE_EXTENSION_SYNCHRONIZATION" ), sDisable, OUString() );
+@@ -602,7 +602,8 @@ void syncRepositories(
+     //synchronize shared before bundled otherewise there are
+     //more revoke and registration calls.
+     sal_Bool bModified = false;
+-    if (needToSyncRepostitory(OUString(RTL_CONSTASCII_USTRINGPARAM("shared")))
++    if (force
++        || needToSyncRepostitory(OUString(RTL_CONSTASCII_USTRINGPARAM("shared")))
+         || needToSyncRepostitory(OUString(RTL_CONSTASCII_USTRINGPARAM("bundled"))))
+     {
+         xExtensionManager =
+diff --git a/desktop/source/pkgchk/unopkg/unopkg_app.cxx b/desktop/source/pkgchk/unopkg/unopkg_app.cxx
+index 43faed5..ef16ea1 100644
+--- a/desktop/source/pkgchk/unopkg/unopkg_app.cxx
++++ b/desktop/source/pkgchk/unopkg/unopkg_app.cxx
+@@ -392,7 +392,7 @@ extern "C" DESKTOP_DLLPUBLIC int unopkg_main()
+         //synching is done in XExtensionManager.reinstall
+         if (!subcmd_gui && ! subCommand.equals(OUSTR("reinstall"))
+             && ! dp_misc::office_is_running())
+-            dp_misc::syncRepositories(xCmdEnv);
++            dp_misc::syncRepositories(false, xCmdEnv);
+ 
+         if ( subcmd_add || subCommand == "remove" )
+         {
+@@ -436,7 +436,7 @@ extern "C" DESKTOP_DLLPUBLIC int unopkg_main()
+                      RTL_CONSTASCII_STRINGPARAM("reinstall") ))
+         {
+             xExtensionManager->reinstallDeployedExtensions(
+-                repository, Reference<task::XAbortChannel>(), xCmdEnv);
++                false, repository, Reference<task::XAbortChannel>(), xCmdEnv);
+         }
+         else if ( subCommand == "list" )
+         {
+diff --git a/offapi/com/sun/star/deployment/XExtensionManager.idl b/offapi/com/sun/star/deployment/XExtensionManager.idl
+index b68ab20..2912e45 100644
+--- a/offapi/com/sun/star/deployment/XExtensionManager.idl
++++ b/offapi/com/sun/star/deployment/XExtensionManager.idl
+@@ -260,6 +260,9 @@ interface XExtensionManager
+         <p>
+         Please use this in case of suspected cache inconsistencies only.
+         </p>
++        @param force
++               set to true when called during soffice bootstrap after cleaning
++               old extension cache
+         @param repositroy
+                the name of the repository
+         @param xAbortChannel
+@@ -268,6 +271,7 @@ interface XExtensionManager
+                command environment for error and progress handling
+     */
+     void reinstallDeployedExtensions(
++        [in] boolean force,
+         [in] string repository,
+         [in] com::sun::star::task::XAbortChannel xAbortChannel,
+         [in] com::sun::star::ucb::XCommandEnvironment xCmdEnv )
+diff --git a/offapi/com/sun/star/deployment/XPackageManager.idl b/offapi/com/sun/star/deployment/XPackageManager.idl
+index 12e7e0e..39ff04a 100644
+--- a/offapi/com/sun/star/deployment/XPackageManager.idl
++++ b/offapi/com/sun/star/deployment/XPackageManager.idl
+@@ -225,12 +225,16 @@ interface XPackageManager
+         Please use this in case of suspected cache inconsistencies only.
+         </p>
+ 
++        @param force
++               set to true when called during soffice bootstrap after cleaning
++               old extension cache
+         @param xAbortChannel
+                abort channel to asynchronously abort the adding process
+         @param xCmdEnv
+                command environment for error and progress handling
+     */
+     void reinstallDeployedPackages(
++        [in] boolean force,
+         [in] com::sun::star::task::XAbortChannel xAbortChannel,
+         [in] com::sun::star::ucb::XCommandEnvironment xCmdEnv )
+         raises (DeploymentException,
+--
+cgit v0.9.0.2-2-gbebe

Modified: libreoffice-common.csh
===================================================================
--- libreoffice-common.csh	2012-09-03 20:30:41 UTC (rev 165916)
+++ libreoffice-common.csh	2012-09-03 20:31:11 UTC (rev 165917)
@@ -1 +1,8 @@
 #setenv PYTHONPATH ${PYTHONPATH}:/usr/lib/libreoffice/program
+
+# to force a certain look'n feel
+
+#setenv SAL_USE_VCLPLUGIN gen
+#setenv SAL_USE_VCLPLUGIN kde4
+#setenv SAL_USE_VCLPLUGIN gtk
+#setenv SAL_USE_VCLPLUGIN gtk3

Modified: libreoffice-common.sh
===================================================================
--- libreoffice-common.sh	2012-09-03 20:30:41 UTC (rev 165916)
+++ libreoffice-common.sh	2012-09-03 20:31:11 UTC (rev 165917)
@@ -1 +1,8 @@
 #export PYTHONPATH="$PYTHONPATH:/usr/lib/libreoffice/program"
+
+# to force a certain look'n feel
+
+#export SAL_USE_VCLPLUGIN=gen
+#export SAL_USE_VCLPLUGIN=kde4
+#export SAL_USE_VCLPLUGIN=gtk
+#export SAL_USE_VCLPLUGIN=gtk3




More information about the arch-commits mailing list