diff options
-rw-r--r-- | comphelper/source/misc/stillreadwriteinteraction.cxx | 26 | ||||
-rw-r--r-- | framework/source/loadenv/loadenv.cxx | 14 | ||||
-rw-r--r-- | include/comphelper/stillreadwriteinteraction.hxx | 6 | ||||
-rw-r--r-- | include/unotools/mediadescriptor.hxx | 1 | ||||
-rw-r--r-- | unotools/source/misc/mediadescriptor.cxx | 25 |
5 files changed, 62 insertions, 10 deletions
diff --git a/comphelper/source/misc/stillreadwriteinteraction.cxx b/comphelper/source/misc/stillreadwriteinteraction.cxx index 1ad24fa2fed2..2dbe73cbf4e8 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 8b3ebfed0890..79e56a0c9166 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 c4efd3aa4f7f..2ac131c0bade 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 393aeeddc206..aceecd6aa0f0 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 c85194b45542..f874a979ccf0 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(); |