1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 /* 3 * This file is part of the LibreOffice project. 4 * 5 * This Source Code Form is subject to the terms of the Mozilla Public 6 * License, v. 2.0. If a copy of the MPL was not distributed with this 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. 8 */ 9 10 #include <comphelper/simplefileaccessinteraction.hxx> 11 #include <com/sun/star/task/XInteractionAbort.hpp> 12 #include <com/sun/star/task/XInteractionApprove.hpp> 13 #include <com/sun/star/ucb/AuthenticationRequest.hpp> 14 #include <com/sun/star/ucb/CertificateValidationRequest.hpp> 15 #include <com/sun/star/ucb/InteractiveIOException.hpp> 16 #include <com/sun/star/ucb/InteractiveNetworkException.hpp> 17 #include <com/sun/star/ucb/UnsupportedDataSinkException.hpp> 18 19 namespace comphelper 20 { 21 /// Will handle com::sun::star::ucb::InteractiveIOException and derived classes 22 const sal_Int32 HANDLE_INTERACTIVEIOEXCEPTION = 0; 23 /// Will handle com::sun::star::ucb::UnsupportedDataSinkException 24 const sal_Int32 HANDLE_UNSUPPORTEDDATASINKEXCEPTION = 1; 25 /// Will handle com::sun::star::ucb::InteractiveNetworkException 26 const sal_Int32 HANDLE_INTERACTIVENETWORKEXCEPTION = 2; 27 /// Will handle com::sun::star::ucb::CertificateValidationRequest 28 const sal_Int32 HANDLE_CERTIFICATEREQUEST = 3; 29 /// Will handle com::sun::star::ucb::AuthenticationRequest 30 const sal_Int32 HANDLE_AUTHENTICATIONREQUEST = 4; 31 SimpleFileAccessInteraction(const css::uno::Reference<css::task::XInteractionHandler> & xHandler)32SimpleFileAccessInteraction::SimpleFileAccessInteraction( 33 const css::uno::Reference<css::task::XInteractionHandler>& xHandler) 34 { 35 std::vector<::ucbhelper::InterceptedInteraction::InterceptedRequest> lInterceptions; 36 ::ucbhelper::InterceptedInteraction::InterceptedRequest aInterceptedRequest; 37 38 //intercept standard IO error exception (local file and WebDAV) 39 aInterceptedRequest.Handle = HANDLE_INTERACTIVEIOEXCEPTION; 40 aInterceptedRequest.Request <<= css::ucb::InteractiveIOException(); 41 aInterceptedRequest.Continuation = cppu::UnoType<css::task::XInteractionAbort>::get(); 42 lInterceptions.push_back(aInterceptedRequest); 43 44 //intercept internal error 45 aInterceptedRequest.Handle = HANDLE_UNSUPPORTEDDATASINKEXCEPTION; 46 aInterceptedRequest.Request <<= css::ucb::UnsupportedDataSinkException(); 47 aInterceptedRequest.Continuation = cppu::UnoType<css::task::XInteractionAbort>::get(); 48 lInterceptions.push_back(aInterceptedRequest); 49 50 //intercept network error exception (WebDAV ucp provider) 51 aInterceptedRequest.Handle = HANDLE_INTERACTIVENETWORKEXCEPTION; 52 aInterceptedRequest.Request <<= css::ucb::InteractiveNetworkException(); 53 aInterceptedRequest.Continuation = cppu::UnoType<css::task::XInteractionAbort>::get(); 54 lInterceptions.push_back(aInterceptedRequest); 55 56 //intercept certificate validation request (WebDAV ucp provider) 57 aInterceptedRequest.Handle = HANDLE_CERTIFICATEREQUEST; 58 aInterceptedRequest.Request <<= css::ucb::CertificateValidationRequest(); 59 aInterceptedRequest.Continuation = cppu::UnoType<css::task::XInteractionAbort>::get(); 60 lInterceptions.push_back(aInterceptedRequest); 61 62 //intercept authentication request (WebDAV ucp provider) 63 aInterceptedRequest.Handle = HANDLE_AUTHENTICATIONREQUEST; 64 aInterceptedRequest.Request <<= css::ucb::AuthenticationRequest(); 65 aInterceptedRequest.Continuation = cppu::UnoType<css::task::XInteractionApprove>::get(); 66 lInterceptions.push_back(aInterceptedRequest); 67 68 setInterceptedHandler(xHandler); 69 setInterceptions(lInterceptions); 70 } 71 ~SimpleFileAccessInteraction()72SimpleFileAccessInteraction::~SimpleFileAccessInteraction() {} 73 intercepted(const::ucbhelper::InterceptedInteraction::InterceptedRequest & aRequest,const css::uno::Reference<css::task::XInteractionRequest> & xRequest)74ucbhelper::InterceptedInteraction::EInterceptionState SimpleFileAccessInteraction::intercepted( 75 const ::ucbhelper::InterceptedInteraction::InterceptedRequest& aRequest, 76 const css::uno::Reference<css::task::XInteractionRequest>& xRequest) 77 { 78 bool bAbort = false; 79 switch (aRequest.Handle) 80 { 81 case HANDLE_UNSUPPORTEDDATASINKEXCEPTION: 82 case HANDLE_INTERACTIVENETWORKEXCEPTION: 83 case HANDLE_INTERACTIVEIOEXCEPTION: 84 { 85 bAbort = true; 86 } 87 break; 88 89 case HANDLE_CERTIFICATEREQUEST: 90 { 91 // use default internal handler. 92 if (m_xInterceptedHandler.is()) 93 { 94 m_xInterceptedHandler->handle(xRequest); 95 return ::ucbhelper::InterceptedInteraction::E_INTERCEPTED; 96 } 97 else 98 bAbort = true; 99 break; 100 } 101 102 case HANDLE_AUTHENTICATIONREQUEST: 103 { 104 // use default internal handler. 105 if (m_xInterceptedHandler.is()) 106 { 107 m_xInterceptedHandler->handle(xRequest); 108 return ::ucbhelper::InterceptedInteraction::E_INTERCEPTED; 109 } 110 else //simply abort 111 bAbort = true; 112 } 113 break; 114 } 115 116 // handle interaction by ourself, by not doing 117 // any selection... 118 if (bAbort) 119 { 120 css::uno::Reference<css::task::XInteractionContinuation> xAbort 121 = ::ucbhelper::InterceptedInteraction::extractContinuation( 122 xRequest->getContinuations(), cppu::UnoType<css::task::XInteractionAbort>::get()); 123 if (!xAbort.is()) 124 return ::ucbhelper::InterceptedInteraction::E_NO_CONTINUATION_FOUND; 125 return ::ucbhelper::InterceptedInteraction::E_INTERCEPTED; 126 } 127 128 return ::ucbhelper::InterceptedInteraction::E_INTERCEPTED; 129 } 130 } 131 132 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 133