cppuhelper/source/bootstrap.cxx | 60 +++++++++++++-- i18npool/CustomTarget_localedata.mk | 3 solenv/bin/linkoo | 50 +++++++++---- stoc/source/simpleregistry/simpleregistry.cxx | 94 +++++++++++++++++++++---- stoc/source/simpleregistry/textualservices.cxx | 11 ++ stoc/source/simpleregistry/textualservices.hxx | 3 vcl/README | 2 7 files changed, 179 insertions(+), 44 deletions(-)
New commits: commit 092a90517889ff7b66a4e7229b897e381bf167f9 Author: Michael Meeks <michael.me...@suse.com> Date: Sat Apr 14 01:34:25 2012 +0200 update vcl readme wrt. fpickers diff --git a/vcl/README b/vcl/README index 81afba0..f373bad 100644 --- a/vcl/README +++ b/vcl/README @@ -1,4 +1,4 @@ -Visual Components Library is responsible for the widgets (windowing, buttons, controls, etc.) operating system abstraction, including basic rendering (e.g. the output device). +Visual Components Library is responsible for the widgets (windowing, buttons, controls, file-pickers etc.) operating system abstraction, including basic rendering (e.g. the output device). Welcome to the Visual Class Libraries (vcl) code commit 5d646f4ba592764de44f50053802b1ed451d93d7 Author: Michael Meeks <michael.me...@suse.com> Date: Fri Apr 13 17:21:21 2012 +0200 i18npool: use URLs for type database in localedata build diff --git a/i18npool/CustomTarget_localedata.mk b/i18npool/CustomTarget_localedata.mk index c21fcd9..e506d46 100644 --- a/i18npool/CustomTarget_localedata.mk +++ b/i18npool/CustomTarget_localedata.mk @@ -39,7 +39,8 @@ $(IPLD)/localedata_%.cxx : $(SRCDIR)/i18npool/source/localedata/data/%.xml \ $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),SAX,1) $(call gb_Helper_abbreviate_dirs_native, \ $(call gb_Helper_execute,saxparser) $* $< $@.tmp \ - $(call gb_Helper_make_url,$(IPLD)/saxparser.rdb) $(OUTDIR_FOR_BUILD)/bin/types.rdb \ + $(call gb_Helper_make_url,$(IPLD)/saxparser.rdb) \ + $(call gb_Helper_make_url,$(OUTDIR_FOR_BUILD)/bin/types.rdb) \ -env:LO_LIB_DIR=$(call gb_Helper_make_url,$(gb_Helper_OUTDIR_FOR_BUILDLIBDIR)) \ $(if $(findstring s,$(MAKEFLAGS)),> /dev/null 2>&1) && \ sed 's/\(^.*get[^;]*$$\)/SAL_DLLPUBLIC_EXPORT \1/' $@.tmp > $@ && \ commit 09524d410bbaad2a0b9b39811cb5cc16621b1396 Author: Michael Meeks <michael.me...@suse.com> Date: Fri Apr 13 15:25:23 2012 +0200 stoc: accelerate opening of multiple XML .rdb files in a directory Instead of nesting these, we aggregate them into a single non-nested registry, which saves lots of CPU at startup, sadly we can only do that for the new-style XML registries, so we have to sniff files, nevertheless this is still far faster. The merged xml files also break the XSimpleRegistry::getURL() method - but it appears not to get called. diff --git a/cppuhelper/source/bootstrap.cxx b/cppuhelper/source/bootstrap.cxx index 39e44fe..cc64e07 100644 --- a/cppuhelper/source/bootstrap.cxx +++ b/cppuhelper/source/bootstrap.cxx @@ -274,16 +274,17 @@ Reference< registry::XSimpleRegistry > readRdbDirectory( url), css::uno::Reference< css::uno::XInterface >()); } - for (css::uno::Reference< css::registry::XSimpleRegistry > last( - lastRegistry);;) + std::vector<rtl::OUString> aURLs; + css::uno::Reference< css::registry::XSimpleRegistry > last(lastRegistry); + for (;;) { osl::DirectoryItem i; - switch (dir.getNextItem(i, SAL_MAX_UINT32)) { - case osl::FileBase::E_None: + osl::FileBase::RC eResult; + eResult = dir.getNextItem(i, SAL_MAX_UINT32); + if (eResult == osl::FileBase::E_NOENT) break; - case osl::FileBase::E_NOENT: - return last; - default: + if (eResult != osl::FileBase::E_None) + { throw css::uno::RuntimeException( (rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("cannot iterate directory ")) + @@ -307,12 +308,49 @@ Reference< registry::XSimpleRegistry > readRdbDirectory( if (aName.toChar() == '.' || aName.endsWithAsciiL("~", 1)) continue; - if (stat.getFileType() != osl::FileStatus::Directory) { //TODO: symlinks - last = readRdbFile( - stat.getFileURL(), fatalErrors, last, simpleRegistryFactory, - nestedRegistryFactory); + if (stat.getFileType() != osl::FileStatus::Directory) //TODO: symlinks + aURLs.push_back(stat.getFileURL()); + } + + size_t nXML = 0; + for (std::vector<rtl::OUString>::iterator it = aURLs.begin(); it != aURLs.end(); it++) + { + // Read / sniff the nasty files ... + osl::File aIn( *it ); + if (aIn.open(osl_File_OpenFlag_Read) != osl::FileBase::E_None) + continue; + + sal_uInt64 nRead = 0; + char buffer[6]; + bool bIsXML = aIn.read(buffer, 6, nRead) == osl::FileBase::E_None && + nRead == 6 && !strncmp(buffer, "<?xml ", 6); + aIn.close(); + if (!bIsXML) + { + OSL_TRACE (OSL_LOG_PREFIX "rdb '%s' is a legacy format\n", + rtl::OUStringToOString( *it, RTL_TEXTENCODING_UTF8 ).getStr()); + break; + } + nXML++; + } + if (nXML == aURLs.size()) + { + OSL_TRACE (OSL_LOG_PREFIX "no legacy rdbs in directory '%s'\n", + rtl::OUStringToOString( url, RTL_TEXTENCODING_UTF8 ).getStr()); + // read whole directory... + last = readRdbFile( url, fatalErrors, last, + simpleRegistryFactory, nestedRegistryFactory); + } + else + { + for (std::vector<rtl::OUString>::iterator it = aURLs.begin(); it != aURLs.end(); it++) + { + // Read / sniff the nasty files ... + last = readRdbFile(*it, fatalErrors, last, + simpleRegistryFactory, nestedRegistryFactory); } } + return last; } Reference< registry::XSimpleRegistry > nestRegistries( diff --git a/stoc/source/simpleregistry/simpleregistry.cxx b/stoc/source/simpleregistry/simpleregistry.cxx index f09b204..9eebb4f 100644 --- a/stoc/source/simpleregistry/simpleregistry.cxx +++ b/stoc/source/simpleregistry/simpleregistry.cxx @@ -48,6 +48,7 @@ #include "cppuhelper/implbase2.hxx" #include "cppuhelper/weak.hxx" #include "osl/mutex.hxx" +#include "osl/file.hxx" #include "registry/registry.hxx" #include "registry/regtype.h" #include "rtl/ref.hxx" @@ -84,6 +85,12 @@ public: private: virtual rtl::OUString SAL_CALL getURL() throw (css::uno::RuntimeException); + virtual void SAL_CALL openRdb( + rtl::OUString const & rURL, sal_Bool bReadOnly, sal_Bool bCreate) + throw ( + css::registry::InvalidRegistryException, + css::uno::RuntimeException); + virtual void SAL_CALL open( rtl::OUString const & rURL, sal_Bool bReadOnly, sal_Bool bCreate) throw ( @@ -1130,27 +1137,17 @@ rtl::OUString Key::getResolvedName(rtl::OUString const & aKeyName) return resolved; } -rtl::OUString SimpleRegistry::getURL() throw (css::uno::RuntimeException) { +rtl::OUString SimpleRegistry::getURL() throw (css::uno::RuntimeException) +{ osl::MutexGuard guard(mutex_); return textual_.get() == 0 ? registry_.getName() : textual_->getUri(); } -void SimpleRegistry::open( +void SimpleRegistry::openRdb( rtl::OUString const & rURL, sal_Bool bReadOnly, sal_Bool bCreate) throw (css::registry::InvalidRegistryException, css::uno::RuntimeException) { osl::MutexGuard guard(mutex_); - if (textual_.get() != 0) { - throw css::registry::InvalidRegistryException( - (rtl::OUString( - RTL_CONSTASCII_USTRINGPARAM( - "com.sun.star.registry.SimpleRegistry.open(")) + - rURL + - rtl::OUString( - RTL_CONSTASCII_USTRINGPARAM( - "): instance already open"))), - static_cast< OWeakObject * >(this)); - } RegError err = (rURL.isEmpty() && bCreate) ? REG_REGISTRY_NOT_EXISTS : registry_.open(rURL, bReadOnly ? REG_READONLY : REG_READWRITE); @@ -1162,7 +1159,10 @@ void SimpleRegistry::open( break; case REG_INVALID_REGISTRY: if (bReadOnly && !bCreate) { - textual_.reset(new stoc::simpleregistry::TextualServices(rURL)); + if (!textual_.get()) + textual_.reset(new stoc::simpleregistry::TextualServices(rURL)); + else + textual_->merge(rURL); break; } // fall through @@ -1180,6 +1180,72 @@ void SimpleRegistry::open( } } +void SimpleRegistry::open( + rtl::OUString const & rURL, sal_Bool bReadOnly, sal_Bool bCreate) + throw (css::registry::InvalidRegistryException, css::uno::RuntimeException) +{ + osl::MutexGuard guard(mutex_); + + osl::DirectoryItem aItem; + osl::FileBase::RC eErr; + osl::FileStatus aStatus(osl_FileStatus_Mask_Type); + + // FIXME: busts the 'create' mode ... + if ((eErr = osl::DirectoryItem::get( rURL, aItem )) != osl::FileBase::E_None || + (eErr = aItem.getFileStatus( aStatus )) != osl::FileBase::E_None || + !aStatus.isDirectory()) + { + if (textual_.get() != 0) + throw css::registry::InvalidRegistryException( + (rtl::OUString("com.sun.star.registry.SimpleRegistry.open(") + + rURL + rtl::OUString("): instance already open")), + static_cast< OWeakObject * >(this)); + openRdb (rURL, bReadOnly, bCreate); + } + else + { + osl::Directory dir(rURL); + eErr = dir.open(); + if (eErr != osl::FileBase::E_None) + goto err_throw; + + for (;;) { + osl::DirectoryItem i; + if (dir.getNextItem(i, SAL_MAX_UINT32) != osl::FileBase::E_None) + break; + osl::FileStatus stat(osl_FileStatus_Mask_Type | osl_FileStatus_Mask_FileName | + osl_FileStatus_Mask_FileURL); + if (i.getFileStatus(stat) != osl::FileBase::E_None) + throw css::uno::RuntimeException( + (rtl::OUString("cannot stat in directory ") + rURL ), + css::uno::Reference< css::uno::XInterface >()); + + rtl::OUString aName = stat.getFileName(); + + // Ignore backup files - to allow people to edit their + // services/ without extremely confusing behaviour + if (aName.toChar() == '.' || aName.endsWithAsciiL("~", 1)) + continue; + + if (stat.getFileType() != osl::FileStatus::Directory) + openRdb(stat.getFileURL(), bReadOnly, bCreate); + } + } + return; + +err_throw: + throw css::registry::InvalidRegistryException( + (rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "com.sun.star.registry.SimpleRegistry.open(")) + + rURL + + rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "): error statting url = ")) + + rtl::OUString::valueOf(static_cast< sal_Int32 >(eErr))), + static_cast< OWeakObject * >(this)); +} + sal_Bool SimpleRegistry::isValid() throw (css::uno::RuntimeException) { osl::MutexGuard guard(mutex_); return textual_.get() != 0 || registry_.isValid(); diff --git a/stoc/source/simpleregistry/textualservices.cxx b/stoc/source/simpleregistry/textualservices.cxx index ad24a44..2491f55 100644 --- a/stoc/source/simpleregistry/textualservices.cxx +++ b/stoc/source/simpleregistry/textualservices.cxx @@ -1236,6 +1236,15 @@ css::uno::Sequence< rtl::OUString > Key::getChildren() { TextualServices::TextualServices(rtl::OUString const & uri): uri_(uri), data_(new Data) { + merge(uri); +} + +TextualServices::~TextualServices() {} + +// load and merge registry contents from uri +void TextualServices::merge(const rtl::OUString &uri) + throw (com::sun::star::registry::InvalidRegistryException) +{ try { Parser(uri, data_); } catch (css::container::NoSuchElementException &) { @@ -1247,8 +1256,6 @@ TextualServices::TextualServices(rtl::OUString const & uri): } } -TextualServices::~TextualServices() {} - css::uno::Reference< css::registry::XRegistryKey > TextualServices::getRootKey() { return new Key(data_, std::vector< rtl::OUString >()); diff --git a/stoc/source/simpleregistry/textualservices.hxx b/stoc/source/simpleregistry/textualservices.hxx index 286eb92..0341c15 100644 --- a/stoc/source/simpleregistry/textualservices.hxx +++ b/stoc/source/simpleregistry/textualservices.hxx @@ -53,6 +53,9 @@ public: virtual ~TextualServices(); + void merge(const rtl::OUString &uri) + throw (com::sun::star::registry::InvalidRegistryException); + inline rtl::OUString getUri() { return uri_; } com::sun::star::uno::Reference< com::sun::star::registry::XRegistryKey > commit a871537f328711f02d3b5ba18612bbf25c6f563b Author: Michael Meeks <michael.me...@suse.com> Date: Thu Apr 12 12:28:24 2012 +0100 linkoo: add --copy mode, default to this on windows diff --git a/solenv/bin/linkoo b/solenv/bin/linkoo index 8381ccc..f825e30 100755 --- a/solenv/bin/linkoo +++ b/solenv/bin/linkoo @@ -3,6 +3,8 @@ if 0; use strict; +use File::stat; +use File::Copy; #************************************************************************* # @@ -13,7 +15,7 @@ use strict; #************************************************************************* # # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# +# # Copyright 2000, 2010 Oracle and/or its affiliates. # # OpenOffice.org - a multi-platform office productivity suite @@ -56,20 +58,26 @@ export OOO_DISABLE_RECOVERY=1 export SAL_ALLOW_LINKOO_SYMLINKS=1 '; -if ($ENV{'OS'} eq 'MACOSX') { - print "FIXME: linkoo currently does not work on Mac OS X\n"; - exit(0); -} - my $dry_run = 0; my $backup = 0; +my $copy = 0; my $usage = 0; +my $windows = 0; my $LANG; my $TARGET; my $LIBVER; my $OOO_BUILD; my $OOO_INSTALL; +if ($ENV{'OS'} eq 'MACOSX') { + print "FIXME: linkoo currently does not work on Mac OS X\n"; + exit(0); +} +if ($TARGET eq 'wntgcci.pro') { + $windows = 1; + $copy = 1; +} + # process options for my $a (@ARGV) { @@ -80,7 +88,8 @@ for my $a (@ARGV) { $usage = 1; } elsif ($a eq '--backup') { $backup = 1; - + } elsif ($a eq '--copy') { + $copy = 1; # ordered arguments } elsif (!defined $OOO_INSTALL) { $OOO_INSTALL = $a; @@ -97,7 +106,7 @@ if (!defined $OOO_BUILD && defined $ENV{SRC_ROOT}) { } if ($usage || !defined $OOO_INSTALL || !defined $OOO_BUILD) { - printf "Usage: linkoo </path/to/ooo/install> [</path/to/ooo/build/tree>] [--dry-run] [--backup]\n"; + printf "Usage: linkoo </path/to/ooo/install> [</path/to/ooo/build/tree>] [--dry-run] [--backup] [--copy]\n"; exit (1); } @@ -117,10 +126,10 @@ my $ure_lib_dir = 'ure-link/lib'; my $win_ure_lib_dir = 'URE/bin'; my @exceptions = ( 'libsunjavaplugin', 'libjvmfwk' ); -push @exceptions, 'cppuhelper' if ($TARGET ne 'wntgcci.pro'); +push @exceptions, 'cppuhelper' if (!$windows); my $bin; -$bin = "|\\.bin" if ($TARGET eq 'wntgcci.pro'); +$bin = "|\\.bin" if ($windows); my %replaceable = ( $brand_program_dir => "(\\.so|\\.dll|\\.exe|\\.com$bin)\$", $ure_lib_dir => "(\\.so\$|\\.so\\.3\$)", @@ -200,7 +209,17 @@ sub do_link($$$$@) my $dest_name = shift; my $dont_check_link = shift; - if (-l "$dest/$dest_name" ) { + if ($copy) { # copy if older ... + my $src_mtime = stat("$src/$src_name")->mtime; + my $dest_mtime = stat("$dest/$dest_name")->mtime; + if ($src_mtime > $dest_mtime) { +# print " copy $src/$src_name ($src_mtime) -> $dest/$dest_name ($dest_mtime)\n"; + print " copy $src/$src_name -> $dest/$dest_name\n"; + copy("$src/$src_name", "$dest/$dest_name") || die "Failed top copy: $!"; + } else { +# print " up-to-date $src/$src_name -> $dest/$dest_name\n"; + } + } elsif (-l "$dest/$dest_name" ) { my $link = readlink ("$dest/$dest_name"); if ($link =~ /^\//) { # Absolute path if (!$dry_run) { @@ -324,6 +343,8 @@ sub evilness($) my $src = "$OOO_BUILD/shell/$TARGET/lib/$name"; my $dest = "$OOO_BUILD/sfx2/$TARGET/lib/$name"; + return if ($windows); + if ($doit eq 'undo') { if (-l $dest) { print " unlink $name\n"; @@ -362,8 +383,7 @@ sub do_link_gdb_py($$$) sub link_gdb_py() { - return if ($TARGET eq 'wntgcci.pro'); - + return if ($windows); print "Special gdb.py helpers case: "; my $dirh; @@ -396,7 +416,7 @@ sub link_gdb_py() sub link_pagein_files() { - return if ($TARGET eq 'wntgcci.pro'); + return if ($windows); print "pagein case:"; my $src = "$OOO_BUILD/solver/$TARGET/bin"; @@ -427,7 +447,7 @@ if (!-f "$OOO_INSTALL/" . $brand_program_dir . "/ooenv") { evilness ('do'); print "\nlinkoo finished"; -print ", please don't forget to source ooenv before ./soffice." if ($TARGET ne 'wntgcci.pro'); +print ", please don't forget to source ooenv before ./soffice." if (!$windows); print "\n"; # vim:set shiftwidth=4 softtabstop=4 expandtab: _______________________________________________ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits