kbrown / rpms / libreoffice

Forked from rpms/libreoffice 2 years ago
Clone

Blame SOURCES/0001-fdo-67725-unoidl-AggregatingCursor-must-wrap-modules.patch

2135ec
From f450c132e6a65e1d11f20595bb0bfbf786e1dc2d Mon Sep 17 00:00:00 2001
2135ec
From: Stephan Bergmann <sbergman@redhat.com>
2135ec
Date: Thu, 24 Oct 2013 09:48:13 +0200
2135ec
Subject: [PATCH] fdo#67725 unoidl::AggregatingCursor must wrap modules for
2135ec
 aggregation, too
2135ec
2135ec
Otherwise cppuhelper::TypeManager::createTypeDescriptionEnumeration, sitting on
2135ec
top such an AggregatingCursor, will miss any entities from provider P' in module
2135ec
M if any previous provider P contains the same module M.
2135ec
2135ec
That happened when climaker generates cli_oootypes.dll, where the enumeration
2135ec
missed everything from offapi in top-level module "com" because it had already
2135ec
seen udkapi's "com", and only reported the handful of entities under offapi's
2135ec
other top-level module "org" (which does not appear in udkapi).
2135ec
2135ec
Change-Id: If538391bde22bcc346417b5988cf12023f0d4172
2135ec
(cherry picked from commit bdd55e28fc7788c2968daaf87b782f8e6189ee2d)
2135ec
---
2135ec
 unoidl/source/unoidl.cxx | 112 +++++++++++++++++++++++++++++++++--------------
2135ec
 1 file changed, 78 insertions(+), 34 deletions(-)
2135ec
2135ec
diff --git a/unoidl/source/unoidl.cxx b/unoidl/source/unoidl.cxx
2135ec
index a9939e4..c55e02b 100644
2135ec
--- a/unoidl/source/unoidl.cxx
2135ec
+++ b/unoidl/source/unoidl.cxx
2135ec
@@ -23,41 +23,101 @@ namespace unoidl {
2135ec
 
2135ec
 namespace {
2135ec
 
2135ec
+class AggregatingModule: public ModuleEntity {
2135ec
+public:
2135ec
+    AggregatingModule(
2135ec
+        std::vector< rtl::Reference< Provider > > const & providers,
2135ec
+        OUString const & name):
2135ec
+        providers_(providers), name_(name)
2135ec
+    {}
2135ec
+
2135ec
+private:
2135ec
+    virtual ~AggregatingModule() throw () {}
2135ec
+
2135ec
+    virtual std::vector< OUString > getMemberNames() const;
2135ec
+
2135ec
+    virtual rtl::Reference< MapCursor > createCursor() const;
2135ec
+
2135ec
+    std::vector< rtl::Reference< Provider > > providers_;
2135ec
+    OUString name_;
2135ec
+};
2135ec
+
2135ec
+std::vector< OUString > AggregatingModule::getMemberNames() const {
2135ec
+    std::set< OUString > names;
2135ec
+    for (std::vector< rtl::Reference< Provider > >::const_iterator i(
2135ec
+             providers_.begin());
2135ec
+         i != providers_.end(); ++i)
2135ec
+    {
2135ec
+        rtl::Reference< Entity > ent((*i)->findEntity(name_));
2135ec
+        if (ent.is() && ent->getSort() == Entity::SORT_MODULE) {
2135ec
+            std::vector< OUString > ns(
2135ec
+                static_cast< ModuleEntity * >(ent.get())->getMemberNames());
2135ec
+            names.insert(ns.begin(), ns.end());
2135ec
+        }
2135ec
+    }
2135ec
+    return std::vector< OUString >(names.begin(), names.end());
2135ec
+}
2135ec
+
2135ec
 class AggregatingCursor: public MapCursor {
2135ec
 public:
2135ec
     AggregatingCursor(
2135ec
-        std::vector< rtl::Reference< MapCursor > > const & cursors):
2135ec
-        cursors_(cursors), iterator_(cursors_.begin())
2135ec
-    {}
2135ec
+        std::vector< rtl::Reference< Provider > > const & providers,
2135ec
+        OUString const & name):
2135ec
+        providers_(providers), name_(name), iterator_(providers_.begin())
2135ec
+    { findCursor(); }
2135ec
 
2135ec
 private:
2135ec
     virtual ~AggregatingCursor() throw () {}
2135ec
 
2135ec
-    virtual rtl::Reference< Entity > getNext(rtl::OUString * name);
2135ec
+    virtual rtl::Reference< Entity > getNext(OUString * name);
2135ec
 
2135ec
-    std::vector< rtl::Reference< MapCursor > > cursors_;
2135ec
-    std::vector< rtl::Reference< MapCursor > >::iterator iterator_;
2135ec
-    std::set< rtl::OUString > seenMembers;
2135ec
+    void findCursor();
2135ec
+
2135ec
+    std::vector< rtl::Reference< Provider > > providers_;
2135ec
+    OUString name_;
2135ec
+    std::vector< rtl::Reference< Provider > >::iterator iterator_;
2135ec
+    rtl::Reference< MapCursor > cursor_;
2135ec
+    std::set< OUString > seen_;
2135ec
 };
2135ec
 
2135ec
-rtl::Reference< Entity > AggregatingCursor::getNext(rtl::OUString * name) {
2135ec
-    for (;;) {
2135ec
-        if (iterator_ == cursors_.end()) {
2135ec
-            return rtl::Reference< Entity >();
2135ec
-        }
2135ec
-        rtl::OUString n;
2135ec
-        rtl::Reference< Entity > ent((*iterator_)->getNext(&n);;
2135ec
+rtl::Reference< Entity > AggregatingCursor::getNext(OUString * name) {
2135ec
+    while (cursor_.is()) {
2135ec
+        OUString n;
2135ec
+        rtl::Reference< Entity > ent(cursor_->getNext(&n);;
2135ec
         if (ent.is()) {
2135ec
-            if (seenMembers.insert(n).second) {
2135ec
+            if (seen_.insert(n).second) {
2135ec
                 if (name != 0) {
2135ec
                     *name = n;
2135ec
                 }
2135ec
-                return ent;
2135ec
+                return ent->getSort() == Entity::SORT_MODULE
2135ec
+                    ? new AggregatingModule(
2135ec
+                        providers_, (name_.isEmpty() ? name_ : name_ + ".") + n)
2135ec
+                    : ent;
2135ec
             }
2135ec
         } else {
2135ec
-            ++iterator_;
2135ec
+            cursor_.clear();
2135ec
+            findCursor();
2135ec
         }
2135ec
     }
2135ec
+    return rtl::Reference< Entity >();
2135ec
+}
2135ec
+
2135ec
+void AggregatingCursor::findCursor() {
2135ec
+    for (; !cursor_.is() && iterator_ != providers_.end(); ++iterator_) {
2135ec
+        if (name_.isEmpty()) {
2135ec
+            cursor_ = (*iterator_)->createRootCursor();
2135ec
+        } else {
2135ec
+            rtl::Reference< Entity > ent((*iterator_)->findEntity(name_));
2135ec
+            if (ent.is() && ent->getSort() == Entity::SORT_MODULE) {
2135ec
+                cursor_ = static_cast< ModuleEntity * >(ent.get())->
2135ec
+                    createCursor();
2135ec
+            }
2135ec
+        }
2135ec
+    }
2135ec
+}
2135ec
+
2135ec
+rtl::Reference< MapCursor > AggregatingModule::createCursor() const {
2135ec
+    return new AggregatingCursor(providers_, name_);
2135ec
 }
2135ec
 
2135ec
 }
2135ec
@@ -139,23 +199,7 @@ rtl::Reference< Entity > Manager::findEntity(rtl::OUString const & name) const {
2135ec
 rtl::Reference< MapCursor > Manager::createCursor(rtl::OUString const & name)
2135ec
     const
2135ec
 {
2135ec
-    std::vector< rtl::Reference< MapCursor > > curs;
2135ec
-    for (std::vector< rtl::Reference< Provider > >::const_iterator i(
2135ec
-             providers_.begin());
2135ec
-         i != providers_.end(); ++i)
2135ec
-    {
2135ec
-        if (name.isEmpty()) {
2135ec
-            curs.push_back((*i)->createRootCursor());
2135ec
-        } else {
2135ec
-            rtl::Reference< Entity > ent((*i)->findEntity(name));
2135ec
-            if (ent.is() && ent->getSort() == Entity::SORT_MODULE) {
2135ec
-                curs.push_back(
2135ec
-                    static_cast< ModuleEntity * >(ent.get())->createCursor());
2135ec
-            }
2135ec
-        }
2135ec
-    }
2135ec
-    return curs.empty()
2135ec
-        ? rtl::Reference< MapCursor >() : new AggregatingCursor(curs);
2135ec
+    return new AggregatingCursor(providers_, name);
2135ec
 }
2135ec
 
2135ec
 Manager::~Manager() throw () {}
2135ec
-- 
2135ec
1.8.3.1
2135ec