Allow OServiceManagerWrapper to wrap all service manager implementations

...not just OServiceManager.  (This is a prerequisite to replace the
defaultBootstrap_initialComponentContext() implementation with a more performant
component context/service manager combo.)

The only reason for the restriction to OServiceManager apparently was the
additional createContentEnumeration overload with an XComponentContext
parameter.  It /looks/ to me like this is not really necessary, that it should
always be OK to instantiate implementation factories with this service manager
and its component context, instead of a component context (and its default
service manager) passed into a method call.  This would mean that the code could
be simplified further, needing a component context passed into a method only to
pass along to a new instance created via
createInstanceWith[ArgumentsAnd]Context, but then again I'm not 100% sure and
better leave it at that...

This also means that XUnoTunnel is gone from OServiceManager and XInitialization
is gone from OServiceManagerWrapper.
diff --git a/stoc/source/servicemanager/servicemanager.cxx b/stoc/source/servicemanager/servicemanager.cxx
index 8cc4fba..55ee0d9 100644
--- a/stoc/source/servicemanager/servicemanager.cxx
+++ b/stoc/source/servicemanager/servicemanager.cxx
@@ -40,15 +40,14 @@
#include <cppuhelper/component.hxx>
#include <cppuhelper/factory.hxx>
#include <cppuhelper/implbase1.hxx>
#include <cppuhelper/typeprovider.hxx>
#include <cppuhelper/implementationentry.hxx>
#include <rtl/unload.h>
#include <cppuhelper/component_context.hxx>
#include <cppuhelper/bootstrap.hxx>
#include <cppuhelper/compbase8.hxx>
#include <cppuhelper/compbase6.hxx>
#include <cppuhelper/compbase7.hxx>


#include <com/sun/star/lang/XUnoTunnel.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/lang/XMultiComponentFactory.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
@@ -136,21 +135,6 @@ OUString regsmgr_getImplementationName()

namespace stoc_smgr
{
static Sequence< sal_Int8 > smgr_getImplementationId()
{
    static OImplementationId * s_pId = 0;
    if (! s_pId)
    {
        MutexGuard aGuard( Mutex::getGlobalMutex() );
        if (! s_pId)
        {
            static OImplementationId s_aId;
            s_pId = &s_aId;
        }
    }
    return s_pId->getImplementationId();
}


static Sequence< OUString > retrieveAsciiValueList(
    const Reference< XSimpleRegistry > &xReg, const OUString &keyName )
@@ -466,9 +450,9 @@ struct OServiceManagerMutex

extern "C" void SAL_CALL smgrUnloadingListener(void* id);

typedef WeakComponentImplHelper8<
typedef WeakComponentImplHelper7<
    lang::XMultiServiceFactory, lang::XMultiComponentFactory, lang::XServiceInfo,
    lang::XInitialization, lang::XUnoTunnel,
    lang::XInitialization,
    container::XSet, container::XContentEnumerationAccess,
    beans::XPropertySet > t_OServiceManager_impl;

@@ -482,10 +466,6 @@ public:
    OServiceManager( Reference< XComponentContext > const & xContext );
    virtual ~OServiceManager();

    // XUnoTunnel
    sal_Int64 SAL_CALL getSomething( Sequence< sal_Int8 > const & id )
        throw (RuntimeException);

    // XInitialization
    void SAL_CALL initialize( Sequence< Any > const & args )
        throw (Exception);
@@ -533,9 +513,6 @@ public:
    // XContentEnumerationAccess
    //Sequence< OUString >          getAvailableServiceNames() throw( (Exception) );
    virtual Reference<XEnumeration > SAL_CALL createContentEnumeration(const OUString& aServiceName) throw(::com::sun::star::uno::RuntimeException);
    virtual Reference<XEnumeration > SAL_CALL createContentEnumeration(
        const OUString& aServiceName, Reference< XComponentContext > const & xContext )
        throw(::com::sun::star::uno::RuntimeException);

    // XComponent
    virtual void SAL_CALL dispose() throw(::com::sun::star::uno::RuntimeException);
@@ -616,13 +593,18 @@ inline void OServiceManager::check_undisposed() const
//##################################################################################################
//##################################################################################################

class OServiceManagerWrapper : public OServiceManagerMutex, public t_OServiceManager_impl
typedef WeakComponentImplHelper6<
    lang::XMultiServiceFactory, lang::XMultiComponentFactory, lang::XServiceInfo,
    container::XSet, container::XContentEnumerationAccess,
    beans::XPropertySet > t_OServiceManagerWrapper_impl;

class OServiceManagerWrapper : public OServiceManagerMutex, public t_OServiceManagerWrapper_impl
{
    Reference< XComponentContext > m_xContext;
    OServiceManager * m_root;
    inline OServiceManager * getRoot() SAL_THROW( (RuntimeException) )
    Reference< XMultiComponentFactory > m_root;
    inline Reference< XMultiComponentFactory > getRoot() SAL_THROW( (RuntimeException) )
    {
        if (! m_root)
        if (! m_root.is())
        {
            throw lang::DisposedException(
                OUSTR("service manager instance has already been disposed!"),
@@ -640,21 +622,13 @@ public:
        SAL_THROW( (RuntimeException) );
    virtual ~OServiceManagerWrapper() SAL_THROW(());

    // XUnoTunnel
    sal_Int64 SAL_CALL getSomething( Sequence< sal_Int8 > const & id ) throw (RuntimeException)
        { return getRoot()->getSomething( id ); }

    // XInitialization
    void SAL_CALL initialize( Sequence< Any > const & args ) throw (Exception)
        { getRoot()->initialize( args ); }

    // XServiceInfo
    virtual OUString SAL_CALL getImplementationName() throw (RuntimeException)
        { return getRoot()->getImplementationName(); }
        { return Reference< XServiceInfo >(getRoot(), UNO_QUERY_THROW)->getImplementationName(); }
    virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) throw (RuntimeException)
        { return getRoot()->supportsService( ServiceName ); }
        { return Reference< XServiceInfo >(getRoot(), UNO_QUERY_THROW)->supportsService( ServiceName ); }
    virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() throw (RuntimeException)
        { return getRoot()->getSupportedServiceNames(); }
        { return Reference< XServiceInfo >(getRoot(), UNO_QUERY_THROW)->getSupportedServiceNames(); }

    // XMultiComponentFactory
    virtual Reference< XInterface > SAL_CALL createInstanceWithContext(
@@ -680,30 +654,30 @@ public:

    // XElementAccess
    virtual Type SAL_CALL getElementType() throw (RuntimeException)
        { return getRoot()->getElementType(); }
        { return Reference< XElementAccess >(getRoot(), UNO_QUERY_THROW)->getElementType(); }
    virtual sal_Bool SAL_CALL hasElements() throw (RuntimeException)
        { return getRoot()->hasElements(); }
        { return Reference< XElementAccess >(getRoot(), UNO_QUERY_THROW)->hasElements(); }

    // XEnumerationAccess
    virtual Reference<XEnumeration > SAL_CALL createEnumeration() throw (RuntimeException)
        { return getRoot()->createEnumeration(); }
        { return Reference< XEnumerationAccess >(getRoot(), UNO_QUERY_THROW)->createEnumeration(); }

    // XSet
    virtual sal_Bool SAL_CALL has( const Any & Element ) throw (RuntimeException)
        { return getRoot()->has( Element ); }
        { return Reference< XSet >(getRoot(), UNO_QUERY_THROW)->has( Element ); }
    virtual void SAL_CALL insert( const Any & Element ) throw (lang::IllegalArgumentException, container::ElementExistException, RuntimeException)
        { getRoot()->insert( Element ); }
        { Reference< XSet >(getRoot(), UNO_QUERY_THROW)->insert( Element ); }
    virtual void SAL_CALL remove( const Any & Element ) throw (lang::IllegalArgumentException, container::NoSuchElementException, RuntimeException)
        { getRoot()->remove( Element ); }
        { Reference< XSet >(getRoot(), UNO_QUERY_THROW)->remove( Element ); }

    // XContentEnumerationAccess
    //Sequence< OUString >          getAvailableServiceNames() throw( (Exception) );
    virtual Reference<XEnumeration > SAL_CALL createContentEnumeration(const OUString& aServiceName) throw (RuntimeException)
        { return getRoot()->createContentEnumeration( aServiceName, m_xContext ); }
        { return Reference< XContentEnumerationAccess >(getRoot(), UNO_QUERY_THROW)->createContentEnumeration( aServiceName ); }

    // XPropertySet
    Reference<XPropertySetInfo > SAL_CALL getPropertySetInfo() throw (RuntimeException)
        { return getRoot()->getPropertySetInfo(); }
        { return Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->getPropertySetInfo(); }

    void SAL_CALL setPropertyValue(const OUString& PropertyName, const Any& aValue)
        throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, RuntimeException);
@@ -712,16 +686,16 @@ public:

    void SAL_CALL addPropertyChangeListener(const OUString& PropertyName, const Reference<XPropertyChangeListener >& aListener)
        throw (beans::UnknownPropertyException, lang::WrappedTargetException, RuntimeException)
        { getRoot()->addPropertyChangeListener( PropertyName, aListener ); }
        { Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->addPropertyChangeListener( PropertyName, aListener ); }
    void SAL_CALL removePropertyChangeListener(const OUString& PropertyName, const Reference<XPropertyChangeListener >& aListener)
        throw (beans::UnknownPropertyException, lang::WrappedTargetException, RuntimeException)
        { getRoot()->removePropertyChangeListener( PropertyName, aListener ); }
        { Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->removePropertyChangeListener( PropertyName, aListener ); }
    void SAL_CALL addVetoableChangeListener(const OUString& PropertyName, const Reference<XVetoableChangeListener >& aListener)
        throw (beans::UnknownPropertyException, lang::WrappedTargetException, RuntimeException)
        { getRoot()->addVetoableChangeListener( PropertyName, aListener ); }
        { Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->addVetoableChangeListener( PropertyName, aListener ); }
    void SAL_CALL removeVetoableChangeListener(const OUString& PropertyName, const Reference<XVetoableChangeListener >& aListener)
        throw (beans::UnknownPropertyException, lang::WrappedTargetException, RuntimeException)
        { getRoot()->removeVetoableChangeListener( PropertyName, aListener ); }
        { Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->removeVetoableChangeListener( PropertyName, aListener ); }
};
//__________________________________________________________________________________________________
void SAL_CALL OServiceManagerWrapper::setPropertyValue(
@@ -746,7 +720,7 @@ void SAL_CALL OServiceManagerWrapper::setPropertyValue(
    }
    else
    {
        getRoot()->setPropertyValue( PropertyName, aValue );
        Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->setPropertyValue( PropertyName, aValue );
    }
}
//__________________________________________________________________________________________________
@@ -764,7 +738,7 @@ Any SAL_CALL OServiceManagerWrapper::getPropertyValue(
    }
    else
    {
        return getRoot()->getPropertyValue( PropertyName );
        return Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->getPropertyValue( PropertyName );
    }
}
//__________________________________________________________________________________________________
@@ -772,51 +746,28 @@ void OServiceManagerWrapper::disposing()
{
    m_xContext.clear();

    if (m_root)
    {
// no m_root->dispose(), because every context disposes its service manager...
        m_root->release();
        m_root = 0;
    }
    m_root.clear();
}
//__________________________________________________________________________________________________
OServiceManagerWrapper::~OServiceManagerWrapper() SAL_THROW(())
{
    if (m_root)
    {
        m_root->release();
        m_root = 0;
    }

    g_moduleCount.modCnt.release( &g_moduleCount.modCnt );
}
//__________________________________________________________________________________________________
OServiceManagerWrapper::OServiceManagerWrapper(
    Reference< XComponentContext > const & xContext )
    SAL_THROW( (RuntimeException) )
    : t_OServiceManager_impl( m_mutex )
    : t_OServiceManagerWrapper_impl( m_mutex )
    , m_xContext( xContext )
    , m_root( 0 )
    , m_root( xContext->getServiceManager() )
{
    g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );

    Reference< XUnoTunnel > xTunnel( m_xContext->getServiceManager(), UNO_QUERY );
    OSL_ASSERT( xTunnel.is() );
    if (xTunnel.is())
    {
        m_root = reinterpret_cast< OServiceManager * >(
            xTunnel->getSomething( smgr_getImplementationId() ) );
        OSL_ASSERT( m_root );
        if (m_root)
        {
            m_root->acquire();
        }
    }

    if (! m_root)
    if (! m_root.is())
    {
        throw RuntimeException(
            OUString( RTL_CONSTASCII_USTRINGPARAM("can only wrap OServiceManager instances!") ),
            OUString( RTL_CONSTASCII_USTRINGPARAM("no service manager to wrap") ),
            Reference< XInterface >() );
    }
}
@@ -825,17 +776,6 @@ OServiceManagerWrapper::OServiceManagerWrapper(
//##################################################################################################
//##################################################################################################

// XUnoTunnel
sal_Int64 OServiceManager::getSomething( Sequence< sal_Int8 > const & id )
    throw (RuntimeException)
{
    check_undisposed();
    if (id == smgr_getImplementationId())
        return reinterpret_cast< sal_Int64 >(this);
    else
        return 0;
}

/**
 * Create a ServiceManager
 */
@@ -1389,23 +1329,17 @@ Sequence< Reference< XInterface > > OServiceManager::queryServiceFactories(

// XContentEnumerationAccess
Reference<XEnumeration > OServiceManager::createContentEnumeration(
    const OUString& aServiceName, Reference< XComponentContext > const & xContext )
    const OUString& aServiceName )
    throw(::com::sun::star::uno::RuntimeException)
{
    check_undisposed();
    Sequence< Reference< XInterface > > factories(
        OServiceManager::queryServiceFactories( aServiceName, xContext ) );
        OServiceManager::queryServiceFactories( aServiceName, m_xContext ) );
    if (factories.getLength())
        return new ServiceEnumeration_Impl( factories );
    else
        return Reference< XEnumeration >();
}
Reference<XEnumeration > OServiceManager::createContentEnumeration(
    const OUString& aServiceName )
    throw(::com::sun::star::uno::RuntimeException)
{
    return createContentEnumeration( aServiceName, m_xContext );
}

// XEnumeration
Reference<XEnumeration > OServiceManager::createEnumeration() throw(::com::sun::star::uno::RuntimeException)
@@ -1625,9 +1559,6 @@ public:
    // XContentEnumerationAccess
    //Sequence< OUString >          getAvailableServiceNames() throw( (Exception) );
    Reference<XEnumeration > SAL_CALL createContentEnumeration(const OUString& aServiceName) throw(::com::sun::star::uno::RuntimeException);
    virtual Reference<XEnumeration > SAL_CALL createContentEnumeration(
        const OUString& aServiceName, Reference< XComponentContext > const & xContext )
        throw(::com::sun::star::uno::RuntimeException);

    // XComponent
    void SAL_CALL dispose() throw(::com::sun::star::uno::RuntimeException);
@@ -1883,7 +1814,7 @@ Sequence< Reference< XInterface > > ORegistryServiceManager::queryServiceFactori

// XContentEnumerationAccess
Reference<XEnumeration > ORegistryServiceManager::createContentEnumeration(
    const OUString& aServiceName, Reference< XComponentContext > const & xContext )
    const OUString& aServiceName )
    throw(::com::sun::star::uno::RuntimeException)
{
    check_undisposed();
@@ -1898,17 +1829,11 @@ Reference<XEnumeration > ORegistryServiceManager::createContentEnumeration(
        aImplName = aImpls.getConstArray()[i];
        if ( !haveFactoryWithThisImplementation(aImplName) )
        {
            loadWithImplementationName( aImplName, xContext );
            loadWithImplementationName( aImplName, m_xContext );
        }
    }
    // call the superclass to enumerate all contents
    return OServiceManager::createContentEnumeration( aServiceName, xContext );
}
Reference<XEnumeration > ORegistryServiceManager::createContentEnumeration(
    const OUString& aServiceName )
    throw(::com::sun::star::uno::RuntimeException)
{
    return createContentEnumeration( aServiceName, m_xContext );
    return OServiceManager::createContentEnumeration( aServiceName );
}

// OServiceManager