LCOV - code coverage report
Current view: top level - ucb/source/ucp/tdoc - tdoc_provider.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 171 0.0 %
Date: 2014-04-14 Functions: 0 27 0.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             :  *************************************************************************/
      26             : 
      27             : #include "rtl/ustrbuf.hxx"
      28             : 
      29             : #include "com/sun/star/container/XNameAccess.hpp"
      30             : #include "com/sun/star/embed/XStorage.hpp"
      31             : 
      32             : #include "comphelper/processfactory.hxx"
      33             : #include "ucbhelper/contentidentifier.hxx"
      34             : 
      35             : #include "tdoc_provider.hxx"
      36             : #include "tdoc_content.hxx"
      37             : #include "tdoc_uri.hxx"
      38             : #include "tdoc_docmgr.hxx"
      39             : #include "tdoc_storage.hxx"
      40             : 
      41             : using namespace com::sun::star;
      42             : using namespace tdoc_ucp;
      43             : 
      44             : 
      45             : 
      46             : 
      47             : // ContentProvider Implementation.
      48             : 
      49             : 
      50             : 
      51             : 
      52           0 : ContentProvider::ContentProvider(
      53             :             const uno::Reference< uno::XComponentContext >& rxContext )
      54             : : ::ucbhelper::ContentProviderImplHelper( rxContext ),
      55           0 :   m_xDocsMgr( new OfficeDocumentsManager( rxContext, this ) ),
      56           0 :   m_xStgElemFac( new StorageElementFactory( rxContext, m_xDocsMgr ) )
      57             : {
      58           0 : }
      59             : 
      60             : 
      61             : // virtual
      62           0 : ContentProvider::~ContentProvider()
      63             : {
      64           0 :     if ( m_xDocsMgr.is() )
      65           0 :         m_xDocsMgr->destroy();
      66           0 : }
      67             : 
      68             : 
      69             : 
      70             : // XInterface methods.
      71           0 : void SAL_CALL ContentProvider::acquire()
      72             :     throw()
      73             : {
      74           0 :     OWeakObject::acquire();
      75           0 : }
      76             : 
      77           0 : void SAL_CALL ContentProvider::release()
      78             :     throw()
      79             : {
      80           0 :     OWeakObject::release();
      81           0 : }
      82             : 
      83           0 : css::uno::Any SAL_CALL ContentProvider::queryInterface( const css::uno::Type & rType )
      84             :     throw( css::uno::RuntimeException, std::exception )
      85             : {
      86             :     css::uno::Any aRet = cppu::queryInterface( rType,
      87             :                                                (static_cast< lang::XTypeProvider* >(this)),
      88             :                                                (static_cast< lang::XServiceInfo* >(this)),
      89             :                                                (static_cast< ucb::XContentProvider* >(this)),
      90             :                                                (static_cast< frame::XTransientDocumentsDocumentContentFactory* >(this))
      91           0 :                                                );
      92           0 :     return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
      93             : }
      94             : 
      95             : // XTypeProvider methods.
      96             : 
      97             : 
      98             : 
      99           0 : XTYPEPROVIDER_IMPL_4( ContentProvider,
     100             :                       lang::XTypeProvider,
     101             :                       lang::XServiceInfo,
     102             :                       ucb::XContentProvider,
     103             :                       frame::XTransientDocumentsDocumentContentFactory );
     104             : 
     105             : 
     106             : 
     107             : // XServiceInfo methods.
     108             : 
     109             : 
     110             : 
     111           0 : XSERVICEINFO_IMPL_1_CTX(
     112             :     ContentProvider,
     113             :     OUString( "com.sun.star.comp.ucb.TransientDocumentsContentProvider" ),
     114             :     OUString( TDOC_CONTENT_PROVIDER_SERVICE_NAME ) );
     115             : 
     116             : 
     117             : 
     118             : // Service factory implementation.
     119             : 
     120             : 
     121             : 
     122           0 : ONE_INSTANCE_SERVICE_FACTORY_IMPL( ContentProvider );
     123             : 
     124             : 
     125             : 
     126             : // XContentProvider methods.
     127             : 
     128             : 
     129             : 
     130             : // virtual
     131             : uno::Reference< ucb::XContent > SAL_CALL
     132           0 : ContentProvider::queryContent(
     133             :         const uno::Reference< ucb::XContentIdentifier >& Identifier )
     134             :     throw( ucb::IllegalIdentifierException, uno::RuntimeException, std::exception )
     135             : {
     136           0 :     Uri aUri( Identifier->getContentIdentifier() );
     137           0 :     if ( !aUri.isValid() )
     138             :         throw ucb::IllegalIdentifierException(
     139             :             OUString( "Invalid URL!" ),
     140           0 :             Identifier );
     141             : 
     142             :     // Normalize URI.
     143             :     uno::Reference< ucb::XContentIdentifier > xCanonicId
     144           0 :         = new ::ucbhelper::ContentIdentifier( aUri.getUri() );
     145             : 
     146           0 :     osl::MutexGuard aGuard( m_aMutex );
     147             : 
     148             :     // Check, if a content with given id already exists...
     149             :     uno::Reference< ucb::XContent > xContent
     150           0 :         = queryExistingContent( xCanonicId ).get();
     151             : 
     152           0 :     if ( !xContent.is() )
     153             :     {
     154             :         // Create a new content.
     155           0 :         xContent = Content::create( m_xContext, this, xCanonicId );
     156           0 :         registerNewContent( xContent );
     157             :     }
     158             : 
     159           0 :     return xContent;
     160             : }
     161             : 
     162             : 
     163             : 
     164             : // XTransientDocumentsDocumentContentFactory methods.
     165             : 
     166             : 
     167             : 
     168             : // virtual
     169             : uno::Reference< ucb::XContent > SAL_CALL
     170           0 : ContentProvider::createDocumentContent(
     171             :         const uno::Reference< frame::XModel >& Model )
     172             :     throw ( lang::IllegalArgumentException, uno::RuntimeException, std::exception )
     173             : {
     174             :     // model -> id -> content identifier -> queryContent
     175           0 :     if ( m_xDocsMgr.is() )
     176             :     {
     177           0 :         OUString aDocId = m_xDocsMgr->queryDocumentId( Model );
     178           0 :         if ( !aDocId.isEmpty() )
     179             :         {
     180           0 :             OUStringBuffer aBuffer;
     181           0 :             aBuffer.appendAscii( TDOC_URL_SCHEME ":/" );
     182           0 :             aBuffer.append( aDocId );
     183             : 
     184             :             uno::Reference< ucb::XContentIdentifier > xId
     185           0 :                 = new ::ucbhelper::ContentIdentifier( aBuffer.makeStringAndClear() );
     186             : 
     187           0 :             osl::MutexGuard aGuard( m_aMutex );
     188             : 
     189             :             // Check, if a content with given id already exists...
     190             :             uno::Reference< ucb::XContent > xContent
     191           0 :                 = queryExistingContent( xId ).get();
     192             : 
     193           0 :             if ( !xContent.is() )
     194             :             {
     195             :                 // Create a new content.
     196           0 :                 xContent = Content::create( m_xContext, this, xId );
     197             :             }
     198             : 
     199           0 :             if ( xContent.is() )
     200           0 :                 return xContent;
     201             : 
     202             :             // no content.
     203             :             throw lang::IllegalArgumentException(
     204             :                 OUString(
     205             :                     "Illegal Content Identifier!" ),
     206             :                 static_cast< cppu::OWeakObject * >( this ),
     207           0 :                 1 );
     208             :         }
     209             :         else
     210             :         {
     211             :             throw lang::IllegalArgumentException(
     212             :                 OUString(
     213             :                     "Unable to obtain document id from model!" ),
     214             :                 static_cast< cppu::OWeakObject * >( this ),
     215           0 :                 1 );
     216           0 :         }
     217             :      }
     218             :      else
     219             :      {
     220             :         throw lang::IllegalArgumentException(
     221             :             OUString(
     222             :                 "No Document Manager!" ),
     223             :             static_cast< cppu::OWeakObject * >( this ),
     224           0 :             1 );
     225             :      }
     226             : }
     227             : 
     228             : 
     229             : 
     230             : // interface OfficeDocumentsEventListener
     231             : 
     232             : 
     233             : 
     234             : // virtual
     235           0 : void ContentProvider::notifyDocumentClosed( const OUString & rDocId )
     236             : {
     237           0 :     osl::MutexGuard aGuard( getContentListMutex() );
     238             : 
     239           0 :     ::ucbhelper::ContentRefList aAllContents;
     240           0 :     queryExistingContents( aAllContents );
     241             : 
     242           0 :     ::ucbhelper::ContentRefList::const_iterator it  = aAllContents.begin();
     243           0 :     ::ucbhelper::ContentRefList::const_iterator end = aAllContents.end();
     244             : 
     245             :     // Notify all content objects related to the closed doc.
     246             : 
     247           0 :     bool bFoundDocumentContent = false;
     248           0 :     rtl::Reference< Content > xRoot;
     249             : 
     250           0 :     while ( it != end )
     251             :     {
     252           0 :         Uri aUri( (*it)->getIdentifier()->getContentIdentifier() );
     253             :         OSL_ENSURE( aUri.isValid(),
     254             :                     "ContentProvider::notifyDocumentClosed - Invalid URI!" );
     255             : 
     256           0 :         if ( !bFoundDocumentContent )
     257             :         {
     258           0 :             if ( aUri.isRoot() )
     259             :             {
     260           0 :                 xRoot = static_cast< Content * >( (*it).get() );
     261             :             }
     262           0 :             else if ( aUri.isDocument() )
     263             :             {
     264           0 :                 if ( aUri.getDocumentId() == rDocId )
     265             :                 {
     266           0 :                     bFoundDocumentContent = true;
     267             : 
     268             :                     // document content will notify removal of child itself;
     269             :                     // no need for the root to propagate this.
     270           0 :                     xRoot.clear();
     271             :                 }
     272             :             }
     273             :         }
     274             : 
     275           0 :         if ( aUri.getDocumentId() == rDocId )
     276             :         {
     277             :             // Inform content.
     278             :             rtl::Reference< Content > xContent
     279           0 :                 = static_cast< Content * >( (*it).get() );
     280             : 
     281           0 :             xContent->notifyDocumentClosed();
     282             :         }
     283             : 
     284           0 :         ++it;
     285           0 :     }
     286             : 
     287           0 :     if ( xRoot.is() )
     288             :     {
     289             :         // No document content found for rDocId but root content
     290             :         // instanciated. Root content must announce document removal
     291             :         // to content event listeners.
     292           0 :         xRoot->notifyChildRemoved( rDocId );
     293           0 :     }
     294           0 : }
     295             : 
     296             : 
     297             : // virtual
     298           0 : void ContentProvider::notifyDocumentOpened( const OUString & rDocId )
     299             : {
     300           0 :     osl::MutexGuard aGuard( getContentListMutex() );
     301             : 
     302           0 :     ::ucbhelper::ContentRefList aAllContents;
     303           0 :     queryExistingContents( aAllContents );
     304             : 
     305           0 :     ::ucbhelper::ContentRefList::const_iterator it  = aAllContents.begin();
     306           0 :     ::ucbhelper::ContentRefList::const_iterator end = aAllContents.end();
     307             : 
     308             :     // Find root content. If instanciated let it propagate document insertion.
     309             : 
     310           0 :     while ( it != end )
     311             :     {
     312           0 :         Uri aUri( (*it)->getIdentifier()->getContentIdentifier() );
     313             :         OSL_ENSURE( aUri.isValid(),
     314             :                     "ContentProvider::notifyDocumentOpened - Invalid URI!" );
     315             : 
     316           0 :         if ( aUri.isRoot() )
     317             :         {
     318             :             rtl::Reference< Content > xRoot
     319           0 :                 = static_cast< Content * >( (*it).get() );
     320           0 :             xRoot->notifyChildInserted( rDocId );
     321             : 
     322             :             // Done.
     323           0 :             break;
     324             :         }
     325             : 
     326           0 :         ++it;
     327           0 :     }
     328           0 : }
     329             : 
     330             : 
     331             : 
     332             : // Non-UNO
     333             : 
     334             : 
     335             : 
     336             : uno::Reference< embed::XStorage >
     337           0 : ContentProvider::queryStorage( const OUString & rUri,
     338             :                                StorageAccessMode eMode ) const
     339             : {
     340           0 :     if ( m_xStgElemFac.is() )
     341             :     {
     342             :         try
     343             :         {
     344           0 :             return m_xStgElemFac->createStorage( rUri, eMode );
     345             :         }
     346           0 :         catch ( embed::InvalidStorageException const & )
     347             :         {
     348             :             OSL_FAIL( "Caught InvalidStorageException!" );
     349             :         }
     350           0 :         catch ( lang::IllegalArgumentException const & )
     351             :         {
     352             :             OSL_FAIL( "Caught IllegalArgumentException!" );
     353             :         }
     354           0 :         catch ( io::IOException const & )
     355             :         {
     356             :             // Okay to happen, for instance when the storage does not exist.
     357             :             //OSL_ENSURE( false, "Caught IOException!" );
     358             :         }
     359           0 :         catch ( embed::StorageWrappedTargetException const & )
     360             :         {
     361             :             OSL_FAIL( "Caught embed::StorageWrappedTargetException!" );
     362             :         }
     363             :     }
     364           0 :     return uno::Reference< embed::XStorage >();
     365             : }
     366             : 
     367             : 
     368             : uno::Reference< embed::XStorage >
     369           0 : ContentProvider::queryStorageClone( const OUString & rUri ) const
     370             : {
     371           0 :     if ( m_xStgElemFac.is() )
     372             :     {
     373             :         try
     374             :         {
     375           0 :             Uri aUri( rUri );
     376             :             uno::Reference< embed::XStorage > xParentStorage
     377           0 :                 = m_xStgElemFac->createStorage( aUri.getParentUri(), READ );
     378             :             uno::Reference< embed::XStorage > xStorage
     379           0 :                 = m_xStgElemFac->createTemporaryStorage();
     380             : 
     381           0 :             xParentStorage->copyStorageElementLastCommitTo(
     382           0 :                                 aUri.getDecodedName(), xStorage );
     383           0 :             return xStorage;
     384             :         }
     385           0 :         catch ( embed::InvalidStorageException const & )
     386             :         {
     387             :             OSL_FAIL( "Caught InvalidStorageException!" );
     388             :         }
     389           0 :         catch ( lang::IllegalArgumentException const & )
     390             :         {
     391             :             OSL_FAIL( "Caught IllegalArgumentException!" );
     392             :         }
     393           0 :         catch ( io::IOException const & )
     394             :         {
     395             :             // Okay to happen, for instance when the storage does not exist.
     396             :             //OSL_ENSURE( false, "Caught IOException!" );
     397             :         }
     398           0 :         catch ( embed::StorageWrappedTargetException const & )
     399             :         {
     400             :             OSL_FAIL( "Caught embed::StorageWrappedTargetException!" );
     401             :         }
     402             :     }
     403             : 
     404           0 :     return uno::Reference< embed::XStorage >();
     405             : }
     406             : 
     407             : 
     408             : uno::Reference< io::XInputStream >
     409           0 : ContentProvider::queryInputStream( const OUString & rUri,
     410             :                                    const OUString & rPassword ) const
     411             :     throw ( packages::WrongPasswordException )
     412             : {
     413           0 :     if ( m_xStgElemFac.is() )
     414             :     {
     415             :         try
     416             :         {
     417           0 :             return m_xStgElemFac->createInputStream( rUri, rPassword );
     418             :         }
     419           0 :         catch ( embed::InvalidStorageException const & )
     420             :         {
     421             :             OSL_FAIL( "Caught InvalidStorageException!" );
     422             :         }
     423           0 :         catch ( lang::IllegalArgumentException const & )
     424             :         {
     425             :             OSL_FAIL( "Caught IllegalArgumentException!" );
     426             :         }
     427           0 :         catch ( io::IOException const & )
     428             :         {
     429             :             OSL_FAIL( "Caught IOException!" );
     430             :         }
     431           0 :         catch ( embed::StorageWrappedTargetException const & )
     432             :         {
     433             :             OSL_FAIL( "Caught embed::StorageWrappedTargetException!" );
     434             :         }
     435             : //        catch ( packages::WrongPasswordException const & )
     436             : //        {
     437             : //            // the key provided is wrong; rethrow; to be handled by caller.
     438             : //            throw;
     439             : //        }
     440             :     }
     441           0 :     return uno::Reference< io::XInputStream >();
     442             : }
     443             : 
     444             : 
     445             : uno::Reference< io::XOutputStream >
     446           0 : ContentProvider::queryOutputStream( const OUString & rUri,
     447             :                                     const OUString & rPassword,
     448             :                                     bool bTruncate ) const
     449             :     throw ( packages::WrongPasswordException )
     450             : {
     451           0 :     if ( m_xStgElemFac.is() )
     452             :     {
     453             :         try
     454             :         {
     455             :             return
     456           0 :                 m_xStgElemFac->createOutputStream( rUri, rPassword, bTruncate );
     457             :         }
     458           0 :         catch ( embed::InvalidStorageException const & )
     459             :         {
     460             :             OSL_FAIL( "Caught InvalidStorageException!" );
     461             :         }
     462           0 :         catch ( lang::IllegalArgumentException const & )
     463             :         {
     464             :             OSL_FAIL( "Caught IllegalArgumentException!" );
     465             :         }
     466           0 :         catch ( io::IOException const & )
     467             :         {
     468             :             // Okay to happen, for instance when the storage does not exist.
     469             :             //OSL_ENSURE( false, "Caught IOException!" );
     470             :         }
     471           0 :         catch ( embed::StorageWrappedTargetException const & )
     472             :         {
     473             :             OSL_FAIL( "Caught embed::StorageWrappedTargetException!" );
     474             :         }
     475             : //        catch ( packages::WrongPasswordException const & )
     476             : //        {
     477             : //            // the key provided is wrong; rethrow; to be handled by caller.
     478             : //            throw;
     479             : //        }
     480             :     }
     481           0 :     return uno::Reference< io::XOutputStream >();
     482             : }
     483             : 
     484             : 
     485             : uno::Reference< io::XStream >
     486           0 : ContentProvider::queryStream( const OUString & rUri,
     487             :                               const OUString & rPassword,
     488             :                               bool bTruncate ) const
     489             :     throw ( packages::WrongPasswordException )
     490             : {
     491           0 :     if ( m_xStgElemFac.is() )
     492             :     {
     493             :         try
     494             :         {
     495           0 :             return m_xStgElemFac->createStream( rUri, rPassword, bTruncate );
     496             :         }
     497           0 :         catch ( embed::InvalidStorageException const & )
     498             :         {
     499             :             OSL_FAIL( "Caught InvalidStorageException!" );
     500             :         }
     501           0 :         catch ( lang::IllegalArgumentException const & )
     502             :         {
     503             :             OSL_FAIL( "Caught IllegalArgumentException!" );
     504             :         }
     505           0 :         catch ( io::IOException const & )
     506             :         {
     507             :             // Okay to happen, for instance when the storage does not exist.
     508             :             //OSL_ENSURE( false, "Caught IOException!" );
     509             :         }
     510           0 :         catch ( embed::StorageWrappedTargetException const & )
     511             :         {
     512             :             OSL_FAIL( "Caught embed::StorageWrappedTargetException!" );
     513             :         }
     514             : //        catch ( packages::WrongPasswordException const & )
     515             : //        {
     516             : //            // the key provided is wrong; rethrow; to be handled by caller.
     517             : //            throw;
     518             : //        }
     519             :     }
     520           0 :     return uno::Reference< io::XStream >();
     521             : }
     522             : 
     523             : 
     524           0 : bool ContentProvider::queryNamesOfChildren(
     525             :     const OUString & rUri, uno::Sequence< OUString > & rNames ) const
     526             : {
     527           0 :     Uri aUri( rUri );
     528           0 :     if ( aUri.isRoot() )
     529             :     {
     530             :         // special handling for root, which has no storage, but children.
     531           0 :         if ( m_xDocsMgr.is() )
     532             :         {
     533           0 :             rNames = m_xDocsMgr->queryDocuments();
     534           0 :             return true;
     535             :         }
     536             :     }
     537             :     else
     538             :     {
     539           0 :         if ( m_xStgElemFac.is() )
     540             :         {
     541             :             try
     542             :             {
     543             :                 uno::Reference< embed::XStorage > xStorage
     544           0 :                     = m_xStgElemFac->createStorage( rUri, READ );
     545             : 
     546             :                 OSL_ENSURE( xStorage.is(), "Got no Storage!" );
     547             : 
     548           0 :                 if ( xStorage.is() )
     549             :                 {
     550             :                     uno::Reference< container::XNameAccess > xNA(
     551           0 :                         xStorage, uno::UNO_QUERY );
     552             : 
     553             :                     OSL_ENSURE( xNA.is(), "Got no css.container.XNameAccess!" );
     554           0 :                     if ( xNA.is() )
     555             :                     {
     556           0 :                         rNames = xNA->getElementNames();
     557           0 :                         return true;
     558           0 :                     }
     559           0 :                 }
     560             :             }
     561           0 :             catch ( embed::InvalidStorageException const & )
     562             :             {
     563             :                 OSL_FAIL( "Caught InvalidStorageException!" );
     564             :             }
     565           0 :             catch ( lang::IllegalArgumentException const & )
     566             :             {
     567             :                 OSL_FAIL( "Caught IllegalArgumentException!" );
     568             :             }
     569           0 :             catch ( io::IOException const & )
     570             :             {
     571             :                 // Okay to happen, for instance if the storage does not exist.
     572             :                 //OSL_ENSURE( false, "Caught IOException!" );
     573             :             }
     574           0 :             catch ( embed::StorageWrappedTargetException const & )
     575             :             {
     576             :                 OSL_FAIL( "Caught embed::StorageWrappedTargetException!" );
     577             :             }
     578             :         }
     579             :     }
     580           0 :     return false;
     581             : }
     582             : 
     583             : 
     584             : OUString
     585           0 : ContentProvider::queryStorageTitle( const OUString & rUri ) const
     586             : {
     587           0 :     OUString aTitle;
     588             : 
     589           0 :     Uri aUri( rUri );
     590           0 :     if ( aUri.isRoot() )
     591             :     {
     592             :         // always empty.
     593           0 :         aTitle = OUString();
     594             :     }
     595           0 :     else if ( aUri.isDocument() )
     596             :     {
     597             :         // for documents, title shall not be derived from URL. It shall
     598             :         // be somethimg more 'speaking' than just the document UID.
     599           0 :         if ( m_xDocsMgr.is() )
     600           0 :             aTitle = m_xDocsMgr->queryStorageTitle( aUri.getDocumentId() );
     601             :     }
     602             :     else
     603             :     {
     604             :         // derive title from URL
     605           0 :         aTitle = aUri.getDecodedName();
     606             :     }
     607             : 
     608             :     OSL_ENSURE( !aTitle.isEmpty() || aUri.isRoot(),
     609             :                 "ContentProvider::queryStorageTitle - empty title!" );
     610           0 :     return aTitle;
     611             : }
     612             : 
     613             : 
     614             : uno::Reference< frame::XModel >
     615           0 : ContentProvider::queryDocumentModel( const OUString & rUri ) const
     616             : {
     617           0 :     uno::Reference< frame::XModel > xModel;
     618             : 
     619           0 :     if ( m_xDocsMgr.is() )
     620             :     {
     621           0 :         Uri aUri( rUri );
     622           0 :         xModel = m_xDocsMgr->queryDocumentModel( aUri.getDocumentId() );
     623             :     }
     624             : 
     625             :     OSL_ENSURE( xModel.is(),
     626             :                 "ContentProvider::queryDocumentModel - no model!" );
     627           0 :     return xModel;
     628             : }
     629             : 
     630             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10