[Libreoffice-commits] core.git: Branch 'libreoffice-4-1' - unoidl/source

2013-10-29 Thread Stephan Bergmann
 unoidl/source/unoidl.cxx |  112 ---
 1 file changed, 78 insertions(+), 34 deletions(-)

New commits:
commit cfa141a67592ae5eda7ccf9cc8dbfbe78c7b1959
Author: Stephan Bergmann sberg...@redhat.com
Date:   Thu Oct 24 09:48:13 2013 +0200

fdo#67725 unoidl::AggregatingCursor must wrap modules for aggregation, too

Otherwise cppuhelper::TypeManager::createTypeDescriptionEnumeration, 
sitting on
top such an AggregatingCursor, will miss any entities from provider P' in 
module
M if any previous provider P contains the same module M.

That happened when climaker generates cli_oootypes.dll, where the 
enumeration
missed everything from offapi in top-level module com because it had 
already
seen udkapi's com, and only reported the handful of entities under 
offapi's
other top-level module org (which does not appear in udkapi).

Change-Id: If538391bde22bcc346417b5988cf12023f0d4172
(cherry picked from commit bdd55e28fc7788c2968daaf87b782f8e6189ee2d)
Reviewed-on: https://gerrit.libreoffice.org/6415
Reviewed-by: Caolán McNamara caol...@redhat.com
Tested-by: Caolán McNamara caol...@redhat.com

diff --git a/unoidl/source/unoidl.cxx b/unoidl/source/unoidl.cxx
index a9939e4..c55e02b 100644
--- a/unoidl/source/unoidl.cxx
+++ b/unoidl/source/unoidl.cxx
@@ -23,41 +23,101 @@ namespace unoidl {
 
 namespace {
 
+class AggregatingModule: public ModuleEntity {
+public:
+AggregatingModule(
+std::vector rtl::Reference Provider   const  providers,
+OUString const  name):
+providers_(providers), name_(name)
+{}
+
+private:
+virtual ~AggregatingModule() throw () {}
+
+virtual std::vector OUString  getMemberNames() const;
+
+virtual rtl::Reference MapCursor  createCursor() const;
+
+std::vector rtl::Reference Provider   providers_;
+OUString name_;
+};
+
+std::vector OUString  AggregatingModule::getMemberNames() const {
+std::set OUString  names;
+for (std::vector rtl::Reference Provider  ::const_iterator i(
+ providers_.begin());
+ i != providers_.end(); ++i)
+{
+rtl::Reference Entity  ent((*i)-findEntity(name_));
+if (ent.is()  ent-getSort() == Entity::SORT_MODULE) {
+std::vector OUString  ns(
+static_cast ModuleEntity * (ent.get())-getMemberNames());
+names.insert(ns.begin(), ns.end());
+}
+}
+return std::vector OUString (names.begin(), names.end());
+}
+
 class AggregatingCursor: public MapCursor {
 public:
 AggregatingCursor(
-std::vector rtl::Reference MapCursor   const  cursors):
-cursors_(cursors), iterator_(cursors_.begin())
-{}
+std::vector rtl::Reference Provider   const  providers,
+OUString const  name):
+providers_(providers), name_(name), iterator_(providers_.begin())
+{ findCursor(); }
 
 private:
 virtual ~AggregatingCursor() throw () {}
 
-virtual rtl::Reference Entity  getNext(rtl::OUString * name);
+virtual rtl::Reference Entity  getNext(OUString * name);
 
-std::vector rtl::Reference MapCursor   cursors_;
-std::vector rtl::Reference MapCursor  ::iterator iterator_;
-std::set rtl::OUString  seenMembers;
+void findCursor();
+
+std::vector rtl::Reference Provider   providers_;
+OUString name_;
+std::vector rtl::Reference Provider  ::iterator iterator_;
+rtl::Reference MapCursor  cursor_;
+std::set OUString  seen_;
 };
 
-rtl::Reference Entity  AggregatingCursor::getNext(rtl::OUString * name) {
-for (;;) {
-if (iterator_ == cursors_.end()) {
-return rtl::Reference Entity ();
-}
-rtl::OUString n;
-rtl::Reference Entity  ent((*iterator_)-getNext(n));
+rtl::Reference Entity  AggregatingCursor::getNext(OUString * name) {
+while (cursor_.is()) {
+OUString n;
+rtl::Reference Entity  ent(cursor_-getNext(n));
 if (ent.is()) {
-if (seenMembers.insert(n).second) {
+if (seen_.insert(n).second) {
 if (name != 0) {
 *name = n;
 }
-return ent;
+return ent-getSort() == Entity::SORT_MODULE
+? new AggregatingModule(
+providers_, (name_.isEmpty() ? name_ : name_ + .) + 
n)
+: ent;
 }
 } else {
-++iterator_;
+cursor_.clear();
+findCursor();
 }
 }
+return rtl::Reference Entity ();
+}
+
+void AggregatingCursor::findCursor() {
+for (; !cursor_.is()  iterator_ != providers_.end(); ++iterator_) {
+if (name_.isEmpty()) {
+cursor_ = (*iterator_)-createRootCursor();
+} else {
+rtl::Reference Entity  ent((*iterator_)-findEntity(name_));
+if (ent.is()  ent-getSort() == Entity::SORT_MODULE) {
+cursor_ = 

[Libreoffice-commits] core.git: Branch 'libreoffice-4-1' - unoidl/source

2013-07-09 Thread Stephan Bergmann
 unoidl/source/legacyprovider.cxx |   32 
 1 file changed, 20 insertions(+), 12 deletions(-)

New commits:
commit 6228a80271462a26d409224e84d0e0a3b005c1d6
Author: Stephan Bergmann sberg...@redhat.com
Date:   Tue Jul 9 19:48:21 2013 +0200

fdo#65589: Treat legacy types.rdb w/o /UCR key as empty

...as they are encountered in the wild.

Change-Id: Iae46d3b4b4aca18a09680caabc0e343f8a534989
(cherry picked from commit 87bad231d6f81c611ba145aea483a568623ca42e)

diff --git a/unoidl/source/legacyprovider.cxx b/unoidl/source/legacyprovider.cxx
index 17b95dc..a60424a 100644
--- a/unoidl/source/legacyprovider.cxx
+++ b/unoidl/source/legacyprovider.cxx
@@ -96,16 +96,18 @@ Cursor::Cursor(
 RegistryKey const  key):
 manager_(manager), ucr_(ucr), key_(key), index_(0)
 {
-prefix_ = key_.getName();
-if (!prefix_.endsWith(/)) {
-prefix_ += /;
-}
-RegError e = key_.getKeyNames(, names_);
-if (e != REG_NO_ERROR) {
-throw FileFormatException(
-key_.getRegistryName(),
-(legacy format: cannot get sub-key names of  + key_.getName()
- + :  + OUString::number(e)));
+if (ucr_.isValid()) {
+prefix_ = key_.getName();
+if (!prefix_.endsWith(/)) {
+prefix_ += /;
+}
+RegError e = key_.getKeyNames(, names_);
+if (e != REG_NO_ERROR) {
+throw FileFormatException(
+key_.getRegistryName(),
+(legacy format: cannot get sub-key names of  + key_.getName()
+ + :  + OUString::number(e)));
+}
 }
 }
 
@@ -797,7 +799,11 @@ LegacyProvider::LegacyProvider(
 uri, legacy format: cannot open root key:  + 
OUString::number(e));
 }
 e = root.openKey(UCR, ucr_);
-if (e != REG_NO_ERROR) {
+switch (e) {
+case REG_NO_ERROR:
+case REG_KEY_NOT_EXISTS: // such effectively empty files exist in the wild
+break;
+default:
 throw FileFormatException(
 uri, legacy format: cannot open UCR key:  + OUString::number(e));
 }
@@ -810,7 +816,9 @@ rtl::Reference MapCursor  
LegacyProvider::createRootCursor() const {
 rtl::Reference Entity  LegacyProvider::findEntity(OUString const  name)
 const
 {
-return readEntity(manager_, ucr_, ucr_, name.replace('.', '/'), true);
+return ucr_.isValid()
+? readEntity(manager_, ucr_, ucr_, name.replace('.', '/'), true)
+: rtl::Reference Entity ();
 }
 
 LegacyProvider::~LegacyProvider() throw () {}
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits