[Libreoffice-commits] core.git: Branch 'libreoffice-4-1' - unoidl/source
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
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