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

Generated by: LCOV version 1.11