summaryrefslogtreecommitdiff
path: root/sfx2
diff options
context:
space:
mode:
authorMichael Stahl <michael.stahl@allotropia.de>2022-10-20 19:52:07 +0200
committerMichael Stahl <michael.stahl@allotropia.de>2022-10-21 17:22:45 +0200
commitb1f25771fd7e5671f081bcb80ed58e8678f3105f (patch)
tree951cb5a843e1745156a1348070225601ed266ad8 /sfx2
parentc7bcf51d3efe30047667fe026cbcd3cb87bdece3 (diff)
sfx2: avoid showing 2 dialogs in case WebDAV LOCK request fails
... with 403 error code, which typically indicates read-only; one dialog is enough - also for the initial load of the document. (cherry picked from commit 855d62fc841abc62e0eca079e9b30f9d0888a93f) There is an Infobar anyway that the user can click to try again to edit the document, and if that fails there will be a dialog that offers opening a copy. If opening a file:// document writable fails and it is opened read-only, there is also no extra error dialog, just the Infobar, so this is making WebDAV more consistent. Change-Id: Ice62d167199f384b246b9d60dab4eed456a62288 (cherry picked from commit 48fa1f49d97ce04c9d3749ae02b2874af6477e82) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141620 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
Diffstat (limited to 'sfx2')
-rw-r--r--sfx2/source/doc/docfile.cxx39
1 files changed, 39 insertions, 0 deletions
diff --git a/sfx2/source/doc/docfile.cxx b/sfx2/source/doc/docfile.cxx
index a0f789884d4c..2f773fca6e62 100644
--- a/sfx2/source/doc/docfile.cxx
+++ b/sfx2/source/doc/docfile.cxx
@@ -52,6 +52,7 @@
#include <com/sun/star/ucb/CommandFailedException.hpp>
#include <com/sun/star/ucb/CommandAbortedException.hpp>
#include <com/sun/star/ucb/InteractiveLockingLockedException.hpp>
+#include <com/sun/star/ucb/InteractiveNetworkReadException.hpp>
#include <com/sun/star/ucb/InteractiveNetworkWriteException.hpp>
#include <com/sun/star/ucb/Lock.hpp>
#include <com/sun/star/ucb/NameClashException.hpp>
@@ -1243,6 +1244,37 @@ namespace
}
}
+namespace
+{
+
+// for LOCK request, suppress dialog on 403, typically indicates read-only
+// document and there's a 2nd dialog prompting to open a copy anyway
+class LockInteractionHandler : public ::cppu::WeakImplHelper<task::XInteractionHandler>
+{
+private:
+ uno::Reference<task::XInteractionHandler> m_xHandler;
+
+public:
+ explicit LockInteractionHandler(uno::Reference<task::XInteractionHandler> const& xHandler)
+ : m_xHandler(xHandler)
+ {
+ }
+
+ virtual void SAL_CALL handle(uno::Reference<task::XInteractionRequest> const& xRequest) override
+ {
+ ucb::InteractiveNetworkWriteException readException;
+ ucb::InteractiveNetworkReadException writeException;
+ if ((xRequest->getRequest() >>= readException)
+ || (xRequest->getRequest() >>= writeException))
+ {
+ return; // 403 gets reported as one of these; ignore to avoid dialog
+ }
+ m_xHandler->handle(xRequest);
+ }
+};
+
+} // namespace
+
#endif // HAVE_FEATURE_MULTIUSER_ENVIRONMENT
// sets SID_DOC_READONLY if the document cannot be opened for editing
@@ -1289,6 +1321,13 @@ SfxMedium::LockFileResult SfxMedium::LockOrigFileOnDemand(bool bLoading, bool bN
if( !bResult )
{
uno::Reference< task::XInteractionHandler > xCHandler = GetInteractionHandler( true );
+ // Dialog with error is superfluous:
+ // on loading, will result in read-only with infobar.
+ // bNoUI case for Reload failing, will open dialog later.
+ if (bLoading || bNoUI)
+ {
+ xCHandler = new LockInteractionHandler(xCHandler);
+ }
Reference< css::ucb::XCommandEnvironment > xComEnv = new ::ucbhelper::CommandEnvironment(
xCHandler, Reference< css::ucb::XProgressHandler >() );