[Libreoffice-commits] core.git: cli_ure/source cppuhelper/Library_cppuhelper.mk cppuhelper/source desktop/source stoc/inc stoc/Library_bootstrap.mk stoc/source stoc/util unoidl/inc unoidl/source

Stephan Bergmann sbergman at redhat.com
Mon Apr 22 09:26:07 PDT 2013


 cli_ure/source/climaker/climaker_app.cxx                      |   18 
 cppuhelper/Library_cppuhelper.mk                              |    2 
 cppuhelper/source/defaultbootstrap.cxx                        |   27 
 cppuhelper/source/typedescriptionprovider.cxx                 | 2073 --------
 cppuhelper/source/typedescriptionprovider.hxx                 |   39 
 cppuhelper/source/typemanager.cxx                             | 2370 ++++++++++
 cppuhelper/source/typemanager.hxx                             |  151 
 desktop/source/deployment/registry/component/dp_component.cxx |   57 
 stoc/Library_bootstrap.mk                                     |    3 
 stoc/inc/bootstrapservices.hxx                                |    7 
 stoc/source/bootstrap/services.cxx                            |    6 
 stoc/source/tdmanager/lrucache.hxx                            |  242 -
 stoc/source/tdmanager/tdmgr.cxx                               | 1132 ----
 stoc/source/tdmanager/tdmgr_check.cxx                         |  546 --
 stoc/source/tdmanager/tdmgr_common.hxx                        |   48 
 stoc/source/tdmanager/tdmgr_tdenumeration.cxx                 |  170 
 stoc/source/tdmanager/tdmgr_tdenumeration.hxx                 |   82 
 stoc/util/bootstrap.component                                 |    4 
 unoidl/inc/unoidl/unoidl.hxx                                  |    2 
 unoidl/source/unoidl.cxx                                      |    5 
 20 files changed, 2560 insertions(+), 4424 deletions(-)

New commits:
commit 5275ed805a6e42f56c59d1c5876a7994625905a9
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Wed Apr 17 16:43:13 2013 +0200

    Revert "Revert "WIP: Experimental new binary type.rdb format""
    
    This reverts commit 67e69a55820f50973ca0de75ccab2bb07d0bada8, applying a band-
    aid fix to cli_ure/source/climaker for now.
    
    Conflicts:
    	stoc/inc/bootstrapservices.hxx
    	stoc/source/tdmanager/lrucache.hxx
    	stoc/source/tdmanager/tdmgr.cxx
    	stoc/source/tdmanager/tdmgr_common.hxx
    	stoc/source/tdmanager/tdmgr_tdenumeration.cxx
    	stoc/source/tdmanager/tdmgr_tdenumeration.hxx
    
    Change-Id: Iae669985d0194f06fa349a4a39f0ebd230bc5d28

diff --git a/cli_ure/source/climaker/climaker_app.cxx b/cli_ure/source/climaker/climaker_app.cxx
old mode 100644
new mode 100755
index f7b1f27..e74cc23
--- a/cli_ure/source/climaker/climaker_app.cxx
+++ b/cli_ure/source/climaker/climaker_app.cxx
@@ -483,17 +483,15 @@ SAL_IMPLEMENT_MAIN()
                 Sequence< Any >( &arg, 1 ), xContext ) );
         // insert provider to tdmgr
         Reference< container::XSet > xSet( xTDmgr, UNO_QUERY_THROW );
-        Any provider( makeAny( xTD_provider ) );
-        xSet->insert( provider );
-        OSL_ASSERT( xSet->has( provider ) );
-        if (! extra_registries.empty())
+        for (vector< OUString >::iterator i(extra_registries.begin());
+             i != extra_registries.end(); ++i)
         {
-            arg = makeAny( open_registries( extra_registries, xContext ) );
-            provider = makeAny(
-                xTDprov_factory->createInstanceWithArgumentsAndContext(
-                    Sequence< Any >( &arg, 1 ), xContext ) );
-            xSet->insert( provider );
-            OSL_ASSERT( xSet->has( provider ) );
+            xSet->insert(makeAny(*i));
+        }
+        for (vector< OUString >::iterator i(mandatory_registries.begin());
+             i != mandatory_registries.end(); ++i)
+        {
+            xSet->insert(makeAny(*i));
         }
 
         if (0 == output.getLength()) // no output file specified
diff --git a/cppuhelper/Library_cppuhelper.mk b/cppuhelper/Library_cppuhelper.mk
index 577efbc..b594b53 100644
--- a/cppuhelper/Library_cppuhelper.mk
+++ b/cppuhelper/Library_cppuhelper.mk
@@ -75,7 +75,7 @@ $(eval $(call gb_Library_add_exception_objects,cppuhelper,\
 	cppuhelper/source/shlib \
 	cppuhelper/source/supportsservice \
 	cppuhelper/source/tdmgr \
-	cppuhelper/source/typedescriptionprovider \
+	cppuhelper/source/typemanager \
 	cppuhelper/source/typeprovider \
 	cppuhelper/source/unourl \
 	cppuhelper/source/weak \
diff --git a/cppuhelper/source/defaultbootstrap.cxx b/cppuhelper/source/defaultbootstrap.cxx
index 10c8eaf..fc790ba 100644
--- a/cppuhelper/source/defaultbootstrap.cxx
+++ b/cppuhelper/source/defaultbootstrap.cxx
@@ -12,8 +12,6 @@
 #include <cassert>
 #include <vector>
 
-#include "com/sun/star/container/XHierarchicalNameAccess.hpp"
-#include "com/sun/star/container/XSet.hpp"
 #include "com/sun/star/uno/DeploymentException.hpp"
 #include "com/sun/star/uno/Any.hxx"
 #include "com/sun/star/uno/Reference.hxx"
@@ -29,7 +27,7 @@ using rtl::OUString;
 #include "macro_expander.hxx"
 #include "paths.hxx"
 #include "servicemanager.hxx"
-#include "typedescriptionprovider.hxx"
+#include "typemanager.hxx"
 
 namespace {
 
@@ -60,6 +58,9 @@ cppu::defaultBootstrap_InitialComponentContext(rtl::OUString const & iniUri)
     rtl::Reference< cppuhelper::ServiceManager > smgr(
         new cppuhelper::ServiceManager(
             getBootstrapVariable(bs, "UNO_SERVICES")));
+    rtl::Reference< cppuhelper::TypeManager > tmgr(
+        new cppuhelper::TypeManager(
+            getBootstrapVariable(bs, "UNO_TYPES")));
     cppu::ContextEntry_Init entry;
     std::vector< cppu::ContextEntry_Init > context_values;
     context_values.push_back(
@@ -69,6 +70,13 @@ cppu::defaultBootstrap_InitialComponentContext(rtl::OUString const & iniUri)
                 css::uno::Reference< css::uno::XInterface >(
                     static_cast< cppu::OWeakObject * >(smgr.get()))),
             false));
+    context_values.push_back(
+        cppu::ContextEntry_Init(
+            "/singletons/com.sun.star.reflection.theTypeDescriptionManager",
+            css::uno::makeAny(
+                css::uno::Reference< css::uno::XInterface >(
+                    static_cast< cppu::OWeakObject * >(tmgr.get()))),
+            false));
     context_values.push_back( //TODO: from services.rdb?
         cppu::ContextEntry_Init(
             "/singletons/com.sun.star.util.theMacroExpander",
@@ -92,18 +100,7 @@ cppu::defaultBootstrap_InitialComponentContext(rtl::OUString const & iniUri)
             &context_values[0], context_values.size(),
             css::uno::Reference< css::uno::XComponentContext >()));
     smgr->setContext(context);
-    css::uno::Reference< css::container::XHierarchicalNameAccess > tdmgr(
-        context->getValueByName(
-            "/singletons/com.sun.star.reflection.theTypeDescriptionManager"),
-        css::uno::UNO_QUERY_THROW);
-    css::uno::Reference< css::container::XSet >(
-        tdmgr, css::uno::UNO_QUERY_THROW)->
-        insert(
-            css::uno::makeAny(
-                cppuhelper::createTypeDescriptionProviders(
-                    getBootstrapVariable(bs, "UNO_TYPES"), smgr.get(),
-                    context)));
-    cppu::installTypeDescriptionManager(tdmgr);
+    cppu::installTypeDescriptionManager(tmgr.get());
     return context;
 }
 
diff --git a/cppuhelper/source/typedescriptionprovider.hxx b/cppuhelper/source/typedescriptionprovider.hxx
deleted file mode 100644
index 93336e8..0000000
--- a/cppuhelper/source/typedescriptionprovider.hxx
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-#ifndef INCLUDED_CPPUHELPER_SOURCE_TYPEDESCRIPTIONPROVIDER_HXX
-#define INCLUDED_CPPUHELPER_SOURCE_TYPEDESCRIPTIONPROVIDER_HXX
-
-#include "sal/config.h"
-
-#include "com/sun/star/uno/Reference.hxx"
-#include "com/sun/star/uno/Sequence.hxx"
-
-namespace com { namespace sun { namespace star {
-     namespace container { class XHierarchicalNameAccess; }
-     namespace lang { class XMultiComponentFactory; }
-     namespace uno { class XComponentContext; }
-} } }
-namespace rtl { class OUString; }
-
-namespace cppuhelper {
-
-css::uno::Sequence<
-    css::uno::Reference< css::container::XHierarchicalNameAccess > >
-createTypeDescriptionProviders(
-    rtl::OUString const & uris,
-    css::uno::Reference< css::lang::XMultiComponentFactory > const &
-        serviceManager,
-    css::uno::Reference< css::uno::XComponentContext > const & context);
-
-}
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cppuhelper/source/typedescriptionprovider.cxx b/cppuhelper/source/typemanager.cxx
similarity index 63%
rename from cppuhelper/source/typedescriptionprovider.cxx
rename to cppuhelper/source/typemanager.cxx
index b87575d..4185ddc 100644
--- a/cppuhelper/source/typedescriptionprovider.cxx
+++ b/cppuhelper/source/typemanager.cxx
@@ -10,16 +10,17 @@
 #include "sal/config.h"
 
 #include <cassert>
+#include <cstddef>
 #include <cstdlib>
+#include <cstring>
 #include <set>
 #include <stack>
 #include <vector>
 
 #include "boost/noncopyable.hpp"
+#include "com/sun/star/container/ElementExistException.hpp"
 #include "com/sun/star/container/NoSuchElementException.hpp"
-#include "com/sun/star/container/XHierarchicalNameAccess.hpp"
-#include "com/sun/star/lang/XInitialization.hpp"
-#include "com/sun/star/lang/XMultiComponentFactory.hpp"
+#include "com/sun/star/lang/IllegalArgumentException.hpp"
 #include "com/sun/star/reflection/InvalidTypeNameException.hpp"
 #include "com/sun/star/reflection/NoSuchTypeNameException.hpp"
 #include "com/sun/star/reflection/TypeDescriptionSearchDepth.hpp"
@@ -35,61 +36,99 @@
 #include "com/sun/star/reflection/XServiceTypeDescription2.hpp"
 #include "com/sun/star/reflection/XSingletonTypeDescription2.hpp"
 #include "com/sun/star/reflection/XStructTypeDescription.hpp"
-#include "com/sun/star/reflection/XTypeDescriptionEnumeration.hpp"
-#include "com/sun/star/reflection/XTypeDescriptionEnumerationAccess.hpp"
-#include "com/sun/star/registry/InvalidRegistryException.hpp"
-#include "com/sun/star/registry/XSimpleRegistry.hpp"
+#include "com/sun/star/reflection/XTypeDescription.hpp"
 #include "com/sun/star/uno/Any.hxx"
 #include "com/sun/star/uno/DeploymentException.hpp"
 #include "com/sun/star/uno/Reference.hxx"
 #include "com/sun/star/uno/RuntimeException.hpp"
 #include "com/sun/star/uno/Sequence.hxx"
+#include "com/sun/star/uno/Type.hxx"
 #include "com/sun/star/uno/TypeClass.hpp"
-#include "com/sun/star/uno/XComponentContext.hpp"
-#include "com/sun/star/uno/XInterface.hpp"
-#include "cppuhelper/compbase2.hxx"
+#include "cppu/unotype.hxx"
 #include "cppuhelper/implbase1.hxx"
+#include "cppuhelper/supportsservice.hxx"
 #include "osl/file.hxx"
 #include "osl/mutex.hxx"
 #include "rtl/ref.hxx"
+#include "rtl/string.h"
 #include "rtl/ustring.hxx"
+#include "sal/macros.h"
 #include "sal/types.h"
 
 using rtl::OUString;
 
 #include "unoidl/unoidl.hxx"
-#include "unoidl/unoidlprovider.hxx"
 
 #include "paths.hxx"
-#include "typedescriptionprovider.hxx"
+#include "typemanager.hxx"
 
 namespace {
 
-css::uno::Reference< css::reflection::XTypeDescription > resolve(
-    css::uno::Reference< css::uno::XComponentContext > const & context,
-    rtl::OUString const & name)
-{
-    assert(context.is());
-    try {
-        return css::uno::Reference< css::reflection::XTypeDescription >(
-            (css::uno::Reference< css::container::XHierarchicalNameAccess >(
-                context->getValueByName(
-                    "/singletons/"
-                    "com.sun.star.reflection.theTypeDescriptionManager"),
-                css::uno::UNO_QUERY_THROW)->
-             getByHierarchicalName(name)),
-            css::uno::UNO_QUERY_THROW);
-    } catch (css::container::NoSuchElementException & e) {
-        throw css::uno::DeploymentException(
-            ("cannot resolve type \"" + name + "\"; NoSuchElementException: "
-             + e.Message),
-            e.Context);
+css::uno::Any resolveTypedefs(css::uno::Any const & type) {
+    for (css::uno::Any t(type);;) {
+        css::uno::Reference< css::reflection::XIndirectTypeDescription > ind(
+            type, css::uno::UNO_QUERY);
+        if (!ind.is() || ind->getTypeClass() != css::uno::TypeClass_TYPEDEF) {
+            return t;
+        }
+        t = css::uno::makeAny(ind->getReferencedType());
     }
 }
 
+class SimpleTypeDescription:
+    public cppu::WeakImplHelper1< css::reflection::XTypeDescription >
+{
+public:
+    SimpleTypeDescription(
+        css::uno::TypeClass typeClass, rtl::OUString const & name):
+        typeClass_(typeClass), name_(name)
+    {}
+
+private:
+    virtual ~SimpleTypeDescription() {}
+
+    virtual css::uno::TypeClass SAL_CALL getTypeClass()
+        throw (css::uno::RuntimeException)
+    { return typeClass_; }
+
+    virtual rtl::OUString SAL_CALL getName() throw (css::uno::RuntimeException)
+    { return name_; }
+
+    css::uno::TypeClass typeClass_;
+    rtl::OUString name_;
+};
+
+class SequenceTypeDescription:
+    public cppu::WeakImplHelper1< css::reflection::XIndirectTypeDescription >
+{
+public:
+    SequenceTypeDescription(
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
+        rtl::OUString const & name, rtl::OUString const & componentType):
+        manager_(manager), name_(name), componentType_(componentType)
+    { assert(manager.is()); }
+
+private:
+    virtual ~SequenceTypeDescription() {}
+
+    virtual css::uno::TypeClass SAL_CALL getTypeClass()
+        throw (css::uno::RuntimeException)
+    { return css::uno::TypeClass_SEQUENCE; }
+
+    virtual rtl::OUString SAL_CALL getName() throw (css::uno::RuntimeException)
+    { return name_; }
+
+    virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
+    getReferencedType() throw (css::uno::RuntimeException)
+    { return manager_->resolve(componentType_); }
+
+    rtl::Reference< cppuhelper::TypeManager > manager_;
+    rtl::OUString name_;
+    rtl::OUString componentType_;
+};
+
 class PublishableDescription:
-    public cppu::WeakImplHelper1< css::reflection::XPublished >,
-    private boost::noncopyable
+    public cppu::WeakImplHelper1< css::reflection::XPublished >
 {
 protected:
     PublishableDescription(bool published): published_(published) {}
@@ -104,16 +143,15 @@ private:
 };
 
 class ModuleDescription:
-    public cppu::WeakImplHelper1< css::reflection::XModuleTypeDescription >,
-    private boost::noncopyable
+    public cppu::WeakImplHelper1< css::reflection::XModuleTypeDescription >
 {
 public:
     ModuleDescription(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
         rtl::OUString const & name,
         rtl::Reference< unoidl::ModuleEntity > const & entity):
-        context_(context), name_(name), entity_(entity)
-    { assert(entity.is()); }
+        manager_(manager), name_(name), entity_(entity)
+    { assert(manager.is()); assert(entity.is()); }
 
 private:
     virtual ~ModuleDescription() {}
@@ -130,7 +168,7 @@ private:
         css::uno::Reference< css::reflection::XTypeDescription > >
     SAL_CALL getMembers() throw (css::uno::RuntimeException);
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
+    rtl::Reference< cppuhelper::TypeManager > manager_;
     rtl::OUString name_;
     rtl::Reference< unoidl::ModuleEntity > entity_;
 };
@@ -144,7 +182,7 @@ ModuleDescription::getMembers() throw (css::uno::RuntimeException) {
         css::uno::Sequence<
             css::uno::Reference< css::reflection::XTypeDescription > > s(n);
         for (sal_Int32 i = 0; i != n; ++i) {
-            s[i] = resolve(context_, name_ + "." + names[i]);
+            s[i] = manager_->resolve(name_ + "." + names[i]);
         }
         return s;
     } catch (unoidl::FileFormatException & e) {
@@ -222,12 +260,12 @@ PlainStructTypeDescription_Base;
 class PlainStructTypeDescription: public PlainStructTypeDescription_Base {
 public:
     PlainStructTypeDescription(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
         rtl::OUString const & name,
         rtl::Reference< unoidl::PlainStructTypeEntity > const & entity):
         PlainStructTypeDescription_Base(entity->isPublished()),
-        context_(context), name_(name), entity_(entity)
-    { assert(entity.is()); }
+        manager_(manager), name_(name), entity_(entity)
+    { assert(manager.is()); assert(entity.is()); }
 
 private:
     virtual ~PlainStructTypeDescription() {}
@@ -243,7 +281,7 @@ private:
     getBaseType() throw (css::uno::RuntimeException) {
         return entity_->getDirectBase().isEmpty()
             ? css::uno::Reference< css::reflection::XTypeDescription >()
-            : resolve(context_, entity_->getDirectBase());
+            : manager_->resolve(entity_->getDirectBase());
     }
 
     virtual
@@ -266,7 +304,7 @@ private:
             css::uno::Reference< css::reflection::XTypeDescription > >();
     }
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
+    rtl::Reference< cppuhelper::TypeManager > manager_;
     rtl::OUString name_;
     rtl::Reference< unoidl::PlainStructTypeEntity > entity_;
 };
@@ -279,7 +317,7 @@ PlainStructTypeDescription::getMemberTypes() throw (css::uno::RuntimeException)
     css::uno::Sequence<
         css::uno::Reference< css::reflection::XTypeDescription > > s(n);
     for (sal_Int32 i = 0; i != n; ++i) {
-        s[i] = resolve(context_, entity_->getDirectMembers()[i].type);
+        s[i] = manager_->resolve(entity_->getDirectMembers()[i].type);
     }
     return s;
 }
@@ -297,8 +335,7 @@ css::uno::Sequence< rtl::OUString > PlainStructTypeDescription::getMemberNames()
 }
 
 class ParameterizedMemberTypeDescription:
-    public cppu::WeakImplHelper1< css::reflection::XTypeDescription >,
-    private boost::noncopyable
+    public cppu::WeakImplHelper1< css::reflection::XTypeDescription >
 {
 public:
     explicit ParameterizedMemberTypeDescription(
@@ -328,13 +365,13 @@ class PolymorphicStructTypeTemplateDescription:
 {
 public:
     PolymorphicStructTypeTemplateDescription(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
         rtl::OUString const & name,
         rtl::Reference< unoidl::PolymorphicStructTypeTemplateEntity > const &
             entity):
         PolymorphicStructTypeTemplateDescription_Base(entity->isPublished()),
-        context_(context), name_(name), entity_(entity)
-    { assert(entity.is()); }
+        manager_(manager), name_(name), entity_(entity)
+    { assert(manager.is()); assert(entity.is()); }
 
 private:
     virtual ~PolymorphicStructTypeTemplateDescription() {}
@@ -369,7 +406,7 @@ private:
             css::uno::Reference< css::reflection::XTypeDescription > >();
     }
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
+    rtl::Reference< cppuhelper::TypeManager > manager_;
     rtl::OUString name_;
     rtl::Reference< unoidl::PolymorphicStructTypeTemplateEntity > entity_;
 };
@@ -386,7 +423,7 @@ PolymorphicStructTypeTemplateDescription::getMemberTypes()
         s[i] = entity_->getMembers()[i].parameterized
             ? new ParameterizedMemberTypeDescription(
                 entity_->getMembers()[i].type)
-            : resolve(context_, entity_->getMembers()[i].type);
+            : manager_->resolve(entity_->getMembers()[i].type);
     }
     return s;
 }
@@ -417,6 +454,114 @@ PolymorphicStructTypeTemplateDescription::getTypeParameters()
     return s;
 }
 
+class InstantiatedPolymorphicStructTypeDescription:
+    public cppu::WeakImplHelper1< css::reflection::XStructTypeDescription >
+{
+public:
+    InstantiatedPolymorphicStructTypeDescription(
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
+        rtl::OUString const & name,
+        rtl::Reference< unoidl::PolymorphicStructTypeTemplateEntity > const &
+            entity,
+        std::vector< rtl::OUString > const & arguments):
+        manager_(manager), name_(name), entity_(entity), arguments_(arguments)
+    {
+        assert(manager.is());
+        assert(entity.is());
+        assert(arguments.size() == entity->getTypeParameters().size());
+    }
+
+private:
+    virtual ~InstantiatedPolymorphicStructTypeDescription() {}
+
+    virtual css::uno::TypeClass SAL_CALL getTypeClass()
+        throw (css::uno::RuntimeException)
+    { return css::uno::TypeClass_STRUCT; }
+
+    virtual rtl::OUString SAL_CALL getName() throw (css::uno::RuntimeException)
+    { return name_; }
+
+    virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
+    getBaseType() throw (css::uno::RuntimeException)
+    { return css::uno::Reference< css::reflection::XTypeDescription >(); }
+
+    virtual
+    css::uno::Sequence<
+        css::uno::Reference< css::reflection::XTypeDescription > >
+    SAL_CALL getMemberTypes() throw (css::uno::RuntimeException);
+
+    virtual css::uno::Sequence< rtl::OUString > SAL_CALL getMemberNames()
+        throw (css::uno::RuntimeException);
+
+    virtual css::uno::Sequence< rtl::OUString > SAL_CALL getTypeParameters()
+        throw (css::uno::RuntimeException)
+    { return css::uno::Sequence< rtl::OUString >(); }
+
+    virtual
+    css::uno::Sequence<
+        css::uno::Reference< css::reflection::XTypeDescription > >
+    SAL_CALL getTypeArguments() throw (css::uno::RuntimeException);
+
+    rtl::Reference< cppuhelper::TypeManager > manager_;
+    rtl::OUString name_;
+    rtl::Reference< unoidl::PolymorphicStructTypeTemplateEntity > entity_;
+    std::vector< rtl::OUString > arguments_;
+};
+
+css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > >
+InstantiatedPolymorphicStructTypeDescription::getMemberTypes()
+    throw (css::uno::RuntimeException)
+{
+    assert(entity_->getMembers().size() <= SAL_MAX_INT32);
+    sal_Int32 n = static_cast< sal_Int32 >(entity_->getMembers().size());
+    css::uno::Sequence<
+        css::uno::Reference< css::reflection::XTypeDescription > > s(n);
+    for (sal_Int32 i = 0; i != n; ++i) {
+        rtl::OUString type(entity_->getMembers()[i].type);
+        if (entity_->getMembers()[i].parameterized) {
+            for (std::vector< rtl::OUString >::const_iterator j(
+                     entity_->getTypeParameters().begin());
+                 j != entity_->getTypeParameters().end(); ++j)
+            {
+                if (*j == type) {
+                    type = arguments_[j - entity_->getTypeParameters().begin()];
+                    goto found;
+                }
+            }
+            assert(false); // this cannot happen                         //TODO!
+        found:;
+        }
+        s[i] = manager_->resolve(type);
+    }
+    return s;
+}
+
+css::uno::Sequence< rtl::OUString >
+InstantiatedPolymorphicStructTypeDescription::getMemberNames()
+    throw (css::uno::RuntimeException)
+{
+    assert(entity_->getMembers().size() <= SAL_MAX_INT32);
+    sal_Int32 n = static_cast< sal_Int32 >(entity_->getMembers().size());
+    css::uno::Sequence< rtl::OUString > s(n);
+    for (sal_Int32 i = 0; i != n; ++i) {
+        s[i] = entity_->getMembers()[i].name;
+    }
+    return s;
+}
+css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > >
+InstantiatedPolymorphicStructTypeDescription::getTypeArguments()
+    throw (css::uno::RuntimeException)
+{
+    assert(arguments_.size() <= SAL_MAX_INT32);
+    sal_Int32 n = static_cast< sal_Int32 >(arguments_.size());
+    css::uno::Sequence<
+        css::uno::Reference< css::reflection::XTypeDescription > > s(n);
+    for (sal_Int32 i = 0; i != n; ++i) {
+        s[i] = manager_->resolve(arguments_[i]);
+    }
+    return s;
+}
+
 typedef cppu::ImplInheritanceHelper1<
     PublishableDescription, css::reflection::XCompoundTypeDescription >
 ExceptionTypeDescription_Base;
@@ -424,12 +569,12 @@ ExceptionTypeDescription_Base;
 class ExceptionTypeDescription: public ExceptionTypeDescription_Base {
 public:
     ExceptionTypeDescription(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
         rtl::OUString const & name,
         rtl::Reference< unoidl::ExceptionTypeEntity > const & entity):
-        ExceptionTypeDescription_Base(entity->isPublished()), context_(context),
+        ExceptionTypeDescription_Base(entity->isPublished()), manager_(manager),
         name_(name), entity_(entity)
-    { assert(entity.is()); }
+    { assert(manager.is()); assert(entity.is()); }
 
 private:
     virtual ~ExceptionTypeDescription() {}
@@ -445,7 +590,7 @@ private:
     getBaseType() throw (css::uno::RuntimeException) {
         return entity_->getDirectBase().isEmpty()
             ? css::uno::Reference< css::reflection::XTypeDescription >()
-            : resolve(context_, entity_->getDirectBase());
+            : manager_->resolve(entity_->getDirectBase());
     }
 
     virtual
@@ -456,7 +601,7 @@ private:
     virtual css::uno::Sequence< rtl::OUString > SAL_CALL getMemberNames()
         throw (css::uno::RuntimeException);
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
+    rtl::Reference< cppuhelper::TypeManager > manager_;
     rtl::OUString name_;
     rtl::Reference< unoidl::ExceptionTypeEntity > entity_;
 };
@@ -468,7 +613,7 @@ ExceptionTypeDescription::getMemberTypes() throw (css::uno::RuntimeException) {
     css::uno::Sequence<
         css::uno::Reference< css::reflection::XTypeDescription > > s(n);
     for (sal_Int32 i = 0; i != n; ++i) {
-        s[i] = resolve(context_, entity_->getDirectMembers()[i].type);
+        s[i] = manager_->resolve(entity_->getDirectMembers()[i].type);
     }
     return s;
 }
@@ -485,86 +630,19 @@ css::uno::Sequence< rtl::OUString > ExceptionTypeDescription::getMemberNames()
     return s;
 }
 
-css::uno::Reference< css::reflection::XTypeDescription > resolveTypedefs(
-    css::uno::Reference< css::reflection::XTypeDescription > const & type)
-{
-    css::uno::Reference< css::reflection::XTypeDescription > resolved(type);
-    while (resolved->getTypeClass() == css::uno::TypeClass_TYPEDEF) {
-        resolved
-            = (css::uno::Reference< css::reflection::XIndirectTypeDescription >(
-                   resolved, css::uno::UNO_QUERY_THROW)->
-               getReferencedType());
-    }
-    return resolved;
-}
-
-class BaseOffset: private boost::noncopyable {
-public:
-    BaseOffset(
-        css::uno::Reference< css::reflection::XInterfaceTypeDescription2 >
-            const & description);
-
-    sal_Int32 get() const { return offset_; }
-
-private:
-    void calculateBases(
-        css::uno::Reference< css::reflection::XInterfaceTypeDescription2 >
-            const & description);
-
-    void calculate(
-        css::uno::Reference< css::reflection::XInterfaceTypeDescription2 >
-            const & description);
-
-    std::set< rtl::OUString > set_;
-    sal_Int32 offset_;
-};
-
-BaseOffset::BaseOffset(
-    css::uno::Reference< css::reflection::XInterfaceTypeDescription2 > const &
-        description):
-    offset_(0)
-{
-    calculateBases(description);
-}
-
-void BaseOffset::calculateBases(
-    css::uno::Reference< css::reflection::XInterfaceTypeDescription2 > const &
-        description)
-{
-    css::uno::Sequence<
-        css::uno::Reference < css::reflection::XTypeDescription > > bases(
-            description->getBaseTypes());
-    for (sal_Int32 i = 0; i != bases.getLength(); ++i) {
-        calculate(
-            css::uno::Reference< css::reflection::XInterfaceTypeDescription2 >(
-                resolveTypedefs(bases[i]), css::uno::UNO_QUERY_THROW));
-    }
-}
-
-void BaseOffset::calculate(
-    css::uno::Reference< css::reflection::XInterfaceTypeDescription2 > const &
-        description)
-{
-    if (set_.insert(description->getName()).second) {
-        calculateBases(description);
-        offset_ += description->getMembers().getLength();
-    }
-}
-
 class AttributeDescription:
     public cppu::WeakImplHelper1<
-        css::reflection::XInterfaceAttributeTypeDescription2 >,
-    private boost::noncopyable
+        css::reflection::XInterfaceAttributeTypeDescription2 >
 {
 public:
     AttributeDescription(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
         rtl::OUString const & name,
         unoidl::InterfaceTypeEntity::Attribute const & attribute,
         sal_Int32 position):
-        context_(context), name_(name), attribute_(attribute),
+        manager_(manager), name_(name), attribute_(attribute),
         position_(position)
-    {}
+    { assert(manager.is()); }
 
 private:
     virtual ~AttributeDescription() {}
@@ -588,7 +666,7 @@ private:
 
     virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
     getType() throw (css::uno::RuntimeException)
-    { return resolve(context_, attribute_.type); }
+    { return manager_->resolve(attribute_.type); }
 
     virtual sal_Bool SAL_CALL isBound() throw (css::uno::RuntimeException)
     { return attribute_.bound; }
@@ -603,7 +681,7 @@ private:
         css::uno::Reference< css::reflection::XCompoundTypeDescription > >
     SAL_CALL getSetExceptions() throw (css::uno::RuntimeException);
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
+    rtl::Reference< cppuhelper::TypeManager > manager_;
     rtl::OUString name_;
     unoidl::InterfaceTypeEntity::Attribute attribute_;
     sal_Int32 position_;
@@ -618,7 +696,7 @@ AttributeDescription::getGetExceptions() throw (css::uno::RuntimeException) {
         css::uno::Reference< css::reflection::XCompoundTypeDescription > > s(n);
     for (sal_Int32 i = 0; i != n; ++i) {
         s[i].set(
-            resolve(context_, attribute_.getExceptions[i]),
+            manager_->resolve(attribute_.getExceptions[i]),
             css::uno::UNO_QUERY_THROW);
     }
     return s;
@@ -633,23 +711,22 @@ AttributeDescription::getSetExceptions() throw (css::uno::RuntimeException) {
         css::uno::Reference< css::reflection::XCompoundTypeDescription > > s(n);
     for (sal_Int32 i = 0; i != n; ++i) {
         s[i].set(
-            resolve(context_, attribute_.setExceptions[i]),
+            manager_->resolve(attribute_.setExceptions[i]),
             css::uno::UNO_QUERY_THROW);
     }
     return s;
 }
 
 class MethodParameter:
-    public cppu::WeakImplHelper1< css::reflection::XMethodParameter >,
-    private boost::noncopyable
+    public cppu::WeakImplHelper1< css::reflection::XMethodParameter >
 {
 public:
     MethodParameter(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
         unoidl::InterfaceTypeEntity::Method::Parameter const & parameter,
         sal_Int32 position):
-        context_(context), parameter_(parameter), position_(position)
-    {}
+        manager_(manager), parameter_(parameter), position_(position)
+    { assert(manager.is()); }
 
 private:
     virtual ~MethodParameter() {}
@@ -659,7 +736,7 @@ private:
 
     virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
     getType() throw (css::uno::RuntimeException)
-    { return resolve(context_, parameter_.type); }
+    { return manager_->resolve(parameter_.type); }
 
     virtual sal_Bool SAL_CALL isIn() throw (css::uno::RuntimeException) {
         return
@@ -682,23 +759,22 @@ private:
     virtual sal_Int32 SAL_CALL getPosition() throw (css::uno::RuntimeException)
     { return position_; }
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
+    rtl::Reference< cppuhelper::TypeManager > manager_;
     unoidl::InterfaceTypeEntity::Method::Parameter parameter_;
     sal_Int32 position_;
 };
 
 class MethodDescription:
     public cppu::WeakImplHelper1<
-        css::reflection::XInterfaceMethodTypeDescription >,
-    private boost::noncopyable
+        css::reflection::XInterfaceMethodTypeDescription >
 {
 public:
     MethodDescription(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
         rtl::OUString const & name,
         unoidl::InterfaceTypeEntity::Method const & method, sal_Int32 position):
-        context_(context), name_(name), method_(method), position_(position)
-    {}
+        manager_(manager), name_(name), method_(method), position_(position)
+    { assert(manager.is()); }
 
 private:
     virtual ~MethodDescription() {}
@@ -719,7 +795,7 @@ private:
 
     virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
     getReturnType() throw (css::uno::RuntimeException)
-    { return resolve(context_, method_.returnType); }
+    { return manager_->resolve(method_.returnType); }
 
     virtual sal_Bool SAL_CALL isOneway() throw (css::uno::RuntimeException)
     { return false; }
@@ -734,7 +810,7 @@ private:
         css::uno::Reference< css::reflection::XTypeDescription > >
     SAL_CALL getExceptions() throw (css::uno::RuntimeException);
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
+    rtl::Reference< cppuhelper::TypeManager > manager_;
     rtl::OUString name_;
     unoidl::InterfaceTypeEntity::Method method_;
     sal_Int32 position_;
@@ -747,7 +823,7 @@ MethodDescription::getParameters() throw (css::uno::RuntimeException) {
     css::uno::Sequence<
         css::uno::Reference< css::reflection::XMethodParameter > > s(n);
     for (sal_Int32 i = 0; i != n; ++i) {
-        s[i] = new MethodParameter(context_, method_.parameters[i], i);
+        s[i] = new MethodParameter(manager_, method_.parameters[i], i);
     }
     return s;
 }
@@ -759,11 +835,65 @@ MethodDescription::getExceptions() throw (css::uno::RuntimeException) {
     css::uno::Sequence<
         css::uno::Reference< css::reflection::XTypeDescription > > s(n);
     for (sal_Int32 i = 0; i != n; ++i) {
-        s[i] = resolve(context_, method_.exceptions[i]);
+        s[i] = manager_->resolve(method_.exceptions[i]);
     }
     return s;
 }
 
+class BaseOffset: private boost::noncopyable {
+public:
+    BaseOffset(
+        css::uno::Reference< css::reflection::XInterfaceTypeDescription2 >
+            const & description);
+
+    sal_Int32 get() const { return offset_; }
+
+private:
+    void calculateBases(
+        css::uno::Reference< css::reflection::XInterfaceTypeDescription2 >
+            const & description);
+
+    void calculate(
+        css::uno::Reference< css::reflection::XInterfaceTypeDescription2 >
+            const & description);
+
+    std::set< rtl::OUString > set_;
+    sal_Int32 offset_;
+};
+
+BaseOffset::BaseOffset(
+    css::uno::Reference< css::reflection::XInterfaceTypeDescription2 > const &
+        description):
+    offset_(0)
+{
+    calculateBases(description);
+}
+
+void BaseOffset::calculateBases(
+    css::uno::Reference< css::reflection::XInterfaceTypeDescription2 > const &
+        description)
+{
+    css::uno::Sequence<
+        css::uno::Reference < css::reflection::XTypeDescription > > bases(
+            description->getBaseTypes());
+    for (sal_Int32 i = 0; i != bases.getLength(); ++i) {
+        calculate(
+            css::uno::Reference< css::reflection::XInterfaceTypeDescription2 >(
+                resolveTypedefs(css::uno::makeAny(bases[i])),
+                css::uno::UNO_QUERY_THROW));
+    }
+}
+
+void BaseOffset::calculate(
+    css::uno::Reference< css::reflection::XInterfaceTypeDescription2 > const &
+        description)
+{
+    if (set_.insert(description->getName()).second) {
+        calculateBases(description);
+        offset_ += description->getMembers().getLength();
+    }
+}
+
 typedef cppu::ImplInheritanceHelper1<
     PublishableDescription, css::reflection::XInterfaceTypeDescription2 >
 InterfaceTypeDescription_Base;
@@ -771,12 +901,12 @@ InterfaceTypeDescription_Base;
 class InterfaceTypeDescription: public InterfaceTypeDescription_Base {
 public:
     InterfaceTypeDescription(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
         rtl::OUString const & name,
         rtl::Reference< unoidl::InterfaceTypeEntity > const & entity):
-        InterfaceTypeDescription_Base(entity->isPublished()), context_(context),
+        InterfaceTypeDescription_Base(entity->isPublished()), manager_(manager),
         name_(name), entity_(entity)
-    { assert(entity.is()); }
+    { assert(manager.is()); assert(entity.is()); }
 
 private:
     virtual ~InterfaceTypeDescription() {}
@@ -792,7 +922,7 @@ private:
     getBaseType() throw (css::uno::RuntimeException) {
         return entity_->getDirectMandatoryBases().empty()
             ? css::uno::Reference< css::reflection::XTypeDescription >()
-            : resolve(context_, entity_->getDirectMandatoryBases()[0]);
+            : manager_->resolve(entity_->getDirectMandatoryBases()[0]);
     }
 
     virtual css::uno::Uik SAL_CALL getUik() throw (css::uno::RuntimeException)
@@ -814,7 +944,7 @@ private:
         css::uno::Reference< css::reflection::XTypeDescription > >
     SAL_CALL getOptionalBaseTypes() throw (css::uno::RuntimeException);
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
+    rtl::Reference< cppuhelper::TypeManager > manager_;
     rtl::OUString name_;
     rtl::Reference< unoidl::InterfaceTypeEntity > entity_;
 };
@@ -835,12 +965,12 @@ InterfaceTypeDescription::getMembers() throw (css::uno::RuntimeException) {
     sal_Int32 off = BaseOffset(this).get();
     for (sal_Int32 i = 0; i != n1; ++i) {
         s[i] = new AttributeDescription(
-            context_, name_ + "::" + entity_->getDirectAttributes()[i].name,
+            manager_, name_ + "::" + entity_->getDirectAttributes()[i].name,
             entity_->getDirectAttributes()[i], off + i);
     }
     for (sal_Int32 i = 0; i != n2; ++i) {
         s[n1 + i] = new MethodDescription(
-            context_, name_ + "::" + entity_->getDirectMethods()[i].name,
+            manager_, name_ + "::" + entity_->getDirectMethods()[i].name,
             entity_->getDirectMethods()[i], off + n1 + i);
     }
     return s;
@@ -854,7 +984,7 @@ InterfaceTypeDescription::getBaseTypes() throw (css::uno::RuntimeException) {
     css::uno::Sequence<
         css::uno::Reference< css::reflection::XTypeDescription > > s(n);
     for (sal_Int32 i = 0; i != n; ++i) {
-        s[i] = resolve(context_, entity_->getDirectMandatoryBases()[i]);
+        s[i] = manager_->resolve(entity_->getDirectMandatoryBases()[i]);
     }
     return s;
 }
@@ -869,20 +999,17 @@ InterfaceTypeDescription::getOptionalBaseTypes()
     css::uno::Sequence<
         css::uno::Reference< css::reflection::XTypeDescription > > s(n);
     for (sal_Int32 i = 0; i != n; ++i) {
-        s[i] = resolve(context_, entity_->getDirectOptionalBases()[i]);
+        s[i] = manager_->resolve(entity_->getDirectOptionalBases()[i]);
     }
     return s;
 }
 
 class ConstantDescription:
-    public cppu::WeakImplHelper1< css::reflection::XConstantTypeDescription >,
-    private boost::noncopyable
+    public cppu::WeakImplHelper1< css::reflection::XConstantTypeDescription >
 {
 public:
-    ConstantDescription(
-        rtl::OUString const & name, css::uno::Any const & value):
-        name_(name), value_(value)
-    {}
+    explicit ConstantDescription(
+        unoidl::ConstantGroupEntity::Member const & member);
 
 private:
     virtual ~ConstantDescription() {}
@@ -902,6 +1029,46 @@ private:
     css::uno::Any value_;
 };
 
+ConstantDescription::ConstantDescription(
+    unoidl::ConstantGroupEntity::Member const & member):
+    name_(member.name)
+{
+    switch (member.value.type) {
+    case unoidl::ConstantValue::TYPE_BOOLEAN:
+        value_ <<= member.value.booleanValue;
+        break;
+    case unoidl::ConstantValue::TYPE_BYTE:
+        value_ <<= member.value.byteValue;
+        break;
+    case unoidl::ConstantValue::TYPE_SHORT:
+        value_ <<= member.value.shortValue;
+        break;
+    case unoidl::ConstantValue::TYPE_UNSIGNED_SHORT:
+        value_ <<= member.value.unsignedShortValue;
+        break;
+    case unoidl::ConstantValue::TYPE_LONG:
+        value_ <<= member.value.longValue;
+        break;
+    case unoidl::ConstantValue::TYPE_UNSIGNED_LONG:
+        value_ <<= member.value.unsignedLongValue;
+        break;
+    case unoidl::ConstantValue::TYPE_HYPER:
+        value_ <<= member.value.hyperValue;
+        break;
+    case unoidl::ConstantValue::TYPE_UNSIGNED_HYPER:
+        value_ <<= member.value.unsignedHyperValue;
+        break;
+    case unoidl::ConstantValue::TYPE_FLOAT:
+        value_ <<= member.value.floatValue;
+        break;
+    case unoidl::ConstantValue::TYPE_DOUBLE:
+        value_ <<= member.value.doubleValue;
+        break;
+    default:
+        for (;;) { std::abort(); } // this cannot happen
+    }
+}
+
 typedef cppu::ImplInheritanceHelper1<
     PublishableDescription, css::reflection::XConstantsTypeDescription >
 ConstantGroupDescription_Base;
@@ -909,11 +1076,10 @@ ConstantGroupDescription_Base;
 class ConstantGroupDescription: public ConstantGroupDescription_Base {
 public:
     ConstantGroupDescription(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
         rtl::OUString const & name,
         rtl::Reference< unoidl::ConstantGroupEntity > const & entity):
-        ConstantGroupDescription_Base(entity->isPublished()), context_(context),
-        name_(name), entity_(entity)
+        ConstantGroupDescription_Base(entity->isPublished()), name_(name),
+        entity_(entity)
     { assert(entity.is()); }
 
 private:
@@ -931,7 +1097,6 @@ private:
         css::uno::Reference< css::reflection::XConstantTypeDescription > >
     SAL_CALL getConstants() throw (css::uno::RuntimeException);
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
     rtl::OUString name_;
     rtl::Reference< unoidl::ConstantGroupEntity > entity_;
 };
@@ -944,10 +1109,7 @@ ConstantGroupDescription::getConstants() throw (css::uno::RuntimeException) {
     css::uno::Sequence<
         css::uno::Reference< css::reflection::XConstantTypeDescription > > s(n);
     for (sal_Int32 i = 0; i != n; ++i) {
-        //TODO: use entity_->getMembers()[i].value directly?
-        s[i].set(
-            resolve(context_, name_ + "." + entity_->getMembers()[i].name),
-            css::uno::UNO_QUERY_THROW);
+        s[i] = new ConstantDescription(entity_->getMembers()[i]);
     }
     return s;
 }
@@ -959,12 +1121,12 @@ TypedefDescription_Base;
 class TypedefDescription: public TypedefDescription_Base {
 public:
     TypedefDescription(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
         rtl::OUString const & name,
         rtl::Reference< unoidl::TypedefEntity > const & entity):
-        TypedefDescription_Base(entity->isPublished()), context_(context),
+        TypedefDescription_Base(entity->isPublished()), manager_(manager),
         name_(name), entity_(entity)
-    { assert(entity.is()); }
+    { assert(manager.is()); assert(entity.is()); }
 
 private:
     virtual ~TypedefDescription() {}
@@ -978,25 +1140,24 @@ private:
 
     virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
     getReferencedType() throw (css::uno::RuntimeException)
-    { return resolve(context_, entity_->getType()); }
+    { return manager_->resolve(entity_->getType()); }
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
+    rtl::Reference< cppuhelper::TypeManager > manager_;
     rtl::OUString name_;
     rtl::Reference< unoidl::TypedefEntity > entity_;
 };
 
 class ConstructorParameter:
-    public cppu::WeakImplHelper1< css::reflection::XParameter >,
-    private boost::noncopyable
+    public cppu::WeakImplHelper1< css::reflection::XParameter >
 {
 public:
     ConstructorParameter(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
         unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter
             const & parameter,
         sal_Int32 position):
-        context_(context), parameter_(parameter), position_(position)
-    {}
+        manager_(manager), parameter_(parameter), position_(position)
+    { assert(manager.is()); }
 
 private:
     virtual ~ConstructorParameter() {}
@@ -1006,7 +1167,7 @@ private:
 
     virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
     getType() throw (css::uno::RuntimeException)
-    { return resolve(context_, parameter_.type); }
+    { return manager_->resolve(parameter_.type); }
 
     virtual sal_Bool SAL_CALL isIn() throw (css::uno::RuntimeException)
     { return true; }
@@ -1021,7 +1182,7 @@ private:
         throw (css::uno::RuntimeException)
     { return parameter_.rest; }
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
+    rtl::Reference< cppuhelper::TypeManager > manager_;
     unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter
         parameter_;
     sal_Int32 position_;
@@ -1029,16 +1190,15 @@ private:
 
 class ConstructorDescription:
     public cppu::WeakImplHelper1<
-        css::reflection::XServiceConstructorDescription >,
-    private boost::noncopyable
+        css::reflection::XServiceConstructorDescription >
 {
 public:
     ConstructorDescription(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
         unoidl::SingleInterfaceBasedServiceEntity::Constructor const &
             constructor):
-        context_(context), constructor_(constructor)
-    {}
+        manager_(manager), constructor_(constructor)
+    { assert(manager.is()); }
 
 private:
     virtual ~ConstructorDescription() {}
@@ -1060,7 +1220,7 @@ private:
         css::uno::Reference< css::reflection::XCompoundTypeDescription > >
     SAL_CALL getExceptions() throw (css::uno::RuntimeException);
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
+    rtl::Reference< cppuhelper::TypeManager > manager_;
     unoidl::SingleInterfaceBasedServiceEntity::Constructor constructor_;
 };
 
@@ -1072,7 +1232,7 @@ ConstructorDescription::getParameters() throw (css::uno::RuntimeException) {
         n);
     for (sal_Int32 i = 0; i != n; ++i) {
         s[i] = new ConstructorParameter(
-            context_, constructor_.parameters[i], i);
+            manager_, constructor_.parameters[i], i);
     }
     return s;
 }
@@ -1086,7 +1246,7 @@ ConstructorDescription::getExceptions() throw (css::uno::RuntimeException) {
         css::uno::Reference< css::reflection::XCompoundTypeDescription > > s(n);
     for (sal_Int32 i = 0; i != n; ++i) {
         s[i].set(
-            resolve(context_, constructor_.exceptions[i]),
+            manager_->resolve(constructor_.exceptions[i]),
             css::uno::UNO_QUERY_THROW);
     }
     return s;
@@ -1101,13 +1261,13 @@ class SingleInterfaceBasedServiceDescription:
 {
 public:
     SingleInterfaceBasedServiceDescription(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
         rtl::OUString const & name,
         rtl::Reference< unoidl::SingleInterfaceBasedServiceEntity > const &
             entity):
         SingleInterfaceBasedServiceDescription_Base(entity->isPublished()),
-        context_(context), name_(name), entity_(entity)
-    { assert(entity.is()); }
+        manager_(manager), name_(name), entity_(entity)
+    { assert(manager.is()); assert(entity.is()); }
 
 private:
     virtual ~SingleInterfaceBasedServiceDescription() {}
@@ -1173,14 +1333,14 @@ private:
 
     virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
     getInterface() throw (css::uno::RuntimeException)
-    { return resolve(context_, entity_->getBase()); }
+    { return manager_->resolve(entity_->getBase()); }
 
     virtual
     css::uno::Sequence<
         css::uno::Reference< css::reflection::XServiceConstructorDescription > >
     SAL_CALL getConstructors() throw (css::uno::RuntimeException);
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
+    rtl::Reference< cppuhelper::TypeManager > manager_;
     rtl::OUString name_;
     rtl::Reference< unoidl::SingleInterfaceBasedServiceEntity > entity_;
 };
@@ -1197,21 +1357,20 @@ SingleInterfaceBasedServiceDescription::getConstructors()
             s(n);
     for (sal_Int32 i = 0; i != n; ++i) {
         s[i] = new ConstructorDescription(
-            context_, entity_->getConstructors()[i]);
+            manager_, entity_->getConstructors()[i]);
     }
     return s;
 }
 
 class PropertyDescription:
-    public cppu::WeakImplHelper1< css::reflection::XPropertyTypeDescription >,
-    private boost::noncopyable
+    public cppu::WeakImplHelper1< css::reflection::XPropertyTypeDescription >
 {
 public:
     PropertyDescription(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
         unoidl::AccumulationBasedServiceEntity::Property const & property):
-        context_(context), property_(property)
-    {}
+        manager_(manager), property_(property)
+    { assert(manager.is()); }
 
 private:
     virtual ~PropertyDescription() {}
@@ -1229,9 +1388,9 @@ private:
 
     virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
     getPropertyTypeDescription() throw (css::uno::RuntimeException)
-    { return resolve(context_, property_.type); }
+    { return manager_->resolve(property_.type); }
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
+    rtl::Reference< cppuhelper::TypeManager > manager_;
     unoidl::AccumulationBasedServiceEntity::Property property_;
 };
 
@@ -1244,13 +1403,13 @@ class AccumulationBasedServiceDescription:
 {
 public:
     AccumulationBasedServiceDescription(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
         rtl::OUString const & name,
         rtl::Reference< unoidl::AccumulationBasedServiceEntity > const &
             entity):
         AccumulationBasedServiceDescription_Base(entity->isPublished()),
-        context_(context), name_(name), entity_(entity)
-    { assert(entity.is()); }
+        manager_(manager), name_(name), entity_(entity)
+    { assert(manager.is()); assert(entity.is()); }
 
 private:
     virtual ~AccumulationBasedServiceDescription() {}
@@ -1305,7 +1464,7 @@ private:
                 css::reflection::XServiceConstructorDescription > >();
     }
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
+    rtl::Reference< cppuhelper::TypeManager > manager_;
     rtl::OUString name_;
     rtl::Reference< unoidl::AccumulationBasedServiceEntity > entity_;
 };
@@ -1322,7 +1481,7 @@ AccumulationBasedServiceDescription::getMandatoryServices()
         css::uno::Reference< css::reflection::XServiceTypeDescription > > s(n);
     for (sal_Int32 i = 0; i != n; ++i) {
         s[i].set(
-            resolve(context_, entity_->getDirectMandatoryBaseServices()[i]),
+            manager_->resolve(entity_->getDirectMandatoryBaseServices()[i]),
             css::uno::UNO_QUERY_THROW);
     }
     return s;
@@ -1340,7 +1499,7 @@ AccumulationBasedServiceDescription::getOptionalServices()
         css::uno::Reference< css::reflection::XServiceTypeDescription > > s(n);
     for (sal_Int32 i = 0; i != n; ++i) {
         s[i].set(
-            resolve(context_, entity_->getDirectOptionalBaseServices()[i]),
+            manager_->resolve(entity_->getDirectOptionalBaseServices()[i]),
             css::uno::UNO_QUERY_THROW);
     }
     return s;
@@ -1360,8 +1519,8 @@ AccumulationBasedServiceDescription::getMandatoryInterfaces()
     for (sal_Int32 i = 0; i != n; ++i) {
         s[i].set(
             resolveTypedefs(
-                resolve(
-                    context_, entity_->getDirectMandatoryBaseInterfaces()[i])),
+                manager_->find(
+                    entity_->getDirectMandatoryBaseInterfaces()[i])),
             css::uno::UNO_QUERY_THROW);
     }
     return s;
@@ -1381,8 +1540,8 @@ AccumulationBasedServiceDescription::getOptionalInterfaces()
     for (sal_Int32 i = 0; i != n; ++i) {
         s[i].set(
             resolveTypedefs(
-                resolve(
-                    context_, entity_->getDirectOptionalBaseInterfaces()[i])),
+                manager_->find(
+                    entity_->getDirectOptionalBaseInterfaces()[i])),
             css::uno::UNO_QUERY_THROW);
     }
     return s;
@@ -1400,7 +1559,7 @@ AccumulationBasedServiceDescription::getProperties()
         css::uno::Reference< css::reflection::XPropertyTypeDescription > > s(n);
     for (sal_Int32 i = 0; i != n; ++i) {
         s[i] = new PropertyDescription(
-            context_, entity_->getDirectProperties()[i]);
+            manager_, entity_->getDirectProperties()[i]);
     }
     return s;
 }
@@ -1414,12 +1573,12 @@ class InterfaceBasedSingletonDescription:
 {
 public:
     InterfaceBasedSingletonDescription(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
         rtl::OUString const & name,
         rtl::Reference< unoidl::InterfaceBasedSingletonEntity > const & entity):
         InterfaceBasedSingletonDescription_Base(entity->isPublished()),
-        context_(context), name_(name), entity_(entity)
-    { assert(entity.is()); }
+        manager_(manager), name_(name), entity_(entity)
+    { assert(manager.is()); assert(entity.is()); }
 
 private:
     virtual ~InterfaceBasedSingletonDescription() {}
@@ -1444,9 +1603,9 @@ private:
 
     virtual css::uno::Reference< css::reflection::XTypeDescription >
     SAL_CALL getInterface() throw (css::uno::RuntimeException)
-    { return resolve(context_, entity_->getBase()); }
+    { return manager_->resolve(entity_->getBase()); }
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
+    rtl::Reference< cppuhelper::TypeManager > manager_;
     rtl::OUString name_;
     rtl::Reference< unoidl::InterfaceBasedSingletonEntity > entity_;
 };
@@ -1460,12 +1619,12 @@ class ServiceBasedSingletonDescription:
 {
 public:
     ServiceBasedSingletonDescription(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
         rtl::OUString const & name,
         rtl::Reference< unoidl::ServiceBasedSingletonEntity > const & entity):
         ServiceBasedSingletonDescription_Base(entity_->isPublished()),
-        context_(context), name_(name), entity_(entity)
-    { assert(entity.is()); }
+        manager_(manager), name_(name), entity_(entity)
+    { assert(manager.is()); assert(entity.is()); }
 
 private:
     virtual ~ServiceBasedSingletonDescription() {}
@@ -1481,7 +1640,7 @@ private:
     SAL_CALL getService() throw (css::uno::RuntimeException)
     {
         return css::uno::Reference< css::reflection::XServiceTypeDescription >(
-            resolve(context_, entity_->getBase()), css::uno::UNO_QUERY_THROW);
+            manager_->resolve(entity_->getBase()), css::uno::UNO_QUERY_THROW);
     }
 
     virtual sal_Bool SAL_CALL isInterfaceBased()
@@ -1492,24 +1651,23 @@ private:
     SAL_CALL getInterface() throw (css::uno::RuntimeException)
     { return css::uno::Reference< css::reflection::XTypeDescription >(); }
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
+    rtl::Reference< cppuhelper::TypeManager > manager_;
     rtl::OUString name_;
     rtl::Reference< unoidl::ServiceBasedSingletonEntity > entity_;
 };
 
 class Enumeration:
-    public cppu::WeakImplHelper1<
-        css::reflection::XTypeDescriptionEnumeration >,
-    private boost::noncopyable
+    public cppu::WeakImplHelper1< css::reflection::XTypeDescriptionEnumeration >
 {
 public:
     Enumeration(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
+        rtl::Reference< cppuhelper::TypeManager > const & manager,
         rtl::OUString const & prefix,
         rtl::Reference< unoidl::MapCursor > const & cursor,
         css::uno::Sequence< css::uno::TypeClass > const & types, bool deep):
-        context_(context), types_(types), deep_(deep)
+        manager_(manager), types_(types), deep_(deep)
     {
+        assert(manager.is());
         positions_.push(Position(prefix, cursor));
         findNextMatch();
     }
@@ -1558,7 +1716,7 @@ private:
             constantGroupIndex;
     };
 
-    css::uno::Reference< css::uno::XComponentContext > context_;
+    rtl::Reference< cppuhelper::TypeManager > manager_;
     css::uno::Sequence< css::uno::TypeClass > types_;
     bool deep_;
 
@@ -1582,7 +1740,7 @@ Enumeration::nextTypeDescription()
         name = current_;
         findNextMatch();
     }
-    return resolve(context_, name);
+    return manager_->resolve(name);
 }
 
 bool Enumeration::matches(css::uno::TypeClass tc) const {
@@ -1688,324 +1846,259 @@ void Enumeration::findNextMatch() {
     }
 }
 
-typedef cppu::WeakComponentImplHelper2<
-    css::container::XHierarchicalNameAccess,
-    css::reflection::XTypeDescriptionEnumerationAccess >
-Provider_Base;
+}
 
-class Provider:
-    private osl::Mutex, public Provider_Base, private boost::noncopyable
+cppuhelper::TypeManager::TypeManager(rtl::OUString const & rdbUris):
+    TypeManager_Base(*static_cast< osl::Mutex * >(this)),
+    manager_(new unoidl::Manager)
 {
-public:
-    // throws unoidl::FileFormatException, unoidl::NoSuchFileException:
-    Provider(
-        css::uno::Reference< css::uno::XComponentContext > const & context,
-        rtl::OUString const & uri):
-        Provider_Base(*static_cast< osl::Mutex * >(this)), context_(context),
-        provider_(new unoidl::UnoidlProvider(uri))
-    {}
-
-    using Provider_Base::acquire;
-    using Provider_Base::release;
-
-private:
-    virtual ~Provider() {}
-
-    virtual void SAL_CALL disposing() {} //TODO
-
-    virtual css::uno::Any SAL_CALL getByHierarchicalName(
-        rtl::OUString const & aName)
-        throw (
-            css::container::NoSuchElementException, css::uno::RuntimeException);
-
-    virtual sal_Bool SAL_CALL hasByHierarchicalName(
-        rtl::OUString const & aName) throw (css::uno::RuntimeException);
-
-    virtual css::uno::Reference< css::reflection::XTypeDescriptionEnumeration >
-    SAL_CALL createTypeDescriptionEnumeration(
-        rtl::OUString const & moduleName,
-        css::uno::Sequence< css::uno::TypeClass > const & types,
-        css::reflection::TypeDescriptionSearchDepth depth)
-        throw(
-            css::reflection::NoSuchTypeNameException,
-            css::reflection::InvalidTypeNameException,
-            css::uno::RuntimeException);
-
-    css::uno::Reference< css::uno::XComponentContext > context_;
-    rtl::Reference< unoidl::UnoidlProvider > provider_;
-};
+    readRdbs(rdbUris);
+}
 
-css::uno::Any Provider::getByHierarchicalName(rtl::OUString const & aName)
-    throw (css::container::NoSuchElementException, css::uno::RuntimeException)
-{
-    try {
-        bool cnst;
-        sal_uInt32 off = provider_->find(aName, &cnst);
-        if (off == 0) {
-            throw css::container::NoSuchElementException(
-                aName, static_cast< cppu::OWeakObject * >(this));
-        }
-        if (cnst) {
-            unoidl::ConstantValue val1(provider_->getConstant(off));
-            css::uno::Any val2;
-            switch (val1.type) {
-            case unoidl::ConstantValue::TYPE_BOOLEAN:
-                val2 <<= val1.booleanValue;
-                break;
-            case unoidl::ConstantValue::TYPE_BYTE:
-                val2 <<= val1.byteValue;
-                break;
-            case unoidl::ConstantValue::TYPE_SHORT:
-                val2 <<= val1.shortValue;
-                break;
-            case unoidl::ConstantValue::TYPE_UNSIGNED_SHORT:
-                val2 <<= val1.unsignedShortValue;
-                break;
-            case unoidl::ConstantValue::TYPE_LONG:
-                val2 <<= val1.longValue;
-                break;
-            case unoidl::ConstantValue::TYPE_UNSIGNED_LONG:
-                val2 <<= val1.unsignedLongValue;
-                break;
-            case unoidl::ConstantValue::TYPE_HYPER:
-                val2 <<= val1.hyperValue;
-                break;
-            case unoidl::ConstantValue::TYPE_UNSIGNED_HYPER:
-                val2 <<= val1.unsignedHyperValue;
-                break;
-            case unoidl::ConstantValue::TYPE_FLOAT:
-                val2 <<= val1.floatValue;
-                break;
-            case unoidl::ConstantValue::TYPE_DOUBLE:
-                val2 <<= val1.doubleValue;
-                break;
-            default:
-                for (;;) { std::abort(); } // this cannot happen
-            }
+css::uno::Any cppuhelper::TypeManager::find(rtl::OUString const & name) {
+    //TODO: caching? (here or in unoidl::Manager?)
+    struct Simple {
+        char const * name; sal_Int32 length;
+        css::uno::TypeClass typeClass;
+    };
+    static Simple const simple[] = {
+        { RTL_CONSTASCII_STRINGPARAM("void"), css::uno::TypeClass_VOID },
+        { RTL_CONSTASCII_STRINGPARAM("boolean"), css::uno::TypeClass_BOOLEAN },
+        { RTL_CONSTASCII_STRINGPARAM("byte"), css::uno::TypeClass_BYTE },
+        { RTL_CONSTASCII_STRINGPARAM("short"), css::uno::TypeClass_SHORT },
+        { RTL_CONSTASCII_STRINGPARAM("unsigned short"),
+          css::uno::TypeClass_UNSIGNED_SHORT },
+        { RTL_CONSTASCII_STRINGPARAM("long"), css::uno::TypeClass_LONG },
+        { RTL_CONSTASCII_STRINGPARAM("unsigned long"),
+          css::uno::TypeClass_UNSIGNED_LONG },
+        { RTL_CONSTASCII_STRINGPARAM("hyper"), css::uno::TypeClass_HYPER },
+        { RTL_CONSTASCII_STRINGPARAM("unsigned hyper"),
+          css::uno::TypeClass_UNSIGNED_HYPER },
+        { RTL_CONSTASCII_STRINGPARAM("float"), css::uno::TypeClass_FLOAT },
+        { RTL_CONSTASCII_STRINGPARAM("double"), css::uno::TypeClass_DOUBLE },
+        { RTL_CONSTASCII_STRINGPARAM("char"), css::uno::TypeClass_CHAR },
+        { RTL_CONSTASCII_STRINGPARAM("string"), css::uno::TypeClass_STRING },
+        { RTL_CONSTASCII_STRINGPARAM("type"), css::uno::TypeClass_TYPE },
+        { RTL_CONSTASCII_STRINGPARAM("any"), css::uno::TypeClass_ANY } };
+    for (std::size_t i = 0; i != SAL_N_ELEMENTS(simple); ++i) {
+        if (name.equalsAsciiL(simple[i].name, simple[i].length)) {
             return css::uno::makeAny<
                 css::uno::Reference< css::reflection::XTypeDescription > >(
-                    new ConstantDescription(aName, val2));
-        } else {
-            rtl::Reference< unoidl::Entity > ent(provider_->getEntity(off));
+                    new SimpleTypeDescription(simple[i].typeClass, name));
+        }
+    }
+    if (name.match("[]")) {
+        return getSequenceType(name);
+    }
+    sal_Int32 i = name.indexOf('<');
+    if (i != -1) {
+        return getInstantiatedStruct(name, i);
+    }
+    i = name.indexOf("::");
+    if (i != -1) {
+        return getInterfaceMember(name, i);
+    }
+    rtl::Reference< unoidl::Entity > ent(findEntity(name));
+    if (ent.is()) {
+        return getNamed(name, ent);
+    }
+    i = name.lastIndexOf('.');
+    if (i != -1) {
+        ent = findEntity(name.copy(0, i));
+        if (ent.is()) {
             switch (ent->getSort()) {
-            case unoidl::Entity::SORT_MODULE:
-                return css::uno::makeAny<
-                    css::uno::Reference< css::reflection::XTypeDescription > >(
-                        new ModuleDescription(
-                            context_, aName,
-                            static_cast< unoidl::ModuleEntity * >(ent.get())));
             case unoidl::Entity::SORT_ENUM_TYPE:
-                return css::uno::makeAny<
-                    css::uno::Reference< css::reflection::XTypeDescription > >(
-                        new EnumTypeDescription(
-                            aName,
-                            static_cast< unoidl::EnumTypeEntity * >(
-                                ent.get())));
-            case unoidl::Entity::SORT_PLAIN_STRUCT_TYPE:
-                return css::uno::makeAny<
-                    css::uno::Reference< css::reflection::XTypeDescription > >(
-                        new PlainStructTypeDescription(
-                            context_, aName,
-                            static_cast< unoidl::PlainStructTypeEntity * >(
-                                ent.get())));
-            case unoidl::Entity::SORT_POLYMORPHIC_STRUCT_TYPE_TEMPLATE:
-                return css::uno::makeAny<
-                    css::uno::Reference< css::reflection::XTypeDescription > >(
-                        new PolymorphicStructTypeTemplateDescription(
-                            context_, aName,
-                            static_cast<
-                                unoidl::PolymorphicStructTypeTemplateEntity * >(
-                                    ent.get())));
-            case unoidl::Entity::SORT_EXCEPTION_TYPE:
-                return css::uno::makeAny<
-                    css::uno::Reference< css::reflection::XTypeDescription > >(
-                        new ExceptionTypeDescription(
-                            context_, aName,
-                            static_cast< unoidl::ExceptionTypeEntity * >(
-                                ent.get())));
-            case unoidl::Entity::SORT_INTERFACE_TYPE:
-                return css::uno::makeAny<
-                    css::uno::Reference< css::reflection::XTypeDescription > >(
-                        new InterfaceTypeDescription(
-                            context_, aName,
-                            static_cast< unoidl::InterfaceTypeEntity * >(
-                                ent.get())));
-            case unoidl::Entity::SORT_TYPEDEF:
-                return css::uno::makeAny<
-                    css::uno::Reference< css::reflection::XTypeDescription > >(
-                        new TypedefDescription(
-                            context_, aName,
-                            static_cast< unoidl::TypedefEntity * >(ent.get())));
+                return getEnumMember(
+                    static_cast< unoidl::EnumTypeEntity * >(ent.get()),
+                    name.copy(i + 1));
             case unoidl::Entity::SORT_CONSTANT_GROUP:
-                return css::uno::makeAny<
-                    css::uno::Reference< css::reflection::XTypeDescription > >(
-                        new ConstantGroupDescription(
-                            context_, aName,
-                            static_cast< unoidl::ConstantGroupEntity * >(
-                                ent.get())));
-            case unoidl::Entity::SORT_SINGLE_INTERFACE_BASED_SERVICE:
-                return css::uno::makeAny<
-                    css::uno::Reference< css::reflection::XTypeDescription > >(
-                        new SingleInterfaceBasedServiceDescription(
-                            context_, aName,
-                            static_cast<
-                                unoidl::SingleInterfaceBasedServiceEntity * >(
-                                    ent.get())));
-            case unoidl::Entity::SORT_ACCUMULATION_BASED_SERVICE:
-                return css::uno::makeAny<
-                    css::uno::Reference< css::reflection::XTypeDescription > >(
-                        new AccumulationBasedServiceDescription(
-                            context_, aName,
-                            static_cast<
-                                unoidl::AccumulationBasedServiceEntity * >(
-                                    ent.get())));
-            case unoidl::Entity::SORT_INTERFACE_BASED_SINGLETON:
-                return css::uno::makeAny<
-                    css::uno::Reference< css::reflection::XTypeDescription > >(
-                        new InterfaceBasedSingletonDescription(
-                            context_, aName,
-                            static_cast<
-                                unoidl::InterfaceBasedSingletonEntity * >(
-                                    ent.get())));
-            case unoidl::Entity::SORT_SERVICE_BASED_SINGLETON:
-                return css::uno::makeAny<
-                    css::uno::Reference< css::reflection::XTypeDescription > >(
-                        new ServiceBasedSingletonDescription(
-                            context_, aName,
-                            static_cast<
-                                unoidl::ServiceBasedSingletonEntity * >(
-                                    ent.get())));
+                return getConstant(
+                    static_cast< unoidl::ConstantGroupEntity * >(ent.get()),
+                    name.copy(i + 1));
             default:
-                for (;;) { std::abort(); } // this cannot happen
+                break;
             }
         }
-    } catch (unoidl::FileFormatException & e) {
+    }
+    return css::uno::Any();
+}
+
+css::uno::Reference< css::reflection::XTypeDescription >
+cppuhelper::TypeManager::resolve(rtl::OUString const & name) {
+    css::uno::Reference< css::reflection::XTypeDescription > desc(
+        find(name), css::uno::UNO_QUERY);
+    if (!desc.is()) {
         throw css::uno::DeploymentException(
-            e.getUri() + ": " + e.getDetail(),
+            "cannot resolve type \"" + name + "\"",
             static_cast< cppu::OWeakObject * >(this));
     }
+    return desc;
 }
 
-sal_Bool Provider::hasByHierarchicalName(
-    rtl::OUString const & aName) throw (css::uno::RuntimeException)
+cppuhelper::TypeManager::~TypeManager() throw () {}
+
+void cppuhelper::TypeManager::disposing() {} //TODO
+
+rtl::OUString cppuhelper::TypeManager::getImplementationName()
+    throw (css::uno::RuntimeException)
 {
-    try {
-        return provider_->find(aName) != 0;
-    } catch (unoidl::FileFormatException & e) {
-        throw css::uno::DeploymentException(
-            e.getUri() + ": " + e.getDetail(),
-            static_cast< cppu::OWeakObject * >(this));
+    return rtl::OUString(
+        "com.sun.star.comp.cppuhelper.bootstrap.TypeManager");
+}
+
+sal_Bool cppuhelper::TypeManager::supportsService(
+    rtl::OUString const & ServiceName)
+    throw (css::uno::RuntimeException)
+{
+    return cppu::supportsService(this, ServiceName);
+}
+
+css::uno::Sequence< rtl::OUString >
+cppuhelper::TypeManager::getSupportedServiceNames()
+    throw (css::uno::RuntimeException)
+{
+    css::uno::Sequence< rtl::OUString > names(1);
+    names[0] = "com.sun.star.reflection.TypeDescriptionManager"; //TODO
+    return names;
+}
+
+css::uno::Any cppuhelper::TypeManager::getByHierarchicalName(
+    rtl::OUString const & aName)
+    throw (css::container::NoSuchElementException, css::uno::RuntimeException)
+{
+    css::uno::Any desc(find(aName));
+    if (!desc.hasValue()) {
+        throw css::container::NoSuchElementException(
+            aName, static_cast< cppu::OWeakObject * >(this));
     }
+    return desc;
+}
+
+sal_Bool cppuhelper::TypeManager::hasByHierarchicalName(
+    rtl::OUString const & aName)
+    throw (css::uno::RuntimeException)
+{
+    return find(aName).hasValue();
+}
+
+css::uno::Type cppuhelper::TypeManager::getElementType()
+    throw (css::uno::RuntimeException)
+{
+    return cppu::UnoType< rtl::OUString >::get();
+}
+
+sal_Bool cppuhelper::TypeManager::hasElements()
+    throw (css::uno::RuntimeException)
+{
+    throw css::uno::RuntimeException(
+        "TypeManager hasElements: method not supported",
+        static_cast< cppu::OWeakObject * >(this));
+}
+
+css::uno::Reference< css::container::XEnumeration >
+cppuhelper::TypeManager::createEnumeration()
+    throw (css::uno::RuntimeException)
+{
+    throw css::uno::RuntimeException(
+        "TypeManager createEnumeration: method not supported",
+        static_cast< cppu::OWeakObject * >(this));
+}
+
+sal_Bool cppuhelper::TypeManager::has(css::uno::Any const &)
+    throw (css::uno::RuntimeException)
+{
+    throw css::uno::RuntimeException(
+        "TypeManager has: method not supported",
+        static_cast< cppu::OWeakObject * >(this));
+}
+
+void cppuhelper::TypeManager::insert(css::uno::Any const & aElement)
+    throw (
+        css::lang::IllegalArgumentException,
+        css::container::ElementExistException, css::uno::RuntimeException)
+{
+    rtl::OUString uri;
+    if (!(aElement >>= uri)) {
+        throw css::lang::IllegalArgumentException(
+            ("css.uno.theTypeDescriptionManager.insert expects a string URI"
+             " argument"),
+            static_cast< cppu::OWeakObject * >(this), 0);
+    }
+    //TODO: check for ElementExistException
+    //TODO: check for consistency with existing data
+    readRdbFile(uri, false);
+}
+
+void cppuhelper::TypeManager::remove(css::uno::Any const & aElement)
+    throw (
+        css::lang::IllegalArgumentException,
+        css::container::NoSuchElementException, css::uno::RuntimeException)
+{
+    rtl::OUString uri;
+    if (!(aElement >>= uri)) {
+        throw css::lang::IllegalArgumentException(
+            ("css.uno.theTypeDescriptionManager.remove expects a string URI"
+             " argument"),
+            static_cast< cppu::OWeakObject * >(this), 0);
+    }
+    //TODO: remove requests are silently ignored for now
 }
 
 css::uno::Reference< css::reflection::XTypeDescriptionEnumeration >
-Provider::createTypeDescriptionEnumeration(
+cppuhelper::TypeManager::createTypeDescriptionEnumeration(
     rtl::OUString const & moduleName,
     css::uno::Sequence< css::uno::TypeClass > const & types,
     css::reflection::TypeDescriptionSearchDepth depth)
-    throw(
+    throw (
         css::reflection::NoSuchTypeNameException,
-        css::reflection::InvalidTypeNameException, css::uno::RuntimeException)
+        css::reflection::InvalidTypeNameException,
+        css::uno::RuntimeException)
 {
+    //TODO: This fails for modules spread across multiple providers, esp. for
+    // the empty moduleName
+    rtl::Reference< unoidl::Entity > ent(findEntity(moduleName));
+    if (!ent.is()) {
+        throw css::reflection::NoSuchTypeNameException(
+            moduleName, static_cast< cppu::OWeakObject * >(this));
+    }
+    if (ent->getSort() != unoidl::Entity::SORT_MODULE) {
+        throw css::reflection::InvalidTypeNameException(
+            moduleName, static_cast< cppu::OWeakObject * >(this));
+    }
+    rtl::Reference< unoidl::MapCursor > cursor;
     try {
-        rtl::OUString prefix;
-        rtl::Reference< unoidl::MapCursor > cursor;
-        if (moduleName.isEmpty()) {
-            cursor = provider_->createRootCursor();
-        } else {
-            prefix = moduleName + ".";
-            bool cnst;
-            sal_uInt32 off = provider_->find(moduleName, &cnst);
-            if (off == 0) {
-                throw css::reflection::NoSuchTypeNameException(
-                    moduleName, static_cast< cppu::OWeakObject * >(this));
-            }
-            if (cnst) {
-                throw css::reflection::InvalidTypeNameException(
-                    moduleName, static_cast< cppu::OWeakObject * >(this));
-            }
-            rtl::Reference< unoidl::Entity > ent(provider_->getEntity(off));
-            if (ent->getSort() != unoidl::Entity::SORT_MODULE) {
-                throw css::reflection::InvalidTypeNameException(
-                    moduleName, static_cast< cppu::OWeakObject * >(this));
-            }
-            cursor = static_cast< unoidl::ModuleEntity * >(ent.get())->
-                createCursor();
-        }
-        return new Enumeration(
-            context_, prefix, cursor, types,
-            depth == css::reflection::TypeDescriptionSearchDepth_INFINITE);
+        cursor = static_cast< unoidl::ModuleEntity * >(ent.get())->
+            createCursor();
     } catch (unoidl::FileFormatException & e) {
         throw css::uno::DeploymentException(
-            e.getUri() + ": " + e.getDetail(),
+            ("unoidl::FileFormatException for <" + e.getUri() + ">: "
+             + e.getDetail()),
             static_cast< cppu::OWeakObject * >(this));
     }
+    return new Enumeration(
+        this, moduleName + ".", cursor, types,
+        depth == css::reflection::TypeDescriptionSearchDepth_INFINITE);
 }
 
-css::uno::Reference< css::container::XHierarchicalNameAccess >
-readLegacyRdbFile(
-    rtl::OUString const & uri,
-    css::uno::Reference< css::lang::XMultiComponentFactory > const &
-        serviceManager,
-    css::uno::Reference< css::uno::XComponentContext > const & context)
-{
-    assert(serviceManager.is());
-    css::uno::Reference< css::registry::XSimpleRegistry > reg(
-        serviceManager->createInstanceWithContext(
-            "com.sun.star.comp.stoc.SimpleRegistry", context),
-        css::uno::UNO_QUERY_THROW);
-    try {
-        reg->open(uri, true, false);
-    } catch (css::registry::InvalidRegistryException & e) {
-        throw css::uno::DeploymentException(
-            "Invalid registry " + uri + ":" + e.Message,
-            css::uno::Reference< css::uno::XInterface >());
-    }
-    css::uno::Sequence< css::uno::Any > arg(1);
-    arg[0] <<= reg;
-    return css::uno::Reference< css::container::XHierarchicalNameAccess >(
-        serviceManager->createInstanceWithArgumentsAndContext(
-            "com.sun.star.comp.stoc.RegistryTypeDescriptionProvider", arg,
-            context),
-        css::uno::UNO_QUERY_THROW);
-}
-
-void readRdbFile(
-    rtl::OUString const & uri, bool optional,
-    css::uno::Reference< css::lang::XMultiComponentFactory > const &
-        serviceManager,
-    css::uno::Reference< css::uno::XComponentContext > const & context,
-    std::vector<
-        css::uno::Reference< css::container::XHierarchicalNameAccess > > *
-            providers)
-{
-    assert(providers != 0);
-    css::uno::Reference< css::container::XHierarchicalNameAccess > prov;
-    try {
-        prov = new Provider(context, uri);
-    } catch (unoidl::NoSuchFileException &) {
-        if (optional) {
-            SAL_INFO("cppuhelper", "Ignored optional " << uri);
-            return;
+void cppuhelper::TypeManager::readRdbs(rtl::OUString const & uris) {
+    for (sal_Int32 i = 0; i != -1;) {
+        rtl::OUString uri(uris.getToken(0, ' ', i));
+        if (uri.isEmpty()) {
+            continue;
+        }
+        bool optional;
+        bool directory;
+        cppu::decodeRdbUri(&uri, &optional, &directory);
+        if (directory) {
+            readRdbDirectory(uri, optional);
+        } else {
+            readRdbFile(uri, optional);
         }
-        throw css::uno::DeploymentException(
-            uri + ": no such file",
-            css::uno::Reference< css::uno::XInterface >());
-    } catch (unoidl::FileFormatException &) {
-        prov = readLegacyRdbFile(uri, serviceManager, context);
     }
-    assert(prov.is());
-    providers->push_back(prov);
 }
 
-void readRdbDirectory(
-    rtl::OUString const & uri, bool optional,
-    css::uno::Reference< css::lang::XMultiComponentFactory > const &
-        serviceManager,
-    css::uno::Reference< css::uno::XComponentContext > const & context,
-    std::vector<
-        css::uno::Reference< css::container::XHierarchicalNameAccess > > *
-            providers)
+void cppuhelper::TypeManager::readRdbDirectory(
+    rtl::OUString const & uri, bool optional)
 {
     osl::Directory dir(uri);
     switch (dir.open()) {
@@ -2020,54 +2113,258 @@ void readRdbDirectory(
     default:
         throw css::uno::DeploymentException(
             "Cannot open directory " + uri,
-            css::uno::Reference< css::uno::XInterface >());
+            static_cast< cppu::OWeakObject * >(this));
     }
     for (;;) {
-        rtl::OUString fileUri;
-        if (!cppu::nextDirectoryItem(dir, &fileUri)) {
+        rtl::OUString url;
+        if (!cppu::nextDirectoryItem(dir, &url)) {
             break;
         }
-        readRdbFile(fileUri, optional, serviceManager, context, providers);
+        readRdbFile(url, false);
     }
 }
 
+void cppuhelper::TypeManager::readRdbFile(
+    rtl::OUString const & uri, bool optional)
+{
+    rtl::Reference< unoidl::Provider > prov;
+    try {
+        prov = unoidl::loadProvider(manager_, uri);
+    } catch (unoidl::NoSuchFileException &) {
+        if (!optional) {
+            throw css::uno::DeploymentException(
+                uri + ": no such file",
+                static_cast< cppu::OWeakObject * >(this));
+        }
+        SAL_INFO("cppuhelper", "Ignored optional " << uri);
+    } catch (unoidl::FileFormatException & e) {
+            throw css::uno::DeploymentException(
+                ("unoidl::FileFormatException for <" + e.getUri() + ">: "
+                 + e.getDetail()),
+                static_cast< cppu::OWeakObject * >(this));
+    }
+    manager_->addProvider(prov);
 }
 
-css::uno::Sequence<
-    css::uno::Reference< css::container::XHierarchicalNameAccess > >
-cppuhelper::createTypeDescriptionProviders(
-    rtl::OUString const & uris,
-    css::uno::Reference< css::lang::XMultiComponentFactory > const &
-        serviceManager,
-    css::uno::Reference< css::uno::XComponentContext > const & context)
-{
-    std::vector<
-        css::uno::Reference< css::container::XHierarchicalNameAccess > > provs;
-    for (sal_Int32 i = 0; i != -1;) {
-        rtl::OUString uri(uris.getToken(0, ' ', i));
-        if (uri.isEmpty()) {
-            continue;
+css::uno::Any cppuhelper::TypeManager::getSequenceType(
+    rtl::OUString const & name)
+{
+    assert(name.match("[]"));
+    return css::uno::makeAny<
+        css::uno::Reference< css::reflection::XTypeDescription > >(
+            new SequenceTypeDescription(
+                this, name, name.copy(std::strlen("[]"))));
+}
+
+css::uno::Any cppuhelper::TypeManager::getInstantiatedStruct(
+    rtl::OUString const & name, sal_Int32 separator)
+{
+    assert(name.indexOf('<') == separator && separator != -1);
+    rtl::Reference< unoidl::Entity > ent(findEntity(name.copy(0, separator)));
+    if (!ent.is()
+        || (ent->getSort()
+            != unoidl::Entity::SORT_POLYMORPHIC_STRUCT_TYPE_TEMPLATE))
+    {
+        return css::uno::Any();
+    }
+    rtl::Reference< unoidl::PolymorphicStructTypeTemplateEntity > ent2(
+        static_cast< unoidl::PolymorphicStructTypeTemplateEntity * >(
+            ent.get()));
+    std::vector< rtl::OUString > args;
+    sal_Int32 i = separator;
+    do {
+        ++i; // skip '<' or ','
+        sal_Int32 j = i;
+        for (sal_Int32 level = 0; j != name.getLength(); ++j) {
+            sal_Unicode c = name[j];
+            if (c == ',') {
+                if (level == 0) {
+                    break;
+                }
+            } else if (c == '<') {
+                ++level;
+            } else if (c == '>') {
+                if (level == 0) {
+                    break;
+                }
+                --level;
+            }
         }
-        bool optional;
-        bool directory;
-        cppu::decodeRdbUri(&uri, &optional, &directory);
-        if (directory) {
-            readRdbDirectory(uri, optional, serviceManager, context, &provs);
-        } else {
-            readRdbFile(uri, optional, serviceManager, context, &provs);
+        if (j != name.getLength()) {
+            args.push_back(name.copy(i, j - i));
         }
+        i = j;
+    } while (i != name.getLength() && name[i] != '>');
+    if (i != name.getLength() - 1 || name[i] != '>'
+        || args.size() != ent2->getTypeParameters().size())
+    {
+        return css::uno::Any();
     }
+    return css::uno::makeAny<
+        css::uno::Reference< css::reflection::XTypeDescription > >(
+            new InstantiatedPolymorphicStructTypeDescription(
+                this, name, ent2, args));
+}
+
+css::uno::Any cppuhelper::TypeManager::getInterfaceMember(
+    rtl::OUString const & name, sal_Int32 separator)
+{
+    assert(name.indexOf("::") == separator && separator != -1);
+    css::uno::Reference< css::reflection::XInterfaceTypeDescription2 > ifc(
+        resolveTypedefs(find(name.copy(0, separator))), css::uno::UNO_QUERY);
+    if (!ifc.is()) {
+        return css::uno::Any();
+    }
+    rtl::OUString member(name.copy(separator + std::strlen("::")));
     css::uno::Sequence<
-        css::uno::Reference< css::container::XHierarchicalNameAccess > > provs2(
-            static_cast< sal_Int32 >(provs.size())); //TODO: check overflow
-    std::vector<
         css::uno::Reference<
-            css::container::XHierarchicalNameAccess > >::iterator i(
-                provs.begin());
-    for (sal_Int32 j = 0; j != provs2.getLength(); ++j) {
-        provs2[j] = *i++;
+            css::reflection::XInterfaceMemberTypeDescription > > mems(
+                ifc->getMembers());
+    for (sal_Int32 i = 0; i != mems.getLength(); ++i) {
+        if (mems[i]->getMemberName() == member) {
+            return css::uno::makeAny<
+                css::uno::Reference< css::reflection::XTypeDescription > >(
+                    mems[i].get());
+        }
+    }
+    return css::uno::Any();
+}
+
+css::uno::Any cppuhelper::TypeManager::getNamed(
+    rtl::OUString const & name, rtl::Reference< unoidl::Entity > entity)
+{
+    assert(entity.is());
+    switch (entity->getSort()) {
+    case unoidl::Entity::SORT_MODULE:
+        return css::uno::makeAny<
+            css::uno::Reference< css::reflection::XTypeDescription > >(
+                new ModuleDescription(
+                    this, name,
+                    static_cast< unoidl::ModuleEntity * >(entity.get())));
+    case unoidl::Entity::SORT_ENUM_TYPE:
+        return css::uno::makeAny<
+            css::uno::Reference< css::reflection::XTypeDescription > >(
+                new EnumTypeDescription(
+                    name,
+                    static_cast< unoidl::EnumTypeEntity * >(entity.get())));
+    case unoidl::Entity::SORT_PLAIN_STRUCT_TYPE:
+        return css::uno::makeAny<
+            css::uno::Reference< css::reflection::XTypeDescription > >(
+                new PlainStructTypeDescription(
+                    this, name,
+                    static_cast< unoidl::PlainStructTypeEntity * >(
+                        entity.get())));
+    case unoidl::Entity::SORT_POLYMORPHIC_STRUCT_TYPE_TEMPLATE:
+        return css::uno::makeAny<
+            css::uno::Reference< css::reflection::XTypeDescription > >(
+                new PolymorphicStructTypeTemplateDescription(
+                    this, name,
+                    static_cast<
+                        unoidl::PolymorphicStructTypeTemplateEntity * >(
+                            entity.get())));
+    case unoidl::Entity::SORT_EXCEPTION_TYPE:
+        return css::uno::makeAny<
+            css::uno::Reference< css::reflection::XTypeDescription > >(
+                new ExceptionTypeDescription(
+                    this, name,
+                    static_cast< unoidl::ExceptionTypeEntity * >(
+                        entity.get())));
+    case unoidl::Entity::SORT_INTERFACE_TYPE:
+        return css::uno::makeAny<
+            css::uno::Reference< css::reflection::XTypeDescription > >(
+                new InterfaceTypeDescription(
+                    this, name,
+                    static_cast< unoidl::InterfaceTypeEntity * >(
+                        entity.get())));
+    case unoidl::Entity::SORT_TYPEDEF:
+        return css::uno::makeAny<
+            css::uno::Reference< css::reflection::XTypeDescription > >(
+                new TypedefDescription(
+                    this, name,
+                    static_cast< unoidl::TypedefEntity * >(entity.get())));
+    case unoidl::Entity::SORT_CONSTANT_GROUP:
+        return css::uno::makeAny<
+            css::uno::Reference< css::reflection::XTypeDescription > >(
+                new ConstantGroupDescription(
+                    name,
+                    static_cast< unoidl::ConstantGroupEntity * >(
+                        entity.get())));
+    case unoidl::Entity::SORT_SINGLE_INTERFACE_BASED_SERVICE:
+        return css::uno::makeAny<
+            css::uno::Reference< css::reflection::XTypeDescription > >(
+                new SingleInterfaceBasedServiceDescription(
+                    this, name,
+                    static_cast< unoidl::SingleInterfaceBasedServiceEntity * >(
+                        entity.get())));
+    case unoidl::Entity::SORT_ACCUMULATION_BASED_SERVICE:
+        return css::uno::makeAny<
+            css::uno::Reference< css::reflection::XTypeDescription > >(
+                new AccumulationBasedServiceDescription(
+                    this, name,
+                    static_cast< unoidl::AccumulationBasedServiceEntity * >(
+                        entity.get())));
+    case unoidl::Entity::SORT_INTERFACE_BASED_SINGLETON:
+        return css::uno::makeAny<
+            css::uno::Reference< css::reflection::XTypeDescription > >(
+                new InterfaceBasedSingletonDescription(
+                    this, name,
+                    static_cast< unoidl::InterfaceBasedSingletonEntity * >(
+                        entity.get())));
+    case unoidl::Entity::SORT_SERVICE_BASED_SINGLETON:
+        return css::uno::makeAny<
+            css::uno::Reference< css::reflection::XTypeDescription > >(
+                new ServiceBasedSingletonDescription(
+                    this, name,
+                    static_cast< unoidl::ServiceBasedSingletonEntity * >(
+                        entity.get())));
+    default:
+        for (;;) { std::abort(); } // this cannot happen
+    }
+}
+
+css::uno::Any cppuhelper::TypeManager::getEnumMember(
+    rtl::Reference< unoidl::EnumTypeEntity > entity,
+    rtl::OUString const & member)
+{
+    for (std::vector< unoidl::EnumTypeEntity::Member >::const_iterator i(
+             entity->getMembers().begin());
+         i != entity->getMembers().end(); ++i)
+    {
+        if (i->name == member) {
+            return css::uno::makeAny(i->value);
+        }
+    }
+    return css::uno::Any();
+}
+
+css::uno::Any cppuhelper::TypeManager::getConstant(
+    rtl::Reference< unoidl::ConstantGroupEntity > entity,
+    rtl::OUString const & member)
+{
+    for (std::vector< unoidl::ConstantGroupEntity::Member >::const_iterator i(
+             entity->getMembers().begin());
+         i != entity->getMembers().end(); ++i)
+    {
+        if (i->name == member) {
+            return css::uno::makeAny<
+                css::uno::Reference< css::reflection::XTypeDescription > >(
+                    new ConstantDescription(*i));
+        }
+    }
+    return css::uno::Any();
+}
+
+rtl::Reference< unoidl::Entity > cppuhelper::TypeManager::findEntity(
+    rtl::OUString const & name)
+{
+    try {
+        return manager_->findEntity(name);
+    } catch (unoidl::FileFormatException & e) {
+        throw css::uno::DeploymentException(
+            ("unoidl::FileFormatException for <" + e.getUri() + ">: "
+             + e.getDetail()),
+            static_cast< cppu::OWeakObject * >(this));
     }
-    return provs2;
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cppuhelper/source/typemanager.hxx b/cppuhelper/source/typemanager.hxx
new file mode 100644
index 0000000..a84a231
--- /dev/null
+++ b/cppuhelper/source/typemanager.hxx
@@ -0,0 +1,151 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_CPPUHELPER_SOURCE_TYPEMANAGER_HXX
+#define INCLUDED_CPPUHELPER_SOURCE_TYPEMANAGER_HXX
+
+#include "sal/config.h"
+
+#include "com/sun/star/container/ElementExistException.hpp"
+#include "com/sun/star/container/NoSuchElementException.hpp"
+#include "com/sun/star/container/XHierarchicalNameAccess.hpp"
+#include "com/sun/star/container/XSet.hpp"
+#include "com/sun/star/lang/IllegalArgumentException.hpp"
+#include "com/sun/star/lang/XServiceInfo.hpp"
+#include "com/sun/star/reflection/InvalidTypeNameException.hpp"
+#include "com/sun/star/reflection/NoSuchTypeNameException.hpp"
+#include "com/sun/star/reflection/TypeDescriptionSearchDepth.hpp"
+#include "com/sun/star/reflection/XTypeDescriptionEnumerationAccess.hpp"
+#include "com/sun/star/uno/Reference.hxx"
+#include "com/sun/star/uno/RuntimeException.hpp"
+#include "com/sun/star/uno/Sequence.hxx"
+#include "cppuhelper/compbase4.hxx"
+#include "osl/mutex.hxx"
+#include "rtl/ref.hxx"
+#include "sal/types.h"
+
+namespace com { namespace sun { namespace star {
+    namespace uno { class Any; }
+    namespace reflection { class XTypeDescription; }
+} } }
+namespace rtl { class OUString; }
+namespace unoidl {
+    class ConstantGroupEntity;
+    class Entity;
+    class EnumTypeEntity;
+    class Manager;
+}
+
+namespace cppuhelper {
+
+typedef cppu::WeakComponentImplHelper4<
+    css::lang::XServiceInfo, css::container::XHierarchicalNameAccess,
+    css::container::XSet, css::reflection::XTypeDescriptionEnumerationAccess >
+TypeManager_Base;
+
+class TypeManager: private osl::Mutex, public TypeManager_Base {
+public:
+    explicit TypeManager(rtl::OUString const & rdbUris);
+
+    using TypeManager_Base::acquire;
+    using TypeManager_Base::release;
+
+    css::uno::Any find(rtl::OUString const & name);
+
+    css::uno::Reference< css::reflection::XTypeDescription > resolve(
+        rtl::OUString const & name);
+
+private:
+    virtual ~TypeManager() throw ();
+
+    virtual void SAL_CALL disposing();
+
+    virtual rtl::OUString SAL_CALL getImplementationName()
+        throw (css::uno::RuntimeException);
+
+    virtual sal_Bool SAL_CALL supportsService(rtl::OUString const & ServiceName)
+        throw (css::uno::RuntimeException);
+
+    virtual css::uno::Sequence< rtl::OUString > SAL_CALL
+    getSupportedServiceNames() throw (css::uno::RuntimeException);
+
+    virtual css::uno::Any SAL_CALL getByHierarchicalName(
+        rtl::OUString const & aName)
+        throw (
+            css::container::NoSuchElementException, css::uno::RuntimeException);
+
+    virtual sal_Bool SAL_CALL hasByHierarchicalName(rtl::OUString const & aName)
+        throw (css::uno::RuntimeException);
+
+    virtual css::uno::Type SAL_CALL getElementType()
+        throw (css::uno::RuntimeException);
+
+    virtual sal_Bool SAL_CALL hasElements() throw (css::uno::RuntimeException);
+
+    virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL
+    createEnumeration() throw (css::uno::RuntimeException);
+
+    virtual sal_Bool SAL_CALL has(css::uno::Any const & aElement)
+        throw (css::uno::RuntimeException);
+
+    virtual void SAL_CALL insert(css::uno::Any const & aElement)
+        throw (
+            css::lang::IllegalArgumentException,
+            css::container::ElementExistException, css::uno::RuntimeException);
+
+    virtual void SAL_CALL remove(css::uno::Any const & aElement)
+        throw (
+            css::lang::IllegalArgumentException,
+            css::container::NoSuchElementException, css::uno::RuntimeException);
+
+    virtual css::uno::Reference< css::reflection::XTypeDescriptionEnumeration >
+    SAL_CALL createTypeDescriptionEnumeration(
+        rtl::OUString const & moduleName,
+        css::uno::Sequence< css::uno::TypeClass > const & types,
+        css::reflection::TypeDescriptionSearchDepth depth)
+        throw (
+            css::reflection::NoSuchTypeNameException,
+            css::reflection::InvalidTypeNameException,
+            css::uno::RuntimeException);
+
+    void readRdbs(rtl::OUString const & uris);
+
+    void readRdbDirectory(rtl::OUString const & uri, bool optional);
+
+    void readRdbFile(rtl::OUString const & uri, bool optional);
+
+    css::uno::Any getSequenceType(rtl::OUString const & name);
+
+    css::uno::Any getInstantiatedStruct(
+        rtl::OUString const & name, sal_Int32 separator);
+
+    css::uno::Any getInterfaceMember(
+        rtl::OUString const & name, sal_Int32 separator);
+
+    css::uno::Any getNamed(
+        rtl::OUString const & name, rtl::Reference< unoidl::Entity > entity);
+
+    css::uno::Any getEnumMember(
+        rtl::Reference< unoidl::EnumTypeEntity > entity,
+        rtl::OUString const & member);
+
+    css::uno::Any getConstant(
+        rtl::Reference< unoidl::ConstantGroupEntity > entity,
+        rtl::OUString const & member);
+
+    rtl::Reference< unoidl::Entity > findEntity(rtl::OUString const & name);
+
+    rtl::Reference< unoidl::Manager > manager_;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/desktop/source/deployment/registry/component/dp_component.cxx b/desktop/source/deployment/registry/component/dp_component.cxx
index e72aa32..66cfd4b 100644
--- a/desktop/source/deployment/registry/component/dp_component.cxx
+++ b/desktop/source/deployment/registry/component/dp_component.cxx
@@ -35,7 +35,6 @@
 #include "svl/inettype.hxx"
 #include "com/sun/star/lang/WrappedTargetRuntimeException.hpp"
 #include "com/sun/star/container/XNameContainer.hpp"
-#include "com/sun/star/container/XHierarchicalNameAccess.hpp"
 #include "com/sun/star/container/XSet.hpp"
 #include "com/sun/star/registry/XSimpleRegistry.hpp"
 #include "com/sun/star/registry/XImplementationRegistration.hpp"
@@ -183,7 +182,6 @@ class BackendImpl : public ::dp_registry::backend::PackageRegistryBackend
         BackendImpl * getMyBackend() const;
 
         const bool m_jarFile;
-        Reference<container::XHierarchicalNameAccess> m_xTDprov;
 
         virtual void SAL_CALL disposing();
 
@@ -400,7 +398,6 @@ void BackendImpl::ComponentPackageImpl::disposing()
 //______________________________________________________________________________
 void BackendImpl::TypelibraryPackageImpl::disposing()
 {
-    m_xTDprov.clear();
     Package::disposing();
 }
 
@@ -1532,37 +1529,12 @@ void BackendImpl::TypelibraryPackageImpl::processPackage_(
         }
         else // RDB:
         {
-            Reference<XComponentContext> const & xContext =
-                that->getComponentContext();
-            if (! m_xTDprov.is())
-            {
-                m_xTDprov.set( that->getObject( url ), UNO_QUERY );
-                if (! m_xTDprov.is())
-                {
-                    const Reference<registry::XSimpleRegistry> xReg(
-                        xContext->getServiceManager()
-                        ->createInstanceWithContext("com.sun.star.registry.SimpleRegistry",
-                            xContext ), UNO_QUERY_THROW );
-                    xReg->open( expandUnoRcUrl(url),
-                                true /* read-only */, false /* ! create */ );
-                    const Any arg(xReg);
-                    Reference<container::XHierarchicalNameAccess> xTDprov(
-                        xContext->getServiceManager()
-                        ->createInstanceWithArgumentsAndContext(
-                            "com.sun.star.comp.stoc.RegistryTypeDescriptionProvider",
-                            Sequence<Any>( &arg, 1 ), xContext ), UNO_QUERY );
-                    OSL_ASSERT( xTDprov.is() );
-                    if (xTDprov.is())
-                        m_xTDprov.set( that->insertObject( url, xTDprov ),
-                                       UNO_QUERY_THROW );
-                }
-            }
-            if (m_xTDprov.is()) {
-                Reference<container::XSet> xSet(
-                    xContext->getValueByName( "/singletons/com.sun.star.reflection.theTypeDescriptionManager" ),
-                    UNO_QUERY_THROW );
-                xSet->insert( Any(m_xTDprov) );
-            }
+            css::uno::Reference< css::container::XSet >(
+                that->getComponentContext()->getValueByName(
+                    "/singletons"
+                    "/com.sun.star.reflection.theTypeDescriptionManager"),
+                css::uno::UNO_QUERY_THROW)->insert(
+                    css::uno::makeAny(expandUnoRcUrl(url)));
         }
 
         that->addToUnoRc( m_jarFile ? RCITEM_JAR_TYPELIB : RCITEM_RDB_TYPELIB,
@@ -1574,18 +1546,13 @@ void BackendImpl::TypelibraryPackageImpl::processPackage_(
             m_jarFile ? RCITEM_JAR_TYPELIB : RCITEM_RDB_TYPELIB, url, xCmdEnv );
 
         // revoking types at runtime, possible, sensible?
-        if (!m_xTDprov.is())
-            m_xTDprov.set( that->getObject( url ), UNO_QUERY );
-        if (m_xTDprov.is()) {
-            // remove live:
-            const Reference<container::XSet> xSet(
+        if (!m_jarFile) {

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list