[Libreoffice-commits] core.git: comphelper/source framework/source include/comphelper include/unotools unotools/source
Giuseppe Castagno
giuseppe.castagno at acca-esse.eu
Wed Jul 22 09:17:36 PDT 2015
comphelper/source/misc/stillreadwriteinteraction.cxx | 26 ++++++++++++++++++-
framework/source/loadenv/loadenv.cxx | 14 ++++++----
include/comphelper/stillreadwriteinteraction.hxx | 6 +++-
include/unotools/mediadescriptor.hxx | 1
unotools/source/misc/mediadescriptor.cxx | 25 ++++++++++++++++--
5 files changed, 62 insertions(+), 10 deletions(-)
New commits:
commit bc9a8ddbb7081f79e915c841e56fd1c40f0df6f9
Author: Giuseppe Castagno <giuseppe.castagno at acca-esse.eu>
Date: Sat Jul 18 18:29:13 2015 +0200
tdf#82744: fix WebDAV lock/unlock behaviour - part 2
Changes done to the code in framework, comphelper and unotools,
in no particular order
- add an interaction handler dedicated to WebDAV
The stock interaction handler can be missing depending on the need of
the framework performing its tasks, so a dedicated handler is
provided, this one is always present.
- force opening of a WebDAV file.
A WebDAV file sould be open r/o even if explicitly requested to open
as r/w.
This is a limitation of current WebDAV implementation, not of the
standard.
This change is needed in order to reopen correctly a file as
requested by a 'Edit Mode' GUI command.
Change-Id: I5368fa2c0511f1630e6d6139c6a986d33aa19082
Reviewed-on: https://gerrit.libreoffice.org/17182
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
Tested-by: Michael Meeks <michael.meeks at collabora.com>
diff --git a/comphelper/source/misc/stillreadwriteinteraction.cxx b/comphelper/source/misc/stillreadwriteinteraction.cxx
index 1ad24fa..2dbe73c 100644
--- a/comphelper/source/misc/stillreadwriteinteraction.cxx
+++ b/comphelper/source/misc/stillreadwriteinteraction.cxx
@@ -23,14 +23,20 @@
#include <com/sun/star/task/XInteractionAbort.hpp>
+#include <com/sun/star/task/XInteractionApprove.hpp>
+
#include <com/sun/star/ucb/UnsupportedDataSinkException.hpp>
+#include <com/sun/star/ucb/AuthenticationRequest.hpp>
+
namespace comphelper{
-StillReadWriteInteraction::StillReadWriteInteraction(const css::uno::Reference< css::task::XInteractionHandler >& xHandler)
+StillReadWriteInteraction::StillReadWriteInteraction(const css::uno::Reference< css::task::XInteractionHandler >& xHandler,
+ const css::uno::Reference< css::task::XInteractionHandler >& xAuthenticationHandler)
: m_bUsed (false)
, m_bHandledByMySelf (false)
, m_bHandledByInternalHandler(false)
+ , m_xAuthenticationHandler(xAuthenticationHandler)
{
::std::vector< ::ucbhelper::InterceptedInteraction::InterceptedRequest > lInterceptions;
::ucbhelper::InterceptedInteraction::InterceptedRequest aInterceptedRequest;
@@ -47,6 +53,12 @@ StillReadWriteInteraction::StillReadWriteInteraction(const css::uno::Reference<
aInterceptedRequest.MatchExact = false;
lInterceptions.push_back(aInterceptedRequest);
+ aInterceptedRequest.Handle = HANDLE_AUTHENTICATIONREQUESTEXCEPTION;
+ aInterceptedRequest.Request <<= css::ucb::AuthenticationRequest();
+ aInterceptedRequest.Continuation = cppu::UnoType<css::task::XInteractionApprove>::get();
+ aInterceptedRequest.MatchExact = false;
+ lInterceptions.push_back(aInterceptedRequest);
+
setInterceptedHandler(xHandler);
setInterceptions(lInterceptions);
}
@@ -96,6 +108,18 @@ ucbhelper::InterceptedInteraction::EInterceptionState StillReadWriteInteraction:
bAbort = true;
}
break;
+ case HANDLE_AUTHENTICATIONREQUESTEXCEPTION:
+ {
+//use internal authentication dedicated handler and return
+ if (m_xAuthenticationHandler.is())
+ {
+ m_xAuthenticationHandler->handle(xRequest);
+ return ::ucbhelper::InterceptedInteraction::E_INTERCEPTED;
+ }
+ else //simply abort
+ bAbort = true;
+ }
+ break;
}
// handle interaction by ourself
diff --git a/framework/source/loadenv/loadenv.cxx b/framework/source/loadenv/loadenv.cxx
index 8b3ebfe..79e56a0 100644
--- a/framework/source/loadenv/loadenv.cxx
+++ b/framework/source/loadenv/loadenv.cxx
@@ -325,12 +325,16 @@ void LoadEnv::initializeUIDefaults( const css::uno::Reference< css::uno::XCompon
}
}
- if (
- (xInteractionHandler.is() ) &&
- (io_lMediaDescriptor.find(utl::MediaDescriptor::PROP_INTERACTIONHANDLER()) == io_lMediaDescriptor.end())
- )
+ if ( xInteractionHandler.is() )
{
- io_lMediaDescriptor[utl::MediaDescriptor::PROP_INTERACTIONHANDLER()] <<= xInteractionHandler;
+ if( io_lMediaDescriptor.find(utl::MediaDescriptor::PROP_INTERACTIONHANDLER()) == io_lMediaDescriptor.end() )
+ {
+ io_lMediaDescriptor[utl::MediaDescriptor::PROP_INTERACTIONHANDLER()] <<= xInteractionHandler;
+ }
+ if( io_lMediaDescriptor.find(utl::MediaDescriptor::PROP_AUTHENTICATIONHANDLER()) == io_lMediaDescriptor.end() )
+ {
+ io_lMediaDescriptor[utl::MediaDescriptor::PROP_AUTHENTICATIONHANDLER()] <<= xInteractionHandler;
+ }
}
if (io_lMediaDescriptor.find(utl::MediaDescriptor::PROP_MACROEXECUTIONMODE()) == io_lMediaDescriptor.end())
diff --git a/include/comphelper/stillreadwriteinteraction.hxx b/include/comphelper/stillreadwriteinteraction.hxx
index c4efd3a..2ac131c 100644
--- a/include/comphelper/stillreadwriteinteraction.hxx
+++ b/include/comphelper/stillreadwriteinteraction.hxx
@@ -33,19 +33,23 @@ class COMPHELPER_DLLPUBLIC StillReadWriteInteraction : public ::ucbhelper::Inter
private:
static const sal_Int32 HANDLE_INTERACTIVEIOEXCEPTION = 0;
static const sal_Int32 HANDLE_UNSUPPORTEDDATASINKEXCEPTION = 1;
+ static const sal_Int32 HANDLE_AUTHENTICATIONREQUESTEXCEPTION = 2;
bool m_bUsed;
bool m_bHandledByMySelf;
bool m_bHandledByInternalHandler;
public:
- StillReadWriteInteraction(const com::sun::star::uno::Reference< com::sun::star::task::XInteractionHandler >& xHandler);
+ StillReadWriteInteraction(const com::sun::star::uno::Reference< com::sun::star::task::XInteractionHandler >& xHandler,
+ const com::sun::star::uno::Reference< com::sun::star::task::XInteractionHandler >& xAuthenticationHandler);
void resetInterceptions();
void resetErrorStates();
bool wasWriteError() { return (m_bUsed && m_bHandledByMySelf);}
private:
+ ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler > m_xAuthenticationHandler;
+
virtual ucbhelper::InterceptedInteraction::EInterceptionState intercepted(const ::ucbhelper::InterceptedInteraction::InterceptedRequest& aRequest,
const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionRequest >& xRequest) SAL_OVERRIDE;
diff --git a/include/unotools/mediadescriptor.hxx b/include/unotools/mediadescriptor.hxx
index 393aeed..aceecd6 100644
--- a/include/unotools/mediadescriptor.hxx
+++ b/include/unotools/mediadescriptor.hxx
@@ -71,6 +71,7 @@ class UNOTOOLS_DLLPUBLIC MediaDescriptor : public comphelper::SequenceAsHashMap
static const OUString& PROP_HIDDEN();
static const OUString& PROP_INPUTSTREAM();
static const OUString& PROP_INTERACTIONHANDLER();
+ static const OUString& PROP_AUTHENTICATIONHANDLER();
static const OUString& PROP_JUMPMARK();
static const OUString& PROP_MACROEXECUTIONMODE();
static const OUString& PROP_MEDIATYPE();
diff --git a/unotools/source/misc/mediadescriptor.cxx b/unotools/source/misc/mediadescriptor.cxx
index c85194b..f874a97 100644
--- a/unotools/source/misc/mediadescriptor.cxx
+++ b/unotools/source/misc/mediadescriptor.cxx
@@ -153,7 +153,13 @@ const OUString& MediaDescriptor::PROP_INTERACTIONHANDLER()
return sProp;
}
-const OUString& MediaDescriptor::PROP_JUMPMARK()
+const OUString& MediaDescriptor::PROP_AUTHENTICATIONHANDLER()
+{
+ static const OUString sProp("AuthenticationHandler");
+ return sProp;
+}
+
+ const OUString& MediaDescriptor::PROP_JUMPMARK()
{
static const OUString sProp("JumpMark");
return sProp;
@@ -601,7 +607,11 @@ bool MediaDescriptor::impl_openStreamWithURL( const OUString& sURL, bool bLockFi
MediaDescriptor::PROP_INTERACTIONHANDLER(),
css::uno::Reference< css::task::XInteractionHandler >());
- comphelper::StillReadWriteInteraction* pInteraction = new comphelper::StillReadWriteInteraction(xOrgInteraction);
+ css::uno::Reference< css::task::XInteractionHandler > xAuthenticationInteraction = getUnpackedValueOrDefault(
+ MediaDescriptor::PROP_AUTHENTICATIONHANDLER(),
+ css::uno::Reference< css::task::XInteractionHandler >());
+
+ comphelper::StillReadWriteInteraction* pInteraction = new comphelper::StillReadWriteInteraction(xOrgInteraction,xAuthenticationInteraction);
css::uno::Reference< css::task::XInteractionHandler > xInteraction(static_cast< css::task::XInteractionHandler* >(pInteraction), css::uno::UNO_QUERY);
css::uno::Reference< css::ucb::XProgressHandler > xProgress;
@@ -676,7 +686,16 @@ bool MediaDescriptor::impl_openStreamWithURL( const OUString& sURL, bool bLockFi
"unotools.misc",
"caught Exception \"" << e.Message
<< "\" while opening <" << sURL << ">");
- return false;
+ // If the protocol is webdav, then we need to treat the stream as readonly, even if the
+ // operation was requested as read/write explicitly (the WebDAV UCB implementation is monodirectional
+ // read or write not both at the same time).
+ OUString aScheme;
+ css::uno::Reference< css::ucb::XContentIdentifier > xContId(
+ aContent.get().is() ? aContent.get()->getIdentifier() : 0 );
+ if ( xContId.is() )
+ aScheme = xContId->getContentProviderScheme();
+ if(!aScheme.equalsIgnoreAsciiCaseAscii( "http" ) && !aScheme.equalsIgnoreAsciiCaseAscii( "https" ))
+ return false;
}
xStream.clear();
xInputStream.clear();
More information about the Libreoffice-commits
mailing list