/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_ucbhelper.hxx" #include //_______________________________________________ // includes //_______________________________________________ // namespace namespace ucbhelper{ namespace css = ::com::sun::star; //_______________________________________________ // definitions /*----------------------------------------------- 17.03.2004 11:00 -----------------------------------------------*/ InterceptedInteraction::InterceptedInteraction() { } /*----------------------------------------------- 17.03.2004 14:55 -----------------------------------------------*/ void InterceptedInteraction::setInterceptedHandler(const css::uno::Reference< css::task::XInteractionHandler >& xInterceptedHandler) { m_xInterceptedHandler = xInterceptedHandler; } /*----------------------------------------------- 17.03.2004 14:55 -----------------------------------------------*/ void InterceptedInteraction::setInterceptions(const ::std::vector< InterceptedRequest >& lInterceptions) { m_lInterceptions = lInterceptions; } /*----------------------------------------------- 18.03.2004 10:10 -----------------------------------------------*/ InterceptedInteraction::EInterceptionState InterceptedInteraction::intercepted( const InterceptedRequest&, const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionRequest >&) { // default behaviour! see impl_interceptRequest() for further informations ... return E_NOT_INTERCEPTED; } /*----------------------------------------------- 18.03.2004 09:46 -----------------------------------------------*/ css::uno::Reference< css::task::XInteractionContinuation > InterceptedInteraction::extractContinuation(const css::uno::Sequence< css::uno::Reference< css::task::XInteractionContinuation > >& lContinuations, const css::uno::Type& aType ) { const css::uno::Reference< css::task::XInteractionContinuation >* pContinuations = lContinuations.getConstArray(); sal_Int32 c = lContinuations.getLength(); sal_Int32 i = 0; for (i=0; i xCheck(pContinuations[i], css::uno::UNO_QUERY); if (xCheck->queryInterface(aType).hasValue()) return pContinuations[i]; } return css::uno::Reference< css::task::XInteractionContinuation >(); } /*----------------------------------------------- 18.03.2004 10:03 -----------------------------------------------*/ void SAL_CALL InterceptedInteraction::handle(const css::uno::Reference< css::task::XInteractionRequest >& xRequest) throw(css::uno::RuntimeException) { impl_handleDefault(xRequest); } /*----------------------------------------------- 18.03.2004 10:02 -----------------------------------------------*/ void InterceptedInteraction::impl_handleDefault(const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionRequest >& xRequest) { EInterceptionState eState = impl_interceptRequest(xRequest); switch(eState) { case E_NOT_INTERCEPTED: { // Non of the intercepted requests match to the given one. // => forward request to the internal wrapped handler - if there is one. if (m_xInterceptedHandler.is()) m_xInterceptedHandler->handle(xRequest); } break; case E_NO_CONTINUATION_FOUND: { // Runtime error! The defined continuation could not be located // inside the set of available containuations of the incoming request. // Whats wrong - the interception list or the request? OSL_ENSURE(sal_False, "InterceptedInteraction::handle()\nCould intercept this interaction request - but cant locate the right continuation!"); } break; case E_INTERCEPTED: break; } } /*----------------------------------------------- 18.03.2004 09:48 -----------------------------------------------*/ InterceptedInteraction::EInterceptionState InterceptedInteraction::impl_interceptRequest(const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionRequest >& xRequest) { css::uno::Any aRequest = xRequest->getRequest(); css::uno::Type aRequestType = aRequest.getValueType(); css::uno::Sequence< css::uno::Reference< css::task::XInteractionContinuation > > lContinuations = xRequest->getContinuations(); // check against the list of static requests sal_Int32 nHandle = 0; ::std::vector< InterceptedRequest >::const_iterator pIt; for ( pIt = m_lInterceptions.begin(); pIt != m_lInterceptions.end() ; ++pIt ) { const InterceptedRequest& rInterception = *pIt; css::uno::Type aInterceptedType = rInterception.Request.getValueType(); // check the request sal_Bool bMatch = sal_False; if (rInterception.MatchExact) bMatch = aInterceptedType.equals(aRequestType); else bMatch = aInterceptedType.isAssignableFrom(aRequestType); // dont change intercepted and request type here -> it will check the wrong direction! // intercepted ... // Call they might existing derived class, so they can handle that by its own. // If its not interested on that (may be its not overwritten and the default implementation // returns E_NOT_INTERCEPTED as default) -> break this loop and search for the right continuation. if (bMatch) { EInterceptionState eState = intercepted(rInterception, xRequest); if (eState == E_NOT_INTERCEPTED) break; return eState; } ++nHandle; } if (pIt != m_lInterceptions.end()) // => can be true only if bMatch=TRUE! { // match -> search required continuation const InterceptedRequest& rInterception = *pIt; css::uno::Reference< css::task::XInteractionContinuation > xContinuation = InterceptedInteraction::extractContinuation(lContinuations, rInterception.Continuation); if (xContinuation.is()) { xContinuation->select(); return E_INTERCEPTED; } // Can be reached only, if the request does not support the given continuation! // => RuntimeError!? return E_NO_CONTINUATION_FOUND; } return E_NOT_INTERCEPTED; } } // namespace ucbhelper