LCOV - code coverage report
Current view: top level - stoc/source/servicemanager - servicemanager.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 271 664 40.8 %
Date: 2012-08-25 Functions: 45 117 38.5 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 271 1336 20.3 %

           Branch data     Line data    Source code
       1                 :            : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2                 :            : /*
       3                 :            :  * This file is part of the LibreOffice project.
       4                 :            :  *
       5                 :            :  * This Source Code Form is subject to the terms of the Mozilla Public
       6                 :            :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7                 :            :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8                 :            :  *
       9                 :            :  * This file incorporates work covered by the following license notice:
      10                 :            :  *
      11                 :            :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12                 :            :  *   contributor license agreements. See the NOTICE file distributed
      13                 :            :  *   with this work for additional information regarding copyright
      14                 :            :  *   ownership. The ASF licenses this file to you under the Apache
      15                 :            :  *   License, Version 2.0 (the "License"); you may not use this file
      16                 :            :  *   except in compliance with the License. You may obtain a copy of
      17                 :            :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18                 :            :  */
      19                 :            : 
      20                 :            : #include <osl/mutex.hxx>
      21                 :            : #include <osl/diagnose.h>
      22                 :            : #include <rtl/ustrbuf.hxx>
      23                 :            : 
      24                 :            : #include <boost/unordered_map.hpp>
      25                 :            : #include <boost/unordered_set.hpp>
      26                 :            : #include <list>
      27                 :            : #include <uno/mapping.hxx>
      28                 :            : #include <uno/dispatcher.h>
      29                 :            : #include <cppuhelper/queryinterface.hxx>
      30                 :            : #include <cppuhelper/weakref.hxx>
      31                 :            : #include <cppuhelper/component.hxx>
      32                 :            : #include <cppuhelper/factory.hxx>
      33                 :            : #include <cppuhelper/implbase1.hxx>
      34                 :            : #include <cppuhelper/implementationentry.hxx>
      35                 :            : #include <rtl/unload.h>
      36                 :            : #include <cppuhelper/component_context.hxx>
      37                 :            : #include <cppuhelper/bootstrap.hxx>
      38                 :            : #include <cppuhelper/compbase6.hxx>
      39                 :            : #include <cppuhelper/compbase7.hxx>
      40                 :            : 
      41                 :            : 
      42                 :            : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
      43                 :            : #include <com/sun/star/lang/XMultiComponentFactory.hpp>
      44                 :            : #include <com/sun/star/lang/XServiceInfo.hpp>
      45                 :            : #include <com/sun/star/lang/XSingleServiceFactory.hpp>
      46                 :            : #include <com/sun/star/lang/XInitialization.hpp>
      47                 :            : #include <com/sun/star/lang/XEventListener.hpp>
      48                 :            : #include <com/sun/star/lang/DisposedException.hpp>
      49                 :            : #include <com/sun/star/beans/XPropertySet.hpp>
      50                 :            : #include <com/sun/star/beans/PropertyAttribute.hpp>
      51                 :            : #include <com/sun/star/registry/XRegistryKey.hpp>
      52                 :            : #include <com/sun/star/registry/XSimpleRegistry.hpp>
      53                 :            : #include <com/sun/star/container/XSet.hpp>
      54                 :            : #include <com/sun/star/container/XElementAccess.hpp>
      55                 :            : #include <com/sun/star/container/XEnumeration.hpp>
      56                 :            : #include <com/sun/star/container/XContentEnumerationAccess.hpp>
      57                 :            : #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
      58                 :            : #include <com/sun/star/uno/XUnloadingPreference.hpp>
      59                 :            : 
      60                 :            : #include <bootstrapservices.hxx>
      61                 :            : 
      62                 :            : #define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
      63                 :            : 
      64                 :            : 
      65                 :            : using namespace com::sun::star;
      66                 :            : using namespace com::sun::star::uno;
      67                 :            : using namespace com::sun::star::beans;
      68                 :            : using namespace com::sun::star::registry;
      69                 :            : using namespace com::sun::star::lang;
      70                 :            : using namespace com::sun::star::container;
      71                 :            : using namespace cppu;
      72                 :            : using namespace osl;
      73                 :            : using namespace std;
      74                 :            : 
      75                 :            : using ::rtl::OUString;
      76                 :            : using ::rtl::OUStringToOString;
      77                 :            : using ::rtl::OUStringBuffer;
      78                 :            : using ::rtl::OString;
      79                 :            : 
      80                 :            : rtl_StandardModuleCount g_moduleCount = MODULE_COUNT_INIT;
      81                 :            : 
      82                 :            : namespace stoc_bootstrap
      83                 :            : {
      84                 :        764 : Sequence< OUString > smgr_wrapper_getSupportedServiceNames()
      85                 :            : {
      86                 :        764 :     Sequence< OUString > seqNames(1);
      87                 :            :     seqNames.getArray()[0] = OUString(
      88 [ +  - ][ +  - ]:        764 :         RTL_CONSTASCII_USTRINGPARAM("com.sun.star.lang.MultiServiceFactory") );
      89                 :        764 :     return seqNames;
      90                 :            : }
      91                 :            : 
      92                 :      10036 : OUString smgr_wrapper_getImplementationName()
      93                 :            : {
      94                 :            :     return OUString(
      95                 :      10036 :         RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.stoc.OServiceManagerWrapper"));
      96                 :            : }
      97                 :            : 
      98                 :          0 : Sequence< OUString > smgr_getSupportedServiceNames()
      99                 :            : {
     100                 :          0 :     Sequence< OUString > seqNames(2);
     101                 :            :     seqNames.getArray()[0] = OUString(
     102 [ #  # ][ #  # ]:          0 :         RTL_CONSTASCII_USTRINGPARAM("com.sun.star.lang.MultiServiceFactory") );
     103         [ #  # ]:          0 :     seqNames.getArray()[1] = OUString(
     104         [ #  # ]:          0 :         RTL_CONSTASCII_USTRINGPARAM("com.sun.star.lang.ServiceManager") );
     105                 :          0 :     return seqNames;
     106                 :            : }
     107                 :            : 
     108                 :      10036 : OUString smgr_getImplementationName()
     109                 :            : {
     110                 :      10036 :     return OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.stoc.OServiceManager"));
     111                 :            : }
     112                 :            : 
     113                 :        756 : Sequence< OUString > regsmgr_getSupportedServiceNames()
     114                 :            : {
     115                 :        756 :     Sequence< OUString > seqNames(2);
     116 [ +  - ][ +  - ]:        756 :     seqNames.getArray()[0] = OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.lang.MultiServiceFactory"));
     117 [ +  - ][ +  - ]:        756 :     seqNames.getArray()[1] = OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.lang.RegistryServiceManager"));
     118                 :        756 :     return seqNames;
     119                 :            : }
     120                 :            : 
     121                 :      10036 : OUString regsmgr_getImplementationName()
     122                 :            : {
     123                 :      10036 :     return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.stoc.ORegistryServiceManager" ) );
     124                 :            : }
     125                 :            : }
     126                 :            : 
     127                 :            : namespace stoc_smgr
     128                 :            : {
     129                 :            : 
     130                 :       1282 : static Sequence< OUString > retrieveAsciiValueList(
     131                 :            :     const Reference< XSimpleRegistry > &xReg, const OUString &keyName )
     132                 :            : {
     133         [ +  - ]:       1282 :     Reference< XEnumerationAccess > xAccess( xReg, UNO_QUERY );
     134         [ +  - ]:       1282 :     Sequence< OUString > seq;
     135         [ +  + ]:       1282 :     if( xAccess.is() )
     136                 :            :     {
     137 [ +  - ][ +  - ]:        434 :         Reference< XEnumeration > xEnum = xAccess->createEnumeration();
     138 [ +  - ][ +  - ]:       1302 :         while( xEnum.is() && xEnum->hasMoreElements() )
         [ +  - ][ +  + ]
                 [ +  + ]
     139                 :            :         {
     140                 :        868 :             Reference< XSimpleRegistry > xTempReg;
     141 [ +  - ][ +  - ]:        868 :             xEnum->nextElement() >>= xTempReg;
                 [ +  - ]
     142         [ +  - ]:        868 :             if( xTempReg.is() )
     143                 :            :             {
     144         [ +  - ]:        868 :                 Sequence< OUString > seq2 = retrieveAsciiValueList( xTempReg, keyName );
     145                 :            : 
     146         [ +  + ]:        868 :                 if( seq2.getLength() )
     147                 :            :                 {
     148                 :        434 :                     sal_Int32 n1Len = seq.getLength();
     149                 :        434 :                     sal_Int32 n2Len = seq2.getLength();
     150                 :            : 
     151         [ +  - ]:        434 :                     seq.realloc( n1Len + n2Len );
     152                 :        434 :                     const OUString *pSource = seq2.getConstArray();
     153         [ +  - ]:        434 :                     OUString *pTarget = seq.getArray();
     154         [ +  + ]:        868 :                     for( int i = 0 ; i < n2Len ; i ++ )
     155                 :            :                     {
     156                 :        434 :                         pTarget[i+n1Len] = pSource[i];
     157                 :            :                     }
     158         [ +  - ]:        868 :                 }
     159                 :            :             }
     160                 :       1302 :         }
     161                 :            :     }
     162         [ +  - ]:        848 :     else if( xReg.is () )
     163                 :            :     {
     164                 :            :         try
     165                 :            :         {
     166 [ +  - ][ +  - ]:        848 :             Reference< XRegistryKey > rRootKey = xReg->getRootKey();
     167         [ +  - ]:        848 :             if( rRootKey.is() )
     168                 :            :             {
     169 [ +  - ][ +  - ]:        848 :                 Reference<XRegistryKey > xKey = rRootKey->openKey(keyName);
     170         [ +  + ]:        848 :                 if( xKey.is() )
     171                 :            :                 {
     172 [ +  - ][ +  - ]:        414 :                     seq = xKey->getAsciiListValue();
         [ +  - ][ +  - ]
     173                 :        848 :                 }
     174      [ #  #  # ]:        848 :             }
     175                 :            :         }
     176         [ #  # ]:          0 :         catch( InvalidRegistryException & )
     177                 :            :         {
     178                 :            :         }
     179         [ #  # ]:          0 :         catch (InvalidValueException &)
     180                 :            :         {
     181                 :            :         }
     182                 :            :     }
     183                 :       1282 :     return seq;
     184                 :            : }
     185                 :            : 
     186                 :            : /*****************************************************************************
     187                 :            :     Enumeration by ServiceName
     188                 :            : *****************************************************************************/
     189                 :            : struct hashRef_Impl
     190                 :            : {
     191                 :      13380 :     size_t operator()(const Reference<XInterface > & rName) const
     192                 :            :     {
     193                 :            :         // query to XInterface. The cast to XInterface* must be the same for the same object
     194         [ +  - ]:      13380 :         Reference<XInterface > x( Reference<XInterface >::query( rName ) );
     195         [ +  - ]:      13380 :         return (size_t)x.get();
     196                 :            :     }
     197                 :            : };
     198                 :            : 
     199                 :            : struct equaltoRef_Impl
     200                 :            : {
     201                 :          0 :     size_t operator()(const Reference<XInterface > & rName1, const Reference<XInterface > & rName2 ) const
     202                 :          0 :         { return rName1 == rName2; }
     203                 :            : };
     204                 :            : 
     205                 :            : typedef boost::unordered_set
     206                 :            : <
     207                 :            :     Reference<XInterface >,
     208                 :            :     hashRef_Impl,
     209                 :            :     equaltoRef_Impl
     210                 :            : > HashSet_Ref;
     211                 :            : 
     212                 :            : 
     213                 :            : class ServiceEnumeration_Impl : public WeakImplHelper1< XEnumeration >
     214                 :            : {
     215                 :            : public:
     216                 :          0 :     ServiceEnumeration_Impl( const Sequence< Reference<XInterface > > & rFactories )
     217                 :            :         : aFactories( rFactories )
     218 [ #  # ][ #  # ]:          0 :         , nIt( 0 )
     219         [ #  # ]:          0 :         { g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt ); }
     220                 :          0 :     virtual ~ServiceEnumeration_Impl()
     221 [ #  # ][ #  # ]:          0 :         { g_moduleCount.modCnt.release( &g_moduleCount.modCnt ); }
         [ #  # ][ #  # ]
     222                 :            : 
     223                 :            :     // XEnumeration
     224                 :            :     sal_Bool SAL_CALL hasMoreElements()
     225                 :            :         throw(::com::sun::star::uno::RuntimeException);
     226                 :            :     Any SAL_CALL nextElement()
     227                 :            :         throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
     228                 :            : private:
     229                 :            :     Mutex                               aMutex;
     230                 :            :     Sequence< Reference<XInterface > >  aFactories;
     231                 :            :     sal_Int32                           nIt;
     232                 :            : };
     233                 :            : 
     234                 :            : // XEnumeration
     235                 :          0 : sal_Bool ServiceEnumeration_Impl::hasMoreElements() throw(::com::sun::star::uno::RuntimeException)
     236                 :            : {
     237         [ #  # ]:          0 :     MutexGuard aGuard( aMutex );
     238         [ #  # ]:          0 :     return nIt != aFactories.getLength();
     239                 :            : }
     240                 :            : 
     241                 :            : // XEnumeration
     242                 :          0 : Any ServiceEnumeration_Impl::nextElement()
     243                 :            :     throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
     244                 :            : {
     245         [ #  # ]:          0 :     MutexGuard aGuard( aMutex );
     246         [ #  # ]:          0 :     if( nIt == aFactories.getLength() )
     247         [ #  # ]:          0 :         throw NoSuchElementException();
     248                 :            : 
     249 [ #  # ][ #  # ]:          0 :     return Any( &aFactories.getConstArray()[nIt++], ::getCppuType( (const Reference<XInterface > *)0 ) );
     250                 :            : }
     251                 :            : 
     252                 :            : //==================================================================================================
     253 [ #  # ][ #  # ]:          0 : class PropertySetInfo_Impl : public WeakImplHelper1< beans::XPropertySetInfo >
     254                 :            : {
     255                 :            :     Sequence< beans::Property > m_properties;
     256                 :            : 
     257                 :            : public:
     258                 :          0 :     inline PropertySetInfo_Impl( Sequence< beans::Property > const & properties ) SAL_THROW(())
     259         [ #  # ]:          0 :         : m_properties( properties )
     260                 :          0 :         {}
     261                 :            : 
     262                 :            :     // XPropertySetInfo impl
     263                 :            :     virtual Sequence< beans::Property > SAL_CALL getProperties()
     264                 :            :         throw (RuntimeException);
     265                 :            :     virtual beans::Property SAL_CALL getPropertyByName( OUString const & name )
     266                 :            :         throw (beans::UnknownPropertyException, RuntimeException);
     267                 :            :     virtual sal_Bool SAL_CALL hasPropertyByName( OUString const & name )
     268                 :            :         throw (RuntimeException);
     269                 :            : };
     270                 :            : //__________________________________________________________________________________________________
     271                 :          0 : Sequence< beans::Property > PropertySetInfo_Impl::getProperties()
     272                 :            :     throw (RuntimeException)
     273                 :            : {
     274                 :          0 :     return m_properties;
     275                 :            : }
     276                 :            : //__________________________________________________________________________________________________
     277                 :          0 : beans::Property PropertySetInfo_Impl::getPropertyByName( OUString const & name )
     278                 :            :     throw (beans::UnknownPropertyException, RuntimeException)
     279                 :            : {
     280                 :          0 :     beans::Property const * p = m_properties.getConstArray();
     281         [ #  # ]:          0 :     for ( sal_Int32 nPos = m_properties.getLength(); nPos--; )
     282                 :            :     {
     283         [ #  # ]:          0 :         if (p[ nPos ].Name.equals( name ))
     284                 :          0 :             return p[ nPos ];
     285                 :            :     }
     286                 :            :     throw beans::UnknownPropertyException(
     287 [ #  # ][ #  # ]:          0 :         OUSTR("unknown property: ") + name, Reference< XInterface >() );
     288                 :            : }
     289                 :            : //__________________________________________________________________________________________________
     290                 :          0 : sal_Bool PropertySetInfo_Impl::hasPropertyByName( OUString const & name )
     291                 :            :     throw (RuntimeException)
     292                 :            : {
     293                 :          0 :     beans::Property const * p = m_properties.getConstArray();
     294         [ #  # ]:          0 :     for ( sal_Int32 nPos = m_properties.getLength(); nPos--; )
     295                 :            :     {
     296         [ #  # ]:          0 :         if (p[ nPos ].Name.equals( name ))
     297                 :          0 :             return sal_True;
     298                 :            :     }
     299                 :          0 :     return sal_False;
     300                 :            : }
     301                 :            : 
     302                 :            : 
     303                 :            : /*****************************************************************************
     304                 :            :     Enumeration by implementation
     305                 :            : *****************************************************************************/
     306                 :            : class ImplementationEnumeration_Impl : public WeakImplHelper1< XEnumeration >
     307                 :            : {
     308                 :            : public:
     309                 :          0 :     ImplementationEnumeration_Impl( const HashSet_Ref & rImplementationMap )
     310                 :            :         : aImplementationMap( rImplementationMap )
     311 [ #  # ][ #  # ]:          0 :         , aIt( aImplementationMap.begin() )
                 [ #  # ]
     312                 :            :         {
     313         [ #  # ]:          0 :             g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
     314                 :          0 :         }
     315                 :            :     virtual ~ImplementationEnumeration_Impl();
     316                 :            : 
     317                 :            :     // XEnumeration
     318                 :            :     virtual sal_Bool SAL_CALL hasMoreElements()
     319                 :            :          throw(::com::sun::star::uno::RuntimeException);
     320                 :            :     virtual Any SAL_CALL nextElement()
     321                 :            :         throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
     322                 :            : 
     323                 :            : private:
     324                 :            :     Mutex                           aMutex;
     325                 :            :     HashSet_Ref                     aImplementationMap;
     326                 :            :     HashSet_Ref::iterator           aIt;
     327                 :            :     Reference<XInterface >          xNext;
     328                 :            : };
     329                 :            : 
     330 [ #  # ][ #  # ]:          0 : ImplementationEnumeration_Impl::~ImplementationEnumeration_Impl()
     331                 :            : {
     332         [ #  # ]:          0 :     g_moduleCount.modCnt.release( &g_moduleCount.modCnt );
     333         [ #  # ]:          0 : }
     334                 :            : 
     335                 :            : // XEnumeration
     336                 :          0 : sal_Bool ImplementationEnumeration_Impl::hasMoreElements()
     337                 :            :     throw(::com::sun::star::uno::RuntimeException)
     338                 :            : {
     339         [ #  # ]:          0 :     MutexGuard aGuard( aMutex );
     340 [ #  # ][ #  # ]:          0 :     return aIt != aImplementationMap.end();
     341                 :            : }
     342                 :            : 
     343                 :            : // XEnumeration
     344                 :          0 : Any ImplementationEnumeration_Impl::nextElement()
     345                 :            :     throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
     346                 :            : {
     347         [ #  # ]:          0 :     MutexGuard aGuard( aMutex );
     348 [ #  # ][ #  # ]:          0 :     if( aIt == aImplementationMap.end() )
     349         [ #  # ]:          0 :         throw NoSuchElementException();
     350                 :            : 
     351 [ #  # ][ #  # ]:          0 :     Any ret( &(*aIt), ::getCppuType( (const Reference<XInterface > *)0 ) );
     352                 :          0 :     ++aIt;
     353         [ #  # ]:          0 :     return ret;
     354                 :            : }
     355                 :            : 
     356                 :            : /*****************************************************************************
     357                 :            :     Hash tables
     358                 :            : *****************************************************************************/
     359                 :            : struct equalOWString_Impl
     360                 :            : {
     361                 :        818 :   sal_Bool operator()(const OUString & s1, const OUString & s2) const
     362                 :        818 :         { return s1 == s2; }
     363                 :            : };
     364                 :            : 
     365                 :            : struct hashOWString_Impl
     366                 :            : {
     367                 :      15767 :     size_t operator()(const OUString & rName) const
     368                 :      15767 :         { return rName.hashCode(); }
     369                 :            : };
     370                 :            : 
     371                 :            : typedef boost::unordered_set
     372                 :            : <
     373                 :            :     OUString,
     374                 :            :     hashOWString_Impl,
     375                 :            :     equalOWString_Impl
     376                 :            : > HashSet_OWString;
     377                 :            : 
     378                 :            : typedef boost::unordered_multimap
     379                 :            : <
     380                 :            :     OUString,
     381                 :            :     Reference<XInterface >,
     382                 :            :     hashOWString_Impl,
     383                 :            :     equalOWString_Impl
     384                 :            : > HashMultimap_OWString_Interface;
     385                 :            : 
     386                 :            : typedef boost::unordered_map
     387                 :            : <
     388                 :            :     OUString,
     389                 :            :     Reference<XInterface >,
     390                 :            :     hashOWString_Impl,
     391                 :            :     equalOWString_Impl
     392                 :            : > HashMap_OWString_Interface;
     393                 :            : 
     394                 :            : /*****************************************************************************
     395                 :            :     class OServiceManager_Listener
     396                 :            : *****************************************************************************/
     397 [ +  - ][ -  + ]:        724 : class OServiceManager_Listener : public WeakImplHelper1< XEventListener >
     398                 :            : {
     399                 :            : private:
     400                 :            :     WeakReference<XSet > xSMgr;
     401                 :            : 
     402                 :            : public:
     403                 :        756 :     OServiceManager_Listener( const Reference<XSet > & rSMgr )
     404         [ +  - ]:        756 :         : xSMgr( rSMgr )
     405                 :        756 :         {}
     406                 :            : 
     407                 :            :     // XEventListener
     408                 :            :     virtual void SAL_CALL disposing(const EventObject & rEvt ) throw(::com::sun::star::uno::RuntimeException);
     409                 :            : };
     410                 :            : 
     411                 :       2921 : void OServiceManager_Listener::disposing(const EventObject & rEvt )
     412                 :            :     throw(::com::sun::star::uno::RuntimeException)
     413                 :            : {
     414         [ +  - ]:       2921 :     Reference<XSet > x( xSMgr );
     415         [ +  + ]:       2921 :     if( x.is() )
     416                 :            :     {
     417                 :            :         try
     418                 :            :         {
     419 [ +  - ][ +  - ]:         65 :             x->remove( Any( &rEvt.Source, ::getCppuType( (const Reference<XInterface > *)0 ) ) );
                 [ +  - ]
              [ #  #  # ]
     420                 :            :         }
     421         [ #  # ]:          0 :         catch( const IllegalArgumentException & )
     422                 :            :         {
     423                 :            :             OSL_FAIL( "IllegalArgumentException caught" );
     424                 :            :         }
     425         [ #  # ]:          0 :         catch( const NoSuchElementException & )
     426                 :            :         {
     427                 :            :             OSL_FAIL( "NoSuchElementException caught" );
     428                 :            :         }
     429                 :       2921 :     }
     430                 :       2921 : }
     431                 :            : 
     432                 :            : 
     433                 :            : /*****************************************************************************
     434                 :            :     class OServiceManager
     435                 :            : *****************************************************************************/
     436                 :       1128 : struct OServiceManagerMutex
     437                 :            : {
     438                 :            :     Mutex m_mutex;
     439                 :            : };
     440                 :            : 
     441                 :            : extern "C" void SAL_CALL smgrUnloadingListener(void* id);
     442                 :            : 
     443                 :            : typedef WeakComponentImplHelper7<
     444                 :            :     lang::XMultiServiceFactory, lang::XMultiComponentFactory, lang::XServiceInfo,
     445                 :            :     lang::XInitialization,
     446                 :            :     container::XSet, container::XContentEnumerationAccess,
     447                 :            :     beans::XPropertySet > t_OServiceManager_impl;
     448                 :            : 
     449                 :            : class OServiceManager
     450                 :            :     : public OServiceManagerMutex
     451                 :            :     , public t_OServiceManager_impl
     452                 :            : {
     453                 :            : public:
     454                 :            :     friend void SAL_CALL smgrUnloadingListener(void* id);
     455                 :            : 
     456                 :            :     OServiceManager( Reference< XComponentContext > const & xContext );
     457                 :            :     virtual ~OServiceManager();
     458                 :            : 
     459                 :            :     // XInitialization
     460                 :            :     void SAL_CALL initialize( Sequence< Any > const & args )
     461                 :            :         throw (Exception);
     462                 :            : 
     463                 :            :     // XServiceInfo
     464                 :            :     virtual OUString SAL_CALL getImplementationName() throw(::com::sun::star::uno::RuntimeException);
     465                 :          0 :     static OUString getImplementationName_Static() throw(::com::sun::star::uno::RuntimeException)
     466                 :          0 :         { return stoc_bootstrap::smgr_getImplementationName(); }
     467                 :            :     virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) throw(::com::sun::star::uno::RuntimeException);
     468                 :            :     virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException);
     469                 :            : 
     470                 :            :     // XMultiComponentFactory
     471                 :            :     virtual Reference< XInterface > SAL_CALL createInstanceWithContext(
     472                 :            :         OUString const & rServiceSpecifier, Reference< XComponentContext > const & xContext )
     473                 :            :         throw (Exception, RuntimeException);
     474                 :            :     virtual Reference< XInterface > SAL_CALL createInstanceWithArgumentsAndContext(
     475                 :            :         OUString const & rServiceSpecifier,
     476                 :            :         Sequence< Any > const & rArguments,
     477                 :            :         Reference< XComponentContext > const & xContext )
     478                 :            :         throw (Exception, RuntimeException);
     479                 :            : //      virtual Sequence< OUString > SAL_CALL getAvailableServiceNames()
     480                 :            : //          throw (RuntimeException);
     481                 :            : 
     482                 :            :     // XMultiServiceFactory
     483                 :            :     virtual Sequence< OUString > SAL_CALL getAvailableServiceNames() throw(::com::sun::star::uno::RuntimeException);
     484                 :            :     virtual Reference<XInterface > SAL_CALL createInstance(const OUString &) throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
     485                 :            :     virtual Reference<XInterface > SAL_CALL createInstanceWithArguments(const OUString &, const Sequence<Any >& Arguments) throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
     486                 :            : 
     487                 :            :     // The same as the getAvailableServiceNames, but only uique names
     488                 :            :     Sequence< OUString > getUniqueAvailableServiceNames(
     489                 :            :         HashSet_OWString & aNameSet );
     490                 :            : 
     491                 :            :     // XElementAccess
     492                 :            :     virtual Type SAL_CALL getElementType() throw(::com::sun::star::uno::RuntimeException);
     493                 :            :     virtual sal_Bool SAL_CALL hasElements() throw(::com::sun::star::uno::RuntimeException);
     494                 :            : 
     495                 :            :     // XEnumerationAccess
     496                 :            :     virtual Reference<XEnumeration > SAL_CALL createEnumeration() throw(::com::sun::star::uno::RuntimeException);
     497                 :            : 
     498                 :            :     // XSet
     499                 :            :     virtual sal_Bool SAL_CALL has( const Any & Element ) throw(::com::sun::star::uno::RuntimeException);
     500                 :            :     virtual void SAL_CALL insert( const Any & Element ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::ElementExistException, ::com::sun::star::uno::RuntimeException);
     501                 :            :     virtual void SAL_CALL remove( const Any & Element ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException);
     502                 :            : 
     503                 :            :     // XContentEnumerationAccess
     504                 :            :     //Sequence< OUString >          getAvailableServiceNames() throw( (Exception) );
     505                 :            :     virtual Reference<XEnumeration > SAL_CALL createContentEnumeration(const OUString& aServiceName) throw(::com::sun::star::uno::RuntimeException);
     506                 :            : 
     507                 :            :     // XComponent
     508                 :            :     virtual void SAL_CALL dispose() throw(::com::sun::star::uno::RuntimeException);
     509                 :            : 
     510                 :            :     // XPropertySet
     511                 :            :     Reference<XPropertySetInfo > SAL_CALL getPropertySetInfo()
     512                 :            :         throw(::com::sun::star::uno::RuntimeException);
     513                 :            :     void SAL_CALL setPropertyValue(const OUString& PropertyName, const Any& aValue)
     514                 :            :         throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
     515                 :            :     Any SAL_CALL getPropertyValue(const OUString& PropertyName)
     516                 :            :         throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
     517                 :            :     void SAL_CALL addPropertyChangeListener(const OUString& PropertyName, const Reference<XPropertyChangeListener >& aListener)
     518                 :            :         throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
     519                 :            :     void SAL_CALL removePropertyChangeListener(const OUString& PropertyName, const Reference<XPropertyChangeListener >& aListener)
     520                 :            :         throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
     521                 :            :     void SAL_CALL addVetoableChangeListener(const OUString& PropertyName, const Reference<XVetoableChangeListener >& aListener)
     522                 :            :         throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
     523                 :            :     void SAL_CALL removeVetoableChangeListener(const OUString& PropertyName, const Reference<XVetoableChangeListener >& aListener)
     524                 :            :         throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
     525                 :            : 
     526                 :            : protected:
     527                 :            :     inline bool is_disposed() const SAL_THROW( (lang::DisposedException) );
     528                 :            :     inline void check_undisposed() const SAL_THROW( (lang::DisposedException) );
     529                 :            :     virtual void SAL_CALL disposing();
     530                 :            : 
     531                 :            :     sal_Bool haveFactoryWithThisImplementation(const OUString& aImplName);
     532                 :            : 
     533                 :            :     virtual Sequence< Reference< XInterface > > queryServiceFactories(
     534                 :            :         const OUString& aServiceName, Reference< XComponentContext > const & xContext );
     535                 :            : 
     536                 :            :     Reference< XComponentContext >  m_xContext;
     537                 :            : 
     538                 :            :     Reference< beans::XPropertySetInfo > m_xPropertyInfo;
     539                 :            : 
     540                 :            :     sal_Int32 m_nUnloadingListenerId;
     541                 :            : 
     542                 :            :     // Does clean up when the unloading mechanism has been set off. It is called from
     543                 :            :     // the listener function smgrUnloadingListener.
     544                 :            :     void onUnloadingNotify();
     545                 :            :     // factories which have been loaded and not inserted( by XSet::insert)
     546                 :            :     // are remembered by this set. Those factories
     547                 :            :     // are not released on a call to onUnloadingNotify
     548                 :            :     HashSet_Ref m_SetLoadedFactories;
     549                 :            : private:
     550                 :            : 
     551                 :            :     Reference<XEventListener >      getFactoryListener();
     552                 :            : 
     553                 :            : 
     554                 :            :     HashMultimap_OWString_Interface m_ServiceMap;
     555                 :            :     HashSet_Ref                     m_ImplementationMap;
     556                 :            :     HashMap_OWString_Interface      m_ImplementationNameMap;
     557                 :            :     Reference<XEventListener >      xFactoryListener;
     558                 :            :     bool                            m_bInDisposing;
     559                 :            : };
     560                 :            : 
     561                 :            : 
     562                 :            : //______________________________________________________________________________
     563                 :      15817 : inline bool OServiceManager::is_disposed() const
     564                 :            :     SAL_THROW( (lang::DisposedException) )
     565                 :            : {
     566                 :            :     // ought to be guarded by m_mutex:
     567 [ +  + ][ -  + ]:      15817 :     return (m_bInDisposing || rBHelper.bDisposed);
     568                 :            : }
     569                 :            : 
     570                 :            : //______________________________________________________________________________
     571                 :      15752 : inline void OServiceManager::check_undisposed() const
     572                 :            :     SAL_THROW( (lang::DisposedException) )
     573                 :            : {
     574         [ -  + ]:      15752 :     if (is_disposed())
     575                 :            :     {
     576                 :            :         throw lang::DisposedException(
     577                 :            :             OUSTR("service manager instance has already been disposed!"),
     578 [ #  # ][ #  # ]:          0 :             (OWeakObject *)this );
                 [ #  # ]
     579                 :            :     }
     580                 :      15752 : }
     581                 :            : 
     582                 :            : //##################################################################################################
     583                 :            : //##################################################################################################
     584                 :            : //##################################################################################################
     585                 :            : 
     586                 :            : typedef WeakComponentImplHelper6<
     587                 :            :     lang::XMultiServiceFactory, lang::XMultiComponentFactory, lang::XServiceInfo,
     588                 :            :     container::XSet, container::XContentEnumerationAccess,
     589                 :            :     beans::XPropertySet > t_OServiceManagerWrapper_impl;
     590                 :            : 
     591                 :            : class OServiceManagerWrapper : public OServiceManagerMutex, public t_OServiceManagerWrapper_impl
     592                 :            : {
     593                 :            :     Reference< XComponentContext > m_xContext;
     594                 :            :     Reference< XMultiComponentFactory > m_root;
     595                 :         21 :     inline Reference< XMultiComponentFactory > getRoot() SAL_THROW( (RuntimeException) )
     596                 :            :     {
     597         [ -  + ]:         21 :         if (! m_root.is())
     598                 :            :         {
     599                 :            :             throw lang::DisposedException(
     600                 :            :                 OUSTR("service manager instance has already been disposed!"),
     601 [ #  # ][ #  # ]:          0 :                 Reference< XInterface >() );
     602                 :            :         }
     603                 :         21 :         return m_root;
     604                 :            :     }
     605                 :            : 
     606                 :            : protected:
     607                 :            :     virtual void SAL_CALL disposing();
     608                 :            : 
     609                 :            : public:
     610                 :            :     OServiceManagerWrapper(
     611                 :            :         Reference< XComponentContext > const & xContext )
     612                 :            :         SAL_THROW( (RuntimeException) );
     613                 :            :     virtual ~OServiceManagerWrapper() SAL_THROW(());
     614                 :            : 
     615                 :            :     // XServiceInfo
     616                 :          0 :     virtual OUString SAL_CALL getImplementationName() throw (RuntimeException)
     617 [ #  # ][ #  # ]:          0 :         { return Reference< XServiceInfo >(getRoot(), UNO_QUERY_THROW)->getImplementationName(); }
                 [ #  # ]
     618                 :          0 :     virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) throw (RuntimeException)
     619 [ #  # ][ #  # ]:          0 :         { return Reference< XServiceInfo >(getRoot(), UNO_QUERY_THROW)->supportsService( ServiceName ); }
                 [ #  # ]
     620                 :          0 :     virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() throw (RuntimeException)
     621 [ #  # ][ #  # ]:          0 :         { return Reference< XServiceInfo >(getRoot(), UNO_QUERY_THROW)->getSupportedServiceNames(); }
                 [ #  # ]
     622                 :            : 
     623                 :            :     // XMultiComponentFactory
     624                 :          0 :     virtual Reference< XInterface > SAL_CALL createInstanceWithContext(
     625                 :            :         OUString const & rServiceSpecifier, Reference< XComponentContext > const & xContext )
     626                 :            :         throw (Exception, RuntimeException)
     627 [ #  # ][ #  # ]:          0 :         { return getRoot()->createInstanceWithContext( rServiceSpecifier, xContext ); }
     628                 :         21 :     virtual Reference< XInterface > SAL_CALL createInstanceWithArgumentsAndContext(
     629                 :            :         OUString const & rServiceSpecifier,
     630                 :            :         Sequence< Any > const & rArguments,
     631                 :            :         Reference< XComponentContext > const & xContext )
     632                 :            :         throw (Exception, RuntimeException)
     633 [ +  - ][ +  - ]:         21 :         { return getRoot()->createInstanceWithArgumentsAndContext( rServiceSpecifier, rArguments, xContext ); }
     634                 :            : //      virtual Sequence< OUString > SAL_CALL getAvailableServiceNames()
     635                 :            : //          throw (RuntimeException);
     636                 :            : 
     637                 :            :     // XMultiServiceFactory
     638                 :          0 :     virtual Sequence< OUString > SAL_CALL getAvailableServiceNames() throw (RuntimeException)
     639 [ #  # ][ #  # ]:          0 :         { return getRoot()->getAvailableServiceNames(); }
     640                 :          0 :     virtual Reference<XInterface > SAL_CALL createInstance(const OUString & name) throw (Exception)
     641 [ #  # ][ #  # ]:          0 :         { return getRoot()->createInstanceWithContext( name, m_xContext ); }
     642                 :          0 :     virtual Reference<XInterface > SAL_CALL createInstanceWithArguments(const OUString & name, const Sequence<Any >& Arguments) throw (Exception)
     643 [ #  # ][ #  # ]:          0 :         { return getRoot()->createInstanceWithArgumentsAndContext( name, Arguments, m_xContext ); }
     644                 :            : 
     645                 :            :     // XElementAccess
     646                 :          0 :     virtual Type SAL_CALL getElementType() throw (RuntimeException)
     647 [ #  # ][ #  # ]:          0 :         { return Reference< XElementAccess >(getRoot(), UNO_QUERY_THROW)->getElementType(); }
                 [ #  # ]
     648                 :          0 :     virtual sal_Bool SAL_CALL hasElements() throw (RuntimeException)
     649 [ #  # ][ #  # ]:          0 :         { return Reference< XElementAccess >(getRoot(), UNO_QUERY_THROW)->hasElements(); }
                 [ #  # ]
     650                 :            : 
     651                 :            :     // XEnumerationAccess
     652                 :          0 :     virtual Reference<XEnumeration > SAL_CALL createEnumeration() throw (RuntimeException)
     653 [ #  # ][ #  # ]:          0 :         { return Reference< XEnumerationAccess >(getRoot(), UNO_QUERY_THROW)->createEnumeration(); }
                 [ #  # ]
     654                 :            : 
     655                 :            :     // XSet
     656                 :          0 :     virtual sal_Bool SAL_CALL has( const Any & Element ) throw (RuntimeException)
     657 [ #  # ][ #  # ]:          0 :         { return Reference< XSet >(getRoot(), UNO_QUERY_THROW)->has( Element ); }
                 [ #  # ]
     658                 :          0 :     virtual void SAL_CALL insert( const Any & Element ) throw (lang::IllegalArgumentException, container::ElementExistException, RuntimeException)
     659 [ #  # ][ #  # ]:          0 :         { Reference< XSet >(getRoot(), UNO_QUERY_THROW)->insert( Element ); }
                 [ #  # ]
     660                 :          0 :     virtual void SAL_CALL remove( const Any & Element ) throw (lang::IllegalArgumentException, container::NoSuchElementException, RuntimeException)
     661 [ #  # ][ #  # ]:          0 :         { Reference< XSet >(getRoot(), UNO_QUERY_THROW)->remove( Element ); }
                 [ #  # ]
     662                 :            : 
     663                 :            :     // XContentEnumerationAccess
     664                 :            :     //Sequence< OUString >          getAvailableServiceNames() throw( (Exception) );
     665                 :          0 :     virtual Reference<XEnumeration > SAL_CALL createContentEnumeration(const OUString& aServiceName) throw (RuntimeException)
     666 [ #  # ][ #  # ]:          0 :         { return Reference< XContentEnumerationAccess >(getRoot(), UNO_QUERY_THROW)->createContentEnumeration( aServiceName ); }
                 [ #  # ]
     667                 :            : 
     668                 :            :     // XPropertySet
     669                 :          0 :     Reference<XPropertySetInfo > SAL_CALL getPropertySetInfo() throw (RuntimeException)
     670 [ #  # ][ #  # ]:          0 :         { return Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->getPropertySetInfo(); }
                 [ #  # ]
     671                 :            : 
     672                 :            :     void SAL_CALL setPropertyValue(const OUString& PropertyName, const Any& aValue)
     673                 :            :         throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, RuntimeException);
     674                 :            :     Any SAL_CALL getPropertyValue(const OUString& PropertyName)
     675                 :            :         throw (beans::UnknownPropertyException, lang::WrappedTargetException, RuntimeException);
     676                 :            : 
     677                 :          0 :     void SAL_CALL addPropertyChangeListener(const OUString& PropertyName, const Reference<XPropertyChangeListener >& aListener)
     678                 :            :         throw (beans::UnknownPropertyException, lang::WrappedTargetException, RuntimeException)
     679 [ #  # ][ #  # ]:          0 :         { Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->addPropertyChangeListener( PropertyName, aListener ); }
                 [ #  # ]
     680                 :          0 :     void SAL_CALL removePropertyChangeListener(const OUString& PropertyName, const Reference<XPropertyChangeListener >& aListener)
     681                 :            :         throw (beans::UnknownPropertyException, lang::WrappedTargetException, RuntimeException)
     682 [ #  # ][ #  # ]:          0 :         { Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->removePropertyChangeListener( PropertyName, aListener ); }
                 [ #  # ]
     683                 :          0 :     void SAL_CALL addVetoableChangeListener(const OUString& PropertyName, const Reference<XVetoableChangeListener >& aListener)
     684                 :            :         throw (beans::UnknownPropertyException, lang::WrappedTargetException, RuntimeException)
     685 [ #  # ][ #  # ]:          0 :         { Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->addVetoableChangeListener( PropertyName, aListener ); }
                 [ #  # ]
     686                 :          0 :     void SAL_CALL removeVetoableChangeListener(const OUString& PropertyName, const Reference<XVetoableChangeListener >& aListener)
     687                 :            :         throw (beans::UnknownPropertyException, lang::WrappedTargetException, RuntimeException)
     688 [ #  # ][ #  # ]:          0 :         { Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->removeVetoableChangeListener( PropertyName, aListener ); }
                 [ #  # ]
     689                 :            : };
     690                 :            : //__________________________________________________________________________________________________
     691                 :         10 : void SAL_CALL OServiceManagerWrapper::setPropertyValue(
     692                 :            :     const OUString& PropertyName, const Any& aValue )
     693                 :            :     throw (beans::UnknownPropertyException, beans::PropertyVetoException,
     694                 :            :            lang::IllegalArgumentException, lang::WrappedTargetException, RuntimeException)
     695                 :            : {
     696         [ +  - ]:         10 :     if ( PropertyName == "DefaultContext" )
     697                 :            :     {
     698                 :         10 :         Reference< XComponentContext > xContext;
     699 [ +  - ][ +  - ]:         10 :         if (aValue >>= xContext)
     700                 :            :         {
     701         [ +  - ]:         10 :             MutexGuard aGuard( m_mutex );
     702 [ +  - ][ +  - ]:         10 :             m_xContext = xContext;
     703                 :            :         }
     704                 :            :         else
     705                 :            :         {
     706                 :            :             throw IllegalArgumentException(
     707                 :            :                 OUString( RTL_CONSTASCII_USTRINGPARAM("no XComponentContext given!") ),
     708 [ #  # ][ #  # ]:          0 :                 (OWeakObject *)this, 1 );
                 [ #  # ]
     709                 :         10 :         }
     710                 :            :     }
     711                 :            :     else
     712                 :            :     {
     713 [ #  # ][ #  # ]:          0 :         Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->setPropertyValue( PropertyName, aValue );
                 [ #  # ]
     714                 :            :     }
     715                 :         10 : }
     716                 :            : //__________________________________________________________________________________________________
     717                 :          0 : Any SAL_CALL OServiceManagerWrapper::getPropertyValue(
     718                 :            :     const OUString& PropertyName )
     719                 :            :     throw (beans::UnknownPropertyException, lang::WrappedTargetException, RuntimeException)
     720                 :            : {
     721         [ #  # ]:          0 :     if ( PropertyName == "DefaultContext" )
     722                 :            :     {
     723         [ #  # ]:          0 :         MutexGuard aGuard( m_mutex );
     724         [ #  # ]:          0 :         if( m_xContext.is() )
     725         [ #  # ]:          0 :             return makeAny( m_xContext );
     726                 :            :         else
     727         [ #  # ]:          0 :             return Any();
     728                 :            :     }
     729                 :            :     else
     730                 :            :     {
     731 [ #  # ][ #  # ]:          0 :         return Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->getPropertyValue( PropertyName );
                 [ #  # ]
     732                 :            :     }
     733                 :            : }
     734                 :            : //__________________________________________________________________________________________________
     735                 :          0 : void OServiceManagerWrapper::disposing()
     736                 :            : {
     737                 :          0 :     m_xContext.clear();
     738                 :            : 
     739                 :            : // no m_root->dispose(), because every context disposes its service manager...
     740                 :          0 :     m_root.clear();
     741                 :          0 : }
     742                 :            : //__________________________________________________________________________________________________
     743         [ #  # ]:          0 : OServiceManagerWrapper::~OServiceManagerWrapper() SAL_THROW(())
     744                 :            : {
     745         [ #  # ]:          0 :     g_moduleCount.modCnt.release( &g_moduleCount.modCnt );
     746         [ #  # ]:          0 : }
     747                 :            : //__________________________________________________________________________________________________
     748                 :         10 : OServiceManagerWrapper::OServiceManagerWrapper(
     749                 :            :     Reference< XComponentContext > const & xContext )
     750                 :            :     SAL_THROW( (RuntimeException) )
     751                 :            :     : t_OServiceManagerWrapper_impl( m_mutex )
     752                 :            :     , m_xContext( xContext )
     753 [ +  - ][ +  - ]:         10 :     , m_root( xContext->getServiceManager() )
     754                 :            : {
     755         [ +  - ]:         10 :     g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
     756                 :            : 
     757         [ -  + ]:         10 :     if (! m_root.is())
     758                 :            :     {
     759                 :            :         throw RuntimeException(
     760                 :            :             OUString( RTL_CONSTASCII_USTRINGPARAM("no service manager to wrap") ),
     761 [ #  # ][ #  # ]:          0 :             Reference< XInterface >() );
     762                 :            :     }
     763                 :         10 : }
     764                 :            : 
     765                 :            : //##################################################################################################
     766                 :            : //##################################################################################################
     767                 :            : //##################################################################################################
     768                 :            : 
     769                 :            : /**
     770                 :            :  * Create a ServiceManager
     771                 :            :  */
     772                 :        756 : OServiceManager::OServiceManager( Reference< XComponentContext > const & xContext )
     773                 :            :     : t_OServiceManager_impl( m_mutex )
     774                 :            :     , m_xContext( xContext )
     775 [ +  - ][ +  - ]:        756 :     , m_bInDisposing( false )
         [ +  - ][ +  - ]
     776                 :            : {
     777         [ +  - ]:        756 :     g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
     778         [ +  - ]:        756 :     m_nUnloadingListenerId= rtl_addUnloadingListener( smgrUnloadingListener, this);
     779                 :        756 : }
     780                 :            : 
     781                 :            : /**
     782                 :            :  * Destroy the ServiceManager
     783                 :            :  */
     784 [ +  - ][ +  - ]:        362 : OServiceManager::~OServiceManager()
         [ +  - ][ +  - ]
                 [ +  - ]
     785                 :            : {
     786         [ -  + ]:        362 :     if( m_nUnloadingListenerId != 0)
     787         [ #  # ]:          0 :         rtl_removeUnloadingListener( m_nUnloadingListenerId );
     788                 :            : 
     789         [ +  - ]:        362 :     g_moduleCount.modCnt.release( &g_moduleCount.modCnt );
     790         [ -  + ]:        362 : }
     791                 :            : 
     792                 :            : // Removes entries in m_ServiceMap, m_ImplementationNameMap and m_ImplementationNameMap
     793                 :            : // if those entries have not been inserted through XSet::insert. Therefore the entries
     794                 :            : // are compared with the entries in m_SetLoadedFactories.
     795                 :          0 : void OServiceManager::onUnloadingNotify()
     796                 :            : {
     797         [ #  # ]:          0 :     MutexGuard aGuard( m_mutex);
     798                 :            : 
     799                 :            :     typedef HashSet_Ref::const_iterator CIT_S;
     800                 :            :     typedef HashMultimap_OWString_Interface::iterator IT_MM;
     801                 :            : 
     802         [ #  # ]:          0 :     CIT_S it_SetEnd= m_SetLoadedFactories.end();
     803         [ #  # ]:          0 :     IT_MM it_end1= m_ServiceMap.end();
     804         [ #  # ]:          0 :     list<IT_MM> listDeleteServiceMap;
     805                 :            :     typedef list<IT_MM>::const_iterator CIT_DMM;
     806                 :            :     // find occurrences in m_ServiceMap
     807 [ #  # ][ #  # ]:          0 :     for(IT_MM it_i1= m_ServiceMap.begin(); it_i1 != it_end1; ++it_i1)
     808                 :            :     {
     809 [ #  # ][ #  # ]:          0 :         if( m_SetLoadedFactories.find( it_i1->second) != it_SetEnd)
                 [ #  # ]
     810                 :            :         {
     811 [ #  # ][ #  # ]:          0 :             Reference<XUnloadingPreference> xunl( it_i1->second, UNO_QUERY);
     812         [ #  # ]:          0 :             if( xunl.is())
     813                 :            :             {
     814 [ #  # ][ #  # ]:          0 :                 if( xunl->releaseOnNotification())
                 [ #  # ]
     815         [ #  # ]:          0 :                     listDeleteServiceMap.push_front( it_i1);
     816                 :            :             }
     817                 :            :             else
     818         [ #  # ]:          0 :                 listDeleteServiceMap.push_front( it_i1);
     819                 :            :         }
     820                 :            :     }
     821                 :            :     // delete elements from m_ServiceMap
     822                 :          0 :     CIT_DMM it_end2= listDeleteServiceMap.end();
     823         [ #  # ]:          0 :     for( CIT_DMM it_i2= listDeleteServiceMap.begin(); it_i2 != it_end2; ++it_i2)
     824         [ #  # ]:          0 :         m_ServiceMap.erase( *it_i2);
     825                 :            : 
     826                 :            :     // find elements in m_ImplementationNameMap
     827                 :            :     typedef HashMap_OWString_Interface::iterator IT_M;
     828         [ #  # ]:          0 :     IT_M it_end3= m_ImplementationNameMap.end();
     829         [ #  # ]:          0 :     list<IT_M> listDeleteImplementationNameMap;
     830                 :            :     typedef list<IT_M>::const_iterator CIT_DM;
     831 [ #  # ][ #  # ]:          0 :     for( IT_M it_i3= m_ImplementationNameMap.begin();  it_i3 != it_end3; ++it_i3)
     832                 :            :     {
     833 [ #  # ][ #  # ]:          0 :         if( m_SetLoadedFactories.find( it_i3->second) != it_SetEnd)
                 [ #  # ]
     834                 :            :         {
     835 [ #  # ][ #  # ]:          0 :             Reference<XUnloadingPreference> xunl( it_i3->second, UNO_QUERY);
     836         [ #  # ]:          0 :             if( xunl.is())
     837                 :            :             {
     838 [ #  # ][ #  # ]:          0 :                 if( xunl->releaseOnNotification())
                 [ #  # ]
     839         [ #  # ]:          0 :                     listDeleteImplementationNameMap.push_front( it_i3);
     840                 :            :             }
     841                 :            :             else
     842         [ #  # ]:          0 :                 listDeleteImplementationNameMap.push_front( it_i3);
     843                 :            :         }
     844                 :            :     }
     845                 :            :     // delete elements from m_ImplementationNameMap
     846                 :          0 :     CIT_DM it_end4= listDeleteImplementationNameMap.end();
     847         [ #  # ]:          0 :     for( CIT_DM it_i4= listDeleteImplementationNameMap.begin(); it_i4 != it_end4; ++it_i4)
     848         [ #  # ]:          0 :         m_ImplementationNameMap.erase( *it_i4);
     849                 :            : 
     850                 :            :     // find elements in m_ImplementationMap
     851                 :            :     typedef HashSet_Ref::iterator IT_S;
     852         [ #  # ]:          0 :     IT_S it_end5= m_ImplementationMap.end();
     853         [ #  # ]:          0 :     list<IT_S> listDeleteImplementationMap;
     854                 :            :     typedef list<IT_S>::const_iterator CIT_DS;
     855 [ #  # ][ #  # ]:          0 :     for( IT_S it_i5= m_ImplementationMap.begin(); it_i5 != it_end5; ++it_i5)
     856                 :            :     {
     857 [ #  # ][ #  # ]:          0 :         if( m_SetLoadedFactories.find( *it_i5) != it_SetEnd)
                 [ #  # ]
     858                 :            :         {
     859 [ #  # ][ #  # ]:          0 :             Reference<XUnloadingPreference> xunl( *it_i5, UNO_QUERY);
     860         [ #  # ]:          0 :             if( xunl.is())
     861                 :            :             {
     862 [ #  # ][ #  # ]:          0 :                 if( xunl->releaseOnNotification())
                 [ #  # ]
     863         [ #  # ]:          0 :                     listDeleteImplementationMap.push_front( it_i5);
     864                 :            :             }
     865                 :            :             else
     866         [ #  # ]:          0 :                 listDeleteImplementationMap.push_front( it_i5);
     867                 :            :         }
     868                 :            :     }
     869                 :            :     // delete elements from m_ImplementationMap
     870                 :          0 :     CIT_DS it_end6= listDeleteImplementationMap.end();
     871         [ #  # ]:          0 :     for( CIT_DS it_i6= listDeleteImplementationMap.begin(); it_i6 != it_end6; ++it_i6)
     872         [ #  # ]:          0 :         m_ImplementationMap.erase( *it_i6);
     873                 :            : 
     874                 :            :     // remove Event listener before the factories are released.
     875         [ #  # ]:          0 :     IT_S it_end7= m_SetLoadedFactories.end();
     876                 :            : 
     877         [ #  # ]:          0 :     Reference<XEventListener> xlistener= getFactoryListener();
     878 [ #  # ][ #  # ]:          0 :     for( IT_S it_i7= m_SetLoadedFactories.begin(); it_i7 != it_end7; ++it_i7)
     879                 :            :     {
     880 [ #  # ][ #  # ]:          0 :         Reference<XComponent> xcomp( *it_i7, UNO_QUERY);
     881         [ #  # ]:          0 :         if( xcomp.is())
     882 [ #  # ][ #  # ]:          0 :             xcomp->removeEventListener( xlistener);
     883                 :          0 :     }
     884                 :            :     // release the factories in m_SetLoadedFactories
     885 [ #  # ][ #  # ]:          0 :     m_SetLoadedFactories.clear();
     886                 :          0 : }
     887                 :            : 
     888                 :            : // XComponent
     889                 :        362 : void OServiceManager::dispose()
     890                 :            :     throw(::com::sun::star::uno::RuntimeException)
     891                 :            : {
     892 [ +  - ][ -  + ]:        362 :     if (rBHelper.bDisposed || rBHelper.bInDispose)
     893                 :        362 :         return;
     894                 :        362 :     t_OServiceManager_impl::dispose();
     895                 :            : }
     896                 :            : 
     897                 :        362 : void OServiceManager::disposing()
     898                 :            : {
     899                 :            :     // dispose all factories
     900         [ +  - ]:        362 :     HashSet_Ref aImpls;
     901                 :            :     {
     902         [ +  - ]:        362 :         MutexGuard aGuard( m_mutex );
     903                 :        362 :         m_bInDisposing = true;
     904 [ +  - ][ +  - ]:        362 :         aImpls = m_ImplementationMap;
     905                 :            :     }
     906         [ +  - ]:        362 :     HashSet_Ref::iterator aIt = aImpls.begin();
     907 [ +  - ][ +  + ]:       3283 :     while( aIt != aImpls.end() )
     908                 :            :     {
     909                 :            :         try
     910                 :            :         {
     911 [ +  - ][ +  - ]:       2921 :             Reference<XComponent > xComp( Reference<XComponent >::query( *aIt++ ) );
                 [ +  - ]
     912         [ +  - ]:       2921 :             if( xComp.is() )
     913 [ +  - ][ +  - ]:       2921 :                 xComp->dispose();
                 [ #  # ]
     914                 :            :         }
     915         [ #  # ]:          0 :         catch (const RuntimeException & exc)
     916                 :            :         {
     917                 :            : #if OSL_DEBUG_LEVEL > 1
     918                 :            :             OString str( OUStringToOString( exc.Message, RTL_TEXTENCODING_ASCII_US ) );
     919                 :            :             OSL_TRACE( "### RuntimeException occurred upon disposing factory: %s", str.getStr() );
     920                 :            : #else
     921                 :            :             (void) exc; // unused
     922                 :            : #endif
     923                 :            :         }
     924                 :            :     }
     925                 :            : 
     926                 :            :     // dispose
     927         [ +  - ]:        362 :     HashSet_Ref aImplMap;
     928                 :            :     {
     929         [ +  - ]:        362 :         MutexGuard aGuard( m_mutex );
     930                 :            :         // erase all members
     931 [ +  - ][ +  - ]:        362 :         m_ServiceMap = HashMultimap_OWString_Interface();
                 [ +  - ]
     932         [ +  - ]:        362 :         aImplMap = m_ImplementationMap;
     933 [ +  - ][ +  - ]:        362 :         m_ImplementationMap = HashSet_Ref();
                 [ +  - ]
     934 [ +  - ][ +  - ]:        362 :         m_ImplementationNameMap = HashMap_OWString_Interface();
                 [ +  - ]
     935 [ +  - ][ +  - ]:        362 :         m_SetLoadedFactories= HashSet_Ref();
         [ +  - ][ +  - ]
     936                 :            :     }
     937                 :            : 
     938                 :        362 :     m_xContext.clear();
     939                 :            : 
     940                 :            :     // not only the Event should hold the object
     941                 :            :     OSL_ASSERT( m_refCount != 1 );
     942                 :            : 
     943                 :            :     // Revoke this service manager as unloading listener
     944         [ +  - ]:        362 :     rtl_removeUnloadingListener( m_nUnloadingListenerId);
     945 [ +  - ][ +  - ]:        362 :     m_nUnloadingListenerId=0;
     946                 :        362 : }
     947                 :            : 
     948                 :            : // XPropertySet
     949                 :          0 : Reference<XPropertySetInfo > OServiceManager::getPropertySetInfo()
     950                 :            :     throw(::com::sun::star::uno::RuntimeException)
     951                 :            : {
     952                 :          0 :     check_undisposed();
     953         [ #  # ]:          0 :     if (! m_xPropertyInfo.is())
     954                 :            :     {
     955         [ #  # ]:          0 :         Sequence< beans::Property > seq( 1 );
     956         [ #  # ]:          0 :         seq[ 0 ] = beans::Property(
     957 [ #  # ][ #  # ]:          0 :             OUSTR("DefaultContext"), -1, ::getCppuType( &m_xContext ), 0 );
     958 [ #  # ][ #  # ]:          0 :         Reference< beans::XPropertySetInfo > xInfo( new PropertySetInfo_Impl( seq ) );
                 [ #  # ]
     959                 :            : 
     960         [ #  # ]:          0 :         MutexGuard aGuard( m_mutex );
     961         [ #  # ]:          0 :         if (! m_xPropertyInfo.is())
     962                 :            :         {
     963         [ #  # ]:          0 :             m_xPropertyInfo = xInfo;
     964 [ #  # ][ #  # ]:          0 :         }
     965                 :            :     }
     966                 :          0 :     return m_xPropertyInfo;
     967                 :            : }
     968                 :            : 
     969                 :        399 : void OServiceManager::setPropertyValue(
     970                 :            :     const OUString& PropertyName, const Any& aValue )
     971                 :            :     throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
     972                 :            : {
     973                 :        399 :     check_undisposed();
     974         [ +  - ]:        399 :     if ( PropertyName == "DefaultContext" )
     975                 :            :     {
     976                 :        399 :         Reference< XComponentContext > xContext;
     977 [ +  - ][ +  - ]:        399 :         if (aValue >>= xContext)
     978                 :            :         {
     979         [ +  - ]:        399 :             MutexGuard aGuard( m_mutex );
     980 [ +  - ][ +  - ]:        399 :             m_xContext = xContext;
     981                 :            :         }
     982                 :            :         else
     983                 :            :         {
     984                 :            :             throw IllegalArgumentException(
     985                 :            :                 OUString( RTL_CONSTASCII_USTRINGPARAM("no XComponentContext given!") ),
     986 [ #  # ][ #  # ]:          0 :                 (OWeakObject *)this, 1 );
                 [ #  # ]
     987                 :        399 :         }
     988                 :            :     }
     989                 :            :     else
     990                 :            :     {
     991                 :            :         throw UnknownPropertyException(
     992                 :            :             OUString( RTL_CONSTASCII_USTRINGPARAM("unknown property ") ) + PropertyName,
     993 [ #  # ][ #  # ]:          0 :             (OWeakObject *)this );
                 [ #  # ]
     994                 :            :     }
     995                 :        399 : }
     996                 :            : 
     997                 :          0 : Any OServiceManager::getPropertyValue(const OUString& PropertyName)
     998                 :            :     throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
     999                 :            : {
    1000                 :          0 :     check_undisposed();
    1001         [ #  # ]:          0 :     if ( PropertyName == "DefaultContext" )
    1002                 :            :     {
    1003         [ #  # ]:          0 :         MutexGuard aGuard( m_mutex );
    1004         [ #  # ]:          0 :         if( m_xContext.is() )
    1005         [ #  # ]:          0 :             return makeAny( m_xContext );
    1006                 :            :         else
    1007         [ #  # ]:          0 :             return Any();
    1008                 :            :     }
    1009                 :            :     else
    1010                 :            :     {
    1011         [ #  # ]:          0 :         UnknownPropertyException except;
    1012         [ #  # ]:          0 :         except.Message = OUString( RTL_CONSTASCII_USTRINGPARAM( "ServiceManager : unknown property " ) );
    1013                 :          0 :         except.Message += PropertyName;
    1014         [ #  # ]:          0 :         throw except;
    1015                 :            :     }
    1016                 :            : }
    1017                 :            : 
    1018                 :          0 : void OServiceManager::addPropertyChangeListener(
    1019                 :            :     const OUString&, const Reference<XPropertyChangeListener >&)
    1020                 :            :     throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
    1021                 :            : {
    1022                 :          0 :     check_undisposed();
    1023         [ #  # ]:          0 :     throw UnknownPropertyException();
    1024                 :            : }
    1025                 :            : 
    1026                 :          0 : void OServiceManager::removePropertyChangeListener(
    1027                 :            :     const OUString&, const Reference<XPropertyChangeListener >&)
    1028                 :            :     throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
    1029                 :            : {
    1030                 :          0 :     check_undisposed();
    1031         [ #  # ]:          0 :     throw UnknownPropertyException();
    1032                 :            : }
    1033                 :            : 
    1034                 :          0 : void OServiceManager::addVetoableChangeListener(
    1035                 :            :     const OUString&, const Reference<XVetoableChangeListener >&)
    1036                 :            :     throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
    1037                 :            : {
    1038                 :          0 :     check_undisposed();
    1039         [ #  # ]:          0 :     throw UnknownPropertyException();
    1040                 :            : }
    1041                 :            : 
    1042                 :          0 : void OServiceManager::removeVetoableChangeListener(
    1043                 :            :     const OUString&, const Reference<XVetoableChangeListener >&)
    1044                 :            :     throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
    1045                 :            : {
    1046                 :          0 :     check_undisposed();
    1047         [ #  # ]:          0 :     throw UnknownPropertyException();
    1048                 :            : }
    1049                 :            : 
    1050                 :            : // OServiceManager
    1051                 :       6861 : Reference<XEventListener > OServiceManager::getFactoryListener()
    1052                 :            : {
    1053         [ +  - ]:       6861 :     check_undisposed();
    1054         [ +  - ]:       6861 :     MutexGuard aGuard( m_mutex );
    1055         [ +  + ]:       6861 :     if( !xFactoryListener.is() )
    1056 [ +  - ][ +  - ]:        756 :         xFactoryListener = new OServiceManager_Listener( this );
         [ +  - ][ +  - ]
    1057         [ +  - ]:       6861 :     return xFactoryListener;
    1058                 :            : }
    1059                 :            : 
    1060                 :            : // XMultiServiceFactory, XContentEnumeration
    1061                 :          0 : Sequence< OUString > OServiceManager::getUniqueAvailableServiceNames(
    1062                 :            :     HashSet_OWString & aNameSet )
    1063                 :            : {
    1064         [ #  # ]:          0 :     check_undisposed();
    1065         [ #  # ]:          0 :     MutexGuard aGuard( m_mutex );
    1066         [ #  # ]:          0 :     HashMultimap_OWString_Interface::iterator aSIt = m_ServiceMap.begin();
    1067 [ #  # ][ #  # ]:          0 :     while( aSIt != m_ServiceMap.end() )
    1068 [ #  # ][ #  # ]:          0 :         aNameSet.insert( (*aSIt++).first );
                 [ #  # ]
    1069                 :            : 
    1070                 :            :     /* do not return the implementation names
    1071                 :            :     HashMap_OWString_Interface      m_ImplementationNameMap;
    1072                 :            :     HashMap_OWString_Interface::iterator aIt = m_ImplementationNameMap.begin();
    1073                 :            :     while( aIt != m_ImplementationNameMap.end() )
    1074                 :            :         aNameSet.insert( (*aIt++).first );
    1075                 :            :     */
    1076                 :            : 
    1077         [ #  # ]:          0 :     Sequence< OUString > aNames( aNameSet.size() );
    1078         [ #  # ]:          0 :     OUString * pArray = aNames.getArray();
    1079                 :          0 :     sal_Int32 i = 0;
    1080         [ #  # ]:          0 :     HashSet_OWString::iterator next = aNameSet.begin();
    1081 [ #  # ][ #  # ]:          0 :     while( next != aNameSet.end() )
    1082 [ #  # ][ #  # ]:          0 :         pArray[i++] = (*next++);
    1083                 :            : 
    1084         [ #  # ]:          0 :     return aNames;
    1085                 :            : }
    1086                 :            : 
    1087                 :            : // XMultiComponentFactory
    1088                 :       1217 : Reference< XInterface > OServiceManager::createInstanceWithContext(
    1089                 :            :     OUString const & rServiceSpecifier,
    1090                 :            :     Reference< XComponentContext > const & xContext )
    1091                 :            :     throw (Exception, RuntimeException)
    1092                 :            : {
    1093         [ +  - ]:       1217 :     check_undisposed();
    1094                 :            : #if OSL_DEBUG_LEVEL > 0
    1095                 :            :     Reference< beans::XPropertySet > xProps( xContext->getServiceManager(), UNO_QUERY );
    1096                 :            :     OSL_ASSERT( xProps.is() );
    1097                 :            :     if (xProps.is())
    1098                 :            :     {
    1099                 :            :         Reference< XComponentContext > xDefContext;
    1100                 :            :         xProps->getPropertyValue(
    1101                 :            :             OUString( RTL_CONSTASCII_USTRINGPARAM("DefaultContext") ) ) >>= xDefContext;
    1102                 :            :         OSL_ENSURE(
    1103                 :            :             xContext == xDefContext,
    1104                 :            :             "### default context of service manager singleton differs from context holding it!" );
    1105                 :            :     }
    1106                 :            : #endif
    1107                 :            : 
    1108                 :            :     Sequence< Reference< XInterface > > factories(
    1109         [ +  - ]:       1217 :         queryServiceFactories( rServiceSpecifier, xContext ) );
    1110                 :       1217 :     Reference< XInterface > const * p = factories.getConstArray();
    1111         [ +  - ]:       1217 :     for ( sal_Int32 nPos = 0; nPos < factories.getLength(); ++nPos )
    1112                 :            :     {
    1113                 :            :         try
    1114                 :            :         {
    1115                 :       1217 :             Reference< XInterface > const & xFactory = p[ nPos ];
    1116         [ +  - ]:       1217 :             if (xFactory.is())
    1117                 :            :             {
    1118         [ +  - ]:       1217 :                 Reference< XSingleComponentFactory > xFac( xFactory, UNO_QUERY );
    1119         [ +  - ]:       1217 :                 if (xFac.is())
    1120                 :            :                 {
    1121 [ +  - ][ +  - ]:       1217 :                     return xFac->createInstanceWithContext( xContext );
    1122                 :            :                 }
    1123                 :            :                 else
    1124                 :            :                 {
    1125         [ #  # ]:          0 :                     Reference< XSingleServiceFactory > xFac2( xFactory, UNO_QUERY );
    1126         [ #  # ]:          0 :                     if (xFac2.is())
    1127                 :            :                     {
    1128                 :            : #if OSL_DEBUG_LEVEL > 1
    1129                 :            :                         OString aStr( OUStringToOString( rServiceSpecifier, RTL_TEXTENCODING_ASCII_US ) );
    1130                 :            :                         OSL_TRACE( "### ignoring given context raising service %s !!!", aStr.getStr() );
    1131                 :            : #endif
    1132 [ #  # ][ #  # ]:          0 :                         return xFac2->createInstance();
    1133         [ #  # ]:          0 :                     }
    1134 [ -  + ][ #  # ]:       1217 :                 }
    1135                 :            :             }
    1136                 :            :         }
    1137         [ #  # ]:          0 :         catch (const lang::DisposedException & exc)
    1138                 :            :         {
    1139                 :            : #if OSL_DEBUG_LEVEL > 1
    1140                 :            :             OString str( OUStringToOString( exc.Message, RTL_TEXTENCODING_ASCII_US ) );
    1141                 :            :             OSL_TRACE( "### DisposedException occurred: %s", str.getStr() );
    1142                 :            : #else
    1143                 :            :             (void) exc; // unused
    1144                 :            : #endif
    1145                 :            :         }
    1146                 :            :     }
    1147                 :            : 
    1148         [ +  - ]:       1217 :     return Reference< XInterface >();
    1149                 :            : }
    1150                 :            : // XMultiComponentFactory
    1151                 :         15 : Reference< XInterface > OServiceManager::createInstanceWithArgumentsAndContext(
    1152                 :            :     OUString const & rServiceSpecifier,
    1153                 :            :     Sequence< Any > const & rArguments,
    1154                 :            :     Reference< XComponentContext > const & xContext )
    1155                 :            :     throw (Exception, RuntimeException)
    1156                 :            : {
    1157         [ +  - ]:         15 :     check_undisposed();
    1158                 :            : #if OSL_DEBUG_LEVEL > 0
    1159                 :            :     Reference< beans::XPropertySet > xProps( xContext->getServiceManager(), UNO_QUERY );
    1160                 :            :     OSL_ASSERT( xProps.is() );
    1161                 :            :     if (xProps.is())
    1162                 :            :     {
    1163                 :            :         Reference< XComponentContext > xDefContext;
    1164                 :            :         xProps->getPropertyValue(
    1165                 :            :             OUString( RTL_CONSTASCII_USTRINGPARAM("DefaultContext") ) ) >>= xDefContext;
    1166                 :            :         OSL_ENSURE(
    1167                 :            :             xContext == xDefContext,
    1168                 :            :             "### default context of service manager singleton differs from context holding it!" );
    1169                 :            :     }
    1170                 :            : #endif
    1171                 :            : 
    1172                 :            :     Sequence< Reference< XInterface > > factories(
    1173         [ +  - ]:         15 :         queryServiceFactories( rServiceSpecifier, xContext ) );
    1174                 :         15 :     Reference< XInterface > const * p = factories.getConstArray();
    1175         [ +  - ]:         15 :     for ( sal_Int32 nPos = 0; nPos < factories.getLength(); ++nPos )
    1176                 :            :     {
    1177                 :            :         try
    1178                 :            :         {
    1179                 :         15 :             Reference< XInterface > const & xFactory = p[ nPos ];
    1180         [ +  - ]:         15 :             if (xFactory.is())
    1181                 :            :             {
    1182         [ +  - ]:         15 :                 Reference< XSingleComponentFactory > xFac( xFactory, UNO_QUERY );
    1183         [ +  - ]:         15 :                 if (xFac.is())
    1184                 :            :                 {
    1185 [ +  - ][ +  - ]:         15 :                     return xFac->createInstanceWithArgumentsAndContext( rArguments, xContext );
    1186                 :            :                 }
    1187                 :            :                 else
    1188                 :            :                 {
    1189         [ #  # ]:          0 :                     Reference< XSingleServiceFactory > xFac2( xFactory, UNO_QUERY );
    1190         [ #  # ]:          0 :                     if (xFac2.is())
    1191                 :            :                     {
    1192                 :            : #if OSL_DEBUG_LEVEL > 1
    1193                 :            :                         OString aStr( OUStringToOString( rServiceSpecifier, RTL_TEXTENCODING_ASCII_US ) );
    1194                 :            :                         OSL_TRACE( "### ignoring given context raising service %s !!!", aStr.getStr() );
    1195                 :            : #endif
    1196 [ #  # ][ #  # ]:          0 :                         return xFac2->createInstanceWithArguments( rArguments );
    1197         [ #  # ]:          0 :                     }
    1198 [ -  + ][ #  # ]:         15 :                 }
    1199                 :            :             }
    1200                 :            :         }
    1201         [ #  # ]:          0 :         catch (const lang::DisposedException & exc)
    1202                 :            :         {
    1203                 :            : #if OSL_DEBUG_LEVEL > 1
    1204                 :            :             OString str( OUStringToOString( exc.Message, RTL_TEXTENCODING_ASCII_US ) );
    1205                 :            :             OSL_TRACE( "### DisposedException occurred: %s", str.getStr() );
    1206                 :            : #else
    1207                 :            :             (void) exc; // unused
    1208                 :            : #endif
    1209                 :            :         }
    1210                 :            :     }
    1211                 :            : 
    1212         [ +  - ]:         15 :     return Reference< XInterface >();
    1213                 :            : }
    1214                 :            : 
    1215                 :            : // XMultiServiceFactory, XMultiComponentFactory, XContentEnumeration
    1216                 :          0 : Sequence< OUString > OServiceManager::getAvailableServiceNames()
    1217                 :            :     throw(::com::sun::star::uno::RuntimeException)
    1218                 :            : {
    1219         [ #  # ]:          0 :     check_undisposed();
    1220                 :            :     // all names
    1221         [ #  # ]:          0 :     HashSet_OWString aNameSet;
    1222 [ #  # ][ #  # ]:          0 :     return getUniqueAvailableServiceNames( aNameSet );
    1223                 :            : }
    1224                 :            : 
    1225                 :            : // XMultibleServiceFactory
    1226                 :        808 : Reference<XInterface > OServiceManager::createInstance(
    1227                 :            :     const OUString& rServiceSpecifier )
    1228                 :            :     throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException)
    1229                 :            : {
    1230                 :            :     return createInstanceWithContext(
    1231                 :        808 :         rServiceSpecifier, m_xContext );
    1232                 :            : }
    1233                 :            : 
    1234                 :            : // XMultibleServiceFactory
    1235                 :          0 : Reference<XInterface > OServiceManager::createInstanceWithArguments(
    1236                 :            :     const OUString& rServiceSpecifier,
    1237                 :            :     const Sequence<Any >& rArguments )
    1238                 :            :     throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException)
    1239                 :            : {
    1240                 :            :     return createInstanceWithArgumentsAndContext(
    1241                 :          0 :         rServiceSpecifier, rArguments, m_xContext );
    1242                 :            : }
    1243                 :            : 
    1244                 :            : // XInitialization
    1245                 :          0 : void OServiceManager::initialize( Sequence< Any > const & )
    1246                 :            :     throw (Exception)
    1247                 :            : {
    1248                 :          0 :     check_undisposed();
    1249                 :            :     OSL_FAIL( "not impl!" );
    1250                 :          0 : }
    1251                 :            : 
    1252                 :            : // XServiceInfo
    1253                 :          0 : OUString OServiceManager::getImplementationName()
    1254                 :            :     throw(::com::sun::star::uno::RuntimeException)
    1255                 :            : {
    1256                 :          0 :     check_undisposed();
    1257                 :          0 :     return getImplementationName_Static();
    1258                 :            : }
    1259                 :            : 
    1260                 :            : // XServiceInfo
    1261                 :          0 : sal_Bool OServiceManager::supportsService(const OUString& ServiceName)
    1262                 :            :     throw(::com::sun::star::uno::RuntimeException)
    1263                 :            : {
    1264         [ #  # ]:          0 :     check_undisposed();
    1265         [ #  # ]:          0 :     Sequence< OUString > aSNL = getSupportedServiceNames();
    1266                 :          0 :     const OUString * pArray = aSNL.getConstArray();
    1267         [ #  # ]:          0 :     for( sal_Int32 i = 0; i < aSNL.getLength(); i++ )
    1268         [ #  # ]:          0 :         if( pArray[i] == ServiceName )
    1269                 :          0 :             return sal_True;
    1270         [ #  # ]:          0 :     return sal_False;
    1271                 :            : }
    1272                 :            : 
    1273                 :            : // XServiceInfo
    1274                 :          0 : Sequence< OUString > OServiceManager::getSupportedServiceNames()
    1275                 :            :     throw(::com::sun::star::uno::RuntimeException)
    1276                 :            : {
    1277                 :          0 :     check_undisposed();
    1278                 :          0 :     return stoc_bootstrap::smgr_getSupportedServiceNames();
    1279                 :            : }
    1280                 :            : 
    1281                 :            : 
    1282                 :       1232 : Sequence< Reference< XInterface > > OServiceManager::queryServiceFactories(
    1283                 :            :     const OUString& aServiceName, Reference< XComponentContext > const & )
    1284                 :            : {
    1285         [ +  - ]:       1232 :     Sequence< Reference< XInterface > > ret;
    1286                 :            : 
    1287         [ +  - ]:       1232 :     MutexGuard aGuard( m_mutex );
    1288                 :            :     ::std::pair<
    1289                 :            :           HashMultimap_OWString_Interface::iterator,
    1290                 :            :           HashMultimap_OWString_Interface::iterator> p(
    1291         [ +  - ]:       1232 :               m_ServiceMap.equal_range( aServiceName ) );
    1292                 :            : 
    1293         [ +  + ]:       1232 :     if (p.first == p.second) // no factories
    1294                 :            :     {
    1295                 :            :         // no service found, look for an implementation
    1296         [ +  - ]:        813 :         HashMap_OWString_Interface::iterator aIt = m_ImplementationNameMap.find( aServiceName );
    1297 [ +  - ][ +  + ]:        813 :         if( aIt != m_ImplementationNameMap.end() )
    1298                 :            :         {
    1299         [ +  - ]:        399 :             Reference< XInterface > const & x = aIt->second;
    1300                 :            :             // an implementation found
    1301 [ +  - ][ +  - ]:        813 :             ret = Sequence< Reference< XInterface > >( &x, 1 );
                 [ +  - ]
    1302                 :            :         }
    1303                 :            :     }
    1304                 :            :     else
    1305                 :            :     {
    1306         [ +  - ]:        419 :         ::std::vector< Reference< XInterface > > vec;
    1307         [ +  - ]:        419 :         vec.reserve( 4 );
    1308         [ +  + ]:        838 :         while (p.first != p.second)
    1309                 :            :         {
    1310 [ +  - ][ +  - ]:        419 :             vec.push_back( p.first->second );
    1311                 :        419 :             ++p.first;
    1312                 :            :         }
    1313                 :            :         ret = Sequence< Reference< XInterface > >(
    1314 [ -  + ][ +  - ]:        419 :             vec.empty() ? 0 : &vec[ 0 ], vec.size() );
         [ +  - ][ +  - ]
    1315                 :            :     }
    1316                 :            : 
    1317         [ +  - ]:       1232 :     return ret;
    1318                 :            : }
    1319                 :            : 
    1320                 :            : // XContentEnumerationAccess
    1321                 :          0 : Reference<XEnumeration > OServiceManager::createContentEnumeration(
    1322                 :            :     const OUString& aServiceName )
    1323                 :            :     throw(::com::sun::star::uno::RuntimeException)
    1324                 :            : {
    1325         [ #  # ]:          0 :     check_undisposed();
    1326                 :            :     Sequence< Reference< XInterface > > factories(
    1327         [ #  # ]:          0 :         OServiceManager::queryServiceFactories( aServiceName, m_xContext ) );
    1328         [ #  # ]:          0 :     if (factories.getLength())
    1329 [ #  # ][ #  # ]:          0 :         return new ServiceEnumeration_Impl( factories );
                 [ #  # ]
    1330                 :            :     else
    1331         [ #  # ]:          0 :         return Reference< XEnumeration >();
    1332                 :            : }
    1333                 :            : 
    1334                 :            : // XEnumeration
    1335                 :          0 : Reference<XEnumeration > OServiceManager::createEnumeration() throw(::com::sun::star::uno::RuntimeException)
    1336                 :            : {
    1337         [ #  # ]:          0 :     check_undisposed();
    1338         [ #  # ]:          0 :     MutexGuard aGuard( m_mutex );
    1339 [ #  # ][ #  # ]:          0 :     return new ImplementationEnumeration_Impl( m_ImplementationMap );
         [ #  # ][ #  # ]
    1340                 :            : }
    1341                 :            : 
    1342                 :            : // XElementAccess
    1343                 :          0 : Type OServiceManager::getElementType()
    1344                 :            :     throw(::com::sun::star::uno::RuntimeException)
    1345                 :            : {
    1346                 :          0 :     check_undisposed();
    1347                 :          0 :     return ::getCppuType( (const Reference< XInterface > *)0 );
    1348                 :            : }
    1349                 :            : 
    1350                 :            : // XElementAccess
    1351                 :          0 : sal_Bool OServiceManager::hasElements()
    1352                 :            :     throw(::com::sun::star::uno::RuntimeException)
    1353                 :            : {
    1354         [ #  # ]:          0 :     check_undisposed();
    1355         [ #  # ]:          0 :     MutexGuard aGuard( m_mutex );
    1356         [ #  # ]:          0 :     return !m_ImplementationMap.empty();
    1357                 :            : }
    1358                 :            : 
    1359                 :            : // XSet
    1360                 :          0 : sal_Bool OServiceManager::has( const Any & Element )
    1361                 :            :     throw(::com::sun::star::uno::RuntimeException)
    1362                 :            : {
    1363                 :          0 :     check_undisposed();
    1364         [ #  # ]:          0 :     if( Element.getValueTypeClass() == TypeClass_INTERFACE )
    1365                 :            :     {
    1366         [ #  # ]:          0 :         Reference<XInterface > xEle( Element, UNO_QUERY_THROW );
    1367         [ #  # ]:          0 :         MutexGuard aGuard( m_mutex );
    1368                 :          0 :         return m_ImplementationMap.find( xEle ) !=
    1369 [ #  # ][ #  # ]:          0 :             m_ImplementationMap.end();
                 [ #  # ]
    1370                 :            :     }
    1371         [ #  # ]:          0 :     else if (Element.getValueTypeClass() == TypeClass_STRING)
    1372                 :            :     {
    1373                 :            :         OUString const & implName =
    1374                 :          0 :             *reinterpret_cast< OUString const * >(Element.getValue());
    1375         [ #  # ]:          0 :         MutexGuard aGuard( m_mutex );
    1376                 :          0 :         return m_ImplementationNameMap.find( implName ) !=
    1377 [ #  # ][ #  # ]:          0 :             m_ImplementationNameMap.end();
                 [ #  # ]
    1378                 :            :     }
    1379                 :          0 :     return sal_False;
    1380                 :            : }
    1381                 :            : 
    1382                 :            : // XSet
    1383                 :       6861 : void OServiceManager::insert( const Any & Element )
    1384                 :            :     throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::ElementExistException, ::com::sun::star::uno::RuntimeException)
    1385                 :            : {
    1386         [ +  - ]:       6861 :     check_undisposed();
    1387         [ -  + ]:       6861 :     if( Element.getValueTypeClass() != TypeClass_INTERFACE )
    1388                 :            :     {
    1389                 :            :         throw IllegalArgumentException(
    1390                 :            :             OUString( RTL_CONSTASCII_USTRINGPARAM("no interface given!") ),
    1391 [ #  # ][ #  # ]:          0 :             Reference< XInterface >(), 0 );
    1392                 :            :     }
    1393         [ +  - ]:       6861 :     Reference<XInterface > xEle( Element, UNO_QUERY_THROW );
    1394                 :            : 
    1395                 :            :     {
    1396         [ +  - ]:       6861 :     MutexGuard aGuard( m_mutex );
    1397         [ +  - ]:       6861 :     HashSet_Ref::iterator aIt = m_ImplementationMap.find( xEle );
    1398 [ +  - ][ -  + ]:       6861 :     if( aIt != m_ImplementationMap.end() )
    1399                 :            :     {
    1400                 :            :         throw ElementExistException(
    1401                 :            :             OUString( RTL_CONSTASCII_USTRINGPARAM("element already exists!") ),
    1402 [ #  # ][ #  # ]:          0 :             Reference< XInterface >() );
    1403                 :            :     }
    1404                 :            : 
    1405                 :            :     // put into the implementation hashmap
    1406         [ +  - ]:       6861 :     m_ImplementationMap.insert( xEle );
    1407                 :            : 
    1408                 :            :     // put into the implementation name hashmap
    1409         [ +  - ]:       6861 :     Reference<XServiceInfo > xInfo( Reference<XServiceInfo >::query( xEle ) );
    1410         [ +  - ]:       6861 :     if( xInfo.is() )
    1411                 :            :     {
    1412 [ +  - ][ +  - ]:       6861 :         OUString aImplName = xInfo->getImplementationName();
    1413         [ +  - ]:       6861 :         if( !aImplName.isEmpty() )
    1414 [ +  - ][ +  - ]:       6861 :             m_ImplementationNameMap[ aImplName ] = xEle;
    1415                 :            : 
    1416                 :            :         //put into the service map
    1417 [ +  - ][ +  - ]:       6861 :         Sequence< OUString > aServiceNames = xInfo->getSupportedServiceNames();
    1418                 :       6861 :         const OUString * pArray = aServiceNames.getConstArray();
    1419         [ +  + ]:      13722 :         for( sal_Int32 i = 0; i < aServiceNames.getLength(); i++ )
    1420                 :            :         {
    1421                 :            :             m_ServiceMap.insert( HashMultimap_OWString_Interface::value_type(
    1422 [ +  - ][ +  - ]:       6861 :                 pArray[i], *(Reference<XInterface > *)Element.getValue() ) );
                 [ +  - ]
    1423         [ +  - ]:       6861 :         }
    1424         [ +  - ]:       6861 :     }
    1425                 :            :     }
    1426                 :            :     // add the disposing listener to the factory
    1427         [ +  - ]:       6861 :     Reference<XComponent > xComp( Reference<XComponent >::query( xEle ) );
    1428         [ +  - ]:       6861 :     if( xComp.is() )
    1429 [ +  - ][ +  - ]:       6861 :         xComp->addEventListener( getFactoryListener() );
                 [ +  - ]
    1430                 :       6861 : }
    1431                 :            : 
    1432                 :            : // helper function
    1433                 :          0 : sal_Bool OServiceManager::haveFactoryWithThisImplementation(const OUString& aImplName)
    1434                 :            : {
    1435         [ #  # ]:          0 :     return ( m_ImplementationNameMap.find(aImplName) != m_ImplementationNameMap.end());
    1436                 :            : }
    1437                 :            : 
    1438                 :            : // XSet
    1439                 :         65 : void OServiceManager::remove( const Any & Element )
    1440                 :            :      throw(::com::sun::star::lang::IllegalArgumentException,
    1441                 :            :            ::com::sun::star::container::NoSuchElementException,
    1442                 :            :            ::com::sun::star::uno::RuntimeException)
    1443                 :            : {
    1444         [ -  + ]:         65 :     if (is_disposed())
    1445                 :         65 :         return;
    1446                 :            : 
    1447                 :          0 :     Reference<XInterface > xEle;
    1448         [ #  # ]:          0 :     if (Element.getValueTypeClass() == TypeClass_INTERFACE)
    1449                 :            :     {
    1450         [ #  # ]:          0 :         xEle.set( Element, UNO_QUERY_THROW );
    1451                 :            :     }
    1452         [ #  # ]:          0 :     else if (Element.getValueTypeClass() == TypeClass_STRING)
    1453                 :            :     {
    1454                 :            :         OUString const & implName =
    1455                 :          0 :             *reinterpret_cast< OUString const * >(Element.getValue());
    1456         [ #  # ]:          0 :         MutexGuard aGuard( m_mutex );
    1457                 :            :         HashMap_OWString_Interface::const_iterator const iFind(
    1458         [ #  # ]:          0 :             m_ImplementationNameMap.find( implName ) );
    1459 [ #  # ][ #  # ]:          0 :         if (iFind == m_ImplementationNameMap.end())
    1460                 :            :         {
    1461                 :            :             throw NoSuchElementException(
    1462                 :            :                 OUString( RTL_CONSTASCII_USTRINGPARAM("element is not in: ") )
    1463 [ #  # ][ #  # ]:          0 :                 + implName, static_cast< OWeakObject * >(this) );
                 [ #  # ]
    1464                 :            :         }
    1465 [ #  # ][ #  # ]:          0 :         xEle = iFind->second;
                 [ #  # ]
    1466                 :            :     }
    1467                 :            :     else
    1468                 :            :     {
    1469                 :            :         throw IllegalArgumentException(
    1470                 :            :             OUString( RTL_CONSTASCII_USTRINGPARAM(
    1471                 :            :                           "neither interface nor string given!") ),
    1472 [ #  # ][ #  # ]:          0 :             Reference< XInterface >(), 0 );
    1473                 :            :     }
    1474                 :            : 
    1475                 :            :     // remove the disposing listener from the factory
    1476         [ #  # ]:          0 :     Reference<XComponent > xComp( Reference<XComponent >::query( xEle ) );
    1477         [ #  # ]:          0 :     if( xComp.is() )
    1478 [ #  # ][ #  # ]:          0 :         xComp->removeEventListener( getFactoryListener() );
                 [ #  # ]
    1479                 :            : 
    1480         [ #  # ]:          0 :     MutexGuard aGuard( m_mutex );
    1481         [ #  # ]:          0 :     HashSet_Ref::iterator aIt = m_ImplementationMap.find( xEle );
    1482 [ #  # ][ #  # ]:          0 :     if( aIt == m_ImplementationMap.end() )
    1483                 :            :     {
    1484                 :            :         throw NoSuchElementException(
    1485                 :            :             OUString( RTL_CONSTASCII_USTRINGPARAM("element is not in!") ),
    1486 [ #  # ][ #  # ]:          0 :             static_cast< OWeakObject * >(this) );
                 [ #  # ]
    1487                 :            :     }
    1488                 :            :     //First remove all factories which have been loaded by ORegistryServiceManager.
    1489 [ #  # ][ #  # ]:          0 :     m_SetLoadedFactories.erase( *aIt);
    1490                 :            :     //Remove from the implementation map. It contains all factories of m_SetLoadedFactories
    1491                 :            :     //which have been added directly through XSet, that is not via ORegistryServiceManager
    1492         [ #  # ]:          0 :     m_ImplementationMap.erase( aIt );
    1493                 :            : 
    1494                 :            :     // remove from the implementation name hashmap
    1495         [ #  # ]:          0 :     Reference<XServiceInfo > xInfo( Reference<XServiceInfo >::query( xEle ) );
    1496         [ #  # ]:          0 :     if( xInfo.is() )
    1497                 :            :     {
    1498 [ #  # ][ #  # ]:          0 :         OUString aImplName = xInfo->getImplementationName();
    1499         [ #  # ]:          0 :         if( !aImplName.isEmpty() )
    1500         [ #  # ]:          0 :             m_ImplementationNameMap.erase( aImplName );
    1501                 :            :     }
    1502                 :            : 
    1503                 :            :     //remove from the service map
    1504         [ #  # ]:          0 :     Reference<XServiceInfo > xSF( Reference<XServiceInfo >::query( xEle ) );
    1505         [ #  # ]:          0 :     if( xSF.is() )
    1506                 :            :     {
    1507 [ #  # ][ #  # ]:          0 :         Sequence< OUString > aServiceNames = xSF->getSupportedServiceNames();
    1508                 :          0 :         const OUString * pArray = aServiceNames.getConstArray();
    1509         [ #  # ]:          0 :         for( sal_Int32 i = 0; i < aServiceNames.getLength(); i++ )
    1510                 :            :         {
    1511                 :            :             pair<HashMultimap_OWString_Interface::iterator, HashMultimap_OWString_Interface::iterator> p =
    1512         [ #  # ]:          0 :                 m_ServiceMap.equal_range( pArray[i] );
    1513                 :            : 
    1514         [ #  # ]:          0 :             while( p.first != p.second )
    1515                 :            :             {
    1516 [ #  # ][ #  # ]:          0 :                 if( xEle == (*p.first).second )
                 [ #  # ]
    1517                 :            :                 {
    1518         [ #  # ]:          0 :                     m_ServiceMap.erase( p.first );
    1519                 :          0 :                     break;
    1520                 :            :                 }
    1521                 :          0 :                 ++p.first;
    1522                 :            :             }
    1523         [ #  # ]:          0 :         }
    1524         [ #  # ]:         65 :     }
    1525                 :            : }
    1526                 :            : 
    1527                 :            : /*****************************************************************************
    1528                 :            :     class ORegistryServiceManager
    1529                 :            : *****************************************************************************/
    1530                 :            : class ORegistryServiceManager : public OServiceManager
    1531                 :            : {
    1532                 :            : public:
    1533                 :            :     ORegistryServiceManager( Reference< XComponentContext > const & xContext );
    1534                 :            :     virtual ~ORegistryServiceManager();
    1535                 :            : 
    1536                 :            :     // XInitialization
    1537                 :            :     void SAL_CALL initialize(const Sequence< Any >& Arguments)
    1538                 :            :         throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
    1539                 :            : 
    1540                 :            :     // XServiceInfo
    1541                 :          0 :     OUString SAL_CALL getImplementationName() throw(::com::sun::star::uno::RuntimeException)
    1542                 :          0 :         { return stoc_bootstrap::regsmgr_getImplementationName(); }
    1543                 :            : 
    1544                 :            :     Sequence< OUString > SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException);
    1545                 :            : 
    1546                 :            :     // XMultiServiceFactory
    1547                 :            :     Sequence< OUString > SAL_CALL getAvailableServiceNames() throw(::com::sun::star::uno::RuntimeException);
    1548                 :            : 
    1549                 :            :     // XContentEnumerationAccess
    1550                 :            :     //Sequence< OUString >          getAvailableServiceNames() throw( (Exception) );
    1551                 :            :     Reference<XEnumeration > SAL_CALL createContentEnumeration(const OUString& aServiceName) throw(::com::sun::star::uno::RuntimeException);
    1552                 :            : 
    1553                 :            :     // XComponent
    1554                 :            :     void SAL_CALL dispose() throw(::com::sun::star::uno::RuntimeException);
    1555                 :            : 
    1556                 :            :     // OServiceManager
    1557                 :            :     Reference<XPropertySetInfo > SAL_CALL getPropertySetInfo()
    1558                 :            :         throw(::com::sun::star::uno::RuntimeException);
    1559                 :            :     Any SAL_CALL getPropertyValue(const OUString& PropertyName)
    1560                 :            :         throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    1561                 :            : 
    1562                 :            : protected:
    1563                 :            :     //OServiceManager
    1564                 :            :     Sequence< Reference< XInterface > > queryServiceFactories(
    1565                 :            :         const OUString& aServiceName, Reference< XComponentContext > const & xContext );
    1566                 :            : private:
    1567                 :            :     Reference<XRegistryKey >        getRootKey();
    1568                 :            :     Reference<XInterface > loadWithImplementationName(
    1569                 :            :         const OUString & rImplName, Reference< XComponentContext > const & xContext );
    1570                 :            :     Sequence<OUString>          getFromServiceName(const OUString& serviceName);
    1571                 :            :     Reference<XInterface > loadWithServiceName(
    1572                 :            :         const OUString & rImplName, Reference< XComponentContext > const & xContext );
    1573                 :            :     void                        fillAllNamesFromRegistry( HashSet_OWString & );
    1574                 :            : 
    1575                 :            :     sal_Bool                    m_searchedRegistry;
    1576                 :            :     Reference<XSimpleRegistry > m_xRegistry;    // readonly property Registry
    1577                 :            :     Reference<XRegistryKey >    m_xRootKey;
    1578                 :            : 
    1579                 :            : #if OSL_DEBUG_LEVEL > 0
    1580                 :            :     bool m_init;
    1581                 :            : #endif
    1582                 :            : };
    1583                 :            : 
    1584                 :            : /**
    1585                 :            :  * Create a ServiceManager
    1586                 :            :  */
    1587                 :        756 : ORegistryServiceManager::ORegistryServiceManager( Reference< XComponentContext > const & xContext )
    1588                 :            :     : OServiceManager( xContext )
    1589                 :        756 :     , m_searchedRegistry(sal_False)
    1590                 :            : #if OSL_DEBUG_LEVEL > 0
    1591                 :            :     , m_init( false )
    1592                 :            : #endif
    1593                 :            : {
    1594                 :        756 : }
    1595                 :            : 
    1596                 :            : /**
    1597                 :            :  * Destroy the ServiceManager
    1598                 :            :  */
    1599                 :        362 : ORegistryServiceManager::~ORegistryServiceManager()
    1600                 :            : {
    1601         [ -  + ]:        724 : }
    1602                 :            : 
    1603                 :            : // XComponent
    1604                 :        362 : void ORegistryServiceManager::dispose()
    1605                 :            :     throw(::com::sun::star::uno::RuntimeException)
    1606                 :            : {
    1607 [ +  - ][ +  - ]:        362 :     if (rBHelper.bDisposed || rBHelper.bInDispose)
    1608                 :        362 :         return;
    1609         [ +  - ]:        362 :     OServiceManager::dispose();
    1610                 :            :     // dispose
    1611         [ +  - ]:        362 :     MutexGuard aGuard( m_mutex );
    1612                 :            :     // erase all members
    1613         [ +  - ]:        362 :     m_xRegistry = Reference<XSimpleRegistry >();
    1614 [ +  - ][ +  - ]:        362 :     m_xRootKey = Reference<XRegistryKey >();
    1615                 :            : }
    1616                 :            : 
    1617                 :            : /**
    1618                 :            :  * Return the root key of the registry. The Default registry service is ordered
    1619                 :            :  * if no registry is set.
    1620                 :            :  */
    1621                 :            : //Reference<XServiceProvider > create_DefaultRegistry_ServiceProvider();
    1622                 :            : 
    1623                 :        414 : Reference<XRegistryKey > ORegistryServiceManager::getRootKey()
    1624                 :            : {
    1625         [ +  + ]:        414 :     if( !m_xRootKey.is() )
    1626                 :            :     {
    1627         [ +  - ]:        399 :         MutexGuard aGuard( m_mutex );
    1628                 :            :         //  DefaultRegistry suchen !!!!
    1629 [ -  + ][ #  # ]:        399 :         if( !m_xRegistry.is() && !m_searchedRegistry )
                 [ -  + ]
    1630                 :            :         {
    1631                 :            :             // merken, es wird nur einmal gesucht
    1632                 :          0 :             m_searchedRegistry = sal_True;
    1633                 :            : 
    1634                 :            :             m_xRegistry.set(
    1635                 :            :                 createInstanceWithContext(
    1636                 :            :                     OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.registry.DefaultRegistry") ),
    1637                 :          0 :                     m_xContext ),
    1638 [ #  # ][ #  # ]:          0 :                 UNO_QUERY );
                 [ #  # ]
    1639                 :            :         }
    1640 [ +  - ][ +  - ]:        399 :         if( m_xRegistry.is() && !m_xRootKey.is() )
                 [ +  - ]
    1641 [ +  - ][ +  - ]:        399 :             m_xRootKey = m_xRegistry->getRootKey();
         [ +  - ][ +  - ]
    1642                 :            :     }
    1643                 :            : 
    1644                 :        414 :     return m_xRootKey;
    1645                 :            : }
    1646                 :            : 
    1647                 :            : /**
    1648                 :            :  * Create a service provider from the registry with an implementation name
    1649                 :            :  */
    1650                 :        414 : Reference<XInterface > ORegistryServiceManager::loadWithImplementationName(
    1651                 :            :     const OUString& name, Reference< XComponentContext > const & xContext )
    1652                 :            : {
    1653                 :        414 :     Reference<XInterface > ret;
    1654                 :            : 
    1655         [ +  - ]:        414 :     Reference<XRegistryKey > xRootKey = getRootKey();
    1656         [ +  - ]:        414 :     if( !xRootKey.is() )
    1657                 :            :         return ret;
    1658                 :            : 
    1659                 :            :     try
    1660                 :            :     {
    1661         [ +  - ]:        414 :         OUString implementationName = OUString( RTL_CONSTASCII_USTRINGPARAM("/IMPLEMENTATIONS/") ) + name;
    1662 [ +  - ][ +  - ]:        414 :         Reference<XRegistryKey > xImpKey = m_xRootKey->openKey(implementationName);
    1663                 :            : 
    1664         [ +  - ]:        414 :         if( xImpKey.is() )
    1665                 :            :         {
    1666                 :        414 :             Reference< lang::XMultiServiceFactory > xMgr;
    1667         [ +  - ]:        414 :             if (xContext.is())
    1668 [ +  - ][ +  - ]:        414 :                 xMgr.set( xContext->getServiceManager(), UNO_QUERY_THROW );
                 [ +  - ]
    1669                 :            :             else
    1670         [ #  # ]:          0 :                 xMgr.set( this );
    1671 [ +  - ][ +  - ]:        414 :             ret = createSingleRegistryFactory( xMgr, name, xImpKey );
    1672 [ +  - ][ +  - ]:        414 :             insert( makeAny( ret ) );
    1673                 :            :             // Remember this factory as loaded in contrast to inserted ( XSet::insert)
    1674                 :            :             // factories. Those loaded factories in this set are candidates for being
    1675                 :            :             // released on an unloading notification.
    1676         [ +  - ]:        414 :             m_SetLoadedFactories.insert( ret);
    1677         [ #  # ]:        414 :         }
    1678                 :            :     }
    1679         [ #  # ]:          0 :     catch (InvalidRegistryException &)
    1680                 :            :     {
    1681                 :            :     }
    1682                 :            : 
    1683                 :        414 :     return ret;
    1684                 :            : }
    1685                 :            : 
    1686                 :            : /**
    1687                 :            :  * Return all implementation out of the registry.
    1688                 :            :  */
    1689                 :        414 : Sequence<OUString> ORegistryServiceManager::getFromServiceName(
    1690                 :            :     const OUString& serviceName )
    1691                 :            : {
    1692                 :        414 :     OUStringBuffer buf;
    1693         [ +  - ]:        414 :     buf.appendAscii( RTL_CONSTASCII_STRINGPARAM( "/SERVICES/" ) );
    1694         [ +  - ]:        414 :     buf.append( serviceName );
    1695 [ +  - ][ +  - ]:        414 :     return retrieveAsciiValueList( m_xRegistry, buf.makeStringAndClear() );
    1696                 :            : }
    1697                 :            : 
    1698                 :            : /**
    1699                 :            :  * Create a service provider from the registry
    1700                 :            :  */
    1701                 :        414 : Reference<XInterface > ORegistryServiceManager::loadWithServiceName(
    1702                 :            :     const OUString& serviceName, Reference< XComponentContext > const & xContext )
    1703                 :            : {
    1704         [ +  - ]:        414 :     Sequence<OUString> implEntries = getFromServiceName( serviceName );
    1705         [ +  - ]:        828 :     for (sal_Int32 i = 0; i < implEntries.getLength(); i++)
    1706                 :            :     {
    1707                 :            :         Reference< XInterface > x(
    1708         [ +  - ]:        414 :             loadWithImplementationName( implEntries.getConstArray()[i], xContext ) );
    1709         [ +  - ]:        414 :         if (x.is())
    1710                 :        414 :             return x;
    1711         [ -  + ]:        414 :     }
    1712                 :            : 
    1713         [ +  - ]:        414 :     return Reference<XInterface >();
    1714                 :            : }
    1715                 :            : 
    1716                 :            : /**
    1717                 :            :  * Return a sequence of all service names from the registry.
    1718                 :            :  */
    1719                 :          0 : void ORegistryServiceManager::fillAllNamesFromRegistry( HashSet_OWString & rSet )
    1720                 :            : {
    1721         [ #  # ]:          0 :     Reference<XRegistryKey > xRootKey = getRootKey();
    1722         [ #  # ]:          0 :     if( !xRootKey.is() )
    1723                 :          0 :         return;
    1724                 :            : 
    1725                 :            :     try
    1726                 :            :     {
    1727         [ #  # ]:          0 :         Reference<XRegistryKey > xServicesKey = xRootKey->openKey(
    1728 [ #  # ][ #  # ]:          0 :             OUString( RTL_CONSTASCII_USTRINGPARAM("SERVICES") ) );
    1729                 :            :         // root + /Services + /
    1730         [ #  # ]:          0 :         if( xServicesKey.is() )
    1731                 :            :         {
    1732 [ #  # ][ #  # ]:          0 :             sal_Int32 nPrefix = xServicesKey->getKeyName().getLength() +1;
    1733 [ #  # ][ #  # ]:          0 :             Sequence<Reference<XRegistryKey > > aKeys = xServicesKey->openKeys();
    1734         [ #  # ]:          0 :             for( sal_Int32 i = 0; i < aKeys.getLength(); i++ )
    1735 [ #  # ][ #  # ]:          0 :                 rSet.insert( aKeys.getConstArray()[i]->getKeyName().copy( nPrefix ) );
         [ #  # ][ #  # ]
    1736         [ #  # ]:          0 :         }
    1737                 :            :     }
    1738         [ #  # ]:          0 :     catch (InvalidRegistryException &)
    1739                 :            :     {
    1740         [ #  # ]:          0 :     }
    1741                 :            : }
    1742                 :            : 
    1743                 :            : // XInitialization
    1744                 :        399 : void ORegistryServiceManager::initialize(const Sequence< Any >& Arguments)
    1745                 :            :     throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException)
    1746                 :            : {
    1747         [ +  - ]:        399 :     check_undisposed();
    1748         [ +  - ]:        399 :     MutexGuard aGuard( m_mutex );
    1749         [ +  - ]:        399 :     if (Arguments.getLength() > 0)
    1750                 :            :     {
    1751                 :        399 :         m_xRootKey.clear();
    1752         [ +  - ]:        399 :         Arguments[ 0 ] >>= m_xRegistry;
    1753         [ +  - ]:        399 :     }
    1754                 :            : #if OSL_DEBUG_LEVEL > 0
    1755                 :            :     // to find all bootstrapping processes to be fixed...
    1756                 :            :     OSL_ENSURE( !m_init, "### second init of service manager instance!" );
    1757                 :            :     m_init = true;
    1758                 :            : #endif
    1759                 :        399 : }
    1760                 :            : 
    1761                 :            : // XMultiServiceFactory, XContentEnumeration
    1762                 :          0 : Sequence< OUString > ORegistryServiceManager::getAvailableServiceNames()
    1763                 :            :     throw(::com::sun::star::uno::RuntimeException)
    1764                 :            : {
    1765         [ #  # ]:          0 :     check_undisposed();
    1766         [ #  # ]:          0 :     MutexGuard aGuard( m_mutex );
    1767                 :            :     // all names
    1768         [ #  # ]:          0 :     HashSet_OWString aNameSet;
    1769                 :            : 
    1770                 :            :     // all names from the registry
    1771         [ #  # ]:          0 :     fillAllNamesFromRegistry( aNameSet );
    1772                 :            : 
    1773 [ #  # ][ #  # ]:          0 :     return OServiceManager::getUniqueAvailableServiceNames( aNameSet );
                 [ #  # ]
    1774                 :            : }
    1775                 :            : 
    1776                 :            : // XServiceInfo
    1777                 :          0 : Sequence< OUString > ORegistryServiceManager::getSupportedServiceNames()
    1778                 :            :     throw(::com::sun::star::uno::RuntimeException)
    1779                 :            : {
    1780                 :          0 :     check_undisposed();
    1781                 :          0 :     return stoc_bootstrap::regsmgr_getSupportedServiceNames();
    1782                 :            : }
    1783                 :            : 
    1784                 :            : 
    1785                 :            : // OServiceManager
    1786                 :       1232 : Sequence< Reference< XInterface > > ORegistryServiceManager::queryServiceFactories(
    1787                 :            :     const OUString& aServiceName, Reference< XComponentContext > const & xContext )
    1788                 :            : {
    1789                 :            :     Sequence< Reference< XInterface > > ret(
    1790         [ +  - ]:       1232 :         OServiceManager::queryServiceFactories( aServiceName, xContext ) );
    1791         [ +  + ]:       1232 :     if (ret.getLength())
    1792                 :            :     {
    1793         [ +  - ]:        818 :         return ret;
    1794                 :            :     }
    1795                 :            :     else
    1796                 :            :     {
    1797         [ +  - ]:        414 :         MutexGuard aGuard( m_mutex );
    1798         [ +  - ]:        414 :         Reference< XInterface > x( loadWithServiceName( aServiceName, xContext ) );
    1799         [ -  + ]:        414 :         if (! x.is())
    1800 [ #  # ][ #  # ]:          0 :             x = loadWithImplementationName( aServiceName, xContext );
    1801 [ +  - ][ +  - ]:        414 :         return Sequence< Reference< XInterface > >( &x, 1 );
    1802         [ +  - ]:       1232 :     }
    1803                 :            : }
    1804                 :            : 
    1805                 :            : // XContentEnumerationAccess
    1806                 :          0 : Reference<XEnumeration > ORegistryServiceManager::createContentEnumeration(
    1807                 :            :     const OUString& aServiceName )
    1808                 :            :     throw(::com::sun::star::uno::RuntimeException)
    1809                 :            : {
    1810         [ #  # ]:          0 :     check_undisposed();
    1811         [ #  # ]:          0 :     MutexGuard aGuard( ((ORegistryServiceManager *)this)->m_mutex );
    1812                 :            :     // get all implementation names registered under this service name from the registry
    1813         [ #  # ]:          0 :     Sequence<OUString> aImpls = ((ORegistryServiceManager *)this)->getFromServiceName( aServiceName );
    1814                 :            :     // load and insert all factories specified by the registry
    1815                 :            :     sal_Int32 i;
    1816                 :          0 :     OUString aImplName;
    1817         [ #  # ]:          0 :     for( i = 0; i < aImpls.getLength(); i++ )
    1818                 :            :     {
    1819                 :          0 :         aImplName = aImpls.getConstArray()[i];
    1820 [ #  # ][ #  # ]:          0 :         if ( !haveFactoryWithThisImplementation(aImplName) )
    1821                 :            :         {
    1822         [ #  # ]:          0 :             loadWithImplementationName( aImplName, m_xContext );
    1823                 :            :         }
    1824                 :            :     }
    1825                 :            :     // call the superclass to enumerate all contents
    1826 [ #  # ][ #  # ]:          0 :     return OServiceManager::createContentEnumeration( aServiceName );
                 [ #  # ]
    1827                 :            : }
    1828                 :            : 
    1829                 :            : // OServiceManager
    1830                 :          0 : Reference<XPropertySetInfo > ORegistryServiceManager::getPropertySetInfo()
    1831                 :            :     throw(::com::sun::star::uno::RuntimeException)
    1832                 :            : {
    1833                 :          0 :     check_undisposed();
    1834         [ #  # ]:          0 :     if (! m_xPropertyInfo.is())
    1835                 :            :     {
    1836         [ #  # ]:          0 :         Sequence< beans::Property > seq( 2 );
    1837         [ #  # ]:          0 :         seq[ 0 ] = beans::Property(
    1838 [ #  # ][ #  # ]:          0 :             OUSTR("DefaultContext"), -1, ::getCppuType( &m_xContext ), 0 );
    1839         [ #  # ]:          0 :         seq[ 1 ] = beans::Property(
    1840         [ #  # ]:          0 :             OUSTR("Registry"), -1, ::getCppuType( &m_xRegistry ),
    1841         [ #  # ]:          0 :             beans::PropertyAttribute::READONLY );
    1842 [ #  # ][ #  # ]:          0 :         Reference< beans::XPropertySetInfo > xInfo( new PropertySetInfo_Impl( seq ) );
                 [ #  # ]
    1843                 :            : 
    1844         [ #  # ]:          0 :         MutexGuard aGuard( m_mutex );
    1845         [ #  # ]:          0 :         if (! m_xPropertyInfo.is())
    1846                 :            :         {
    1847         [ #  # ]:          0 :             m_xPropertyInfo = xInfo;
    1848 [ #  # ][ #  # ]:          0 :         }
    1849                 :            :     }
    1850                 :          0 :     return m_xPropertyInfo;
    1851                 :            : }
    1852                 :            : 
    1853                 :          0 : Any ORegistryServiceManager::getPropertyValue(const OUString& PropertyName)
    1854                 :            :     throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
    1855                 :            : {
    1856                 :          0 :     check_undisposed();
    1857         [ #  # ]:          0 :     if ( PropertyName == "Registry" )
    1858                 :            :     {
    1859         [ #  # ]:          0 :         MutexGuard aGuard( m_mutex );
    1860         [ #  # ]:          0 :         if( m_xRegistry.is() )
    1861         [ #  # ]:          0 :             return makeAny( m_xRegistry );
    1862                 :            :         else
    1863         [ #  # ]:          0 :             return Any();
    1864                 :            :     }
    1865                 :          0 :     return OServiceManager::getPropertyValue( PropertyName );
    1866                 :            : }
    1867                 :            : 
    1868                 :            : /* This is the listener function used by the service manager in order
    1869                 :            : to implement the unloading mechanism, id is the this pointer of the
    1870                 :            : service manager instances. On notification, that is the function is being called
    1871                 :            : by rtl_unloadUnusedModules, the cached factroies are being removed from the
    1872                 :            : service manager ( except manually inserted factories).
    1873                 :            : */
    1874                 :          0 : extern "C" void SAL_CALL smgrUnloadingListener(void* id)
    1875                 :            : {
    1876                 :          0 :     stoc_smgr::OServiceManager* pMgr= reinterpret_cast<stoc_smgr::OServiceManager*>( id);
    1877                 :          0 :       pMgr->onUnloadingNotify();
    1878                 :          0 : }
    1879                 :            : 
    1880                 :            : } // namespace
    1881                 :            : 
    1882                 :            : namespace stoc_bootstrap
    1883                 :            : {
    1884                 :            : /**
    1885                 :            :  * Create the ServiceManager
    1886                 :            :  */
    1887                 :          0 : Reference<XInterface > SAL_CALL OServiceManager_CreateInstance(
    1888                 :            :     const Reference< XComponentContext > & xContext )
    1889                 :            : {
    1890                 :            :     return Reference<XInterface >(
    1891                 :            :         static_cast< XInterface * >(
    1892         [ #  # ]:          0 :             static_cast< OWeakObject * >( new stoc_smgr::OServiceManager( xContext ) ) ) );
    1893                 :            : }
    1894                 :            : 
    1895                 :            : /**
    1896                 :            :  * Create the ServiceManager
    1897                 :            :  */
    1898                 :        756 : Reference<XInterface > SAL_CALL ORegistryServiceManager_CreateInstance(
    1899                 :            :     const Reference< XComponentContext > & xContext )
    1900                 :            :     throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException)
    1901                 :            : {
    1902                 :            :     return Reference<XInterface >(
    1903                 :            :         static_cast< XInterface * >(
    1904         [ +  - ]:        756 :             static_cast< OWeakObject * >( new stoc_smgr::ORegistryServiceManager( xContext ) ) ) );
    1905                 :            : }
    1906                 :            : 
    1907                 :         10 : Reference<XInterface > SAL_CALL OServiceManagerWrapper_CreateInstance(
    1908                 :            :     const Reference< XComponentContext > & xContext )
    1909                 :            :     throw (Exception)
    1910                 :            : {
    1911         [ +  - ]:         10 :     return (OWeakObject *)new stoc_smgr::OServiceManagerWrapper( xContext );
    1912                 :            : }
    1913                 :            : }
    1914                 :            : 
    1915                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10