LCOV - code coverage report
Current view: top level - ucb/source/ucp/hierarchy - hierarchyprovider.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 68 81 84.0 %
Date: 2014-11-03 Functions: 15 20 75.0 %
Legend: Lines: hit not hit

          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             : 
      21             : /**************************************************************************
      22             :                                 TODO
      23             :  **************************************************************************
      24             : 
      25             :  - XInitialization::initialize does not work any longer!
      26             : 
      27             :  *************************************************************************/
      28             : #include <osl/diagnose.h>
      29             : #include <com/sun/star/beans/PropertyValue.hpp>
      30             : #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
      31             : #include <com/sun/star/util/theOfficeInstallationDirectories.hpp>
      32             : #include <comphelper/processfactory.hxx>
      33             : #include <ucbhelper/contentidentifier.hxx>
      34             : #include "hierarchyprovider.hxx"
      35             : #include "hierarchycontent.hxx"
      36             : #include "hierarchyuri.hxx"
      37             : 
      38             : #include "../inc/urihelper.hxx"
      39             : 
      40             : using namespace com::sun::star;
      41             : using namespace hierarchy_ucp;
      42             : 
      43             : 
      44             : 
      45             : 
      46             : // HierarchyContentProvider Implementation.
      47             : 
      48             : 
      49             : 
      50             : 
      51           4 : HierarchyContentProvider::HierarchyContentProvider(
      52             :             const uno::Reference< uno::XComponentContext >& rxContext )
      53           4 : : ::ucbhelper::ContentProviderImplHelper( rxContext )
      54             : {
      55           4 : }
      56             : 
      57             : 
      58             : // virtual
      59           8 : HierarchyContentProvider::~HierarchyContentProvider()
      60             : {
      61           8 : }
      62             : 
      63             : 
      64             : 
      65             : // XInterface methods.
      66             : 
      67        3340 : void SAL_CALL HierarchyContentProvider::acquire()
      68             :     throw()
      69             : {
      70        3340 :     OWeakObject::acquire();
      71        3340 : }
      72             : 
      73        3340 : void SAL_CALL HierarchyContentProvider::release()
      74             :     throw()
      75             : {
      76        3340 :     OWeakObject::release();
      77        3340 : }
      78             : 
      79         106 : css::uno::Any SAL_CALL HierarchyContentProvider::queryInterface( const css::uno::Type & rType )
      80             :     throw( css::uno::RuntimeException, std::exception )
      81             : {
      82             :     css::uno::Any aRet = cppu::queryInterface( rType,
      83             :                                                (static_cast< lang::XTypeProvider* >(this)),
      84             :                                                (static_cast< lang::XServiceInfo* >(this)),
      85             :                                                (static_cast< ucb::XContentProvider* >(this)),
      86             :                                                (static_cast< lang::XInitialization* >(this))
      87         106 :                                                );
      88         106 :     return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
      89             : }
      90             : 
      91             : // XTypeProvider methods.
      92             : 
      93             : 
      94             : 
      95           0 : XTYPEPROVIDER_IMPL_4( HierarchyContentProvider,
      96             :                       lang::XTypeProvider,
      97             :                       lang::XServiceInfo,
      98             :                       ucb::XContentProvider,
      99             :                       lang::XInitialization );
     100             : 
     101             : 
     102             : 
     103             : // XServiceInfo methods.
     104             : 
     105             : 
     106             : 
     107          24 : XSERVICEINFO_IMPL_1_CTX( HierarchyContentProvider,
     108             :                      OUString( "com.sun.star.comp.ucb.HierarchyContentProvider" ),
     109             :                      OUString( HIERARCHY_CONTENT_PROVIDER_SERVICE_NAME ) );
     110             : 
     111             : 
     112             : 
     113             : // Service factory implementation.
     114             : 
     115             : 
     116             : 
     117           4 : ONE_INSTANCE_SERVICE_FACTORY_IMPL( HierarchyContentProvider );
     118             : 
     119             : 
     120             : 
     121             : // XContentProvider methods.
     122             : 
     123             : 
     124             : 
     125             : // virtual
     126             : uno::Reference< ucb::XContent > SAL_CALL
     127          78 : HierarchyContentProvider::queryContent(
     128             :         const uno::Reference< ucb::XContentIdentifier >& Identifier )
     129             :     throw( ucb::IllegalIdentifierException, uno::RuntimeException, std::exception )
     130             : {
     131          78 :     HierarchyUri aUri( Identifier->getContentIdentifier() );
     132          78 :     if ( !aUri.isValid() )
     133           0 :         throw ucb::IllegalIdentifierException();
     134             : 
     135             :     // Encode URL and create new Id. This may "correct" user-typed-in URL's.
     136             :     uno::Reference< ucb::XContentIdentifier > xCanonicId
     137         156 :         = new ::ucbhelper::ContentIdentifier( ::ucb_impl::urihelper::encodeURI( aUri.getUri() ) );
     138         156 :     osl::MutexGuard aGuard( m_aMutex );
     139             : 
     140             :     // Check, if a content with given id already exists...
     141             :     uno::Reference< ucb::XContent > xContent
     142          78 :         = queryExistingContent( xCanonicId ).get();
     143          78 :     if ( xContent.is() )
     144          26 :         return xContent;
     145             : 
     146             :     // Create a new content.
     147          52 :     xContent = HierarchyContent::create( m_xContext, this, xCanonicId );
     148          52 :     registerNewContent( xContent );
     149             : 
     150          52 :     if ( xContent.is() && !xContent->getIdentifier().is() )
     151           0 :         throw ucb::IllegalIdentifierException();
     152             : 
     153         130 :     return xContent;
     154             : }
     155             : 
     156             : 
     157             : 
     158             : // XInitialization methods.
     159             : 
     160             : 
     161             : 
     162             : // virtual
     163           0 : void SAL_CALL HierarchyContentProvider::initialize(
     164             :                                 const uno::Sequence< uno::Any >& aArguments )
     165             :     throw( uno::Exception, uno::RuntimeException, std::exception )
     166             : {
     167           0 :     if ( aArguments.getLength() > 0 )
     168             :         OSL_FAIL( "HierarchyContentProvider::initialize : not supported!" );
     169           0 : }
     170             : 
     171             : 
     172             : 
     173             : //  Non-interface methods.
     174             : 
     175             : 
     176             : 
     177             : uno::Reference< lang::XMultiServiceFactory >
     178         150 : HierarchyContentProvider::getConfigProvider(
     179             :                                 const OUString & rServiceSpecifier )
     180             : {
     181         150 :     osl::MutexGuard aGuard( m_aMutex );
     182             :     ConfigProviderMap::iterator it = m_aConfigProviderMap.find(
     183         150 :                                                     rServiceSpecifier );
     184         150 :     if ( it == m_aConfigProviderMap.end() )
     185             :     {
     186             :         try
     187             :         {
     188           2 :             ConfigProviderMapEntry aEntry;
     189             :             aEntry.xConfigProvider
     190           4 :                 = uno::Reference< lang::XMultiServiceFactory >(
     191           4 :                                 m_xContext->getServiceManager()->createInstanceWithContext(rServiceSpecifier, m_xContext),
     192           2 :                                 uno::UNO_QUERY );
     193             : 
     194           2 :             if ( aEntry.xConfigProvider.is() )
     195             :             {
     196           2 :                 m_aConfigProviderMap[ rServiceSpecifier ] = aEntry;
     197           2 :                 return aEntry.xConfigProvider;
     198           0 :             }
     199             :         }
     200           0 :         catch ( uno::Exception const & )
     201             :         {
     202             : //            OSL_FAIL( //                        "HierarchyContentProvider::getConfigProvider - "
     203             : //                        "caught exception!" );
     204             :         }
     205             : 
     206             :         OSL_FAIL( "HierarchyContentProvider::getConfigProvider - "
     207             :                     "No config provider!" );
     208             : 
     209           0 :         return uno::Reference< lang::XMultiServiceFactory >();
     210             :     }
     211             : 
     212         148 :     return (*it).second.xConfigProvider;
     213             : }
     214             : 
     215             : 
     216             : uno::Reference< container::XHierarchicalNameAccess >
     217         118 : HierarchyContentProvider::getRootConfigReadNameAccess(
     218             :                                 const OUString & rServiceSpecifier )
     219             : {
     220         118 :     osl::MutexGuard aGuard( m_aMutex );
     221             :     ConfigProviderMap::iterator it = m_aConfigProviderMap.find(
     222         118 :                                                     rServiceSpecifier );
     223         118 :     if ( it != m_aConfigProviderMap.end() )
     224             :     {
     225         118 :         if ( !( (*it).second.xRootReadAccess.is() ) )
     226             :         {
     227           2 :             if ( (*it).second.bTriedToGetRootReadAccess ) // #82494#
     228             :             {
     229             :                 OSL_FAIL( "HierarchyContentProvider::getRootConfigReadNameAccess - "
     230             :                     "Unable to read any config data! -> #82494#" );
     231           0 :                 return uno::Reference< container::XHierarchicalNameAccess >();
     232             :             }
     233             : 
     234             :             try
     235             :             {
     236             :                 uno::Reference< lang::XMultiServiceFactory > xConfigProv
     237           2 :                     = getConfigProvider( rServiceSpecifier );
     238             : 
     239           2 :                 if ( xConfigProv.is() )
     240             :                 {
     241           2 :                     uno::Sequence< uno::Any > aArguments( 1 );
     242           4 :                     beans::PropertyValue      aProperty;
     243           2 :                     aProperty.Name = "nodepath" ;
     244           2 :                     aProperty.Value <<= OUString(); // root path
     245           2 :                     aArguments[ 0 ] <<= aProperty;
     246             : 
     247           2 :                     (*it).second.bTriedToGetRootReadAccess = true;
     248             : 
     249           2 :                     (*it).second.xRootReadAccess
     250           6 :                         = uno::Reference< container::XHierarchicalNameAccess >(
     251           2 :                             xConfigProv->createInstanceWithArguments(
     252             :                                 OUString( "com.sun.star.ucb.HierarchyDataReadAccess"  ),
     253           2 :                                 aArguments ),
     254           4 :                             uno::UNO_QUERY );
     255           2 :                 }
     256             :             }
     257           0 :             catch ( uno::RuntimeException const & )
     258             :             {
     259           0 :                 throw;
     260             :             }
     261           0 :             catch ( uno::Exception const & )
     262             :             {
     263             :                 // createInstance, createInstanceWithArguments
     264             : 
     265             :                 OSL_FAIL( "HierarchyContentProvider::getRootConfigReadNameAccess - "
     266             :                     "caught Exception!" );
     267             :             }
     268             :         }
     269             :     }
     270             : 
     271         118 :     return (*it).second.xRootReadAccess;
     272             : }
     273             : 
     274             : 
     275             : uno::Reference< util::XOfficeInstallationDirectories >
     276         118 : HierarchyContentProvider::getOfficeInstallationDirectories()
     277             : {
     278         118 :     if ( !m_xOfficeInstDirs.is() )
     279             :     {
     280           2 :         osl::MutexGuard aGuard( m_aMutex );
     281           2 :         if ( !m_xOfficeInstDirs.is() )
     282             :         {
     283             :             OSL_ENSURE( m_xContext.is(), "No service manager!" );
     284             : 
     285           2 :             m_xOfficeInstDirs = util::theOfficeInstallationDirectories::get(m_xContext);
     286           2 :         }
     287             :     }
     288         118 :     return m_xOfficeInstDirs;
     289             : }
     290             : 
     291             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10