[Libreoffice-commits] core.git: Branch 'feature/cmis' - include/ucbhelper offapi/com sfx2/source ucbhelper/source ucb/source

Cao Cuong Ngo cao.cuong.ngo at gmail.com
Fri Aug 2 08:35:16 PDT 2013


 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.ngo at 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


More information about the Libreoffice-commits mailing list