summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCao Cuong Ngo <cao.cuong.ngo@gmail.com>2013-08-02 15:04:40 +0200
committerCao Cuong Ngo <cao.cuong.ngo@gmail.com>2013-08-02 17:27:12 +0200
commit0ffd4c9bce1824054f71d20456fb01b86113e89b (patch)
treeca048dc02d1b625890b20fa7299ca1ddfa83c812
parent1498cf0d9429f992affbe1ab5701b07e66cf1754 (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.hxx4
-rw-r--r--offapi/com/sun/star/ucb/GlobalTransferCommandArgument2.idl6
-rw-r--r--offapi/com/sun/star/ucb/InsertCommandArgument2.idl5
-rw-r--r--sfx2/source/doc/docfile.cxx5
-rw-r--r--ucb/source/core/ucbcmds.cxx4
-rw-r--r--ucb/source/ucp/cmis/cmis_content.cxx78
-rw-r--r--ucbhelper/source/client/content.cxx6
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 746ba2040280..c59675f8d5c5 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 3c4fdd71fe02..78bf6124a15d 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 cd0fb011642a..7fedb846035b 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 b5f710e0cc14..ccfd6c71cf21 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