1*dde7d3faSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*dde7d3faSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*dde7d3faSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*dde7d3faSAndrew Rist * distributed with this work for additional information 6*dde7d3faSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*dde7d3faSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*dde7d3faSAndrew Rist * "License"); you may not use this file except in compliance 9*dde7d3faSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*dde7d3faSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*dde7d3faSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*dde7d3faSAndrew Rist * software distributed under the License is distributed on an 15*dde7d3faSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*dde7d3faSAndrew Rist * KIND, either express or implied. See the License for the 17*dde7d3faSAndrew Rist * specific language governing permissions and limitations 18*dde7d3faSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*dde7d3faSAndrew Rist *************************************************************/ 21*dde7d3faSAndrew Rist 22*dde7d3faSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_comphelper.hxx" 26cdf0e10cSrcweir #include <comphelper/stillreadwriteinteraction.hxx> 27cdf0e10cSrcweir 28cdf0e10cSrcweir #ifndef __COM_SUN_STAR_UCB_INTERACTIVEIOEXCEPTION_HPP__ 29cdf0e10cSrcweir #include <com/sun/star/ucb/InteractiveIOException.hpp> 30cdf0e10cSrcweir #endif 31cdf0e10cSrcweir 32cdf0e10cSrcweir #ifndef __COM_SUN_STAR_TASK_XINTERACTIONABORT_HPP__ 33cdf0e10cSrcweir #include <com/sun/star/task/XInteractionAbort.hpp> 34cdf0e10cSrcweir #endif 35cdf0e10cSrcweir 36cdf0e10cSrcweir #ifndef __COM_SUN_STAR_UCB_UNSUPPORTEDDATASINKEXCEPTION_HPP__ 37cdf0e10cSrcweir #include <com/sun/star/ucb/UnsupportedDataSinkException.hpp> 38cdf0e10cSrcweir #endif 39cdf0e10cSrcweir 40cdf0e10cSrcweir namespace comphelper{ 41cdf0e10cSrcweir 42cdf0e10cSrcweir namespace css = ::com::sun::star; 43cdf0e10cSrcweir 44cdf0e10cSrcweir StillReadWriteInteraction::StillReadWriteInteraction(const css::uno::Reference< css::task::XInteractionHandler >& xHandler) 45cdf0e10cSrcweir : m_bUsed (sal_False) 46cdf0e10cSrcweir , m_bHandledByMySelf (sal_False) 47cdf0e10cSrcweir , m_bHandledByInternalHandler(sal_False) 48cdf0e10cSrcweir { 49cdf0e10cSrcweir ::std::vector< ::ucbhelper::InterceptedInteraction::InterceptedRequest > lInterceptions; 50cdf0e10cSrcweir ::ucbhelper::InterceptedInteraction::InterceptedRequest aInterceptedRequest; 51cdf0e10cSrcweir 52cdf0e10cSrcweir aInterceptedRequest.Handle = HANDLE_INTERACTIVEIOEXCEPTION; 53cdf0e10cSrcweir aInterceptedRequest.Request <<= css::ucb::InteractiveIOException(); 54cdf0e10cSrcweir aInterceptedRequest.Continuation = ::getCppuType(static_cast< css::uno::Reference< css::task::XInteractionAbort >* >(0)); 55cdf0e10cSrcweir aInterceptedRequest.MatchExact = sal_False; 56cdf0e10cSrcweir lInterceptions.push_back(aInterceptedRequest); 57cdf0e10cSrcweir 58cdf0e10cSrcweir aInterceptedRequest.Handle = HANDLE_UNSUPPORTEDDATASINKEXCEPTION; 59cdf0e10cSrcweir aInterceptedRequest.Request <<= css::ucb::UnsupportedDataSinkException(); 60cdf0e10cSrcweir aInterceptedRequest.Continuation = ::getCppuType(static_cast< css::uno::Reference< css::task::XInteractionAbort >* >(0)); 61cdf0e10cSrcweir aInterceptedRequest.MatchExact = sal_False; 62cdf0e10cSrcweir lInterceptions.push_back(aInterceptedRequest); 63cdf0e10cSrcweir 64cdf0e10cSrcweir setInterceptedHandler(xHandler); 65cdf0e10cSrcweir setInterceptions(lInterceptions); 66cdf0e10cSrcweir } 67cdf0e10cSrcweir 68cdf0e10cSrcweir void StillReadWriteInteraction::resetInterceptions() 69cdf0e10cSrcweir { 70cdf0e10cSrcweir setInterceptions(::std::vector< ::ucbhelper::InterceptedInteraction::InterceptedRequest >()); 71cdf0e10cSrcweir } 72cdf0e10cSrcweir 73cdf0e10cSrcweir void StillReadWriteInteraction::resetErrorStates() 74cdf0e10cSrcweir { 75cdf0e10cSrcweir m_bUsed = sal_False; 76cdf0e10cSrcweir m_bHandledByMySelf = sal_False; 77cdf0e10cSrcweir m_bHandledByInternalHandler = sal_False; 78cdf0e10cSrcweir } 79cdf0e10cSrcweir 80cdf0e10cSrcweir sal_Bool StillReadWriteInteraction::wasWriteError() 81cdf0e10cSrcweir { 82cdf0e10cSrcweir return (m_bUsed && m_bHandledByMySelf); 83cdf0e10cSrcweir } 84cdf0e10cSrcweir 85cdf0e10cSrcweir ucbhelper::InterceptedInteraction::EInterceptionState StillReadWriteInteraction::intercepted(const ::ucbhelper::InterceptedInteraction::InterceptedRequest& aRequest, 86cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionRequest >& xRequest) 87cdf0e10cSrcweir { 88cdf0e10cSrcweir // we are used! 89cdf0e10cSrcweir m_bUsed = sal_True; 90cdf0e10cSrcweir 91cdf0e10cSrcweir // check if its a real interception - might some parameters are not the right ones ... 92cdf0e10cSrcweir sal_Bool bAbort = sal_False; 93cdf0e10cSrcweir switch(aRequest.Handle) 94cdf0e10cSrcweir { 95cdf0e10cSrcweir case HANDLE_INTERACTIVEIOEXCEPTION: 96cdf0e10cSrcweir { 97cdf0e10cSrcweir css::ucb::InteractiveIOException exIO; 98cdf0e10cSrcweir xRequest->getRequest() >>= exIO; 99cdf0e10cSrcweir bAbort = ( 100cdf0e10cSrcweir (exIO.Code == css::ucb::IOErrorCode_ACCESS_DENIED ) 101cdf0e10cSrcweir || (exIO.Code == css::ucb::IOErrorCode_LOCKING_VIOLATION ) 102cdf0e10cSrcweir || (exIO.Code == css::ucb::IOErrorCode_NOT_EXISTING ) 103cdf0e10cSrcweir #ifdef MACOSX 104cdf0e10cSrcweir // this is a workaround for MAC, on this platform if the file is locked 105cdf0e10cSrcweir // the returned error code looks to be wrong 106cdf0e10cSrcweir || (exIO.Code == css::ucb::IOErrorCode_GENERAL ) 107cdf0e10cSrcweir #endif 108cdf0e10cSrcweir ); 109cdf0e10cSrcweir } 110cdf0e10cSrcweir break; 111cdf0e10cSrcweir 112cdf0e10cSrcweir case HANDLE_UNSUPPORTEDDATASINKEXCEPTION: 113cdf0e10cSrcweir { 114cdf0e10cSrcweir bAbort = sal_True; 115cdf0e10cSrcweir } 116cdf0e10cSrcweir break; 117cdf0e10cSrcweir } 118cdf0e10cSrcweir 119cdf0e10cSrcweir // handle interaction by ourself 120cdf0e10cSrcweir if (bAbort) 121cdf0e10cSrcweir { 122cdf0e10cSrcweir m_bHandledByMySelf = sal_True; 123cdf0e10cSrcweir css::uno::Reference< css::task::XInteractionContinuation > xAbort = ::ucbhelper::InterceptedInteraction::extractContinuation( 124cdf0e10cSrcweir xRequest->getContinuations(), 125cdf0e10cSrcweir ::getCppuType(static_cast< css::uno::Reference< css::task::XInteractionAbort >* >(0))); 126cdf0e10cSrcweir if (!xAbort.is()) 127cdf0e10cSrcweir return ::ucbhelper::InterceptedInteraction::E_NO_CONTINUATION_FOUND; 128cdf0e10cSrcweir xAbort->select(); 129cdf0e10cSrcweir return ::ucbhelper::InterceptedInteraction::E_INTERCEPTED; 130cdf0e10cSrcweir } 131cdf0e10cSrcweir 132cdf0e10cSrcweir // Otherwhise use internal handler. 133cdf0e10cSrcweir if (m_xInterceptedHandler.is()) 134cdf0e10cSrcweir { 135cdf0e10cSrcweir m_bHandledByInternalHandler = sal_True; 136cdf0e10cSrcweir m_xInterceptedHandler->handle(xRequest); 137cdf0e10cSrcweir } 138cdf0e10cSrcweir return ::ucbhelper::InterceptedInteraction::E_INTERCEPTED; 139cdf0e10cSrcweir } 140cdf0e10cSrcweir } 141