summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2013-03-13 08:59:42 +0100
committerMichael Meeks <michael.meeks@suse.com>2013-03-13 10:18:07 +0000
commit43a4a16f60b7d1603b9984cfb355dc7e736a15f4 (patch)
tree2574cca1e72059a07a26c482abfdae82bae45f7a
parent8ed047be746c428b4b9d614afc26e53238ec72f8 (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. (cherry picked from commit 8722f0e7ef690205d042c8a6b1fdf342a34ecbe1) Change-Id: I1a9c0c094f5320456940e3af4c802711828ab5ac Signed-off-by: Michael Meeks <michael.meeks@suse.com>
-rw-r--r--ucb/source/ucp/gio/gio_content.cxx31
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 b675f25109bb..4833a4842906 100644
--- a/ucb/source/ucp/gio/gio_content.cxx
+++ b/ucb/source/ucp/gio/gio_content.cxx
@@ -408,7 +408,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
@@ -416,45 +416,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 );
@@ -466,14 +466,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 );
@@ -484,7 +484,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 );
@@ -509,11 +509,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);
}
@@ -1066,6 +1062,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