diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2013-03-13 08:59:42 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2013-03-13 08:59:42 +0100 |
commit | 8722f0e7ef690205d042c8a6b1fdf342a34ecbe1 (patch) | |
tree | ccc57edbfc8c2f4ad9e408909d587449f22fc3eb | |
parent | 07c6e76749559614743ca11efc9dec265f7cfacc (diff) |
rhbz#895690: Make GIO UCP less brittle, so saving docs works again
966d20e35d5a2be2fce6c204af5c156c3ead7063 "CMIS ucp: write documents back to CMIS
server" had introduced changes to sfx2/source/doc/docfile.cxx in LO 3.6 that
changed the exact commands that this code issued for UCP content nodes. The GIO
UCP was not prepared to handle that, causing saving of documents via it to fail
with rather obscure error messages:
* For one, docfile.cxx started to call "getPropertyValues" to obtain the "Title"
of a non-existent content. That lead to an InteractiveAugmentedIOException
instead of silently returning a void value.
* For another, docfile.cxx started to call "transfer" on a folder content whose
URL did not have a trailing slash, so the code computed a wrong URL for the
child element, resulting in various problems depending on context.
Change-Id: I1a9c0c094f5320456940e3af4c802711828ab5ac
-rw-r--r-- | ucb/source/ucp/gio/gio_content.cxx | 31 |
1 files changed, 15 insertions, 16 deletions
diff --git a/ucb/source/ucp/gio/gio_content.cxx b/ucb/source/ucp/gio/gio_content.cxx index e08b72788074..6584bc5b2ba1 100644 --- a/ucb/source/ucp/gio/gio_content.cxx +++ b/ucb/source/ucp/gio/gio_content.cxx @@ -405,7 +405,7 @@ uno::Reference< sdbc::XRow > Content::getPropertyValuesFromGFileInfo(GFileInfo * if ( rProp.Name == "IsDocument" ) { - if (g_file_info_has_attribute(pInfo, G_FILE_ATTRIBUTE_STANDARD_TYPE)) + if (pInfo != 0 && g_file_info_has_attribute(pInfo, G_FILE_ATTRIBUTE_STANDARD_TYPE)) xRow->appendBoolean( rProp, ( g_file_info_get_file_type( pInfo ) == G_FILE_TYPE_REGULAR || g_file_info_get_file_type( pInfo ) == G_FILE_TYPE_UNKNOWN ) ); else @@ -413,45 +413,45 @@ uno::Reference< sdbc::XRow > Content::getPropertyValuesFromGFileInfo(GFileInfo * } else if ( rProp.Name == "IsFolder" ) { - if( g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_STANDARD_TYPE) ) + if (pInfo != 0 && g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_STANDARD_TYPE) ) xRow->appendBoolean( rProp, ( g_file_info_get_file_type( pInfo ) == G_FILE_TYPE_DIRECTORY )); else xRow->appendVoid( rProp ); } else if ( rProp.Name == "Title" ) { - if (g_file_info_has_attribute(pInfo, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME)) + if (pInfo != 0 && g_file_info_has_attribute(pInfo, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME)) { const char *pName = g_file_info_get_display_name(pInfo); xRow->appendString( rProp, rtl::OUString(pName, strlen(pName), RTL_TEXTENCODING_UTF8) ); } else - xRow->appendVoid( rProp ); + xRow->appendVoid(rProp); } else if ( rProp.Name == "IsReadOnly" ) { - if( g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE ) ) + if (pInfo != 0 && g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE ) ) xRow->appendBoolean( rProp, !g_file_info_get_attribute_boolean( pInfo, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE) ); else xRow->appendVoid( rProp ); } else if ( rProp.Name == "DateCreated" ) { - if( g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_TIME_CREATED ) ) + if (pInfo != 0 && g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_TIME_CREATED ) ) xRow->appendTimestamp( rProp, getDateFromUnix(g_file_info_get_attribute_uint64(pInfo, G_FILE_ATTRIBUTE_TIME_CREATED)) ); else xRow->appendVoid( rProp ); } else if ( rProp.Name == "DateModified" ) { - if( g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_TIME_CHANGED ) ) + if (pInfo != 0 && g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_TIME_CHANGED ) ) xRow->appendTimestamp( rProp, getDateFromUnix(g_file_info_get_attribute_uint64(pInfo, G_FILE_ATTRIBUTE_TIME_CHANGED)) ); else xRow->appendVoid( rProp ); } else if ( rProp.Name == "Size" ) { - if( g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_STANDARD_SIZE) ) + if (pInfo != 0 && g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_STANDARD_SIZE) ) xRow->appendLong( rProp, ( g_file_info_get_size( pInfo ) )); else xRow->appendVoid( rProp ); @@ -463,14 +463,14 @@ uno::Reference< sdbc::XRow > Content::getPropertyValuesFromGFileInfo(GFileInfo * } else if ( rProp.Name == "IsCompactDisc" ) { - if( g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_MOUNTABLE_CAN_EJECT ) ) + if (pInfo != 0 && g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_MOUNTABLE_CAN_EJECT ) ) xRow->appendBoolean( rProp, g_file_info_get_attribute_boolean(pInfo, G_FILE_ATTRIBUTE_MOUNTABLE_CAN_EJECT) ); else xRow->appendVoid( rProp ); } else if ( rProp.Name == "IsRemoveable" ) { - if( g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_MOUNTABLE_CAN_UNMOUNT ) ) + if (pInfo != 0 && g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_MOUNTABLE_CAN_UNMOUNT ) ) xRow->appendBoolean( rProp, g_file_info_get_attribute_boolean(pInfo, G_FILE_ATTRIBUTE_MOUNTABLE_CAN_UNMOUNT ) ); else xRow->appendVoid( rProp ); @@ -481,7 +481,7 @@ uno::Reference< sdbc::XRow > Content::getPropertyValuesFromGFileInfo(GFileInfo * } else if ( rProp.Name == "IsHidden" ) { - if( g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN) ) + if (pInfo != 0 && g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN) ) xRow->appendBoolean( rProp, ( g_file_info_get_is_hidden ( pInfo ) ) ); else xRow->appendVoid( rProp ); @@ -506,11 +506,7 @@ uno::Reference< sdbc::XRow > Content::getPropertyValues( const uno::Sequence< beans::Property >& rProperties, const uno::Reference< ucb::XCommandEnvironment >& xEnv ) { - GError *pError = NULL; - GFileInfo *pInfo = getGFileInfo(xEnv, &pError); - if (!pInfo) - ucbhelper::cancelCommandExecution(mapGIOError(pError), xEnv); - + GFileInfo *pInfo = getGFileInfo(xEnv); return getPropertyValuesFromGFileInfo(pInfo, m_xContext, xEnv, rProperties); } @@ -1063,6 +1059,9 @@ void Content::transfer( const ucb::TransferInfo& aTransferInfo, const uno::Refer throw( uno::Exception ) { rtl::OUString sDest = m_xIdentifier->getContentIdentifier(); + if (!sDest.endsWith("/")) { + sDest += "/"; + } if (aTransferInfo.NewTitle.getLength()) sDest += aTransferInfo.NewTitle; else |