summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2019-04-29 11:45:46 +0200
committerMichael Stahl <Michael.Stahl@cib.de>2019-04-29 18:43:51 +0200
commit41747b75076e4446947873b3edc2abe3e3c4ebd1 (patch)
tree7234638839d4feeb20fe18197180850758be221e
parentdc37b4babc3234df7e2bde67ac662324925f0e61 (diff)
tdf#123472: Propagate getGFileInfo failure less aggressively
...from Content::getPropertyValues. ca0308797df86ebece19260f3ca438a0cb437208 "tdf#121337: Fail on GIO error in GIO UCP getPropertyValue" had made Content::getPropertyValues fail for every getGFileInfo failure. However, when saving to a not-yet exisiting file, SfxMedium::Transfer_Impl (sfx2/source/doc/docfile.cxx) requests the properties "Title" and "ObjectId" from the Content representing the not-yet existing file, and apparently expects those requests not to fail. So restructure Content::getPropertyValues to only call getGFileInfo when actually needed (that covers not failing for the unknown- anyway "ObjecdtId" property), and handle "Title" specially by not failing for a non-existing file. (The documentation at offapi/com/sun/star/ucb/Content.idl says for the "getPropertyValues" command that: "The execution will not be aborted, if there are properties requested, that are unknown to the content." But that leaves it somewhat unclear whether failure to obtain a known property should be propagated. It apparently should be in the context of tfd#121337 fixed previously, but apparently not for "Title" here.) Change-Id: I12a9a5bd93d661922ea3b7b19a84a7e73e7e4b50 Reviewed-on: https://gerrit.libreoffice.org/71515 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com> (cherry picked from commit 6d3dd64391e67e6cfe406dea047e13227ea94c4b) Reviewed-on: https://gerrit.libreoffice.org/71525 Reviewed-by: Michael Stahl <Michael.Stahl@cib.de>
-rw-r--r--ucb/source/ucp/gio/gio_content.cxx52
-rw-r--r--ucb/source/ucp/gio/gio_content.hxx9
2 files changed, 38 insertions, 23 deletions
diff --git a/ucb/source/ucp/gio/gio_content.cxx b/ucb/source/ucp/gio/gio_content.cxx
index a581c34adb2a..a40576801424 100644
--- a/ucb/source/ucp/gio/gio_content.cxx
+++ b/ucb/source/ucp/gio/gio_content.cxx
@@ -425,12 +425,11 @@ static util::DateTime getDateFromUnix (time_t t)
return util::DateTime();
}
-uno::Reference< sdbc::XRow > Content::getPropertyValuesFromGFileInfo(GFileInfo *pInfo,
- const uno::Reference< uno::XComponentContext >& rxContext,
- const uno::Reference< ucb::XCommandEnvironment > & xEnv,
- const uno::Sequence< beans::Property >& rProperties)
+uno::Reference< sdbc::XRow > Content::getPropertyValues(
+ const uno::Sequence< beans::Property >& rProperties,
+ const uno::Reference< ucb::XCommandEnvironment >& xEnv )
{
- rtl::Reference< ::ucbhelper::PropertyValueSet > xRow = new ::ucbhelper::PropertyValueSet( rxContext );
+ rtl::Reference< ::ucbhelper::PropertyValueSet > xRow = new ::ucbhelper::PropertyValueSet( m_xContext );
sal_Int32 nProps;
const beans::Property* pProps;
@@ -438,12 +437,14 @@ uno::Reference< sdbc::XRow > Content::getPropertyValuesFromGFileInfo(GFileInfo *
nProps = rProperties.getLength();
pProps = rProperties.getConstArray();
+ GFileInfo *pInfo = nullptr;
for( sal_Int32 n = 0; n < nProps; ++n )
{
const beans::Property& rProp = pProps[ n ];
if ( rProp.Name == "IsDocument" )
{
+ getFileInfo(xEnv, &pInfo, true);
if (pInfo != nullptr && 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 ) );
@@ -452,6 +453,7 @@ uno::Reference< sdbc::XRow > Content::getPropertyValuesFromGFileInfo(GFileInfo *
}
else if ( rProp.Name == "IsFolder" )
{
+ getFileInfo(xEnv, &pInfo, true);
if (pInfo != nullptr && 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
@@ -459,6 +461,7 @@ uno::Reference< sdbc::XRow > Content::getPropertyValuesFromGFileInfo(GFileInfo *
}
else if ( rProp.Name == "Title" )
{
+ getFileInfo(xEnv, &pInfo, false);
if (pInfo != nullptr && g_file_info_has_attribute(pInfo, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME))
{
const char *pName = g_file_info_get_display_name(pInfo);
@@ -469,6 +472,7 @@ uno::Reference< sdbc::XRow > Content::getPropertyValuesFromGFileInfo(GFileInfo *
}
else if ( rProp.Name == "IsReadOnly" )
{
+ getFileInfo(xEnv, &pInfo, true);
if (pInfo != nullptr && 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
@@ -476,6 +480,7 @@ uno::Reference< sdbc::XRow > Content::getPropertyValuesFromGFileInfo(GFileInfo *
}
else if ( rProp.Name == "DateCreated" )
{
+ getFileInfo(xEnv, &pInfo, true);
if (pInfo != nullptr && 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
@@ -483,6 +488,7 @@ uno::Reference< sdbc::XRow > Content::getPropertyValuesFromGFileInfo(GFileInfo *
}
else if ( rProp.Name == "DateModified" )
{
+ getFileInfo(xEnv, &pInfo, true);
if (pInfo != nullptr && 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
@@ -490,6 +496,7 @@ uno::Reference< sdbc::XRow > Content::getPropertyValuesFromGFileInfo(GFileInfo *
}
else if ( rProp.Name == "Size" )
{
+ getFileInfo(xEnv, &pInfo, true);
if (pInfo != nullptr && g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_STANDARD_SIZE) )
xRow->appendLong( rProp, ( g_file_info_get_size( pInfo ) ));
else
@@ -502,6 +509,7 @@ uno::Reference< sdbc::XRow > Content::getPropertyValuesFromGFileInfo(GFileInfo *
}
else if ( rProp.Name == "IsCompactDisc" )
{
+ getFileInfo(xEnv, &pInfo, true);
if (pInfo != nullptr && 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
@@ -509,6 +517,7 @@ uno::Reference< sdbc::XRow > Content::getPropertyValuesFromGFileInfo(GFileInfo *
}
else if ( rProp.Name == "IsRemoveable" )
{
+ getFileInfo(xEnv, &pInfo, true);
if (pInfo != nullptr && 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
@@ -520,6 +529,7 @@ uno::Reference< sdbc::XRow > Content::getPropertyValuesFromGFileInfo(GFileInfo *
}
else if ( rProp.Name == "IsHidden" )
{
+ getFileInfo(xEnv, &pInfo, true);
if (pInfo != nullptr && g_file_info_has_attribute( pInfo, G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN) )
xRow->appendBoolean( rProp, ( g_file_info_get_is_hidden ( pInfo ) ) );
else
@@ -540,19 +550,6 @@ uno::Reference< sdbc::XRow > Content::getPropertyValuesFromGFileInfo(GFileInfo *
return uno::Reference< sdbc::XRow >( xRow.get() );
}
-uno::Reference< sdbc::XRow > Content::getPropertyValues(
- const uno::Sequence< beans::Property >& rProperties,
- const uno::Reference< ucb::XCommandEnvironment >& xEnv )
-{
- GError * err = nullptr;
- GFileInfo *pInfo = getGFileInfo(xEnv, &err);
- if (pInfo == nullptr && !mbTransient) {
- ucbhelper::cancelCommandExecution(mapGIOError(err), xEnv);
- }
- assert(err == nullptr);
- return getPropertyValuesFromGFileInfo(pInfo, m_xContext, xEnv, rProperties);
-}
-
static lang::IllegalAccessException
getReadOnlyException( const uno::Reference< uno::XInterface >& rContext )
{
@@ -640,6 +637,25 @@ bool Content::exchangeIdentity( const uno::Reference< ucb::XContentIdentifier >&
return false;
}
+void Content::getFileInfo(
+ css::uno::Reference<css::ucb::XCommandEnvironment> const & env, GFileInfo ** info, bool fail)
+{
+ assert(info != nullptr);
+ if (*info == nullptr)
+ {
+ GError * err = nullptr;
+ *info = getGFileInfo(env, &err);
+ if (*info == nullptr && !mbTransient && fail)
+ {
+ ucbhelper::cancelCommandExecution(mapGIOError(err), env);
+ }
+ else if (err != nullptr)
+ {
+ g_error_free(err);
+ }
+ }
+}
+
uno::Sequence< uno::Any > Content::setPropertyValues(
const uno::Sequence< beans::PropertyValue >& rValues,
const uno::Reference< ucb::XCommandEnvironment >& xEnv )
diff --git a/ucb/source/ucp/gio/gio_content.hxx b/ucb/source/ucp/gio/gio_content.hxx
index a60ae47a738c..8ba80fc4d53f 100644
--- a/ucb/source/ucp/gio/gio_content.hxx
+++ b/ucb/source/ucp/gio/gio_content.hxx
@@ -116,6 +116,10 @@ private:
bool exchangeIdentity(const css::uno::Reference< css::ucb::XContentIdentifier >& xNewId);
+ void getFileInfo(
+ css::uno::Reference<css::ucb::XCommandEnvironment> const & env, GFileInfo ** info,
+ bool fail);
+
public:
/// @throws css::ucb::ContentCreationException
Content( const css::uno::Reference<
@@ -130,11 +134,6 @@ public:
virtual ~Content() override;
- css::uno::Reference< css::sdbc::XRow > getPropertyValuesFromGFileInfo(
- GFileInfo *pInfo, const css::uno::Reference< css::uno::XComponentContext >& rxContext,
- const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv,
- const css::uno::Sequence< css::beans::Property >& rProperties);
-
virtual css::uno::Sequence< css::beans::Property >
getProperties( const css::uno::Reference<
css::ucb::XCommandEnvironment > & xEnv ) override;