[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