include/ucbhelper/content.hxx | 4 offapi/com/sun/star/ucb/GlobalTransferCommandArgument2.idl | 6 - offapi/com/sun/star/ucb/InsertCommandArgument2.idl | 5 sfx2/source/doc/docfile.cxx | 5 ucb/source/core/ucbcmds.cxx | 4 ucb/source/ucp/cmis/cmis_content.cxx | 78 ++++++++++--- ucbhelper/source/client/content.cxx | 6 - 7 files changed, 85 insertions(+), 23 deletions(-)
New commits: commit 0ffd4c9bce1824054f71d20456fb01b86113e89b Author: Cao Cuong Ngo <cao.cuong....@gmail.com> Date: Fri Aug 2 15:04:40 2013 +0200 CMIS: add document ID when saving. The document ID is needed in case the get object by path of the CMIS document doesn't work (like Google Drive) Change-Id: I151d5433a19caeaf4a542b69cd9e95dde58722e7 diff --git a/include/ucbhelper/content.hxx b/include/ucbhelper/content.hxx index 0c5a2b4..b096802 100644 --- a/include/ucbhelper/content.hxx +++ b/include/ucbhelper/content.hxx @@ -670,6 +670,7 @@ public: * @param rCommentVersion contains the comment to use for checkin operations * @param rResultURL is a hacky way to get the update URL after the operation in * case there was a change (introduced for the checkin operation) + * @param rDocumentId is the document Id ( in case of CMIS ). */ sal_Bool transferContent( const Content& rSourceContent, @@ -679,7 +680,8 @@ public: const OUString & rMimeType = OUString( ), bool bMajorVersion = false, const OUString & rCommentVersion = OUString( ), - OUString* pResultURL = NULL ) + OUString* pResultURL = NULL, + const OUString & rDocumentId = OUString( ) ) throw( ::com::sun::star::ucb::CommandAbortedException, ::com::sun::star::uno::RuntimeException, ::com::sun::star::uno::Exception ); diff --git a/offapi/com/sun/star/ucb/GlobalTransferCommandArgument2.idl b/offapi/com/sun/star/ucb/GlobalTransferCommandArgument2.idl index 7169ba9..d7ba69b 100644 --- a/offapi/com/sun/star/ucb/GlobalTransferCommandArgument2.idl +++ b/offapi/com/sun/star/ucb/GlobalTransferCommandArgument2.idl @@ -15,13 +15,17 @@ module com { module sun { module star { module ucb { /** This struct extends the one for transfers arguments by adding a Mime - type property to it. + type and a Document Id property to it. */ struct GlobalTransferCommandArgument2 : GlobalTransferCommandArgument { /** contains the MIME type of the source object. */ string MimeType; + + /** contains the DocumentId of the source object. + */ + string DocumentId; }; diff --git a/offapi/com/sun/star/ucb/InsertCommandArgument2.idl b/offapi/com/sun/star/ucb/InsertCommandArgument2.idl index 5105543..c3d1ab8 100644 --- a/offapi/com/sun/star/ucb/InsertCommandArgument2.idl +++ b/offapi/com/sun/star/ucb/InsertCommandArgument2.idl @@ -21,6 +21,11 @@ struct InsertCommandArgument2 : InsertCommandArgument /** contains the MIME type of the document to insert */ string MimeType; + + /** contains the Document Id of the document to insert + */ + string DocumentId; + }; diff --git a/sfx2/source/doc/docfile.cxx b/sfx2/source/doc/docfile.cxx index 746ba20..c59675f 100644 --- a/sfx2/source/doc/docfile.cxx +++ b/sfx2/source/doc/docfile.cxx @@ -1977,6 +1977,9 @@ void SfxMedium::Transfer_Impl() OUString aFileName; Any aAny = aDestContent.getPropertyValue( OUString("Title" ) ); aAny >>= aFileName; + aAny = aDestContent.getPropertyValue( OUString("ObjectId" ) ); + OUString sObjectId; + aAny >>= sObjectId; if ( aFileName.isEmpty() ) aFileName = GetURLObject().getName( INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET ); @@ -2041,7 +2044,7 @@ void SfxMedium::Transfer_Impl() } OUString sResultURL; if (!aTransferContent.transferContent( aSourceContent, eOperation, - aFileName, nNameClash, aMimeType, bMajor, sComment, &sResultURL )) + aFileName, nNameClash, aMimeType, bMajor, sComment, &sResultURL, sObjectId)) pImp->m_eError = ERRCODE_IO_GENERAL; else if ( !sResultURL.isEmpty( ) ) // Likely to happen only for checkin SwitchDocumentToFile( sResultURL ); diff --git a/ucb/source/core/ucbcmds.cxx b/ucb/source/core/ucbcmds.cxx index 3c4fdd7..78bf612 100644 --- a/ucb/source/core/ucbcmds.cxx +++ b/ucb/source/core/ucbcmds.cxx @@ -1364,6 +1364,7 @@ void globalTransfer_( ucb::InsertCommandArgument2 aArg; aArg.Data = xInputStream; aArg.MimeType = rContext.aArg.MimeType; + aArg.DocumentId = rContext.aArg.DocumentId; switch ( rContext.aArg.NameClash ) { @@ -1614,7 +1615,8 @@ void globalTransfer_( ->getContentIdentifier(), // TargetURL OUString(), // NewTitle; rContext.aArg.NameClash, - rContext.aArg.MimeType ); + rContext.aArg.MimeType, + rContext.aArg.DocumentId); TransferCommandContext aSubCtx( rContext.xSMgr, diff --git a/ucb/source/ucp/cmis/cmis_content.cxx b/ucb/source/ucp/cmis/cmis_content.cxx index cd0fb01..7fedb84 100644 --- a/ucb/source/ucp/cmis/cmis_content.cxx +++ b/ucb/source/ucp/cmis/cmis_content.cxx @@ -604,6 +604,32 @@ namespace cmis else xRow->appendVoid( rProp ); } + else if ( rProp.Name == "ObjectId" ) + { + OUString sId; + try + { + sId = STD_TO_OUSTR( getObject( xEnv )->getId() ); + } + catch ( const libcmis::Exception& ) + { + if ( !m_pObjectProps.empty() ) + { + map< string, libcmis::PropertyPtr >::iterator it = m_pObjectProps.find( "cmis:objectId" ); + if ( it != m_pObjectProps.end( ) ) + { + vector< string > values = it->second->getStrings( ); + if ( !values.empty() ) + sId = STD_TO_OUSTR( values.front( ) ); + } + } + } + + if ( !sId.isEmpty( ) ) + xRow->appendString( rProp, sId ); + else + xRow->appendVoid( rProp ); + } else if ( rProp.Name == "TitleOnServer" ) { string path; @@ -1124,29 +1150,42 @@ namespace cmis if ( pFolder != NULL ) { - map< string, libcmis::PropertyPtr >::iterator it = m_pObjectProps.find( "cmis:name" ); - if ( it == m_pObjectProps.end( ) ) + libcmis::ObjectPtr object; + string newPath; + if ( m_sObjectId.isEmpty( ) ) { - 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; + 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( ); + newPath = pFolder->getPath( ); + if ( newPath[ newPath.size( ) - 1 ] != '/' ) + newPath += "/"; + newPath += newName; - libcmis::ObjectPtr object; + try + { + object = getSession( xEnv )->getObjectByPath( newPath ); + sNewPath = STD_TO_OUSTR( newPath ); + } + catch ( const libcmis::Exception& ) + { + // Nothing matched the path + } + } + else try { - object = getSession( xEnv )->getObjectByPath( newPath ); - sNewPath = STD_TO_OUSTR( newPath ); + object = getSession( xEnv )->getObject( OUSTR_TO_STDSTR( m_sObjectId) ); } - catch ( const libcmis::Exception& ) + catch ( libcmis::Exception& ) { - // Nothing matched the path + // Continue } if ( NULL != object.get( ) ) @@ -1404,6 +1443,9 @@ namespace cmis beans::Property( OUString( "Title" ), -1, getCppuType( static_cast< const OUString * >( 0 ) ), beans::PropertyAttribute::BOUND ), + beans::Property( OUString( "ObjectId" ), + -1, getCppuType( static_cast< const OUString * >( 0 ) ), + beans::PropertyAttribute::BOUND ), beans::Property( OUString( "TitleOnServer" ), -1, getCppuType( static_cast< const OUString * >( 0 ) ), beans::PropertyAttribute::BOUND ), @@ -1651,6 +1693,8 @@ namespace cmis arg.Data = insertArg.Data; arg.ReplaceExisting = insertArg.ReplaceExisting; } + // store the document id + m_sObjectId = arg.DocumentId; insert( arg.Data, arg.ReplaceExisting, arg.MimeType, xEnv ); } else if ( aCommand.Name == "delete" ) diff --git a/ucbhelper/source/client/content.cxx b/ucbhelper/source/client/content.cxx index b5f710e..ccfd6c7 100644 --- a/ucbhelper/source/client/content.cxx +++ b/ucbhelper/source/client/content.cxx @@ -962,7 +962,8 @@ sal_Bool Content::transferContent( const Content& rSourceContent, const OUString & rMimeType, bool bMajorVersion, const OUString & rVersionComment, - OUString* pResultURL ) + OUString* pResultURL, + const OUString & rDocumentId ) throw( CommandAbortedException, RuntimeException, Exception ) { Reference< XUniversalContentBroker > pBroker( @@ -1015,7 +1016,8 @@ sal_Bool Content::transferContent( const Content& rSourceContent, getURL(), // TargetFolderURL, rTitle, nNameClashAction, - rMimeType ); + rMimeType, + rDocumentId ); aCommand.Argument <<= aTransferArg; } else _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits