diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2013-06-14 11:22:51 +0200 |
---|---|---|
committer | Fridrich Strba <fridrich@documentfoundation.org> | 2013-08-20 09:31:50 +0000 |
commit | 08ab6d26e082c1646de73b347058fd9063570e13 (patch) | |
tree | 1bb74adb3cc9eac978b3659c8b7710b34705e6f0 | |
parent | ac9cee0d909ba580a4128f34b675e9f58794ea97 (diff) |
Always try to mount in gio::Content::getGFileInfo
...and not only if the caller happens to pass in non-null ppError. Otherwise,
calling soffice with a document URL handled by the gio UCP that is not yet
gio-mounted would silently do nothing and exit with EXIT_SUCCESS, as the first
thing the type detection code does on the URL is execute "getPropertyValues" for
"IsDocument", which calls getGFileInfo with null ppError, so a void instead of a
boolean value is returned, which then derails the type detection code to
silently fail (which is another problem that needs fixing).
Change-Id: I48a84428cdee5caead02909abc2efd3ae3722052
(cherry picked from commit 4d8bf09305fc4e4bd652187aac0a02398413ba65)
Reviewed-on: https://gerrit.libreoffice.org/5525
Reviewed-by: Fridrich Strba <fridrich@documentfoundation.org>
Tested-by: Fridrich Strba <fridrich@documentfoundation.org>
-rw-r--r-- | ucb/source/ucp/gio/gio_content.cxx | 42 |
1 files changed, 26 insertions, 16 deletions
diff --git a/ucb/source/ucp/gio/gio_content.cxx b/ucb/source/ucp/gio/gio_content.cxx index 34857d2f839a..4fe7e83d0db4 100644 --- a/ucb/source/ucp/gio/gio_content.cxx +++ b/ucb/source/ucp/gio/gio_content.cxx @@ -337,25 +337,35 @@ MountOperation::~MountOperation() GFileInfo* Content::getGFileInfo(const uno::Reference< ucb::XCommandEnvironment >& xEnv, GError **ppError) { - /*If we don't have it already, and we're not a "pre-creation" content then query for the info"*/ - if (!mpInfo && !mbTransient) - { - if (!(mpInfo = g_file_query_info(getGFile(), "*", G_FILE_QUERY_INFO_NONE, NULL, ppError))) - { - //Try and mount if unmounted - if (ppError && (*ppError)->code == G_IO_ERROR_NOT_MOUNTED) - { - g_error_free(*ppError); - - MountOperation aMounter(xEnv); - *ppError = aMounter.Mount(getGFile()); - - //No Mount error, reattempt query - if (!*ppError) - mpInfo = g_file_query_info(getGFile(), "*", G_FILE_QUERY_INFO_NONE, NULL, ppError); + GError * err = 0; + if (mpInfo == 0 && !mbTransient) { + for (bool retried = false;; retried = true) { + mpInfo = g_file_query_info( + getGFile(), "*", G_FILE_QUERY_INFO_NONE, 0, &err); + if (mpInfo != 0) { + break; + } + assert(err != 0); + if (err->code != G_IO_ERROR_NOT_MOUNTED || retried) { + break; + } + SAL_INFO( + "ucb.ucp.gio", + "G_IO_ERROR_NOT_MOUNTED \"" << err->message + << "\", trying to mount"); + g_error_free(err); + err = MountOperation(xEnv).Mount(getGFile()); + if (err != 0) { + break; } } } + if (ppError != 0) { + *ppError = err; + } else if (err != 0) { + SAL_WARN("ucb.ucp.gio", "ignoring GError \"" << err->message << "\""); + g_error_free(err); + } return mpInfo; } |