| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_ucbhelper.hxx" |
| |
| /************************************************************************** |
| TODO |
| ************************************************************************** |
| |
| *************************************************************************/ |
| #include <osl/diagnose.h> |
| #include <osl/mutex.hxx> |
| #include <salhelper/simplereferenceobject.hxx> |
| #include <cppuhelper/weak.hxx> |
| |
| #include <cppuhelper/implbase1.hxx> |
| #include <com/sun/star/ucb/ContentCreationError.hpp> |
| #include <com/sun/star/ucb/XCommandEnvironment.hpp> |
| #include <com/sun/star/ucb/XCommandInfo.hpp> |
| #include <com/sun/star/ucb/XCommandProcessor.hpp> |
| #include <com/sun/star/ucb/Command.hpp> |
| #include <com/sun/star/ucb/CommandInfo.hpp> |
| #include <com/sun/star/ucb/ContentAction.hpp> |
| #include <com/sun/star/ucb/OpenCommandArgument2.hpp> |
| #include <com/sun/star/ucb/InsertCommandArgument.hpp> |
| #include <com/sun/star/ucb/GlobalTransferCommandArgument.hpp> |
| #include <com/sun/star/ucb/NameClash.hpp> |
| #include <com/sun/star/ucb/OpenMode.hpp> |
| #include <com/sun/star/ucb/XContentCreator.hpp> |
| #include <com/sun/star/ucb/XContentEventListener.hpp> |
| #include <com/sun/star/ucb/XContentIdentifierFactory.hpp> |
| #include <com/sun/star/ucb/XContentProvider.hpp> |
| #include <com/sun/star/ucb/XContentProviderManager.hpp> |
| #include <com/sun/star/ucb/XDynamicResultSet.hpp> |
| #include <com/sun/star/ucb/XSortedDynamicResultSetFactory.hpp> |
| #include <com/sun/star/beans/XPropertySetInfo.hpp> |
| #include <com/sun/star/beans/Property.hpp> |
| #include <com/sun/star/beans/PropertyValue.hpp> |
| #include <com/sun/star/sdbc/XResultSet.hpp> |
| #include <com/sun/star/sdbc/XRow.hpp> |
| #include <com/sun/star/lang/IllegalArgumentException.hpp> |
| #include <com/sun/star/beans/UnknownPropertyException.hpp> |
| #include <ucbhelper/macros.hxx> |
| #include <ucbhelper/content.hxx> |
| #include <ucbhelper/contentbroker.hxx> |
| #include <ucbhelper/activedatasink.hxx> |
| #include <ucbhelper/activedatastreamer.hxx> |
| #include <ucbhelper/interactionrequest.hxx> |
| #include <ucbhelper/cancelcommandexecution.hxx> |
| |
| using namespace com::sun::star::container; |
| using namespace com::sun::star::beans; |
| using namespace com::sun::star::io; |
| using namespace com::sun::star::lang; |
| using namespace com::sun::star::sdbc; |
| using namespace com::sun::star::task; |
| using namespace com::sun::star::ucb; |
| using namespace com::sun::star::uno; |
| |
| namespace ucbhelper |
| { |
| |
| class EmptyInputStream : public ::cppu::WeakImplHelper1< XInputStream > |
| { |
| public: |
| virtual sal_Int32 SAL_CALL readBytes( |
| Sequence< sal_Int8 > & data, sal_Int32 nBytesToRead ) |
| throw (IOException, RuntimeException); |
| virtual sal_Int32 SAL_CALL readSomeBytes( |
| Sequence< sal_Int8 > & data, sal_Int32 nMaxBytesToRead ) |
| throw (IOException, RuntimeException); |
| virtual void SAL_CALL skipBytes( sal_Int32 nBytesToSkip ) |
| throw (IOException, RuntimeException); |
| virtual sal_Int32 SAL_CALL available() |
| throw (IOException, RuntimeException); |
| virtual void SAL_CALL closeInput() |
| throw (IOException, RuntimeException); |
| }; |
| |
| sal_Int32 EmptyInputStream::readBytes( |
| Sequence< sal_Int8 > & data, sal_Int32 ) |
| throw (IOException, RuntimeException) |
| { |
| data.realloc( 0 ); |
| return 0; |
| } |
| |
| sal_Int32 EmptyInputStream::readSomeBytes( |
| Sequence< sal_Int8 > & data, sal_Int32 ) |
| throw (IOException, RuntimeException) |
| { |
| data.realloc( 0 ); |
| return 0; |
| } |
| |
| void EmptyInputStream::skipBytes( sal_Int32 ) |
| throw (IOException, RuntimeException) |
| { |
| } |
| |
| sal_Int32 EmptyInputStream::available() |
| throw (IOException, RuntimeException) |
| { |
| return 0; |
| } |
| |
| void EmptyInputStream::closeInput() |
| throw (IOException, RuntimeException) |
| { |
| } |
| |
| |
| //========================================================================= |
| //========================================================================= |
| // |
| // class ContentEventListener_Impl. |
| // |
| //========================================================================= |
| //========================================================================= |
| |
| class ContentEventListener_Impl : public cppu::OWeakObject, |
| public XContentEventListener |
| { |
| Content_Impl& m_rContent; |
| |
| public: |
| ContentEventListener_Impl( Content_Impl& rContent ) |
| : m_rContent( rContent ) {} |
| |
| // XInterface |
| XINTERFACE_DECL() |
| |
| // XContentEventListener |
| virtual void SAL_CALL contentEvent( const ContentEvent& evt ) |
| throw( RuntimeException ); |
| |
| // XEventListener ( base of XContentEventListener ) |
| virtual void SAL_CALL disposing( const EventObject& Source ) |
| throw( RuntimeException ); |
| }; |
| |
| //========================================================================= |
| //========================================================================= |
| // |
| // class Content_Impl. |
| // |
| //========================================================================= |
| //========================================================================= |
| |
| class Content_Impl : public salhelper::SimpleReferenceObject |
| { |
| friend class ContentEventListener_Impl; |
| |
| mutable rtl::OUString m_aURL; |
| Reference< XMultiServiceFactory > m_xSMgr; |
| Reference< XContent > m_xContent; |
| Reference< XCommandProcessor > m_xCommandProcessor; |
| Reference< XCommandEnvironment > m_xEnv; |
| Reference< XContentEventListener > m_xContentEventListener; |
| mutable osl::Mutex m_aMutex; |
| sal_Int32 m_nCommandId; |
| |
| private: |
| void reinit( const Reference< XContent >& xContent ); |
| void disposing(const EventObject& Source); |
| |
| public: |
| Content_Impl() : m_nCommandId( 0 ) {}; |
| Content_Impl( const Reference< XMultiServiceFactory >& rSMgr, |
| const Reference< XContent >& rContent, |
| const Reference< XCommandEnvironment >& rEnv ); |
| |
| virtual ~Content_Impl(); |
| |
| const rtl::OUString& getURL() const; |
| Reference< XContent > getContent(); |
| Reference< XCommandProcessor > getCommandProcessor(); |
| sal_Int32 getCommandId(); |
| Reference< XMultiServiceFactory > getServiceManager() { return m_xSMgr; } |
| |
| Any executeCommand( const Command& rCommand ); |
| void abortCommand(); |
| |
| inline const Reference< XCommandEnvironment >& getEnvironment() const; |
| inline void setEnvironment( |
| const Reference< XCommandEnvironment >& xNewEnv ); |
| |
| void inserted(); |
| }; |
| |
| //========================================================================= |
| // Helpers. |
| //========================================================================= |
| |
| static void ensureContentProviderForURL( const ContentBroker & rBroker, |
| const rtl::OUString & rURL ) |
| throw ( ContentCreationException, RuntimeException ) |
| { |
| Reference< XContentProviderManager > xMgr |
| = rBroker.getContentProviderManagerInterface(); |
| if ( !xMgr.is() ) |
| { |
| throw RuntimeException( |
| rtl::OUString::createFromAscii( |
| "UCB does not implement mandatory interface " |
| "XContentProviderManager!" ), |
| Reference< XInterface >() ); |
| } |
| else |
| { |
| Reference< XContentProvider > xProv |
| = xMgr->queryContentProvider( rURL ); |
| if ( !xProv.is() ) |
| { |
| throw ContentCreationException( |
| rtl::OUString::createFromAscii( |
| "No Content Provider available for given URL!" ), |
| Reference< XInterface >(), |
| ContentCreationError_NO_CONTENT_PROVIDER ); |
| } |
| } |
| } |
| |
| //========================================================================= |
| static ContentBroker* getContentBroker( bool bThrow ) |
| throw ( ContentCreationException, RuntimeException ) |
| { |
| ContentBroker* pBroker = ContentBroker::get(); |
| |
| if ( !pBroker ) |
| { |
| if ( bThrow ) |
| throw RuntimeException( |
| rtl::OUString::createFromAscii( "No Content Broker!" ), |
| Reference< XInterface >() ); |
| } |
| else |
| { |
| #if OSL_DEBUG_LEVEL > 1 |
| Reference< XContentProviderManager > xMgr |
| = pBroker->getContentProviderManagerInterface(); |
| if ( !xMgr.is() ) |
| { |
| if ( bThrow ) |
| throw RuntimeException( |
| rtl::OUString::createFromAscii( |
| "UCB does not implement mandatory interface " |
| "XContentProviderManager!" ), |
| Reference< XInterface >() ); |
| } |
| else |
| { |
| OSL_ENSURE( xMgr->queryContentProviders().getLength(), |
| "Content Broker not configured (no providers)!" ); |
| } |
| #endif |
| } |
| |
| return pBroker; |
| } |
| |
| //========================================================================= |
| static Reference< XContentIdentifier > getContentIdentifier( |
| const ContentBroker & rBroker, |
| const rtl::OUString & rURL, |
| bool bThrow ) |
| throw ( ContentCreationException, RuntimeException ) |
| { |
| Reference< XContentIdentifierFactory > xIdFac |
| = rBroker.getContentIdentifierFactoryInterface(); |
| if ( xIdFac.is() ) |
| { |
| Reference< XContentIdentifier > xId |
| = xIdFac->createContentIdentifier( rURL ); |
| |
| if ( xId.is() ) |
| return xId; |
| |
| if ( bThrow ) |
| { |
| ensureContentProviderForURL( rBroker, rURL ); |
| |
| throw ContentCreationException( |
| rtl::OUString::createFromAscii( |
| "Unable to create Content Identifier!" ), |
| Reference< XInterface >(), |
| ContentCreationError_IDENTIFIER_CREATION_FAILED ); |
| } |
| } |
| else |
| { |
| if ( bThrow ) |
| throw RuntimeException( |
| rtl::OUString::createFromAscii( |
| "UCB does not implement mandatory interface " |
| "XContentIdentifierFactory!" ), |
| Reference< XInterface >() ); |
| } |
| |
| return Reference< XContentIdentifier >(); |
| } |
| |
| //========================================================================= |
| static Reference< XContent > getContent( |
| const ContentBroker & rBroker, |
| const Reference< XContentIdentifier > & xId, |
| bool bThrow ) |
| throw ( ContentCreationException, RuntimeException ) |
| { |
| Reference< XContentProvider > xProvider |
| = rBroker.getContentProviderInterface(); |
| if ( xProvider.is() ) |
| { |
| Reference< XContent > xContent; |
| rtl::OUString msg; |
| try |
| { |
| xContent = xProvider->queryContent( xId ); |
| } |
| catch ( IllegalIdentifierException const & e ) |
| { |
| msg = e.Message; |
| // handled below. |
| } |
| |
| if ( xContent.is() ) |
| return xContent; |
| |
| if ( bThrow ) |
| { |
| ensureContentProviderForURL( rBroker, xId->getContentIdentifier() ); |
| |
| throw ContentCreationException( |
| rtl::OUString::createFromAscii( |
| "Unable to create Content! " ) + msg, |
| Reference< XInterface >(), |
| ContentCreationError_CONTENT_CREATION_FAILED ); |
| } |
| } |
| else |
| { |
| if ( bThrow ) |
| throw RuntimeException( |
| rtl::OUString::createFromAscii( |
| "UCB does not implement mandatory interface " |
| "XContentProvider!" ), |
| Reference< XInterface >() ); |
| } |
| |
| return Reference< XContent >(); |
| } |
| |
| //========================================================================= |
| //========================================================================= |
| // |
| // Content Implementation. |
| // |
| //========================================================================= |
| //========================================================================= |
| |
| Content::Content() |
| : m_xImpl( new Content_Impl ) |
| { |
| } |
| |
| //========================================================================= |
| Content::Content( const rtl::OUString& rURL, |
| const Reference< XCommandEnvironment >& rEnv ) |
| throw ( ContentCreationException, RuntimeException ) |
| { |
| ContentBroker* pBroker = getContentBroker( true ); |
| |
| Reference< XContentIdentifier > xId |
| = getContentIdentifier( *pBroker, rURL, true ); |
| |
| Reference< XContent > xContent = getContent( *pBroker, xId, true ); |
| |
| m_xImpl = new Content_Impl( pBroker->getServiceManager(), xContent, rEnv ); |
| } |
| |
| //========================================================================= |
| Content::Content( const Reference< XContentIdentifier >& rId, |
| const Reference< XCommandEnvironment >& rEnv ) |
| throw ( ContentCreationException, RuntimeException ) |
| { |
| ContentBroker* pBroker = getContentBroker( true ); |
| |
| Reference< XContent > xContent = getContent( *pBroker, rId, true ); |
| |
| m_xImpl = new Content_Impl( pBroker->getServiceManager(), xContent, rEnv ); |
| } |
| |
| //========================================================================= |
| Content::Content( const Reference< XContent >& rContent, |
| const Reference< XCommandEnvironment >& rEnv ) |
| throw ( ContentCreationException, RuntimeException ) |
| { |
| ContentBroker* pBroker = getContentBroker( true ); |
| |
| m_xImpl = new Content_Impl( pBroker->getServiceManager(), rContent, rEnv ); |
| } |
| |
| //========================================================================= |
| Content::Content( const Content& rOther ) |
| { |
| m_xImpl = rOther.m_xImpl; |
| } |
| |
| //========================================================================= |
| // static |
| sal_Bool Content::create( const rtl::OUString& rURL, |
| const Reference< XCommandEnvironment >& rEnv, |
| Content& rContent ) |
| { |
| ContentBroker* pBroker = getContentBroker( false ); |
| if ( !pBroker ) |
| return sal_False; |
| |
| Reference< XContentIdentifier > xId |
| = getContentIdentifier( *pBroker, rURL, false ); |
| if ( !xId.is() ) |
| return sal_False; |
| |
| Reference< XContent > xContent = getContent( *pBroker, xId, false ); |
| if ( !xContent.is() ) |
| return sal_False; |
| |
| rContent.m_xImpl |
| = new Content_Impl( pBroker->getServiceManager(), xContent, rEnv ); |
| |
| return sal_True; |
| } |
| |
| //========================================================================= |
| // static |
| sal_Bool Content::create( const Reference< XContentIdentifier >& rId, |
| const Reference< XCommandEnvironment >& rEnv, |
| Content& rContent ) |
| { |
| ContentBroker* pBroker = getContentBroker( false ); |
| if ( !pBroker ) |
| return sal_False; |
| |
| Reference< XContent > xContent = getContent( *pBroker, rId, false ); |
| if ( !xContent.is() ) |
| return sal_False; |
| |
| rContent.m_xImpl |
| = new Content_Impl( pBroker->getServiceManager(), xContent, rEnv ); |
| |
| return sal_True; |
| } |
| |
| //========================================================================= |
| // static |
| sal_Bool Content::create( const Reference< XContent >& xContent, |
| const Reference< XCommandEnvironment >& rEnv, |
| Content& rContent ) |
| { |
| ContentBroker* pBroker = getContentBroker( false ); |
| if ( !pBroker ) |
| return sal_False; |
| |
| rContent.m_xImpl |
| = new Content_Impl( pBroker->getServiceManager(), xContent, rEnv ); |
| |
| return sal_True; |
| } |
| |
| //========================================================================= |
| Content::~Content() |
| { |
| } |
| |
| //========================================================================= |
| Content& Content::operator=( const Content& rOther ) |
| { |
| m_xImpl = rOther.m_xImpl; |
| return *this; |
| } |
| |
| //========================================================================= |
| Reference< XContent > Content::get() const |
| { |
| return m_xImpl->getContent(); |
| } |
| |
| //========================================================================= |
| const rtl::OUString& Content::getURL() const |
| { |
| return m_xImpl->getURL(); |
| } |
| |
| //========================================================================= |
| const Reference< XCommandEnvironment >& Content::getCommandEnvironment() const |
| { |
| return m_xImpl->getEnvironment(); |
| } |
| |
| //========================================================================= |
| void Content::setCommandEnvironment( |
| const Reference< XCommandEnvironment >& xNewEnv ) |
| { |
| m_xImpl->setEnvironment( xNewEnv ); |
| } |
| |
| //========================================================================= |
| Reference< XCommandInfo > Content::getCommands() |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "getCommandInfo" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument = Any(); |
| |
| Any aResult = m_xImpl->executeCommand( aCommand ); |
| |
| Reference< XCommandInfo > xInfo; |
| aResult >>= xInfo; |
| return xInfo; |
| } |
| |
| //========================================================================= |
| Reference< XPropertySetInfo > Content::getProperties() |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "getPropertySetInfo" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument = Any(); |
| |
| Any aResult = m_xImpl->executeCommand( aCommand ); |
| |
| Reference< XPropertySetInfo > xInfo; |
| aResult >>= xInfo; |
| return xInfo; |
| } |
| |
| //========================================================================= |
| Any Content::getPropertyValue( const rtl::OUString& rPropertyName ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Sequence< rtl::OUString > aNames( 1 ); |
| aNames.getArray()[ 0 ] = rPropertyName; |
| |
| Sequence< Any > aRet = getPropertyValues( aNames ); |
| return aRet.getConstArray()[ 0 ]; |
| } |
| |
| //========================================================================= |
| Any Content::getPropertyValue( sal_Int32 nPropertyHandle ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Sequence< sal_Int32 > aHandles( 1 ); |
| aHandles.getArray()[ 0 ] = nPropertyHandle; |
| |
| Sequence< Any > aRet = getPropertyValues( aHandles ); |
| return aRet.getConstArray()[ 0 ]; |
| } |
| |
| //========================================================================= |
| Any Content::setPropertyValue( const rtl::OUString& rName, |
| const Any& rValue ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Sequence< rtl::OUString > aNames( 1 ); |
| aNames.getArray()[ 0 ] = rName; |
| |
| Sequence< Any > aValues( 1 ); |
| aValues.getArray()[ 0 ] = rValue; |
| |
| Sequence< Any > aErrors = setPropertyValues( aNames, aValues ); |
| return aErrors.getConstArray()[ 0 ]; |
| } |
| |
| //========================================================================= |
| Any Content::setPropertyValue( const sal_Int32 nPropertyHandle, |
| const Any& rValue ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Sequence< sal_Int32 > aHandles( 1 ); |
| aHandles.getArray()[ 0 ] = nPropertyHandle; |
| |
| Sequence< Any > aValues( 1 ); |
| aValues.getArray()[ 0 ] = rValue; |
| |
| Sequence< Any > aErrors = setPropertyValues( aHandles, aValues ); |
| return aErrors.getConstArray()[ 0 ]; |
| } |
| |
| //========================================================================= |
| Sequence< Any > Content::getPropertyValues( |
| const Sequence< rtl::OUString >& rPropertyNames ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Reference< XRow > xRow = getPropertyValuesInterface( rPropertyNames ); |
| |
| sal_Int32 nCount = rPropertyNames.getLength(); |
| Sequence< Any > aValues( nCount ); |
| |
| if ( xRow.is() ) |
| { |
| Any* pValues = aValues.getArray(); |
| |
| for ( sal_Int32 n = 0; n < nCount; ++n ) |
| pValues[ n ] = xRow->getObject( n + 1, Reference< XNameAccess >() ); |
| } |
| |
| return aValues; |
| } |
| |
| //========================================================================= |
| Sequence< Any > Content::getPropertyValues( |
| const Sequence< sal_Int32 >& nPropertyHandles ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Reference< XRow > xRow = getPropertyValuesInterface( nPropertyHandles ); |
| |
| sal_Int32 nCount = nPropertyHandles.getLength(); |
| Sequence< Any > aValues( nCount ); |
| |
| if ( xRow.is() ) |
| { |
| Any* pValues = aValues.getArray(); |
| |
| for ( sal_Int32 n = 0; n < nCount; ++n ) |
| pValues[ n ] = xRow->getObject( n + 1, Reference< XNameAccess >() ); |
| } |
| |
| return aValues; |
| } |
| |
| //========================================================================= |
| Reference< XRow > Content::getPropertyValuesInterface( |
| const Sequence< rtl::OUString >& rPropertyNames ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| sal_Int32 nCount = rPropertyNames.getLength(); |
| Sequence< Property > aProps( nCount ); |
| Property* pProps = aProps.getArray(); |
| |
| const rtl::OUString* pNames = rPropertyNames.getConstArray(); |
| |
| for ( sal_Int32 n = 0; n< nCount; ++n ) |
| { |
| Property& rProp = pProps[ n ]; |
| |
| rProp.Name = pNames[ n ]; |
| rProp.Handle = -1; // n/a |
| // rProp.Type = |
| // rProp.Attributes = ; |
| } |
| |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "getPropertyValues" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument <<= aProps; |
| |
| Any aResult = m_xImpl->executeCommand( aCommand ); |
| |
| Reference< XRow > xRow; |
| aResult >>= xRow; |
| return xRow; |
| } |
| |
| //========================================================================= |
| Reference< XRow > Content::getPropertyValuesInterface( |
| const Sequence< sal_Int32 >& nPropertyHandles ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| sal_Int32 nCount = nPropertyHandles.getLength(); |
| Sequence< Property > aProps( nCount ); |
| Property* pProps = aProps.getArray(); |
| |
| const sal_Int32* pHandles = nPropertyHandles.getConstArray(); |
| |
| for ( sal_Int32 n = 0; n< nCount; ++n ) |
| { |
| Property& rProp = pProps[ n ]; |
| |
| rProp.Name = rtl::OUString(); // n/a |
| rProp.Handle = pHandles[ n ]; |
| // rProp.Type = |
| // rProp.Attributes = ; |
| } |
| |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "getPropertyValues" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument <<= aProps; |
| |
| Any aResult = m_xImpl->executeCommand( aCommand ); |
| |
| Reference< XRow > xRow; |
| aResult >>= xRow; |
| return xRow; |
| } |
| |
| //========================================================================= |
| Sequence< Any > Content::setPropertyValues( |
| const Sequence< rtl::OUString >& rPropertyNames, |
| const Sequence< Any >& rValues ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| if ( rPropertyNames.getLength() != rValues.getLength() ) |
| { |
| ucbhelper::cancelCommandExecution( |
| makeAny( IllegalArgumentException( |
| rtl::OUString::createFromAscii( |
| "Length of property names sequence and value " |
| "sequence are unequal!" ), |
| get(), |
| -1 ) ), |
| m_xImpl->getEnvironment() ); |
| // Unreachable |
| } |
| |
| sal_Int32 nCount = rValues.getLength(); |
| Sequence< PropertyValue > aProps( nCount ); |
| PropertyValue* pProps = aProps.getArray(); |
| |
| const rtl::OUString* pNames = rPropertyNames.getConstArray(); |
| const Any* pValues = rValues.getConstArray(); |
| |
| for ( sal_Int32 n = 0; n< nCount; ++n ) |
| { |
| PropertyValue& rProp = pProps[ n ]; |
| |
| rProp.Name = pNames[ n ]; |
| rProp.Handle = -1; // n/a |
| rProp.Value = pValues[ n ]; |
| // rProp.State = ; |
| } |
| |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "setPropertyValues" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument <<= aProps; |
| |
| Any aResult = m_xImpl->executeCommand( aCommand ); |
| |
| Sequence< Any > aErrors; |
| aResult >>= aErrors; |
| return aErrors; |
| } |
| |
| //========================================================================= |
| Sequence< Any > Content::setPropertyValues( |
| const Sequence< sal_Int32 >& nPropertyHandles, |
| const Sequence< Any >& rValues ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| if ( nPropertyHandles.getLength() != rValues.getLength() ) |
| { |
| ucbhelper::cancelCommandExecution( |
| makeAny( IllegalArgumentException( |
| rtl::OUString::createFromAscii( |
| "Length of property handles sequence and value " |
| "sequence are unequal!" ), |
| get(), |
| -1 ) ), |
| m_xImpl->getEnvironment() ); |
| // Unreachable |
| } |
| |
| sal_Int32 nCount = rValues.getLength(); |
| Sequence< PropertyValue > aProps( nCount ); |
| PropertyValue* pProps = aProps.getArray(); |
| |
| const sal_Int32* pHandles = nPropertyHandles.getConstArray(); |
| const Any* pValues = rValues.getConstArray(); |
| |
| for ( sal_Int32 n = 0; n< nCount; ++n ) |
| { |
| PropertyValue& rProp = pProps[ n ]; |
| |
| rProp.Name = rtl::OUString(); // n/a |
| rProp.Handle = pHandles[ n ]; |
| rProp.Value = pValues[ n ]; |
| // rProp.State = ; |
| } |
| |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "setPropertyValues" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument <<= aProps; |
| |
| Any aResult = m_xImpl->executeCommand( aCommand ); |
| |
| Sequence< Any > aErrors; |
| aResult >>= aErrors; |
| return aErrors; |
| } |
| |
| //========================================================================= |
| Any Content::executeCommand( const rtl::OUString& rCommandName, |
| const Any& rCommandArgument ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Command aCommand; |
| aCommand.Name = rCommandName; |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument = rCommandArgument; |
| |
| return m_xImpl->executeCommand( aCommand ); |
| } |
| |
| //========================================================================= |
| Any Content::executeCommand( sal_Int32 nCommandHandle, |
| const Any& rCommandArgument ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Command aCommand; |
| aCommand.Name = rtl::OUString(); // n/a |
| aCommand.Handle = nCommandHandle; |
| aCommand.Argument = rCommandArgument; |
| |
| return m_xImpl->executeCommand( aCommand ); |
| } |
| |
| //========================================================================= |
| void Content::abortCommand() |
| { |
| m_xImpl->abortCommand(); |
| } |
| |
| //========================================================================= |
| Any Content::createCursorAny( const Sequence< rtl::OUString >& rPropertyNames, |
| ResultSetInclude eMode ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| sal_Int32 nCount = rPropertyNames.getLength(); |
| Sequence< Property > aProps( nCount ); |
| Property* pProps = aProps.getArray(); |
| const rtl::OUString* pNames = rPropertyNames.getConstArray(); |
| for ( sal_Int32 n = 0; n < nCount; ++n ) |
| { |
| Property& rProp = pProps[ n ]; |
| rProp.Name = pNames[ n ]; |
| rProp.Handle = -1; // n/a |
| } |
| |
| OpenCommandArgument2 aArg; |
| aArg.Mode = ( eMode == INCLUDE_FOLDERS_ONLY ) |
| ? OpenMode::FOLDERS |
| : ( eMode == INCLUDE_DOCUMENTS_ONLY ) |
| ? OpenMode::DOCUMENTS : OpenMode::ALL; |
| aArg.Priority = 0; // unused |
| aArg.Sink = Reference< XInterface >(); // unused |
| aArg.Properties = aProps; |
| |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "open" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument <<= aArg; |
| |
| return m_xImpl->executeCommand( aCommand ); |
| } |
| |
| //========================================================================= |
| Any Content::createCursorAny( const Sequence< sal_Int32 >& rPropertyHandles, |
| ResultSetInclude eMode ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| sal_Int32 nCount = rPropertyHandles.getLength(); |
| Sequence< Property > aProps( nCount ); |
| Property* pProps = aProps.getArray(); |
| const sal_Int32* pHandles = rPropertyHandles.getConstArray(); |
| for ( sal_Int32 n = 0; n < nCount; ++n ) |
| { |
| Property& rProp = pProps[ n ]; |
| rProp.Name = rtl::OUString(); // n/a |
| rProp.Handle = pHandles[ n ]; |
| } |
| |
| OpenCommandArgument2 aArg; |
| aArg.Mode = ( eMode == INCLUDE_FOLDERS_ONLY ) |
| ? OpenMode::FOLDERS |
| : ( eMode == INCLUDE_DOCUMENTS_ONLY ) |
| ? OpenMode::DOCUMENTS : OpenMode::ALL; |
| aArg.Priority = 0; // unused |
| aArg.Sink = Reference< XInterface >(); // unused |
| aArg.Properties = aProps; |
| |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "open" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument <<= aArg; |
| |
| return m_xImpl->executeCommand( aCommand ); |
| } |
| |
| //========================================================================= |
| Reference< XResultSet > Content::createCursor( |
| const Sequence< rtl::OUString >& rPropertyNames, |
| ResultSetInclude eMode ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Any aCursorAny = createCursorAny( rPropertyNames, eMode ); |
| |
| Reference< XDynamicResultSet > xDynSet; |
| Reference< XResultSet > aResult; |
| |
| aCursorAny >>= xDynSet; |
| if ( xDynSet.is() ) |
| aResult = xDynSet->getStaticResultSet(); |
| |
| OSL_ENSURE( aResult.is(), "Content::createCursor - no cursor!" ); |
| |
| if ( !aResult.is() ) |
| { |
| // Former, the open command directly returned a XResultSet. |
| aCursorAny >>= aResult; |
| |
| OSL_ENSURE( !aResult.is(), |
| "Content::createCursor - open-Command must " |
| "return a Reference< XDynnamicResultSet >!" ); |
| } |
| |
| return aResult; |
| } |
| |
| //========================================================================= |
| Reference< XResultSet > Content::createCursor( |
| const Sequence< sal_Int32 >& rPropertyHandles, |
| ResultSetInclude eMode ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Any aCursorAny = createCursorAny( rPropertyHandles, eMode ); |
| |
| Reference< XDynamicResultSet > xDynSet; |
| Reference< XResultSet > aResult; |
| |
| aCursorAny >>= xDynSet; |
| if ( xDynSet.is() ) |
| aResult = xDynSet->getStaticResultSet(); |
| |
| OSL_ENSURE( aResult.is(), "Content::createCursor - no cursor!" ); |
| |
| if ( !aResult.is() ) |
| { |
| // Former, the open command directly returned a XResultSet. |
| aCursorAny >>= aResult; |
| |
| OSL_ENSURE( !aResult.is(), |
| "Content::createCursor - open-Command must " |
| "return a Reference< XDynnamicResultSet >!" ); |
| } |
| |
| return aResult; |
| } |
| |
| //========================================================================= |
| Reference< XDynamicResultSet > Content::createDynamicCursor( |
| const Sequence< rtl::OUString >& rPropertyNames, |
| ResultSetInclude eMode ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Reference< XDynamicResultSet > aResult; |
| createCursorAny( rPropertyNames, eMode ) >>= aResult; |
| |
| OSL_ENSURE( aResult.is(), "Content::createDynamicCursor - no cursor!" ); |
| |
| return aResult; |
| } |
| |
| //========================================================================= |
| Reference< XDynamicResultSet > Content::createDynamicCursor( |
| const Sequence< sal_Int32 >& rPropertyHandles, |
| ResultSetInclude eMode ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Reference< XDynamicResultSet > aResult; |
| createCursorAny( rPropertyHandles, eMode ) >>= aResult; |
| |
| OSL_ENSURE( aResult.is(), "Content::createDynamicCursor - no cursor!" ); |
| |
| return aResult; |
| } |
| |
| //========================================================================= |
| Reference< XDynamicResultSet > Content::createSortedDynamicCursor( |
| const Sequence< rtl::OUString >& rPropertyNames, |
| const Sequence< NumberedSortingInfo >& rSortInfo, |
| Reference< XAnyCompareFactory > rAnyCompareFactory, |
| ResultSetInclude eMode ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Reference< XDynamicResultSet > aResult; |
| Reference< XDynamicResultSet > aOrigCursor = createDynamicCursor( rPropertyNames, eMode ); |
| |
| if( aOrigCursor.is() ) |
| { |
| Reference< XMultiServiceFactory > aServiceManager = m_xImpl->getServiceManager(); |
| |
| if( aServiceManager.is() ) |
| { |
| Reference< XSortedDynamicResultSetFactory > aSortFactory( aServiceManager->createInstance( |
| rtl::OUString::createFromAscii( "com.sun.star.ucb.SortedDynamicResultSetFactory" )), |
| UNO_QUERY ); |
| |
| aResult = aSortFactory->createSortedDynamicResultSet( aOrigCursor, |
| rSortInfo, |
| rAnyCompareFactory ); |
| } |
| |
| OSL_ENSURE( aResult.is(), "Content::createSortedDynamicCursor - no sorted cursor!\n" ); |
| |
| if( !aResult.is() ) |
| aResult = aOrigCursor; |
| } |
| |
| return aResult; |
| } |
| |
| //========================================================================= |
| Reference< XDynamicResultSet > Content::createSortedDynamicCursor( |
| const Sequence< sal_Int32 >& rPropertyHandles, |
| const Sequence< NumberedSortingInfo >& rSortInfo, |
| Reference< XAnyCompareFactory > rAnyCompareFactory, |
| ResultSetInclude eMode ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Reference< XDynamicResultSet > aResult; |
| Reference< XDynamicResultSet > aOrigCursor = createDynamicCursor( rPropertyHandles, eMode ); |
| |
| if( aOrigCursor.is() ) |
| { |
| Reference< XMultiServiceFactory > aServiceManager = m_xImpl->getServiceManager(); |
| |
| if( aServiceManager.is() ) |
| { |
| Reference< XSortedDynamicResultSetFactory > aSortFactory( aServiceManager->createInstance( |
| rtl::OUString::createFromAscii( "com.sun.star.ucb.SortedDynamicResultSetFactory" )), |
| UNO_QUERY ); |
| |
| aResult = aSortFactory->createSortedDynamicResultSet( aOrigCursor, |
| rSortInfo, |
| rAnyCompareFactory ); |
| } |
| |
| OSL_ENSURE( aResult.is(), "Content::createSortedDynamicCursor - no sorted cursor!\n" ); |
| |
| if( !aResult.is() ) |
| aResult = aOrigCursor; |
| } |
| |
| return aResult; |
| } |
| |
| //========================================================================= |
| Reference< XResultSet > Content::createSortedCursor( |
| const Sequence< rtl::OUString >& rPropertyNames, |
| const Sequence< NumberedSortingInfo >& rSortInfo, |
| Reference< XAnyCompareFactory > rAnyCompareFactory, |
| ResultSetInclude eMode ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Reference< XResultSet > aResult; |
| Reference< XDynamicResultSet > aDynSet; |
| |
| Any aCursorAny = createCursorAny( rPropertyNames, eMode ); |
| |
| aCursorAny >>= aDynSet; |
| |
| if( aDynSet.is() ) |
| { |
| Reference< XDynamicResultSet > aDynResult; |
| Reference< XMultiServiceFactory > aServiceManager = m_xImpl->getServiceManager(); |
| |
| if( aServiceManager.is() ) |
| { |
| Reference< XSortedDynamicResultSetFactory > aSortFactory( aServiceManager->createInstance( |
| rtl::OUString::createFromAscii( "com.sun.star.ucb.SortedDynamicResultSetFactory" )), |
| UNO_QUERY ); |
| |
| aDynResult = aSortFactory->createSortedDynamicResultSet( aDynSet, |
| rSortInfo, |
| rAnyCompareFactory ); |
| } |
| |
| OSL_ENSURE( aDynResult.is(), "Content::createSortedCursor - no sorted cursor!\n" ); |
| |
| if( aDynResult.is() ) |
| aResult = aDynResult->getStaticResultSet(); |
| else |
| aResult = aDynSet->getStaticResultSet(); |
| } |
| |
| OSL_ENSURE( aResult.is(), "Content::createSortedCursor - no cursor!" ); |
| |
| if ( !aResult.is() ) |
| { |
| // Former, the open command directly returned a XResultSet. |
| aCursorAny >>= aResult; |
| |
| OSL_ENSURE( !aResult.is(), |
| "Content::createCursor - open-Command must " |
| "return a Reference< XDynnamicResultSet >!" ); |
| } |
| |
| return aResult; |
| } |
| |
| //========================================================================= |
| Reference< XResultSet > Content::createSortedCursor( |
| const Sequence< sal_Int32 >& rPropertyHandles, |
| const Sequence< NumberedSortingInfo >& rSortInfo, |
| Reference< XAnyCompareFactory > rAnyCompareFactory, |
| ResultSetInclude eMode ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| Reference< XResultSet > aResult; |
| Reference< XDynamicResultSet > aDynSet; |
| |
| Any aCursorAny = createCursorAny( rPropertyHandles, eMode ); |
| |
| aCursorAny >>= aDynSet; |
| |
| if( aDynSet.is() ) |
| { |
| Reference< XDynamicResultSet > aDynResult; |
| Reference< XMultiServiceFactory > aServiceManager = m_xImpl->getServiceManager(); |
| |
| if( aServiceManager.is() ) |
| { |
| Reference< XSortedDynamicResultSetFactory > aSortFactory( aServiceManager->createInstance( |
| rtl::OUString::createFromAscii( "com.sun.star.ucb.SortedDynamicResultSetFactory" )), |
| UNO_QUERY ); |
| |
| aDynResult = aSortFactory->createSortedDynamicResultSet( aDynSet, |
| rSortInfo, |
| rAnyCompareFactory ); |
| } |
| |
| OSL_ENSURE( aDynResult.is(), "Content::createSortedCursor - no sorted cursor!\n" ); |
| |
| if( aDynResult.is() ) |
| aResult = aDynResult->getStaticResultSet(); |
| else |
| aResult = aDynSet->getStaticResultSet(); |
| } |
| |
| OSL_ENSURE( aResult.is(), "Content::createSortedCursor - no cursor!" ); |
| |
| if ( !aResult.is() ) |
| { |
| // Former, the open command directly returned a XResultSet. |
| aCursorAny >>= aResult; |
| |
| OSL_ENSURE( !aResult.is(), |
| "Content::createCursor - open-Command must " |
| "return a Reference< XDynnamicResultSet >!" ); |
| } |
| |
| return aResult; |
| } |
| |
| //========================================================================= |
| Reference< XInputStream > Content::openStream() |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| if ( !isDocument() ) |
| return Reference< XInputStream >(); |
| |
| Reference< XActiveDataSink > xSink = new ActiveDataSink; |
| |
| OpenCommandArgument2 aArg; |
| aArg.Mode = OpenMode::DOCUMENT; |
| aArg.Priority = 0; // unused |
| aArg.Sink = xSink; |
| aArg.Properties = Sequence< Property >( 0 ); // unused |
| |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "open" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument <<= aArg; |
| |
| m_xImpl->executeCommand( aCommand ); |
| |
| return xSink->getInputStream(); |
| } |
| |
| //========================================================================= |
| Reference< XInputStream > Content::openStreamNoLock() |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| if ( !isDocument() ) |
| return Reference< XInputStream >(); |
| |
| Reference< XActiveDataSink > xSink = new ActiveDataSink; |
| |
| OpenCommandArgument2 aArg; |
| aArg.Mode = OpenMode::DOCUMENT_SHARE_DENY_NONE; |
| aArg.Priority = 0; // unused |
| aArg.Sink = xSink; |
| aArg.Properties = Sequence< Property >( 0 ); // unused |
| |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "open" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument <<= aArg; |
| |
| m_xImpl->executeCommand( aCommand ); |
| |
| return xSink->getInputStream(); |
| } |
| |
| //========================================================================= |
| Reference< XStream > Content::openWriteableStream() |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| if ( !isDocument() ) |
| return Reference< XStream >(); |
| |
| Reference< XActiveDataStreamer > xStreamer = new ActiveDataStreamer; |
| |
| OpenCommandArgument2 aArg; |
| aArg.Mode = OpenMode::DOCUMENT; |
| aArg.Priority = 0; // unused |
| aArg.Sink = xStreamer; |
| aArg.Properties = Sequence< Property >( 0 ); // unused |
| |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "open" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument <<= aArg; |
| |
| m_xImpl->executeCommand( aCommand ); |
| |
| return xStreamer->getStream(); |
| } |
| |
| //========================================================================= |
| Reference< XStream > Content::openWriteableStreamNoLock() |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| if ( !isDocument() ) |
| return Reference< XStream >(); |
| |
| Reference< XActiveDataStreamer > xStreamer = new ActiveDataStreamer; |
| |
| OpenCommandArgument2 aArg; |
| aArg.Mode = OpenMode::DOCUMENT_SHARE_DENY_NONE; |
| aArg.Priority = 0; // unused |
| aArg.Sink = xStreamer; |
| aArg.Properties = Sequence< Property >( 0 ); // unused |
| |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "open" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument <<= aArg; |
| |
| m_xImpl->executeCommand( aCommand ); |
| |
| return xStreamer->getStream(); |
| } |
| |
| //========================================================================= |
| sal_Bool Content::openStream( const Reference< XActiveDataSink >& rSink ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| if ( !isDocument() ) |
| return sal_False; |
| |
| OpenCommandArgument2 aArg; |
| aArg.Mode = OpenMode::DOCUMENT; |
| aArg.Priority = 0; // unused |
| aArg.Sink = rSink; |
| aArg.Properties = Sequence< Property >( 0 ); // unused |
| |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "open" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument <<= aArg; |
| |
| m_xImpl->executeCommand( aCommand ); |
| |
| return sal_True; |
| } |
| |
| //========================================================================= |
| sal_Bool Content::openStream( const Reference< XOutputStream >& rStream ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| if ( !isDocument() ) |
| return sal_False; |
| |
| OpenCommandArgument2 aArg; |
| aArg.Mode = OpenMode::DOCUMENT; |
| aArg.Priority = 0; // unused |
| aArg.Sink = rStream; |
| aArg.Properties = Sequence< Property >( 0 ); // unused |
| |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "open" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument <<= aArg; |
| |
| m_xImpl->executeCommand( aCommand ); |
| |
| return sal_True; |
| } |
| |
| //========================================================================= |
| void Content::writeStream( const Reference< XInputStream >& rStream, |
| sal_Bool bReplaceExisting ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| InsertCommandArgument aArg; |
| aArg.Data = rStream.is() ? rStream : new EmptyInputStream; |
| aArg.ReplaceExisting = bReplaceExisting; |
| |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "insert" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument <<= aArg; |
| |
| m_xImpl->executeCommand( aCommand ); |
| |
| m_xImpl->inserted(); |
| } |
| |
| //========================================================================= |
| Sequence< ContentInfo > Content::queryCreatableContentsInfo() |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| // First, try it using "CreatableContentsInfo" property -> the "new" way. |
| Sequence< ContentInfo > aInfo; |
| if ( getPropertyValue( |
| rtl::OUString::createFromAscii( "CreatableContentsInfo" ) ) |
| >>= aInfo ) |
| return aInfo; |
| |
| // Second, try it using XContentCreator interface -> the "old" way (not |
| // providing the chance to supply an XCommandEnvironment. |
| Reference< XContentCreator > xCreator( m_xImpl->getContent(), UNO_QUERY ); |
| if ( xCreator.is() ) |
| aInfo = xCreator->queryCreatableContentsInfo(); |
| |
| return aInfo; |
| } |
| |
| //========================================================================= |
| sal_Bool Content::insertNewContent( const rtl::OUString& rContentType, |
| const Sequence< rtl::OUString >& |
| rPropertyNames, |
| const Sequence< Any >& rPropertyValues, |
| Content& rNewContent ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| return insertNewContent( rContentType, |
| rPropertyNames, |
| rPropertyValues, |
| new EmptyInputStream, |
| rNewContent ); |
| } |
| |
| //========================================================================= |
| sal_Bool Content::insertNewContent( const rtl::OUString& rContentType, |
| const Sequence< sal_Int32 >& |
| nPropertyHandles, |
| const Sequence< Any >& rPropertyValues, |
| Content& rNewContent ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| return insertNewContent( rContentType, |
| nPropertyHandles, |
| rPropertyValues, |
| new EmptyInputStream, |
| rNewContent ); |
| } |
| |
| //========================================================================= |
| sal_Bool Content::insertNewContent( const rtl::OUString& rContentType, |
| const Sequence< rtl::OUString >& |
| rPropertyNames, |
| const Sequence< Any >& rPropertyValues, |
| const Reference< XInputStream >& rData, |
| Content& rNewContent ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| if ( rContentType.getLength() == 0 ) |
| return sal_False; |
| |
| // First, try it using "createNewContent" command -> the "new" way. |
| ContentInfo aInfo; |
| aInfo.Type = rContentType; |
| aInfo.Attributes = 0; |
| |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "createNewContent" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument <<= aInfo; |
| |
| Reference< XContent > xNew; |
| try |
| { |
| m_xImpl->executeCommand( aCommand ) >>= xNew; |
| } |
| catch ( RuntimeException const & ) |
| { |
| throw; |
| } |
| catch ( Exception const & ) |
| { |
| } |
| |
| if ( !xNew.is() ) |
| { |
| // Second, try it using XContentCreator interface -> the "old" |
| // way (not providing the chance to supply an XCommandEnvironment. |
| Reference< XContentCreator > xCreator( m_xImpl->getContent(), UNO_QUERY ); |
| |
| if ( !xCreator.is() ) |
| return sal_False; |
| |
| xNew = xCreator->createNewContent( aInfo ); |
| |
| if ( !xNew.is() ) |
| return sal_False; |
| } |
| |
| Content aNewContent( xNew, m_xImpl->getEnvironment() ); |
| aNewContent.setPropertyValues( rPropertyNames, rPropertyValues ); |
| aNewContent.executeCommand( rtl::OUString::createFromAscii( "insert" ), |
| makeAny( |
| InsertCommandArgument( |
| rData.is() ? rData : new EmptyInputStream, |
| sal_False /* ReplaceExisting */ ) ) ); |
| aNewContent.m_xImpl->inserted(); |
| |
| rNewContent = aNewContent; |
| return sal_True; |
| } |
| |
| //========================================================================= |
| sal_Bool Content::insertNewContent( const rtl::OUString& rContentType, |
| const Sequence< sal_Int32 >& |
| nPropertyHandles, |
| const Sequence< Any >& rPropertyValues, |
| const Reference< XInputStream >& rData, |
| Content& rNewContent ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| if ( rContentType.getLength() == 0 ) |
| return sal_False; |
| |
| // First, try it using "createNewContent" command -> the "new" way. |
| ContentInfo aInfo; |
| aInfo.Type = rContentType; |
| aInfo.Attributes = 0; |
| |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "createNewContent" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument <<= aInfo; |
| |
| Reference< XContent > xNew; |
| try |
| { |
| m_xImpl->executeCommand( aCommand ) >>= xNew; |
| } |
| catch ( RuntimeException const & ) |
| { |
| throw; |
| } |
| catch ( Exception const & ) |
| { |
| } |
| |
| if ( !xNew.is() ) |
| { |
| // Second, try it using XContentCreator interface -> the "old" |
| // way (not providing the chance to supply an XCommandEnvironment. |
| Reference< XContentCreator > xCreator( m_xImpl->getContent(), UNO_QUERY ); |
| |
| if ( !xCreator.is() ) |
| return sal_False; |
| |
| xNew = xCreator->createNewContent( aInfo ); |
| |
| if ( !xNew.is() ) |
| return sal_False; |
| } |
| |
| Content aNewContent( xNew, m_xImpl->getEnvironment() ); |
| aNewContent.setPropertyValues( nPropertyHandles, rPropertyValues ); |
| aNewContent.executeCommand( rtl::OUString::createFromAscii( "insert" ), |
| makeAny( |
| InsertCommandArgument( |
| rData.is() ? rData : new EmptyInputStream, |
| sal_False /* ReplaceExisting */ ) ) ); |
| aNewContent.m_xImpl->inserted(); |
| |
| rNewContent = aNewContent; |
| return sal_True; |
| } |
| |
| //========================================================================= |
| sal_Bool Content::transferContent( const Content& rSourceContent, |
| InsertOperation eOperation, |
| const rtl::OUString & rTitle, |
| const sal_Int32 nNameClashAction ) |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| ContentBroker* pBroker = ContentBroker::get(); |
| if ( !pBroker ) |
| { |
| OSL_ENSURE( sal_False, |
| "Content::transferContent - No Content Broker!" ); |
| return sal_False; |
| } |
| |
| Reference< XCommandProcessor > xCmdProc( |
| pBroker->getCommandProcessorInterface() ); |
| if ( !xCmdProc.is() ) |
| { |
| OSL_ENSURE( sal_False, |
| "Content::transferContent - No XCommandProcessor!" ); |
| return sal_False; |
| } |
| |
| // Execute command "globalTransfer" at UCB. |
| |
| TransferCommandOperation eTransOp = TransferCommandOperation(); |
| switch ( eOperation ) |
| { |
| case InsertOperation_COPY: |
| eTransOp = TransferCommandOperation_COPY; |
| break; |
| |
| case InsertOperation_MOVE: |
| eTransOp = TransferCommandOperation_MOVE; |
| break; |
| |
| case InsertOperation_LINK: |
| eTransOp = TransferCommandOperation_LINK; |
| break; |
| |
| default: |
| ucbhelper::cancelCommandExecution( |
| makeAny( IllegalArgumentException( |
| rtl::OUString::createFromAscii( |
| "Unknown transfer operation!" ), |
| get(), |
| -1 ) ), |
| m_xImpl->getEnvironment() ); |
| // Unreachable |
| } |
| |
| GlobalTransferCommandArgument aTransferArg( |
| eTransOp, |
| rSourceContent.getURL(), // SourceURL |
| getURL(), // TargetFolderURL, |
| rTitle, |
| nNameClashAction ); |
| Command aCommand; |
| aCommand.Name = rtl::OUString::createFromAscii( "globalTransfer" ); |
| aCommand.Handle = -1; // n/a |
| aCommand.Argument <<= aTransferArg; |
| |
| xCmdProc->execute( aCommand, 0, m_xImpl->getEnvironment() ); |
| return sal_True; |
| } |
| |
| //========================================================================= |
| sal_Bool Content::isFolder() |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| sal_Bool bFolder = sal_False; |
| if ( getPropertyValue( rtl::OUString::createFromAscii( "IsFolder" ) ) |
| >>= bFolder ) |
| return bFolder; |
| |
| ucbhelper::cancelCommandExecution( |
| makeAny( UnknownPropertyException( |
| rtl::OUString::createFromAscii( |
| "Unable to retreive value of property 'IsFolder'!" ), |
| get() ) ), |
| m_xImpl->getEnvironment() ); |
| |
| // Unreachable - cancelCommandExecution always throws an exception. |
| // But some compilers complain... |
| return sal_False; |
| } |
| |
| //========================================================================= |
| sal_Bool Content::isDocument() |
| throw( CommandAbortedException, RuntimeException, Exception ) |
| { |
| sal_Bool bDoc = sal_False; |
| if ( getPropertyValue( rtl::OUString::createFromAscii( "IsDocument" ) ) |
| >>= bDoc ) |
| return bDoc; |
| |
| ucbhelper::cancelCommandExecution( |
| makeAny( UnknownPropertyException( |
| rtl::OUString::createFromAscii( |
| "Unable to retreive value of property 'IsDocument'!" ), |
| get() ) ), |
| m_xImpl->getEnvironment() ); |
| |
| // Unreachable - cancelCommandExecution always throws an exception, |
| // But some compilers complain... |
| return sal_False; |
| } |
| |
| //========================================================================= |
| //========================================================================= |
| // |
| // Content_Impl Implementation. |
| // |
| //========================================================================= |
| //========================================================================= |
| |
| Content_Impl::Content_Impl( const Reference< XMultiServiceFactory >& rSMgr, |
| const Reference< XContent >& rContent, |
| const Reference< XCommandEnvironment >& rEnv ) |
| : m_xSMgr( rSMgr ), |
| m_xContent( rContent ), |
| m_xEnv( rEnv ), |
| m_nCommandId( 0 ) |
| { |
| if ( m_xContent.is() ) |
| { |
| m_xContentEventListener = new ContentEventListener_Impl( *this ); |
| m_xContent->addContentEventListener( m_xContentEventListener ); |
| |
| #if OSL_DEBUG_LEVEL > 1 |
| // Only done on demand in product version for performance reasons, |
| // but a nice debug helper. |
| getURL(); |
| #endif |
| } |
| } |
| |
| //========================================================================= |
| void Content_Impl::reinit( const Reference< XContent >& xContent ) |
| { |
| osl::MutexGuard aGuard( m_aMutex ); |
| |
| m_xCommandProcessor = 0; |
| m_nCommandId = 0; |
| |
| // #92581# - Don't reset m_aURL!!! |
| |
| if ( m_xContent.is() ) |
| { |
| try |
| { |
| m_xContent->removeContentEventListener( m_xContentEventListener ); |
| } |
| catch ( RuntimeException const & ) |
| { |
| } |
| } |
| |
| if ( xContent.is() ) |
| { |
| m_xContent = xContent; |
| m_xContent->addContentEventListener( m_xContentEventListener ); |
| |
| #if OSL_DEBUG_LEVEL > 1 |
| // Only done on demand in product version for performance reasons, |
| // but a nice debug helper. |
| getURL(); |
| #endif |
| } |
| else |
| { |
| // We need m_xContent's URL in order to be able to create the |
| // content object again if demanded ( --> Content_Impl::getContent() ) |
| getURL(); |
| |
| m_xContent = 0; |
| } |
| } |
| |
| //========================================================================= |
| // virtual |
| Content_Impl::~Content_Impl() |
| { |
| if ( m_xContent.is() ) |
| { |
| try |
| { |
| m_xContent->removeContentEventListener( m_xContentEventListener ); |
| } |
| catch ( RuntimeException const & ) |
| { |
| } |
| } |
| } |
| |
| //========================================================================= |
| void Content_Impl::disposing( const EventObject& Source ) |
| { |
| Reference<XContent> xContent; |
| |
| { |
| osl::MutexGuard aGuard( m_aMutex ); |
| if(Source.Source != m_xContent) |
| return; |
| |
| xContent = m_xContent; |
| |
| m_nCommandId = 0; |
| m_aURL = rtl::OUString(); |
| m_xCommandProcessor = 0; |
| m_xContent = 0; |
| } |
| |
| if ( xContent.is() ) |
| { |
| try |
| { |
| xContent->removeContentEventListener( m_xContentEventListener ); |
| } |
| catch ( RuntimeException const & ) |
| { |
| } |
| } |
| } |
| |
| //========================================================================= |
| const rtl::OUString& Content_Impl::getURL() const |
| { |
| if ( !m_aURL.getLength() && m_xContent.is() ) |
| { |
| osl::MutexGuard aGuard( m_aMutex ); |
| |
| if ( !m_aURL.getLength() && m_xContent.is() ) |
| { |
| Reference< XContentIdentifier > xId = m_xContent->getIdentifier(); |
| if ( xId.is() ) |
| m_aURL = xId->getContentIdentifier(); |
| } |
| } |
| |
| return m_aURL; |
| } |
| |
| //========================================================================= |
| Reference< XContent > Content_Impl::getContent() |
| { |
| if ( !m_xContent.is() && m_aURL.getLength() ) |
| { |
| osl::MutexGuard aGuard( m_aMutex ); |
| |
| if ( !m_xContent.is() && m_aURL.getLength() ) |
| { |
| ContentBroker* pBroker = ContentBroker::get(); |
| |
| OSL_ENSURE( pBroker, "No Content Broker!" ); |
| |
| if ( pBroker ) |
| { |
| OSL_ENSURE( pBroker->getContentProviderManagerInterface() |
| ->queryContentProviders().getLength(), |
| "Content Broker not configured (no providers)!" ); |
| |
| Reference< XContentIdentifierFactory > xIdFac |
| = pBroker->getContentIdentifierFactoryInterface(); |
| |
| OSL_ENSURE( xIdFac.is(), "No Content Identifier factory!" ); |
| |
| if ( xIdFac.is() ) |
| { |
| Reference< XContentIdentifier > xId |
| = xIdFac->createContentIdentifier( m_aURL ); |
| |
| OSL_ENSURE( xId.is(), "No Content Identifier!" ); |
| |
| if ( xId.is() ) |
| { |
| Reference< XContentProvider > xProvider |
| = pBroker->getContentProviderInterface(); |
| |
| OSL_ENSURE( xProvider.is(), "No Content Provider!" ); |
| |
| if ( xProvider.is() ) |
| { |
| try |
| { |
| m_xContent = xProvider->queryContent( xId ); |
| } |
| catch ( IllegalIdentifierException const & ) |
| { |
| } |
| |
| if ( m_xContent.is() ) |
| m_xContent->addContentEventListener( |
| m_xContentEventListener ); |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| return m_xContent; |
| } |
| |
| //========================================================================= |
| Reference< XCommandProcessor > Content_Impl::getCommandProcessor() |
| { |
| if ( !m_xCommandProcessor.is() ) |
| { |
| osl::MutexGuard aGuard( m_aMutex ); |
| |
| if ( !m_xCommandProcessor.is() ) |
| m_xCommandProcessor |
| = Reference< XCommandProcessor >( getContent(), UNO_QUERY ); |
| } |
| |
| return m_xCommandProcessor; |
| } |
| |
| //========================================================================= |
| sal_Int32 Content_Impl::getCommandId() |
| { |
| if ( m_nCommandId == 0 ) |
| { |
| osl::MutexGuard aGuard( m_aMutex ); |
| |
| if ( m_nCommandId == 0 ) |
| { |
| Reference< XCommandProcessor > xProc = getCommandProcessor(); |
| if ( xProc.is() ) |
| m_nCommandId = xProc->createCommandIdentifier(); |
| } |
| } |
| |
| return m_nCommandId; |
| } |
| |
| //========================================================================= |
| Any Content_Impl::executeCommand( const Command& rCommand ) |
| { |
| Reference< XCommandProcessor > xProc = getCommandProcessor(); |
| if ( !xProc.is() ) |
| return Any(); |
| |
| // Execute command |
| return xProc->execute( rCommand, getCommandId(), m_xEnv ); |
| } |
| |
| //========================================================================= |
| void Content_Impl::abortCommand() |
| { |
| sal_Int32 nCommandId; |
| Reference< XCommandProcessor > xCommandProcessor; |
| { |
| osl::MutexGuard aGuard( m_aMutex ); |
| nCommandId = m_nCommandId; |
| xCommandProcessor = m_xCommandProcessor; |
| } |
| |
| if ( ( nCommandId != 0 ) && xCommandProcessor.is() ) |
| xCommandProcessor->abort( nCommandId ); |
| } |
| |
| //========================================================================= |
| inline const Reference< XCommandEnvironment >& |
| Content_Impl::getEnvironment() const |
| { |
| return m_xEnv; |
| } |
| |
| //========================================================================= |
| inline void Content_Impl::setEnvironment( |
| const Reference< XCommandEnvironment >& xNewEnv ) |
| { |
| osl::MutexGuard aGuard( m_aMutex ); |
| m_xEnv = xNewEnv; |
| } |
| |
| //========================================================================= |
| void Content_Impl::inserted() |
| { |
| // URL might have changed during 'insert' => recalculate in next getURL() |
| osl::MutexGuard aGuard( m_aMutex ); |
| m_aURL = ::rtl::OUString(); |
| } |
| |
| //========================================================================= |
| //========================================================================= |
| // |
| // ContentEventListener_Impl Implementation. |
| // |
| //========================================================================= |
| //========================================================================= |
| |
| //========================================================================= |
| // |
| // XInterface methods. |
| // |
| //========================================================================= |
| |
| XINTERFACE_IMPL_2( ContentEventListener_Impl, |
| XContentEventListener, |
| XEventListener ); /* base of XContentEventListener */ |
| |
| //========================================================================= |
| // |
| // XContentEventListener methods. |
| // |
| //========================================================================= |
| |
| // virtual |
| void SAL_CALL ContentEventListener_Impl::contentEvent( const ContentEvent& evt ) |
| throw( RuntimeException ) |
| { |
| if ( evt.Source == m_rContent.m_xContent ) |
| { |
| switch ( evt.Action ) |
| { |
| case ContentAction::DELETED: |
| m_rContent.reinit( Reference< XContent >() ); |
| break; |
| |
| case ContentAction::EXCHANGED: |
| m_rContent.reinit( evt.Content ); |
| break; |
| |
| default: |
| break; |
| } |
| } |
| } |
| |
| //========================================================================= |
| // |
| // XEventListenr methods. |
| // |
| //========================================================================= |
| |
| // virtual |
| void SAL_CALL ContentEventListener_Impl::disposing( const EventObject& Source ) |
| throw( RuntimeException ) |
| { |
| m_rContent.disposing(Source); |
| } |
| |
| } /* namespace ucbhelper */ |
| |