diff options
author | Cao Cuong Ngo <cao.cuong.ngo@gmail.com> | 2013-08-02 15:04:40 +0200 |
---|---|---|
committer | Cédric Bosdonnat <cedric.bosdonnat.ooo@free.fr> | 2013-09-02 13:51:54 +0200 |
commit | ff8b445dc003ea9da8d7040030250e7f08ff2fde (patch) | |
tree | 13bcd29d490b9052c1e235b92c10eeb36a492fff | |
parent | f6c006397896ae8b431a0ab85c89ab677d6ab981 (diff) |
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
-rw-r--r-- | include/ucbhelper/content.hxx | 4 | ||||
-rw-r--r-- | offapi/com/sun/star/ucb/GlobalTransferCommandArgument2.idl | 6 | ||||
-rw-r--r-- | offapi/com/sun/star/ucb/InsertCommandArgument2.idl | 5 | ||||
-rw-r--r-- | sfx2/source/doc/docfile.cxx | 5 | ||||
-rw-r--r-- | ucb/source/core/ucbcmds.cxx | 4 | ||||
-rw-r--r-- | ucb/source/ucp/cmis/cmis_content.cxx | 78 | ||||
-rw-r--r-- | ucbhelper/source/client/content.cxx | 6 |
7 files changed, 85 insertions, 23 deletions
diff --git a/include/ucbhelper/content.hxx b/include/ucbhelper/content.hxx index 0c5a2b45db5b..b09680299fce 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 7169ba9afbf2..d7ba69b31a06 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 510554327a78..c3d1ab883863 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 60bcd206a661..329cfb8aee5c 100644 --- a/sfx2/source/doc/docfile.cxx +++ b/sfx2/source/doc/docfile.cxx @@ -1960,6 +1960,9 @@ void SfxMedium::Transfer_Impl() OUString aFileName; Any aAny = aDestContent.getPropertyValue("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 ); @@ -2024,7 +2027,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 8702ac6bf52b..87a677305c37 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.m_xContext, diff --git a/ucb/source/ucp/cmis/cmis_content.cxx b/ucb/source/ucp/cmis/cmis_content.cxx index f9a5a9a46f53..2d687ea73b04 100644 --- a/ucb/source/ucp/cmis/cmis_content.cxx +++ b/ucb/source/ucp/cmis/cmis_content.cxx @@ -601,6 +601,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; @@ -1121,29 +1147,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( ) ) @@ -1401,6 +1440,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 ), @@ -1648,6 +1690,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 2055e9cde1c4..aac47d4b2d8d 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 |