diff options
Diffstat (limited to 'ucb/source/ucp')
-rw-r--r-- | ucb/source/ucp/cmis/cmis_content.cxx | 462 | ||||
-rw-r--r-- | ucb/source/ucp/cmis/cmis_content.hxx | 2 |
2 files changed, 258 insertions, 206 deletions
diff --git a/ucb/source/ucp/cmis/cmis_content.cxx b/ucb/source/ucp/cmis/cmis_content.cxx index 9159c64ff670..bb6e1a0272ac 100644 --- a/ucb/source/ucp/cmis/cmis_content.cxx +++ b/ucb/source/ucp/cmis/cmis_content.cxx @@ -209,25 +209,18 @@ namespace cmis { } - libcmis::ObjectPtr Content::getObject( ) + libcmis::ObjectPtr Content::getObject( ) throw ( libcmis::Exception ) { - try + if ( !m_pObject.get() ) { - if ( !m_pObject.get() ) + if ( !m_sObjectPath.isEmpty( ) ) + m_pObject = m_pSession->getObjectByPath( OUSTR_TO_STDSTR( m_sObjectPath ) ); + else { - if ( !m_sObjectPath.isEmpty( ) ) - m_pObject = m_pSession->getObjectByPath( OUSTR_TO_STDSTR( m_sObjectPath ) ); - else - { - m_pObject = m_pSession->getRootFolder( ); - m_sObjectPath = "/"; - } + m_pObject = m_pSession->getRootFolder( ); + m_sObjectPath = "/"; } } - catch ( const libcmis::Exception& e ) - { - SAL_INFO( "cmisucp", "Unexpected exception: " << e.what() ); - } return m_pObject; } @@ -240,8 +233,21 @@ namespace cmis bool Content::isFolder(const uno::Reference< ucb::XCommandEnvironment >& xEnv ) { - resetAuthProvider( xEnv ); - return getObject( )->getBaseType( ) == "cmis:folder"; + bool bIsFolder = false; + try + { + resetAuthProvider( xEnv ); + bIsFolder = getObject( )->getBaseType( ) == "cmis:folder"; + } + catch ( const libcmis::Exception& e ) + { + ucbhelper::cancelCommandExecution( + ucb::IOErrorCode_GENERAL, + uno::Sequence< uno::Any >( 0 ), + xEnv, + rtl::OUString::createFromAscii( e.what() ) ); + } + return bIsFolder; } uno::Any Content::getBadArgExcept() @@ -267,111 +273,122 @@ namespace cmis for( sal_Int32 n = 0; n < nProps; ++n ) { - const beans::Property& rProp = pProps[ n ]; - - if ( rProp.Name == "IsDocument" ) - { - if ( getObject( ).get( ) ) - xRow->appendBoolean( rProp, getObject()->getBaseType( ) == "cmis:document" ); - else if ( m_pObjectType.get( ) ) - xRow->appendBoolean( rProp, m_pObjectType->getBaseType()->getId( ) == "cmis:document" ); - else - xRow->appendVoid( rProp ); - } - else if ( rProp.Name == "IsFolder" ) - { - if ( getObject( ).get( ) ) - xRow->appendBoolean( rProp, getObject()->getBaseType( ) == "cmis:folder" ); - else if ( m_pObjectType.get( ) ) - xRow->appendBoolean( rProp, m_pObjectType->getBaseType()->getId( ) == "cmis:folder" ); - else - xRow->appendVoid( rProp ); - } - else if ( rProp.Name == "Title" ) + try { - rtl::OUString sTitle; - if ( getObject().get() ) - sTitle = rtl::OUString::createFromAscii( getObject()->getName().c_str( ) ); - else if ( m_pObjectProps.size() > 0 ) + const beans::Property& rProp = pProps[ n ]; + + if ( rProp.Name == "IsDocument" ) { - map< string, libcmis::PropertyPtr >::iterator it = m_pObjectProps.find( "cmis:name" ); - if ( it != m_pObjectProps.end( ) ) + if ( getObject( ).get( ) ) + xRow->appendBoolean( rProp, getObject()->getBaseType( ) == "cmis:document" ); + else if ( m_pObjectType.get( ) ) + xRow->appendBoolean( rProp, m_pObjectType->getBaseType()->getId( ) == "cmis:document" ); + else + xRow->appendVoid( rProp ); + } + else if ( rProp.Name == "IsFolder" ) + { + if ( getObject( ).get( ) ) + xRow->appendBoolean( rProp, getObject()->getBaseType( ) == "cmis:folder" ); + else if ( m_pObjectType.get( ) ) + xRow->appendBoolean( rProp, m_pObjectType->getBaseType()->getId( ) == "cmis:folder" ); + else + xRow->appendVoid( rProp ); + } + else if ( rProp.Name == "Title" ) + { + rtl::OUString sTitle; + if ( getObject().get() ) + sTitle = rtl::OUString::createFromAscii( getObject()->getName().c_str( ) ); + else if ( m_pObjectProps.size() > 0 ) { - vector< string > values = it->second->getStrings( ); - if ( values.size() > 0 ) - sTitle = rtl::OUString::createFromAscii( values.front( ).c_str( ) ); + map< string, libcmis::PropertyPtr >::iterator it = m_pObjectProps.find( "cmis:name" ); + if ( it != m_pObjectProps.end( ) ) + { + vector< string > values = it->second->getStrings( ); + if ( values.size() > 0 ) + sTitle = rtl::OUString::createFromAscii( values.front( ).c_str( ) ); + } } - } - // Nothing worked... get it from the path - if ( sTitle.isEmpty( ) ) - { - rtl::OUString sPath = m_sObjectPath; + // Nothing worked... get it from the path + if ( sTitle.isEmpty( ) ) + { + rtl::OUString sPath = m_sObjectPath; - // Get rid of the trailing slash problem - if ( sPath[ sPath.getLength( ) - 1 ] == '/' ) - sPath = sPath.copy( 0, sPath.getLength() - 1 ); + // Get rid of the trailing slash problem + if ( sPath[ sPath.getLength( ) - 1 ] == '/' ) + sPath = sPath.copy( 0, sPath.getLength() - 1 ); - // Get the last segment - sal_Int32 nPos = sPath.lastIndexOf( '/' ); - if ( nPos >= 0 ) - sTitle = sPath.copy( nPos + 1 ); - } + // Get the last segment + sal_Int32 nPos = sPath.lastIndexOf( '/' ); + if ( nPos >= 0 ) + sTitle = sPath.copy( nPos + 1 ); + } - if ( !sTitle.isEmpty( ) ) - xRow->appendString( rProp, sTitle ); - else - xRow->appendVoid( rProp ); - } - else if ( rProp.Name == "TitleOnServer" ) - { - string path; - if ( getObject().get( ) ) - { - vector< string > paths = getObject( )->getPaths( ); - if ( paths.size( ) > 0 ) - path = paths.front( ); + if ( !sTitle.isEmpty( ) ) + xRow->appendString( rProp, sTitle ); else - path = getObject()->getName( ); + xRow->appendVoid( rProp ); + } + else if ( rProp.Name == "TitleOnServer" ) + { + string path; + if ( getObject().get( ) ) + { + vector< string > paths = getObject( )->getPaths( ); + if ( paths.size( ) > 0 ) + path = paths.front( ); + else + path = getObject()->getName( ); - xRow->appendString( rProp, rtl::OUString::createFromAscii( path.c_str() ) ); + xRow->appendString( rProp, rtl::OUString::createFromAscii( path.c_str() ) ); + } + else + xRow->appendVoid( rProp ); } - else - xRow->appendVoid( rProp ); - } - else if ( rProp.Name == "IsReadOnly" ) - { - boost::shared_ptr< libcmis::AllowableActions > allowableActions = getObject()->getAllowableActions( ); - sal_Bool bReadOnly = sal_False; - if ( allowableActions->isAllowed( libcmis::ObjectAction::SetContentStream ) ) - bReadOnly = sal_True; + else if ( rProp.Name == "IsReadOnly" ) + { + boost::shared_ptr< libcmis::AllowableActions > allowableActions = getObject()->getAllowableActions( ); + sal_Bool bReadOnly = sal_False; + if ( allowableActions->isAllowed( libcmis::ObjectAction::SetContentStream ) ) + bReadOnly = sal_True; - xRow->appendBoolean( rProp, bReadOnly ); - } - else if ( rProp.Name == "DateCreated" ) - { - util::DateTime aTime = lcl_boostToUnoTime( getObject( )->getCreationDate( ) ); - xRow->appendTimestamp( rProp, aTime ); - } - else if ( rProp.Name == "DateModified" ) - { - util::DateTime aTime = lcl_boostToUnoTime( getObject( )->getLastModificationDate( ) ); - xRow->appendTimestamp( rProp, aTime ); - } - else if ( rProp.Name == "Size" ) - { - libcmis::Document* document = dynamic_cast< libcmis::Document* >( getObject().get( ) ); - if ( NULL != document ) - xRow->appendLong( rProp, document->getContentLength() ); + xRow->appendBoolean( rProp, bReadOnly ); + } + else if ( rProp.Name == "DateCreated" ) + { + util::DateTime aTime = lcl_boostToUnoTime( getObject( )->getCreationDate( ) ); + xRow->appendTimestamp( rProp, aTime ); + } + else if ( rProp.Name == "DateModified" ) + { + util::DateTime aTime = lcl_boostToUnoTime( getObject( )->getLastModificationDate( ) ); + xRow->appendTimestamp( rProp, aTime ); + } + else if ( rProp.Name == "Size" ) + { + libcmis::Document* document = dynamic_cast< libcmis::Document* >( getObject().get( ) ); + if ( NULL != document ) + xRow->appendLong( rProp, document->getContentLength() ); + else + xRow->appendVoid( rProp ); + } + else if ( rProp.Name == "CreatableContentsInfo" ) + { + xRow->appendObject( rProp, uno::makeAny( queryCreatableContentsInfo( xEnv ) ) ); + } else - xRow->appendVoid( rProp ); + SAL_INFO( "cmisucp", "Looking for unsupported property " << rProp.Name ); } - else if ( rProp.Name == "CreatableContentsInfo" ) + catch ( const libcmis::Exception& e ) { - xRow->appendObject( rProp, uno::makeAny( queryCreatableContentsInfo( xEnv ) ) ); + ucbhelper::cancelCommandExecution( + ucb::IOErrorCode_GENERAL, + uno::Sequence< uno::Any >( 0 ), + xEnv, + rtl::OUString::createFromAscii( e.what() ) ); } - else - SAL_INFO( "cmisucp", "Looking for unsupported property " << rProp.Name ); } return uno::Reference< sdbc::XRow >( xRow.get() ); @@ -504,105 +521,106 @@ namespace cmis xEnv ); } - try + // For transient content, the URL is the one of the parent + if ( m_bTransient ) { - // For transient content, the URL is the one of the parent - if ( m_bTransient ) + rtl::OUString sNewPath; + + // Try to get the object from the server if there is any + libcmis::Folder* pFolder = NULL; + try { - rtl::OUString sNewPath; + pFolder = dynamic_cast< libcmis::Folder* >( getObject( ).get( ) ); + } + catch ( const libcmis::Exception& ) + { + } + + if ( pFolder != NULL ) + { + map< string, libcmis::PropertyPtr >::iterator it = m_pObjectProps.find( "cmis:name" ); + if ( it == m_pObjectProps.end( ) ) + { + ucbhelper::cancelCommandExecution( uno::makeAny + ( uno::RuntimeException( "Missing name property", + static_cast< cppu::OWeakObject * >( this ) ) ), + xEnv ); + } + string newName = it->second->getStrings( ).front( ); + string newPath = pFolder->getPath( ); + if ( newPath[ newPath.size( ) - 1 ] != '/' ) + newPath += "/"; + newPath += newName; + + libcmis::ObjectPtr object; + try + { + object = m_pSession->getObjectByPath( newPath ); + sNewPath = rtl::OUString::createFromAscii( newPath.c_str( ) ); + } + catch ( const libcmis::Exception& ) + { + // Nothing matched the path + } - // Try to get the object from the server if there is any - libcmis::Folder* pFolder = dynamic_cast< libcmis::Folder* >( getObject( ).get( ) ); - if ( pFolder != NULL ) + if ( NULL != object.get( ) ) { - map< string, libcmis::PropertyPtr >::iterator it = m_pObjectProps.find( "cmis:name" ); - if ( it == m_pObjectProps.end( ) ) + // Are the base type matching? + if ( object->getBaseType( ) != m_pObjectType->getBaseType( )->getId() ) { ucbhelper::cancelCommandExecution( uno::makeAny - ( uno::RuntimeException( "Missing name property", + ( uno::RuntimeException( "Can't change a folder into a document and vice-versa.", static_cast< cppu::OWeakObject * >( this ) ) ), xEnv ); } - string newName = it->second->getStrings( ).front( ); - string newPath = pFolder->getPath( ); - if ( newPath[ newPath.size( ) - 1 ] != '/' ) - newPath += "/"; - newPath += newName; - - libcmis::ObjectPtr object; - try - { - object = m_pSession->getObjectByPath( newPath ); - sNewPath = rtl::OUString::createFromAscii( newPath.c_str( ) ); - } - catch ( const libcmis::Exception& ) + + // Update the existing object if it's a document + libcmis::Document* document = dynamic_cast< libcmis::Document* >( object.get( ) ); + if ( NULL != document ) { - // Nothing matched the path + boost::shared_ptr< ostream > pOut( new ostringstream ( ios_base::binary | ios_base::in | ios_base::out ) ); + uno::Reference < io::XOutputStream > xOutput = new ucbhelper::StdOutputStream( pOut ); + copyData( xInputStream, xOutput ); + document->setContentStream( pOut, string( ), bReplaceExisting ); } + } + else + { + // We need to create a brand new object... either folder or document + bool bIsFolder = m_pObjectType->getBaseType( )->getId( ) == "cmis:folder"; + setCmisProperty( "cmis:objectTypeId", m_pObjectType->getId( ) ); - if ( NULL != object.get( ) ) + if ( bIsFolder ) { - // Are the base type matching? - if ( object->getBaseType( ) != m_pObjectType->getBaseType( )->getId() ) - { - ucbhelper::cancelCommandExecution( uno::makeAny - ( uno::RuntimeException( "Can't change a folder into a document and vice-versa.", - static_cast< cppu::OWeakObject * >( this ) ) ), - xEnv ); - } - - // Update the existing object if it's a document - libcmis::Document* document = dynamic_cast< libcmis::Document* >( object.get( ) ); - if ( NULL != document ) - { - boost::shared_ptr< ostream > pOut( new ostringstream ( ios_base::binary | ios_base::in | ios_base::out ) ); - uno::Reference < io::XOutputStream > xOutput = new ucbhelper::StdOutputStream( pOut ); - copyData( xInputStream, xOutput ); - document->setContentStream( pOut, string( ), bReplaceExisting ); - } + libcmis::FolderPtr pNew = pFolder->createFolder( m_pObjectProps ); + sNewPath = rtl::OUString::createFromAscii( newPath.c_str( ) ); } else { - // We need to create a brand new object... either folder or document - bool bIsFolder = m_pObjectType->getBaseType( )->getId( ) == "cmis:folder"; - setCmisProperty( "cmis:objectTypeId", m_pObjectType->getId( ) ); - - if ( bIsFolder ) - { - libcmis::FolderPtr pNew = pFolder->createFolder( m_pObjectProps ); - sNewPath = rtl::OUString::createFromAscii( newPath.c_str( ) ); - } - else - { - boost::shared_ptr< ostream > pOut( new ostringstream ( ios_base::binary | ios_base::in | ios_base::out ) ); - uno::Reference < io::XOutputStream > xOutput = new ucbhelper::StdOutputStream( pOut ); - copyData( xInputStream, xOutput ); - libcmis::DocumentPtr pNew = pFolder->createDocument( m_pObjectProps, pOut, string() ); - sNewPath = rtl::OUString::createFromAscii( newPath.c_str( ) ); - } + boost::shared_ptr< ostream > pOut( new ostringstream ( ios_base::binary | ios_base::in | ios_base::out ) ); + uno::Reference < io::XOutputStream > xOutput = new ucbhelper::StdOutputStream( pOut ); + copyData( xInputStream, xOutput ); + libcmis::DocumentPtr pNew = pFolder->createDocument( m_pObjectProps, pOut, string() ); + sNewPath = rtl::OUString::createFromAscii( newPath.c_str( ) ); } + } - if ( !sNewPath.isEmpty( ) ) - { - // Update the current content: it's no longer transient - m_sObjectPath = sNewPath; - URL aUrl( m_sURL ); - aUrl.setObjectPath( m_sObjectPath ); - m_sURL = aUrl.asString( ); - m_pObject.reset( ); - m_pObjectType.reset( ); - m_pObjectProps.clear( ); - m_bTransient = false; - - inserted(); - } + if ( !sNewPath.isEmpty( ) ) + { + // Update the current content: it's no longer transient + m_sObjectPath = sNewPath; + URL aUrl( m_sURL ); + aUrl.setObjectPath( m_sObjectPath ); + m_sURL = aUrl.asString( ); + m_pObject.reset( ); + m_pObjectType.reset( ); + m_pObjectProps.clear( ); + m_bTransient = false; + + inserted(); } } } - catch ( const libcmis::Exception& e ) - { - throw uno::Exception( rtl::OUString::createFromAscii( e.what( ) ), *this ); - } } const int TRANSFER_BUFFER_SIZE = 65536; @@ -621,13 +639,24 @@ namespace cmis uno::Sequence< uno::Any > Content::setPropertyValues( const uno::Sequence< beans::PropertyValue >& rValues, - const uno::Reference< ucb::XCommandEnvironment >& ) + const uno::Reference< ucb::XCommandEnvironment >& xEnv ) { - // Get the already set properties if possible - if ( !m_bTransient && getObject( ).get( ) ) + try + { + // Get the already set properties if possible + if ( !m_bTransient && getObject( ).get( ) ) + { + m_pObjectProps = getObject()->getProperties( ); + m_pObjectType = getObject()->getTypeDescription(); + } + } + catch ( const libcmis::Exception& e ) { - m_pObjectProps = getObject()->getProperties( ); - m_pObjectType = getObject()->getTypeDescription(); + ucbhelper::cancelCommandExecution( + ucb::IOErrorCode_GENERAL, + uno::Sequence< uno::Any >( 0 ), + xEnv, + rtl::OUString::createFromAscii( e.what() ) ); } sal_Int32 nCount = rValues.getLength(); @@ -681,16 +710,27 @@ namespace cmis } } - if ( !m_bTransient && bChanged ) + try { - getObject()->updateProperties(); + if ( !m_bTransient && bChanged ) + { + getObject()->updateProperties(); + } + } + catch ( const libcmis::Exception& e ) + { + ucbhelper::cancelCommandExecution( + ucb::IOErrorCode_GENERAL, + uno::Sequence< uno::Any >( 0 ), + xEnv, + rtl::OUString::createFromAscii( e.what() ) ); } return aRet; } sal_Bool Content::feedSink( uno::Reference< uno::XInterface> xSink, - const uno::Reference< ucb::XCommandEnvironment >& /*xEnv*/ ) + const uno::Reference< ucb::XCommandEnvironment >& xEnv ) { if ( !xSink.is() ) return sal_False; @@ -705,17 +745,28 @@ namespace cmis if ( xDataStreamer.is() && !xOut.is() ) xOut = xDataStreamer->getStream()->getOutputStream(); - libcmis::Document* document = dynamic_cast< libcmis::Document* >( getObject().get() ); - boost::shared_ptr< istream > aIn = document->getContentStream( ); + try + { + libcmis::Document* document = dynamic_cast< libcmis::Document* >( getObject().get() ); + boost::shared_ptr< istream > aIn = document->getContentStream( ); - uno::Reference< io::XInputStream > xIn = new ucbhelper::StdInputStream( aIn ); - if( !xIn.is( ) ) - return sal_False; + uno::Reference< io::XInputStream > xIn = new ucbhelper::StdInputStream( aIn ); + if( !xIn.is( ) ) + return sal_False; - if ( xDataSink.is() ) - xDataSink->setInputStream( xIn ); - else if ( xOut.is() ) - copyData( xIn, xOut ); + if ( xDataSink.is() ) + xDataSink->setInputStream( xIn ); + else if ( xOut.is() ) + copyData( xIn, xOut ); + } + catch ( const libcmis::Exception& e ) + { + ucbhelper::cancelCommandExecution( + ucb::IOErrorCode_GENERAL, + uno::Sequence< uno::Any >( 0 ), + xEnv, + rtl::OUString::createFromAscii( e.what() ) ); + } return sal_True; } @@ -814,7 +865,7 @@ namespace cmis return uno::Sequence< ucb::CommandInfo >(aCommandInfoTable, isFolder(xEnv) ? nProps : nProps - 2); } - ::rtl::OUString Content::getParentURL() + ::rtl::OUString Content::getParentURL( ) { rtl::OUString sRet; @@ -966,10 +1017,11 @@ namespace cmis } catch ( const libcmis::Exception& e ) { - ucbhelper::cancelCommandExecution( uno::makeAny - ( uno::RuntimeException( rtl::OUString::createFromAscii( e.what() ), - static_cast< cppu::OWeakObject * >( this ) ) ), - xEnv ); + ucbhelper::cancelCommandExecution( + ucb::IOErrorCode_GENERAL, + uno::Sequence< uno::Any >( 0 ), + xEnv, + rtl::OUString::createFromAscii( e.what() ) ); } } else diff --git a/ucb/source/ucp/cmis/cmis_content.hxx b/ucb/source/ucp/cmis/cmis_content.hxx index a0d619b85d5c..359aaaa46105 100644 --- a/ucb/source/ucp/cmis/cmis_content.hxx +++ b/ucb/source/ucp/cmis/cmis_content.hxx @@ -188,7 +188,7 @@ public: queryCreatableContentsInfo( const com::sun::star::uno::Reference< com::sun::star::ucb::XCommandEnvironment >& xEnv ) throw( com::sun::star::uno::RuntimeException ); - libcmis::ObjectPtr getObject( ); + libcmis::ObjectPtr getObject( ) throw ( libcmis::Exception ); }; } |