LCOV - code coverage report
Current view: top level - ucbhelper/source/client - content.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 414 514 80.5 %
Date: 2014-11-03 Functions: 62 71 87.3 %
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             : #include "sal/config.h"
      21             : 
      22             : #include <cassert>
      23             : 
      24             : #include <osl/diagnose.h>
      25             : #include <osl/mutex.hxx>
      26             : #include <salhelper/simplereferenceobject.hxx>
      27             : #include <cppuhelper/weak.hxx>
      28             : 
      29             : #include <cppuhelper/implbase1.hxx>
      30             : #include <com/sun/star/ucb/CheckinArgument.hpp>
      31             : #include <com/sun/star/ucb/ContentCreationError.hpp>
      32             : #include <com/sun/star/ucb/XCommandEnvironment.hpp>
      33             : #include <com/sun/star/ucb/XCommandInfo.hpp>
      34             : #include <com/sun/star/ucb/XCommandProcessor.hpp>
      35             : #include <com/sun/star/ucb/Command.hpp>
      36             : #include <com/sun/star/ucb/CommandInfo.hpp>
      37             : #include <com/sun/star/ucb/ContentAction.hpp>
      38             : #include <com/sun/star/ucb/OpenCommandArgument2.hpp>
      39             : #include <com/sun/star/ucb/InsertCommandArgument.hpp>
      40             : #include <com/sun/star/ucb/GlobalTransferCommandArgument2.hpp>
      41             : #include <com/sun/star/ucb/NameClash.hpp>
      42             : #include <com/sun/star/ucb/OpenMode.hpp>
      43             : #include <com/sun/star/ucb/XContentCreator.hpp>
      44             : #include <com/sun/star/ucb/XContentEventListener.hpp>
      45             : #include <com/sun/star/ucb/XContentIdentifierFactory.hpp>
      46             : #include <com/sun/star/ucb/XContentProvider.hpp>
      47             : #include <com/sun/star/ucb/XContentProviderManager.hpp>
      48             : #include <com/sun/star/ucb/XDynamicResultSet.hpp>
      49             : #include <com/sun/star/ucb/SortedDynamicResultSetFactory.hpp>
      50             : #include <com/sun/star/ucb/UniversalContentBroker.hpp>
      51             : #include <com/sun/star/ucb/XUniversalContentBroker.hpp>
      52             : #include <com/sun/star/beans/XPropertySetInfo.hpp>
      53             : #include <com/sun/star/beans/Property.hpp>
      54             : #include <com/sun/star/beans/PropertyValue.hpp>
      55             : #include <com/sun/star/sdbc/XResultSet.hpp>
      56             : #include <com/sun/star/sdbc/XRow.hpp>
      57             : #include <com/sun/star/lang/IllegalArgumentException.hpp>
      58             : #include <com/sun/star/beans/UnknownPropertyException.hpp>
      59             : #include <ucbhelper/macros.hxx>
      60             : #include <ucbhelper/content.hxx>
      61             : #include <ucbhelper/activedatasink.hxx>
      62             : #include <ucbhelper/activedatastreamer.hxx>
      63             : #include <ucbhelper/interactionrequest.hxx>
      64             : #include <ucbhelper/cancelcommandexecution.hxx>
      65             : 
      66             : using namespace com::sun::star::container;
      67             : using namespace com::sun::star::beans;
      68             : using namespace com::sun::star::io;
      69             : using namespace com::sun::star::lang;
      70             : using namespace com::sun::star::sdbc;
      71             : using namespace com::sun::star::task;
      72             : using namespace com::sun::star::ucb;
      73             : using namespace com::sun::star::uno;
      74             : 
      75             : namespace ucbhelper
      76             : {
      77             : 
      78       14769 : class EmptyInputStream : public ::cppu::WeakImplHelper1< XInputStream >
      79             : {
      80             : public:
      81             :     virtual sal_Int32 SAL_CALL readBytes(
      82             :         Sequence< sal_Int8 > & data, sal_Int32 nBytesToRead )
      83             :         throw (IOException, RuntimeException, std::exception) SAL_OVERRIDE;
      84             :     virtual sal_Int32 SAL_CALL readSomeBytes(
      85             :         Sequence< sal_Int8 > & data, sal_Int32 nMaxBytesToRead )
      86             :         throw (IOException, RuntimeException, std::exception) SAL_OVERRIDE;
      87             :     virtual void SAL_CALL skipBytes( sal_Int32 nBytesToSkip )
      88             :         throw (IOException, RuntimeException, std::exception) SAL_OVERRIDE;
      89             :     virtual sal_Int32 SAL_CALL available()
      90             :         throw (IOException, RuntimeException, std::exception) SAL_OVERRIDE;
      91             :     virtual void SAL_CALL closeInput()
      92             :         throw (IOException, RuntimeException, std::exception) SAL_OVERRIDE;
      93             : };
      94             : 
      95           0 : sal_Int32 EmptyInputStream::readBytes(
      96             :     Sequence< sal_Int8 > & data, sal_Int32 )
      97             :     throw (IOException, RuntimeException, std::exception)
      98             : {
      99           0 :     data.realloc( 0 );
     100           0 :     return 0;
     101             : }
     102             : 
     103           0 : sal_Int32 EmptyInputStream::readSomeBytes(
     104             :     Sequence< sal_Int8 > & data, sal_Int32 )
     105             :     throw (IOException, RuntimeException, std::exception)
     106             : {
     107           0 :     data.realloc( 0 );
     108           0 :     return 0;
     109             : }
     110             : 
     111           0 : void EmptyInputStream::skipBytes( sal_Int32 )
     112             :     throw (IOException, RuntimeException, std::exception)
     113             : {
     114           0 : }
     115             : 
     116           0 : sal_Int32 EmptyInputStream::available()
     117             :     throw (IOException, RuntimeException, std::exception)
     118             : {
     119           0 :     return 0;
     120             : }
     121             : 
     122           0 : void EmptyInputStream::closeInput()
     123             :     throw (IOException, RuntimeException, std::exception)
     124             : {
     125           0 : }
     126             : 
     127             : 
     128             : 
     129             : 
     130             : 
     131             : // class ContentEventListener_Impl.
     132             : 
     133             : 
     134             : 
     135             : 
     136      447606 : class ContentEventListener_Impl : public cppu::OWeakObject,
     137             :                                       public XContentEventListener
     138             : {
     139             :     Content_Impl& m_rContent;
     140             : 
     141             : public:
     142      223905 :     ContentEventListener_Impl( Content_Impl& rContent )
     143      223905 :     : m_rContent( rContent ) {}
     144             : 
     145             :     // XInterface
     146             :     virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType )
     147             :         throw( css::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
     148             :     virtual void SAL_CALL acquire()
     149             :         throw() SAL_OVERRIDE;
     150             :     virtual void SAL_CALL release()
     151             :         throw() SAL_OVERRIDE;
     152             : 
     153             :     // XContentEventListener
     154             :     virtual void SAL_CALL contentEvent( const ContentEvent& evt )
     155             :         throw( RuntimeException, std::exception ) SAL_OVERRIDE;
     156             : 
     157             :     // XEventListener ( base of XContentEventListener )
     158             :     virtual void SAL_CALL disposing( const EventObject& Source )
     159             :         throw( RuntimeException, std::exception ) SAL_OVERRIDE;
     160             : };
     161             : 
     162             : 
     163             : 
     164             : 
     165             : // class Content_Impl.
     166             : 
     167             : 
     168             : 
     169             : 
     170             : class Content_Impl : public salhelper::SimpleReferenceObject
     171             : {
     172             : friend class ContentEventListener_Impl;
     173             : 
     174             :     mutable OUString               m_aURL;
     175             :     Reference< XComponentContext >      m_xCtx;
     176             :     Reference< XContent >               m_xContent;
     177             :     Reference< XCommandProcessor >          m_xCommandProcessor;
     178             :     Reference< XCommandEnvironment >    m_xEnv;
     179             :     Reference< XContentEventListener >  m_xContentEventListener;
     180             :     mutable osl::Mutex                  m_aMutex;
     181             : 
     182             : private:
     183             :     void reinit( const Reference< XContent >& xContent );
     184             :     void disposing(const EventObject& Source);
     185             : 
     186             : public:
     187       77063 :     Content_Impl() {};
     188             :     Content_Impl( const Reference< XComponentContext >& rCtx,
     189             :                   const Reference< XContent >& rContent,
     190             :                   const Reference< XCommandEnvironment >& rEnv );
     191             : 
     192             :     virtual ~Content_Impl();
     193             : 
     194             :     const OUString&           getURL() const;
     195             :     Reference< XContent >          getContent();
     196             :     Reference< XCommandProcessor > getCommandProcessor();
     197       10531 :     Reference< XComponentContext > getComponentContext()
     198       10531 :     { assert(m_xCtx.is()); return m_xCtx; }
     199             : 
     200             :     Any  executeCommand( const Command& rCommand );
     201             : 
     202             :     inline const Reference< XCommandEnvironment >& getEnvironment() const;
     203             :     inline void setEnvironment(
     204             :                         const Reference< XCommandEnvironment >& xNewEnv );
     205             : 
     206             :     void inserted();
     207             : };
     208             : 
     209             : 
     210             : // Helpers.
     211             : 
     212             : 
     213       10600 : static void ensureContentProviderForURL( const Reference< XUniversalContentBroker >& rBroker,
     214             :                                          const OUString & rURL )
     215             :     throw ( ContentCreationException, RuntimeException )
     216             : {
     217             :     Reference< XContentProvider > xProv
     218       10600 :         = rBroker->queryContentProvider( rURL );
     219       10600 :     if ( !xProv.is() )
     220             :     {
     221             :         throw ContentCreationException(
     222       21200 :             "No Content Provider available for URL: " + rURL,
     223             :             Reference< XInterface >(),
     224       31800 :             ContentCreationError_NO_CONTENT_PROVIDER );
     225       10600 :     }
     226           0 : }
     227             : 
     228             : 
     229      175826 : static Reference< XContentIdentifier > getContentIdentifierThrow(
     230             :                                     const Reference< XUniversalContentBroker > & rBroker,
     231             :                                     const OUString & rURL)
     232             :     throw (ContentCreationException, RuntimeException)
     233             : {
     234             :     Reference< XContentIdentifier > xId
     235      175826 :         = rBroker->createContentIdentifier( rURL );
     236             : 
     237      175826 :     if (!xId.is())
     238             :     {
     239           0 :         ensureContentProviderForURL( rBroker, rURL );
     240             : 
     241             :         throw ContentCreationException(
     242             :             "Unable to create Content Identifier!",
     243             :             Reference< XInterface >(),
     244           0 :             ContentCreationError_IDENTIFIER_CREATION_FAILED );
     245             :     }
     246             : 
     247      175826 :     return xId;
     248             : }
     249             : 
     250       18563 : static Reference< XContentIdentifier > getContentIdentifierNoThrow(
     251             :                                     const Reference< XUniversalContentBroker > & rBroker,
     252             :                                     const OUString & rURL)
     253             :     throw (RuntimeException)
     254             : {
     255       18563 :     return rBroker->createContentIdentifier(rURL);
     256             : }
     257             : 
     258      175826 : static Reference< XContent > getContentThrow(
     259             :                                     const Reference< XUniversalContentBroker > & rBroker,
     260             :                                     const Reference< XContentIdentifier > & xId)
     261             :     throw ( ContentCreationException, RuntimeException )
     262             : {
     263      175826 :     Reference< XContent > xContent;
     264      351652 :     OUString msg;
     265             :     try
     266             :     {
     267      175826 :         xContent = rBroker->queryContent( xId );
     268             :     }
     269           0 :     catch ( IllegalIdentifierException const & e )
     270             :     {
     271           0 :         msg = e.Message;
     272             :         // handled below.
     273             :     }
     274             : 
     275      175826 :     if ( !xContent.is() )
     276             :     {
     277       21200 :         ensureContentProviderForURL( rBroker, xId->getContentIdentifier() );
     278             : 
     279             :         throw ContentCreationException(
     280           0 :             "Unable to create Content for <" + xId->getContentIdentifier() + ">: " + msg,
     281             :             Reference< XInterface >(),
     282           0 :             ContentCreationError_CONTENT_CREATION_FAILED );
     283             :     }
     284             : 
     285      330452 :     return xContent;
     286             : }
     287             : 
     288             : 
     289       18563 : static Reference< XContent > getContentNoThrow(
     290             :                                     const Reference< XUniversalContentBroker > & rBroker,
     291             :                                     const Reference< XContentIdentifier > & xId)
     292             :     throw ( RuntimeException )
     293             : {
     294       18563 :     Reference< XContent > xContent;
     295             :     try
     296             :     {
     297       18563 :         xContent = rBroker->queryContent( xId );
     298             :     }
     299           0 :     catch ( IllegalIdentifierException const & e )
     300             :     {
     301             :         SAL_WARN("ucbhelper", "getContentNoThrow: exception: " << e.Message);
     302             :     }
     303             : 
     304       18563 :     return xContent;
     305             : }
     306             : 
     307             : 
     308             : 
     309             : 
     310             : // Content Implementation.
     311             : 
     312             : 
     313             : 
     314             : 
     315       77063 : Content::Content()
     316       77063 : : m_xImpl( new Content_Impl )
     317             : {
     318       77063 : }
     319             : 
     320             : 
     321      175826 : Content::Content( const OUString& rURL,
     322             :                   const Reference< XCommandEnvironment >& rEnv,
     323             :                   const Reference< XComponentContext >& rCtx )
     324      186426 :     throw ( ContentCreationException, RuntimeException )
     325             : {
     326             :     Reference< XUniversalContentBroker > pBroker(
     327      175826 :         UniversalContentBroker::create( rCtx ) );
     328             : 
     329             :     Reference< XContentIdentifier > xId
     330      351652 :         = getContentIdentifierThrow(pBroker, rURL);
     331             : 
     332      341052 :     Reference< XContent > xContent = getContentThrow(pBroker, xId);
     333             : 
     334      341052 :     m_xImpl = new Content_Impl( rCtx, xContent, rEnv );
     335      165226 : }
     336             : 
     337             : 
     338       40422 : Content::Content( const Reference< XContent >& rContent,
     339             :                   const Reference< XCommandEnvironment >& rEnv,
     340             :                   const Reference< XComponentContext >& rCtx )
     341       40422 :     throw ( ContentCreationException, RuntimeException )
     342             : {
     343       40422 :     m_xImpl = new Content_Impl( rCtx, rContent, rEnv );
     344       40422 : }
     345             : 
     346             : 
     347        3218 : Content::Content( const Content& rOther )
     348             : {
     349        3218 :     m_xImpl = rOther.m_xImpl;
     350        3218 : }
     351             : 
     352             : 
     353             : // static
     354       18563 : bool Content::create( const OUString& rURL,
     355             :                           const Reference< XCommandEnvironment >& rEnv,
     356             :                           const Reference< XComponentContext >& rCtx,
     357             :                           Content& rContent )
     358             : {
     359             :     Reference< XUniversalContentBroker > pBroker(
     360       18563 :         UniversalContentBroker::create( rCtx ) );
     361             : 
     362             :     Reference< XContentIdentifier > xId
     363       37126 :         = getContentIdentifierNoThrow(pBroker, rURL);
     364       18563 :     if ( !xId.is() )
     365           0 :         return false;
     366             : 
     367       37126 :     Reference< XContent > xContent = getContentNoThrow(pBroker, xId);
     368       18563 :     if ( !xContent.is() )
     369         304 :         return false;
     370             : 
     371             :     rContent.m_xImpl
     372       18259 :         = new Content_Impl( rCtx, xContent, rEnv );
     373             : 
     374       36822 :     return true;
     375             : }
     376             : 
     377             : 
     378      285816 : Content::~Content()
     379             : {
     380      285816 : }
     381             : 
     382             : 
     383       52368 : Content& Content::operator=( const Content& rOther )
     384             : {
     385       52368 :     m_xImpl = rOther.m_xImpl;
     386       52368 :     return *this;
     387             : }
     388             : 
     389             : 
     390      141223 : Reference< XContent > Content::get() const
     391             : {
     392      141223 :     return m_xImpl->getContent();
     393             : }
     394             : 
     395             : 
     396       15837 : const OUString& Content::getURL() const
     397             : {
     398       15837 :     return m_xImpl->getURL();
     399             : }
     400             : 
     401             : 
     402          12 : const Reference< XCommandEnvironment >& Content::getCommandEnvironment() const
     403             : {
     404          12 :     return m_xImpl->getEnvironment();
     405             : }
     406             : 
     407             : 
     408        4632 : void Content::setCommandEnvironment(
     409             :                         const Reference< XCommandEnvironment >& xNewEnv )
     410             : {
     411        4632 :     m_xImpl->setEnvironment( xNewEnv );
     412        4632 : }
     413             : 
     414             : 
     415           0 : Reference< XCommandInfo > Content::getCommands()
     416             :     throw( CommandAbortedException, RuntimeException, Exception )
     417             : {
     418           0 :     Command aCommand;
     419           0 :     aCommand.Name     = "getCommandInfo";
     420           0 :     aCommand.Handle   = -1; // n/a
     421           0 :     aCommand.Argument = Any();
     422             : 
     423           0 :     Any aResult = m_xImpl->executeCommand( aCommand );
     424             : 
     425           0 :     Reference< XCommandInfo > xInfo;
     426           0 :     aResult >>= xInfo;
     427           0 :     return xInfo;
     428             : }
     429             : 
     430             : 
     431       34525 : Reference< XPropertySetInfo > Content::getProperties()
     432             :     throw( CommandAbortedException, RuntimeException, Exception )
     433             : {
     434       34525 :     Command aCommand;
     435       34525 :     aCommand.Name     = "getPropertySetInfo";
     436       34525 :     aCommand.Handle   = -1; // n/a
     437       34525 :     aCommand.Argument = Any();
     438             : 
     439       69050 :     Any aResult = m_xImpl->executeCommand( aCommand );
     440             : 
     441       34525 :     Reference< XPropertySetInfo > xInfo;
     442       34525 :     aResult >>= xInfo;
     443       69050 :     return xInfo;
     444             : }
     445             : 
     446             : 
     447      101115 : Any Content::getPropertyValue( const OUString& rPropertyName )
     448             :     throw( CommandAbortedException, RuntimeException, Exception )
     449             : {
     450      101115 :     Sequence< OUString > aNames( 1 );
     451      101115 :     aNames.getArray()[ 0 ] = rPropertyName;
     452             : 
     453      172108 :     Sequence< Any > aRet = getPropertyValues( aNames );
     454      141986 :     return aRet.getConstArray()[ 0 ];
     455             : }
     456             : 
     457             : 
     458        1453 : Any Content::setPropertyValue( const OUString& rName,
     459             :                                 const Any& rValue )
     460             :     throw( CommandAbortedException, RuntimeException, Exception )
     461             : {
     462        1453 :     Sequence< OUString > aNames( 1 );
     463        1453 :     aNames.getArray()[ 0 ] = rName;
     464             : 
     465        2906 :     Sequence< Any > aValues( 1 );
     466        1453 :     aValues.getArray()[ 0 ] = rValue;
     467             : 
     468        2906 :     Sequence< Any > aErrors = setPropertyValues( aNames, aValues );
     469        2906 :     return aErrors.getConstArray()[ 0 ];
     470             : }
     471             : 
     472             : 
     473      101115 : Sequence< Any > Content::getPropertyValues(
     474             :                             const Sequence< OUString >& rPropertyNames )
     475             :     throw( CommandAbortedException, RuntimeException, Exception )
     476             : {
     477      101115 :     Reference< XRow > xRow = getPropertyValuesInterface( rPropertyNames );
     478             : 
     479       70993 :     sal_Int32 nCount = rPropertyNames.getLength();
     480       70993 :     Sequence< Any > aValues( nCount );
     481             : 
     482       70993 :     if ( xRow.is() )
     483             :     {
     484       70993 :         Any* pValues = aValues.getArray();
     485             : 
     486      141986 :         for ( sal_Int32 n = 0; n < nCount; ++n )
     487       70993 :             pValues[ n ] = xRow->getObject( n + 1, Reference< XNameAccess >() );
     488             :     }
     489             : 
     490       70993 :     return aValues;
     491             : }
     492             : 
     493             : 
     494      101115 : Reference< XRow > Content::getPropertyValuesInterface(
     495             :                             const Sequence< OUString >& rPropertyNames )
     496             :     throw( CommandAbortedException, RuntimeException, Exception )
     497             : {
     498      101115 :     sal_Int32 nCount = rPropertyNames.getLength();
     499      101115 :     Sequence< Property > aProps( nCount );
     500      101115 :     Property* pProps = aProps.getArray();
     501             : 
     502      101115 :     const OUString* pNames  = rPropertyNames.getConstArray();
     503             : 
     504      202230 :     for ( sal_Int32 n = 0; n< nCount; ++n )
     505             :     {
     506      101115 :         Property& rProp = pProps[ n ];
     507             : 
     508      101115 :         rProp.Name       = pNames[ n ];
     509      101115 :         rProp.Handle     = -1; // n/a
     510             : //        rProp.Type       =
     511             : //        rProp.Attributes = ;
     512             :     }
     513             : 
     514      202230 :     Command aCommand;
     515      101115 :     aCommand.Name     = "getPropertyValues";
     516      101115 :     aCommand.Handle   = -1; // n/a
     517      101115 :     aCommand.Argument <<= aProps;
     518             : 
     519      172108 :     Any aResult = m_xImpl->executeCommand( aCommand );
     520             : 
     521       70993 :     Reference< XRow > xRow;
     522       70993 :     aResult >>= xRow;
     523      172108 :     return xRow;
     524             : }
     525             : 
     526             : 
     527        6376 : Sequence< Any > Content::setPropertyValues(
     528             :                             const Sequence< OUString >& rPropertyNames,
     529             :                                 const Sequence< Any >& rValues )
     530             :     throw( CommandAbortedException, RuntimeException, Exception )
     531             : {
     532        6376 :     if ( rPropertyNames.getLength() != rValues.getLength() )
     533             :     {
     534             :         ucbhelper::cancelCommandExecution(
     535             :             makeAny( IllegalArgumentException(
     536             :                         OUString(
     537             :                             "Length of property names sequence and value "
     538             :                             "sequence are unequal!" ),
     539             :                         get(),
     540           0 :                         -1 ) ),
     541           0 :             m_xImpl->getEnvironment() );
     542             :         // Unreachable
     543             :     }
     544             : 
     545        6376 :     sal_Int32 nCount = rValues.getLength();
     546        6376 :     Sequence< PropertyValue > aProps( nCount );
     547        6376 :     PropertyValue* pProps = aProps.getArray();
     548             : 
     549        6376 :     const OUString* pNames  = rPropertyNames.getConstArray();
     550        6376 :     const Any* pValues = rValues.getConstArray();
     551             : 
     552       12800 :     for ( sal_Int32 n = 0; n< nCount; ++n )
     553             :     {
     554        6424 :         PropertyValue& rProp = pProps[ n ];
     555             : 
     556        6424 :         rProp.Name   = pNames[ n ];
     557        6424 :         rProp.Handle = -1; // n/a
     558        6424 :         rProp.Value  = pValues[ n ];
     559             : //        rProp.State  = ;
     560             :     }
     561             : 
     562       12752 :     Command aCommand;
     563        6376 :     aCommand.Name     = "setPropertyValues";
     564        6376 :     aCommand.Handle   = -1; // n/a
     565        6376 :     aCommand.Argument <<= aProps;
     566             : 
     567       12752 :     Any aResult = m_xImpl->executeCommand( aCommand );
     568             : 
     569        6376 :     Sequence< Any > aErrors;
     570        6376 :     aResult >>= aErrors;
     571       12752 :     return aErrors;
     572             : }
     573             : 
     574             : 
     575       47639 : Any Content::executeCommand( const OUString& rCommandName,
     576             :                              const Any& rCommandArgument )
     577             :     throw( CommandAbortedException, RuntimeException, Exception )
     578             : {
     579       47639 :     Command aCommand;
     580       47639 :     aCommand.Name     = rCommandName;
     581       47639 :     aCommand.Handle   = -1; // n/a
     582       47639 :     aCommand.Argument = rCommandArgument;
     583             : 
     584       47639 :     return m_xImpl->executeCommand( aCommand );
     585             : }
     586             : 
     587             : 
     588       91019 : Any Content::createCursorAny( const Sequence< OUString >& rPropertyNames,
     589             :                               ResultSetInclude eMode )
     590             :     throw( CommandAbortedException, RuntimeException, Exception )
     591             : {
     592       91019 :     sal_Int32 nCount = rPropertyNames.getLength();
     593       91019 :     Sequence< Property > aProps( nCount );
     594       91019 :     Property* pProps = aProps.getArray();
     595       91019 :     const OUString* pNames = rPropertyNames.getConstArray();
     596      181984 :     for ( sal_Int32 n = 0; n < nCount; ++n )
     597             :     {
     598       90965 :         Property& rProp = pProps[ n ];
     599       90965 :         rProp.Name   = pNames[ n ];
     600       90965 :         rProp.Handle = -1; // n/a
     601             :     }
     602             : 
     603      182038 :     OpenCommandArgument2 aArg;
     604             :     aArg.Mode       = ( eMode == INCLUDE_FOLDERS_ONLY )
     605             :                         ? OpenMode::FOLDERS
     606             :                         : ( eMode == INCLUDE_DOCUMENTS_ONLY )
     607       91019 :                             ? OpenMode::DOCUMENTS : OpenMode::ALL;
     608       91019 :     aArg.Priority   = 0; // unused
     609       91019 :     aArg.Sink.clear(); // unused
     610       91019 :     aArg.Properties = aProps;
     611             : 
     612      182038 :     Command aCommand;
     613       91019 :     aCommand.Name     = "open";
     614       91019 :     aCommand.Handle   = -1; // n/a
     615       91019 :     aCommand.Argument <<= aArg;
     616             : 
     617      182038 :     return m_xImpl->executeCommand( aCommand );
     618             : }
     619             : 
     620             : 
     621       90719 : Reference< XResultSet > Content::createCursor(
     622             :                             const Sequence< OUString >& rPropertyNames,
     623             :                             ResultSetInclude eMode )
     624             :     throw( CommandAbortedException, RuntimeException, Exception )
     625             : {
     626       90719 :     Any aCursorAny = createCursorAny( rPropertyNames, eMode );
     627             : 
     628      181206 :     Reference< XDynamicResultSet > xDynSet;
     629       90603 :     Reference< XResultSet > aResult;
     630             : 
     631       90603 :     aCursorAny >>= xDynSet;
     632       90603 :     if ( xDynSet.is() )
     633       90603 :         aResult = xDynSet->getStaticResultSet();
     634             : 
     635             :     OSL_ENSURE( aResult.is(), "Content::createCursor - no cursor!" );
     636             : 
     637       90603 :     if ( !aResult.is() )
     638             :     {
     639             :         // Former, the open command directly returned a XResultSet.
     640           0 :         aCursorAny >>= aResult;
     641             : 
     642             :         OSL_ENSURE( !aResult.is(),
     643             :                     "Content::createCursor - open-Command must "
     644             :                     "return a Reference< XDynnamicResultSet >!" );
     645             :     }
     646             : 
     647      181206 :     return aResult;
     648             : }
     649             : 
     650             : 
     651         292 : Reference< XDynamicResultSet > Content::createDynamicCursor(
     652             :                             const Sequence< OUString >& rPropertyNames,
     653             :                             ResultSetInclude eMode )
     654             :     throw( CommandAbortedException, RuntimeException, Exception )
     655             : {
     656         292 :     Reference< XDynamicResultSet > aResult;
     657         292 :     createCursorAny( rPropertyNames, eMode ) >>= aResult;
     658             : 
     659             :     OSL_ENSURE( aResult.is(), "Content::createDynamicCursor - no cursor!" );
     660             : 
     661         292 :     return aResult;
     662             : }
     663             : 
     664             : 
     665           8 : Reference< XResultSet > Content::createSortedCursor(
     666             :                             const Sequence< OUString >& rPropertyNames,
     667             :                             const Sequence< NumberedSortingInfo >& rSortInfo,
     668             :                             Reference< XAnyCompareFactory > rAnyCompareFactory,
     669             :                             ResultSetInclude eMode )
     670             :     throw( CommandAbortedException, RuntimeException, Exception )
     671             : {
     672           8 :     Reference< XResultSet > aResult;
     673          16 :     Reference< XDynamicResultSet > aDynSet;
     674             : 
     675          16 :     Any aCursorAny = createCursorAny( rPropertyNames, eMode );
     676             : 
     677           8 :     aCursorAny >>= aDynSet;
     678             : 
     679           8 :     if( aDynSet.is() )
     680             :     {
     681           6 :         Reference< XDynamicResultSet > aDynResult;
     682             : 
     683           6 :         if( m_xImpl->getComponentContext().is() )
     684             :         {
     685             :             Reference< XSortedDynamicResultSetFactory > aSortFactory =
     686           6 :                                 SortedDynamicResultSetFactory::create( m_xImpl->getComponentContext());
     687             : 
     688          18 :             aDynResult = aSortFactory->createSortedDynamicResultSet( aDynSet,
     689             :                                                               rSortInfo,
     690          18 :                                                               rAnyCompareFactory );
     691             :         }
     692             : 
     693             :         OSL_ENSURE( aDynResult.is(), "Content::createSortedCursor - no sorted cursor!\n" );
     694             : 
     695           6 :         if( aDynResult.is() )
     696           6 :             aResult = aDynResult->getStaticResultSet();
     697             :         else
     698           0 :             aResult = aDynSet->getStaticResultSet();
     699             :     }
     700             : 
     701             :     OSL_ENSURE( aResult.is(), "Content::createSortedCursor - no cursor!" );
     702             : 
     703           8 :     if ( !aResult.is() )
     704             :     {
     705             :         // Former, the open command directly returned a XResultSet.
     706           2 :         aCursorAny >>= aResult;
     707             : 
     708             :         OSL_ENSURE( !aResult.is(),
     709             :                     "Content::createCursor - open-Command must "
     710             :                     "return a Reference< XDynnamicResultSet >!" );
     711             :     }
     712             : 
     713          16 :     return aResult;
     714             : }
     715             : 
     716             : 
     717        6794 : Reference< XInputStream > Content::openStream()
     718             :     throw( CommandAbortedException, RuntimeException, Exception )
     719             : {
     720        6794 :     if ( !isDocument() )
     721           0 :         return Reference< XInputStream >();
     722             : 
     723        6706 :     Reference< XActiveDataSink > xSink = new ActiveDataSink;
     724             : 
     725       13412 :     OpenCommandArgument2 aArg;
     726        6706 :     aArg.Mode       = OpenMode::DOCUMENT;
     727        6706 :     aArg.Priority   = 0; // unused
     728        6706 :     aArg.Sink       = xSink;
     729        6706 :     aArg.Properties = Sequence< Property >( 0 ); // unused
     730             : 
     731       13412 :     Command aCommand;
     732        6706 :     aCommand.Name     = "open";
     733        6706 :     aCommand.Handle   = -1; // n/a
     734        6706 :     aCommand.Argument <<= aArg;
     735             : 
     736        6706 :     m_xImpl->executeCommand( aCommand );
     737             : 
     738       13412 :     return xSink->getInputStream();
     739             : }
     740             : 
     741             : 
     742        4520 : Reference< XInputStream > Content::openStreamNoLock()
     743             :     throw( CommandAbortedException, RuntimeException, Exception )
     744             : {
     745        4520 :     if ( !isDocument() )
     746           0 :         return Reference< XInputStream >();
     747             : 
     748        4158 :     Reference< XActiveDataSink > xSink = new ActiveDataSink;
     749             : 
     750        8316 :     OpenCommandArgument2 aArg;
     751        4158 :     aArg.Mode       = OpenMode::DOCUMENT_SHARE_DENY_NONE;
     752        4158 :     aArg.Priority   = 0; // unused
     753        4158 :     aArg.Sink       = xSink;
     754        4158 :     aArg.Properties = Sequence< Property >( 0 ); // unused
     755             : 
     756        8316 :     Command aCommand;
     757        4158 :     aCommand.Name     = "open";
     758        4158 :     aCommand.Handle   = -1; // n/a
     759        4158 :     aCommand.Argument <<= aArg;
     760             : 
     761        4158 :     m_xImpl->executeCommand( aCommand );
     762             : 
     763        8316 :     return xSink->getInputStream();
     764             : }
     765             : 
     766             : 
     767        4694 : Reference< XStream > Content::openWriteableStream()
     768             :     throw( CommandAbortedException, RuntimeException, Exception )
     769             : {
     770        4694 :     if ( !isDocument() )
     771           0 :         return Reference< XStream >();
     772             : 
     773        4670 :     Reference< XActiveDataStreamer > xStreamer = new ActiveDataStreamer;
     774             : 
     775        9340 :     OpenCommandArgument2 aArg;
     776        4670 :     aArg.Mode       = OpenMode::DOCUMENT;
     777        4670 :     aArg.Priority   = 0; // unused
     778        4670 :     aArg.Sink       = xStreamer;
     779        4670 :     aArg.Properties = Sequence< Property >( 0 ); // unused
     780             : 
     781        9340 :     Command aCommand;
     782        4670 :     aCommand.Name     = "open";
     783        4670 :     aCommand.Handle   = -1; // n/a
     784        4670 :     aCommand.Argument <<= aArg;
     785             : 
     786        4670 :     m_xImpl->executeCommand( aCommand );
     787             : 
     788        9340 :     return xStreamer->getStream();
     789             : }
     790             : 
     791             : 
     792           0 : Reference< XStream > Content::openWriteableStreamNoLock()
     793             :     throw( CommandAbortedException, RuntimeException, Exception )
     794             : {
     795           0 :     if ( !isDocument() )
     796           0 :         return Reference< XStream >();
     797             : 
     798           0 :     Reference< XActiveDataStreamer > xStreamer = new ActiveDataStreamer;
     799             : 
     800           0 :     OpenCommandArgument2 aArg;
     801           0 :     aArg.Mode       = OpenMode::DOCUMENT_SHARE_DENY_NONE;
     802           0 :     aArg.Priority   = 0; // unused
     803           0 :     aArg.Sink       = xStreamer;
     804           0 :     aArg.Properties = Sequence< Property >( 0 ); // unused
     805             : 
     806           0 :     Command aCommand;
     807           0 :     aCommand.Name     = "open";
     808           0 :     aCommand.Handle   = -1; // n/a
     809           0 :     aCommand.Argument <<= aArg;
     810             : 
     811           0 :     m_xImpl->executeCommand( aCommand );
     812             : 
     813           0 :     return xStreamer->getStream();
     814             : }
     815             : 
     816             : 
     817        7039 : bool Content::openStream( const Reference< XActiveDataSink >& rSink )
     818             :     throw( CommandAbortedException, RuntimeException, Exception )
     819             : {
     820        7039 :     if ( !isDocument() )
     821           0 :         return false;
     822             : 
     823        6421 :     OpenCommandArgument2 aArg;
     824        6421 :     aArg.Mode       = OpenMode::DOCUMENT;
     825        6421 :     aArg.Priority   = 0; // unused
     826        6421 :     aArg.Sink       = rSink;
     827        6421 :     aArg.Properties = Sequence< Property >( 0 ); // unused
     828             : 
     829       12842 :     Command aCommand;
     830        6421 :     aCommand.Name     = "open";
     831        6421 :     aCommand.Handle   = -1; // n/a
     832        6421 :     aCommand.Argument <<= aArg;
     833             : 
     834        6421 :     m_xImpl->executeCommand( aCommand );
     835             : 
     836       12842 :     return true;
     837             : }
     838             : 
     839             : 
     840           2 : bool Content::openStream( const Reference< XOutputStream >& rStream )
     841             :     throw( CommandAbortedException, RuntimeException, Exception )
     842             : {
     843           2 :     if ( !isDocument() )
     844           0 :         return false;
     845             : 
     846           2 :     OpenCommandArgument2 aArg;
     847           2 :     aArg.Mode       = OpenMode::DOCUMENT;
     848           2 :     aArg.Priority   = 0; // unused
     849           2 :     aArg.Sink       = rStream;
     850           2 :     aArg.Properties = Sequence< Property >( 0 ); // unused
     851             : 
     852           4 :     Command aCommand;
     853           2 :     aCommand.Name     = "open";
     854           2 :     aCommand.Handle   = -1; // n/a
     855           2 :     aCommand.Argument <<= aArg;
     856             : 
     857           2 :     m_xImpl->executeCommand( aCommand );
     858             : 
     859           4 :     return true;
     860             : }
     861             : 
     862             : 
     863        2095 : void Content::writeStream( const Reference< XInputStream >& rStream,
     864             :                            bool bReplaceExisting )
     865             :     throw( CommandAbortedException, RuntimeException, Exception )
     866             : {
     867        2095 :     InsertCommandArgument aArg;
     868        2095 :     aArg.Data            = rStream.is() ? rStream : new EmptyInputStream;
     869        2095 :     aArg.ReplaceExisting = bReplaceExisting;
     870             : 
     871        4190 :     Command aCommand;
     872        2095 :     aCommand.Name     = "insert";
     873        2095 :     aCommand.Handle   = -1; // n/a
     874        2095 :     aCommand.Argument <<= aArg;
     875             : 
     876        2095 :     m_xImpl->executeCommand( aCommand );
     877             : 
     878        4190 :     m_xImpl->inserted();
     879        2095 : }
     880             : 
     881             : 
     882        4903 : Sequence< ContentInfo > Content::queryCreatableContentsInfo()
     883             :     throw( CommandAbortedException, RuntimeException, Exception )
     884             : {
     885             :     // First, try it using "CreatableContentsInfo" property -> the "new" way.
     886        4903 :     Sequence< ContentInfo > aInfo;
     887        9790 :     if ( getPropertyValue(
     888             :              OUString("CreatableContentsInfo") )
     889        9798 :          >>= aInfo )
     890        4895 :         return aInfo;
     891             : 
     892             :     // Second, try it using XContentCreator interface -> the "old" way (not
     893             :     // providing the chance to supply an XCommandEnvironment.
     894           0 :     Reference< XContentCreator > xCreator( m_xImpl->getContent(), UNO_QUERY );
     895           0 :     if ( xCreator.is() )
     896           0 :         aInfo = xCreator->queryCreatableContentsInfo();
     897             : 
     898           0 :     return aInfo;
     899             : }
     900             : 
     901             : 
     902        4923 : bool Content::insertNewContent( const OUString& rContentType,
     903             :                                     const Sequence< OUString >&
     904             :                                         rPropertyNames,
     905             :                                     const Sequence< Any >& rPropertyValues,
     906             :                                     Content& rNewContent )
     907             :     throw( CommandAbortedException, RuntimeException, Exception )
     908             : {
     909             :     return insertNewContent( rContentType,
     910             :                              rPropertyNames,
     911             :                              rPropertyValues,
     912        4923 :                              new EmptyInputStream,
     913        9846 :                              rNewContent );
     914             : }
     915             : 
     916             : 
     917        4923 : bool Content::insertNewContent( const OUString& rContentType,
     918             :                                     const Sequence< OUString >&
     919             :                                         rPropertyNames,
     920             :                                     const Sequence< Any >& rPropertyValues,
     921             :                                     const Reference< XInputStream >& rData,
     922             :                                     Content& rNewContent )
     923             :     throw( CommandAbortedException, RuntimeException, Exception )
     924             : {
     925        4923 :     if ( rContentType.isEmpty() )
     926           0 :         return false;
     927             : 
     928             :     // First, try it using "createNewContent" command -> the "new" way.
     929        4923 :     ContentInfo aInfo;
     930        4923 :     aInfo.Type = rContentType;
     931        4923 :     aInfo.Attributes = 0;
     932             : 
     933        9846 :     Command aCommand;
     934        4923 :     aCommand.Name     = "createNewContent";
     935        4923 :     aCommand.Handle   = -1; // n/a
     936        4923 :     aCommand.Argument <<= aInfo;
     937             : 
     938        9846 :     Reference< XContent > xNew;
     939             :     try
     940             :     {
     941        4923 :         m_xImpl->executeCommand( aCommand ) >>= xNew;
     942             :     }
     943           0 :     catch ( RuntimeException const & )
     944             :     {
     945           0 :         throw;
     946             :     }
     947           0 :     catch ( Exception const & )
     948             :     {
     949             :     }
     950             : 
     951        4923 :     if ( !xNew.is() )
     952             :     {
     953             :         // Second, try it using XContentCreator interface -> the "old"
     954             :         // way (not providing the chance to supply an XCommandEnvironment.
     955           0 :         Reference< XContentCreator > xCreator( m_xImpl->getContent(), UNO_QUERY );
     956             : 
     957           0 :         if ( !xCreator.is() )
     958           0 :             return false;
     959             : 
     960           0 :         xNew = xCreator->createNewContent( aInfo );
     961             : 
     962           0 :         if ( !xNew.is() )
     963           0 :             return false;
     964             :     }
     965             : 
     966             :     Content aNewContent(
     967        9846 :         xNew, m_xImpl->getEnvironment(), m_xImpl->getComponentContext() );
     968        4923 :     aNewContent.setPropertyValues( rPropertyNames, rPropertyValues );
     969             :     aNewContent.executeCommand( OUString("insert"),
     970             :                                 makeAny(
     971             :                                     InsertCommandArgument(
     972        4923 :                                         rData.is() ? rData : new EmptyInputStream,
     973       11313 :                                         sal_False /* ReplaceExisting */ ) ) );
     974        3456 :     aNewContent.m_xImpl->inserted();
     975             : 
     976        3456 :     rNewContent = aNewContent;
     977        8379 :     return true;
     978             : }
     979             : 
     980             : 
     981        5589 : bool Content::transferContent( const Content& rSourceContent,
     982             :                                    InsertOperation eOperation,
     983             :                                    const OUString & rTitle,
     984             :                                    const sal_Int32 nNameClashAction,
     985             :                                    const OUString & rMimeType,
     986             :                                    bool bMajorVersion,
     987             :                                    const OUString & rVersionComment,
     988             :                                    OUString* pResultURL,
     989             :                                    const OUString & rDocumentId )
     990             :     throw( CommandAbortedException, RuntimeException, Exception )
     991             : {
     992             :     Reference< XUniversalContentBroker > pBroker(
     993        5589 :         UniversalContentBroker::create( m_xImpl->getComponentContext() ) );
     994             : 
     995             :     // Execute command "globalTransfer" at UCB.
     996             : 
     997        5589 :     TransferCommandOperation eTransOp = TransferCommandOperation();
     998       11178 :     OUString sCommand( "globalTransfer" );
     999        5589 :     bool bCheckIn = false;
    1000        5589 :     switch ( eOperation )
    1001             :     {
    1002             :         case InsertOperation_COPY:
    1003        5588 :             eTransOp = TransferCommandOperation_COPY;
    1004        5588 :             break;
    1005             : 
    1006             :         case InsertOperation_MOVE:
    1007           1 :             eTransOp = TransferCommandOperation_MOVE;
    1008           1 :             break;
    1009             : 
    1010             :         case InsertOperation_LINK:
    1011           0 :             eTransOp = TransferCommandOperation_LINK;
    1012           0 :             break;
    1013             : 
    1014             :         case InsertOperation_CHECKIN:
    1015           0 :             eTransOp = TransferCommandOperation_COPY;
    1016           0 :             sCommand = "checkin";
    1017           0 :             bCheckIn = true;
    1018           0 :             break;
    1019             :     }
    1020        5589 :     Command aCommand;
    1021        5589 :     aCommand.Name     = sCommand;
    1022        5589 :     aCommand.Handle   = -1; // n/a
    1023             : 
    1024        5589 :     if ( !bCheckIn )
    1025             :     {
    1026             :         GlobalTransferCommandArgument2 aTransferArg(
    1027             :                                             eTransOp,
    1028        5589 :                                             rSourceContent.getURL(), // SourceURL
    1029        5589 :                                             getURL(),   // TargetFolderURL,
    1030             :                                             rTitle,
    1031             :                                             nNameClashAction,
    1032             :                                             rMimeType,
    1033        5589 :                                             rDocumentId );
    1034        5589 :         aCommand.Argument <<= aTransferArg;
    1035             :     }
    1036             :     else
    1037             :     {
    1038             :         CheckinArgument aCheckinArg( bMajorVersion, rVersionComment,
    1039           0 :                 rSourceContent.getURL(), getURL(), rTitle, rMimeType );
    1040           0 :         aCommand.Argument <<= aCheckinArg;
    1041             :     }
    1042             : 
    1043       11173 :     Any aRet = pBroker->execute( aCommand, 0, m_xImpl->getEnvironment() );
    1044        5584 :     if ( pResultURL != NULL )
    1045           0 :         aRet >>= *pResultURL;
    1046       16762 :     return true;
    1047             : }
    1048             : 
    1049             : 
    1050       44424 : bool Content::isFolder()
    1051             :     throw( CommandAbortedException, RuntimeException, Exception )
    1052             : {
    1053       44424 :     bool bFolder = false;
    1054       35208 :     if ( getPropertyValue("IsFolder")
    1055       88848 :         >>= bFolder )
    1056       17600 :         return bFolder;
    1057             : 
    1058             :      ucbhelper::cancelCommandExecution(
    1059             :          makeAny( UnknownPropertyException(
    1060             :                     OUString(
    1061             :                         "Unable to retrieve value of property 'IsFolder'!" ),
    1062           8 :                     get() ) ),
    1063          12 :          m_xImpl->getEnvironment() );
    1064             : 
    1065             : #if !(defined(_MSC_VER) && defined(ENABLE_LTO))
    1066             :     // Unreachable - cancelCommandExecution always throws an exception.
    1067             :     // But some compilers complain...
    1068           0 :     return false;
    1069             : #endif
    1070             : }
    1071             : 
    1072             : 
    1073             : 
    1074             : SAL_WNOUNREACHABLE_CODE_PUSH
    1075             : 
    1076       31544 : bool Content::isDocument()
    1077             :     throw( CommandAbortedException, RuntimeException, Exception )
    1078             : {
    1079       31544 :     bool bDoc = false;
    1080       57542 :     if ( getPropertyValue("IsDocument")
    1081       63088 :         >>= bDoc )
    1082       28771 :         return bDoc;
    1083             : 
    1084             :      ucbhelper::cancelCommandExecution(
    1085             :          makeAny( UnknownPropertyException(
    1086             :                     OUString(
    1087             :                         "Unable to retrieve value of property 'IsDocument'!" ),
    1088           0 :                     get() ) ),
    1089           0 :          m_xImpl->getEnvironment() );
    1090             : 
    1091             :     // Unreachable - cancelCommandExecution always throws an exception,
    1092             :     // But some compilers complain...
    1093           0 :     return false;
    1094             : }
    1095             : 
    1096             : SAL_WNOUNREACHABLE_CODE_POP
    1097             : 
    1098             : 
    1099             : 
    1100             : 
    1101             : // Content_Impl Implementation.
    1102             : 
    1103             : 
    1104             : 
    1105             : 
    1106      223907 : Content_Impl::Content_Impl( const Reference< XComponentContext >& rCtx,
    1107             :                             const Reference< XContent >& rContent,
    1108             :                             const Reference< XCommandEnvironment >& rEnv )
    1109             : : m_xCtx( rCtx ),
    1110             :   m_xContent( rContent ),
    1111      223907 :   m_xEnv( rEnv )
    1112             : {
    1113             :     assert(rCtx.is());
    1114      223907 :     if ( m_xContent.is() )
    1115             :     {
    1116      223905 :         m_xContentEventListener = new ContentEventListener_Impl( *this );
    1117      223905 :         m_xContent->addContentEventListener( m_xContentEventListener );
    1118             : 
    1119             : #if OSL_DEBUG_LEVEL > 1
    1120             :         // Only done on demand in product version for performance reasons,
    1121             :         // but a nice debug helper.
    1122             :         getURL();
    1123             : #endif
    1124             :     }
    1125      223907 : }
    1126             : 
    1127             : 
    1128        3690 : void Content_Impl::reinit( const Reference< XContent >& xContent )
    1129             : {
    1130        3690 :     osl::MutexGuard aGuard( m_aMutex );
    1131             : 
    1132        3690 :     m_xCommandProcessor = 0;
    1133             : 
    1134             :     // #92581# - Don't reset m_aURL!!!
    1135             : 
    1136        3690 :     if ( m_xContent.is() )
    1137             :     {
    1138             :         try
    1139             :         {
    1140        3690 :             m_xContent->removeContentEventListener( m_xContentEventListener );
    1141             :         }
    1142           0 :         catch ( RuntimeException const & )
    1143             :         {
    1144             :         }
    1145             :     }
    1146             : 
    1147        3690 :     if ( xContent.is() )
    1148             :     {
    1149           1 :         m_xContent = xContent;
    1150           1 :         m_xContent->addContentEventListener( m_xContentEventListener );
    1151             : 
    1152             : #if OSL_DEBUG_LEVEL > 1
    1153             :         // Only done on demand in product version for performance reasons,
    1154             :         // but a nice debug helper.
    1155             :         getURL();
    1156             : #endif
    1157             :     }
    1158             :     else
    1159             :     {
    1160             :         // We need m_xContent's URL in order to be able to create the
    1161             :         // content object again if demanded ( --> Content_Impl::getContent() )
    1162        3689 :         getURL();
    1163             : 
    1164        3689 :         m_xContent = 0;
    1165        3690 :     }
    1166        3690 : }
    1167             : 
    1168             : 
    1169             : // virtual
    1170      902571 : Content_Impl::~Content_Impl()
    1171             : {
    1172      300857 :     if ( m_xContent.is() )
    1173             :     {
    1174             :         try
    1175             :         {
    1176      220121 :             m_xContent->removeContentEventListener( m_xContentEventListener );
    1177             :         }
    1178           0 :         catch ( RuntimeException const & )
    1179             :         {
    1180             :         }
    1181             :     }
    1182      601714 : }
    1183             : 
    1184             : 
    1185           0 : void Content_Impl::disposing( const EventObject& Source )
    1186             : {
    1187           0 :     Reference<XContent> xContent;
    1188             : 
    1189             :     {
    1190           0 :         osl::MutexGuard aGuard( m_aMutex );
    1191           0 :         if(Source.Source != m_xContent)
    1192           0 :             return;
    1193             : 
    1194           0 :         xContent = m_xContent;
    1195             : 
    1196           0 :         m_aURL = "";
    1197           0 :         m_xCommandProcessor = 0;
    1198           0 :         m_xContent = 0;
    1199             :     }
    1200             : 
    1201           0 :     if ( xContent.is() )
    1202             :     {
    1203             :         try
    1204             :         {
    1205           0 :             xContent->removeContentEventListener( m_xContentEventListener );
    1206             :         }
    1207           0 :         catch ( RuntimeException const & )
    1208             :         {
    1209             :         }
    1210           0 :     }
    1211             : }
    1212             : 
    1213             : 
    1214       19526 : const OUString& Content_Impl::getURL() const
    1215             : {
    1216       19526 :     if ( m_aURL.isEmpty() && m_xContent.is() )
    1217             :     {
    1218       19507 :         osl::MutexGuard aGuard( m_aMutex );
    1219             : 
    1220       19507 :         if ( m_aURL.isEmpty() && m_xContent.is() )
    1221             :         {
    1222       19507 :             Reference< XContentIdentifier > xId = m_xContent->getIdentifier();
    1223       19507 :             if ( xId.is() )
    1224       19507 :                 m_aURL = xId->getContentIdentifier();
    1225       19507 :         }
    1226             :     }
    1227             : 
    1228       19526 :     return m_aURL;
    1229             : }
    1230             : 
    1231             : 
    1232      313282 : Reference< XContent > Content_Impl::getContent()
    1233             : {
    1234      313282 :     if ( !m_xContent.is() && !m_aURL.isEmpty() )
    1235             :     {
    1236           7 :         osl::MutexGuard aGuard( m_aMutex );
    1237             : 
    1238           7 :         if ( !m_xContent.is() && !m_aURL.isEmpty() )
    1239             :         {
    1240             :             Reference< XUniversalContentBroker > pBroker(
    1241           7 :                 UniversalContentBroker::create( getComponentContext() ) );
    1242             : 
    1243             :             OSL_ENSURE( pBroker->queryContentProviders().getLength(),
    1244             :                         "Content Broker not configured (no providers)!" );
    1245             : 
    1246             :             Reference< XContentIdentifier > xId
    1247          14 :                 = pBroker->createContentIdentifier( m_aURL );
    1248             : 
    1249             :             OSL_ENSURE( xId.is(), "No Content Identifier!" );
    1250             : 
    1251           7 :             if ( xId.is() )
    1252             :             {
    1253             :                 try
    1254             :                 {
    1255           7 :                     m_xContent = pBroker->queryContent( xId );
    1256             :                 }
    1257           0 :                 catch ( IllegalIdentifierException const & )
    1258             :                 {
    1259             :                 }
    1260             : 
    1261           7 :                 if ( m_xContent.is() )
    1262           7 :                     m_xContent->addContentEventListener(
    1263           7 :                         m_xContentEventListener );
    1264           7 :             }
    1265           7 :         }
    1266             :     }
    1267             : 
    1268      313282 :     return m_xContent;
    1269             : }
    1270             : 
    1271             : 
    1272      309649 : Reference< XCommandProcessor > Content_Impl::getCommandProcessor()
    1273             : {
    1274      309649 :     if ( !m_xCommandProcessor.is() )
    1275             :     {
    1276      172059 :         osl::MutexGuard aGuard( m_aMutex );
    1277             : 
    1278      172059 :         if ( !m_xCommandProcessor.is() )
    1279             :             m_xCommandProcessor
    1280      172059 :                 = Reference< XCommandProcessor >( getContent(), UNO_QUERY );
    1281             :     }
    1282             : 
    1283      309649 :     return m_xCommandProcessor;
    1284             : }
    1285             : 
    1286             : 
    1287      309649 : Any Content_Impl::executeCommand( const Command& rCommand )
    1288             : {
    1289      309649 :     Reference< XCommandProcessor > xProc = getCommandProcessor();
    1290      309649 :     if ( !xProc.is() )
    1291           2 :         return Any();
    1292             : 
    1293             :     // Execute command
    1294      309647 :     return xProc->execute( rCommand, 0, m_xEnv );
    1295             : }
    1296             : 
    1297             : 
    1298             : inline const Reference< XCommandEnvironment >&
    1299       10528 :                                         Content_Impl::getEnvironment() const
    1300             : {
    1301       10528 :     return m_xEnv;
    1302             : }
    1303             : 
    1304             : 
    1305        4632 : inline void Content_Impl::setEnvironment(
    1306             :                         const Reference< XCommandEnvironment >& xNewEnv )
    1307             : {
    1308        4632 :     osl::MutexGuard aGuard( m_aMutex );
    1309        4632 :     m_xEnv = xNewEnv;
    1310        4632 : }
    1311             : 
    1312             : 
    1313        5551 : void Content_Impl::inserted()
    1314             : {
    1315             :     // URL might have changed during 'insert' => recalculate in next getURL()
    1316        5551 :     osl::MutexGuard aGuard( m_aMutex );
    1317        5551 :     m_aURL = "";
    1318        5551 : }
    1319             : 
    1320             : 
    1321             : 
    1322             : 
    1323             : // ContentEventListener_Impl Implementation.
    1324             : 
    1325             : 
    1326             : 
    1327             : 
    1328             : 
    1329             : 
    1330             : // XInterface methods.
    1331             : 
    1332      792335 : void SAL_CALL ContentEventListener_Impl::acquire()
    1333             :     throw()
    1334             : {
    1335      792335 :     OWeakObject::acquire();
    1336      792335 : }
    1337             : 
    1338      792131 : void SAL_CALL ContentEventListener_Impl::release()
    1339             :     throw()
    1340             : {
    1341      792131 :     OWeakObject::release();
    1342      792131 : }
    1343             : 
    1344       14496 : css::uno::Any SAL_CALL ContentEventListener_Impl::queryInterface( const css::uno::Type & rType )
    1345             :     throw( css::uno::RuntimeException, std::exception )
    1346             : {
    1347             :     css::uno::Any aRet = cppu::queryInterface( rType,
    1348             :                                                (static_cast< XContentEventListener* >(this)),
    1349             :                                                (static_cast< XEventListener* >(this))
    1350       14496 :                                                );
    1351       14496 :     return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
    1352             : }
    1353             : 
    1354             : // XContentEventListener methods.
    1355             : 
    1356             : 
    1357             : 
    1358             : // virtual
    1359       14496 : void SAL_CALL ContentEventListener_Impl::contentEvent( const ContentEvent& evt )
    1360             :     throw( RuntimeException, std::exception )
    1361             : {
    1362       14496 :     if ( evt.Source == m_rContent.m_xContent )
    1363             :     {
    1364       14496 :         switch ( evt.Action )
    1365             :         {
    1366             :             case ContentAction::DELETED:
    1367        3689 :                 m_rContent.reinit( Reference< XContent >() );
    1368        3689 :                 break;
    1369             : 
    1370             :             case ContentAction::EXCHANGED:
    1371           1 :                 m_rContent.reinit( evt.Content );
    1372           1 :                 break;
    1373             : 
    1374             :             default:
    1375       10806 :                 break;
    1376             :         }
    1377             :     }
    1378       14496 : }
    1379             : 
    1380             : 
    1381             : 
    1382             : // XEventListenr methods.
    1383             : 
    1384             : 
    1385             : 
    1386             : // virtual
    1387           0 : void SAL_CALL ContentEventListener_Impl::disposing( const EventObject& Source )
    1388             :     throw( RuntimeException, std::exception )
    1389             : {
    1390           0 :     m_rContent.disposing(Source);
    1391           0 : }
    1392             : 
    1393             : } /* namespace ucbhelper */
    1394             : 
    1395             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10