LCOV - code coverage report
Current view: top level - uui/source - iahndl.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 9 556 1.6 %
Date: 2014-11-03 Functions: 5 31 16.1 %
Legend: Lines: hit not hit

          Line data    Source code
       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             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <memory>
      21             : 
      22             : #include <com/sun/star/awt/XWindow.hpp>
      23             : #include <com/sun/star/beans/PropertyValue.hpp>
      24             : #include <com/sun/star/configuration/theDefaultProvider.hpp>
      25             : #include <com/sun/star/configuration/backend/MergeRecoveryRequest.hpp>
      26             : #include <com/sun/star/configuration/backend/StratumCreationException.hpp>
      27             : #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
      28             : #include <com/sun/star/document/BrokenPackageRequest.hpp>
      29             : #include <com/sun/star/task/DocumentMacroConfirmationRequest.hpp>
      30             : #include <com/sun/star/java/WrongJavaVersionException.hpp>
      31             : #include <com/sun/star/lang/XInitialization.hpp>
      32             : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
      33             : #include <com/sun/star/script/ModuleSizeExceededRequest.hpp>
      34             : #include <com/sun/star/task/ErrorCodeIOException.hpp>
      35             : #include <com/sun/star/task/ErrorCodeRequest.hpp>
      36             : #include <com/sun/star/task/InteractionHandler.hpp>
      37             : #include <com/sun/star/task/XInteractionAbort.hpp>
      38             : #include <com/sun/star/task/XInteractionApprove.hpp>
      39             : #include <com/sun/star/task/XInteractionAskLater.hpp>
      40             : #include <com/sun/star/task/XInteractionDisapprove.hpp>
      41             : #include <com/sun/star/task/XInteractionHandler2.hpp>
      42             : #include <com/sun/star/task/XInteractionRequest.hpp>
      43             : #include <com/sun/star/task/XInteractionRetry.hpp>
      44             : #include <com/sun/star/ucb/InteractiveAppException.hpp>
      45             : #include <com/sun/star/ucb/InteractiveLockingLockedException.hpp>
      46             : #include <com/sun/star/ucb/InteractiveLockingNotLockedException.hpp>
      47             : #include <com/sun/star/ucb/InteractiveLockingLockExpiredException.hpp>
      48             : #include <com/sun/star/ucb/InteractiveNetworkConnectException.hpp>
      49             : #include <com/sun/star/ucb/InteractiveNetworkOffLineException.hpp>
      50             : #include <com/sun/star/ucb/InteractiveNetworkReadException.hpp>
      51             : #include <com/sun/star/ucb/InteractiveNetworkResolveNameException.hpp>
      52             : #include <com/sun/star/ucb/InteractiveNetworkWriteException.hpp>
      53             : #include <com/sun/star/ucb/InteractiveWrongMediumException.hpp>
      54             : #include <com/sun/star/ucb/NameClashException.hpp>
      55             : #include <com/sun/star/ucb/NameClashResolveRequest.hpp>
      56             : #include <com/sun/star/ucb/UnsupportedNameClashException.hpp>
      57             : #include <com/sun/star/ucb/XInteractionReplaceExistingData.hpp>
      58             : #include <com/sun/star/ucb/XInteractionSupplyName.hpp>
      59             : #include <com/sun/star/xforms/InvalidDataOnSubmitException.hpp>
      60             : #include <com/sun/star/loader/CannotActivateFactoryException.hpp>
      61             : 
      62             : #include <rtl/strbuf.hxx>
      63             : #include <osl/conditn.hxx>
      64             : #include <tools/rcid.h>
      65             : #include <tools/errinf.hxx>
      66             : #include <osl/mutex.hxx>
      67             : #include <osl/thread.hxx>
      68             : #include <tools/diagnose_ex.h>
      69             : #include <comphelper/documentconstants.hxx>
      70             : #include <svtools/sfxecode.hxx>
      71             : #include <vcl/msgbox.hxx>
      72             : #include <vcl/svapp.hxx>
      73             : #include <unotools/configmgr.hxx>
      74             : #include <toolkit/helper/vclunohelper.hxx>
      75             : #include <comphelper/processfactory.hxx>
      76             : #include <comphelper/namedvaluecollection.hxx>
      77             : #include <typelib/typedescription.hxx>
      78             : #include <unotools/confignode.hxx>
      79             : 
      80             : #include "ids.hrc"
      81             : 
      82             : #include "getcontinuations.hxx"
      83             : #include "secmacrowarnings.hxx"
      84             : 
      85             : #include "iahndl.hxx"
      86             : #include "nameclashdlg.hxx"
      87             : 
      88             : #include <boost/scoped_ptr.hpp>
      89             : 
      90             : using ::com::sun::star::uno::Sequence;
      91             : using ::com::sun::star::uno::UNO_QUERY;
      92             : using ::com::sun::star::uno::Reference;
      93             : using ::com::sun::star::task::XInteractionContinuation;
      94             : using ::com::sun::star::task::XInteractionAbort;
      95             : using ::com::sun::star::task::XInteractionApprove;
      96             : using ::com::sun::star::task::XInteractionAskLater;
      97             : using ::com::sun::star::uno::XInterface;
      98             : using ::com::sun::star::lang::XInitialization;
      99             : using ::com::sun::star::uno::UNO_QUERY_THROW;
     100             : using ::com::sun::star::task::InteractionHandler;
     101             : using ::com::sun::star::task::XInteractionHandler2;
     102             : using ::com::sun::star::uno::Exception;
     103             : using ::com::sun::star::uno::Any;
     104             : using ::com::sun::star::task::XInteractionRequest;
     105             : using ::com::sun::star::lang::XMultiServiceFactory;
     106             : 
     107             : using namespace ::com::sun::star;
     108             : 
     109             : namespace {
     110             : 
     111           0 : class HandleData : public osl::Condition
     112             : {
     113             : public:
     114           0 :     HandleData(
     115             :         uno::Reference< task::XInteractionRequest > const & rRequest)
     116             :         : osl::Condition(),
     117             :           m_rRequest(rRequest),
     118           0 :           bHandled( false )
     119             :     {
     120           0 :     }
     121             :     uno::Reference< task::XInteractionRequest > m_rRequest;
     122             :     bool                                        bHandled;
     123             :     beans::Optional< OUString >            m_aResult;
     124             : };
     125             : 
     126             : } /* namespace */
     127             : 
     128        3014 : UUIInteractionHelper::UUIInteractionHelper(
     129             :     uno::Reference< uno::XComponentContext > const & rxContext,
     130             :     uno::Reference< awt::XWindow > const & rxWindowParam,
     131             :     const OUString & rContextParam)
     132             :     :   m_xContext(rxContext),
     133             :         m_xWindowParam(rxWindowParam),
     134        3014 :         m_aContextParam(rContextParam)
     135             : {
     136        3014 : }
     137             : 
     138        3022 : UUIInteractionHelper::UUIInteractionHelper(
     139             :     uno::Reference< uno::XComponentContext > const & rxContext)
     140        3022 :     :  m_xContext(rxContext)
     141             : {
     142        3022 : }
     143             : 
     144        6030 : UUIInteractionHelper::~UUIInteractionHelper()
     145             : {
     146        6030 : }
     147             : 
     148             : long
     149           0 : UUIInteractionHelper::handlerequest(
     150             :     void* pHandleData, void* pInteractionHelper)
     151             : {
     152             :     HandleData* pHND
     153           0 :         = static_cast< HandleData * >(pHandleData);
     154             :     UUIInteractionHelper* pUUI
     155           0 :         = static_cast< UUIInteractionHelper * >(pInteractionHelper);
     156           0 :     bool bDummy = false;
     157           0 :     OUString aDummy;
     158             :     pHND->bHandled
     159           0 :         = pUUI->handleRequest_impl(pHND->m_rRequest, false, bDummy, aDummy);
     160           0 :     pHND->set();
     161           0 :     return 0;
     162             : }
     163             : 
     164             : bool
     165           0 : UUIInteractionHelper::handleRequest(
     166             :     uno::Reference< task::XInteractionRequest > const & rRequest)
     167             : {
     168           0 :     if(
     169             :         // be aware,it is the same type
     170             :         static_cast< oslThreadIdentifier >(
     171           0 :             Application::GetMainThreadIdentifier())
     172           0 :         != osl::Thread::getCurrentIdentifier()
     173           0 :         &&
     174           0 :         GetpApp()
     175             :     ) {
     176             :         // we are not in the main thread, let it handle that stuff
     177           0 :         HandleData aHD(rRequest);
     178           0 :         Link aLink(&aHD,handlerequest);
     179           0 :         Application::PostUserEvent(aLink,this);
     180           0 :         sal_uLong locks = Application::ReleaseSolarMutex();
     181           0 :         aHD.wait();
     182           0 :         Application::AcquireSolarMutex(locks);
     183           0 :         return aHD.bHandled;
     184             :     }
     185             :     else
     186             :     {
     187           0 :         bool bDummy = false;
     188           0 :         OUString aDummy;
     189           0 :         return handleRequest_impl(rRequest, false, bDummy, aDummy);
     190             :     }
     191             : }
     192             : 
     193             : long
     194           0 : UUIInteractionHelper::getstringfromrequest(
     195             :     void* pHandleData,void* pInteractionHelper)
     196             : {
     197           0 :     HandleData* pHND = (HandleData*) pHandleData;
     198           0 :     UUIInteractionHelper* pUUI = (UUIInteractionHelper*) pInteractionHelper;
     199           0 :     pHND->m_aResult = pUUI->getStringFromRequest_impl(pHND->m_rRequest);
     200           0 :     pHND->set();
     201           0 :     return 0;
     202             : }
     203             : 
     204             : beans::Optional< OUString >
     205           0 : UUIInteractionHelper::getStringFromRequest_impl(
     206             :     uno::Reference< task::XInteractionRequest > const & rRequest)
     207             : {
     208           0 :     bool bSuccess = false;
     209           0 :     OUString aMessage;
     210           0 :     handleRequest_impl(rRequest, true, bSuccess, aMessage);
     211             : 
     212             :     OSL_ENSURE(bSuccess ||
     213             :                !isInformationalErrorMessageRequest(
     214             :                    rRequest->getContinuations()),
     215             :                "Interaction request is a candidate for a string representation."
     216             :                "Please implement!");
     217             : 
     218           0 :     return beans::Optional< OUString >(bSuccess, aMessage);
     219             : }
     220             : 
     221             : beans::Optional< OUString >
     222           0 : UUIInteractionHelper::getStringFromRequest(
     223             :     uno::Reference< task::XInteractionRequest > const & rRequest)
     224             : {
     225           0 :     if(
     226             :         // be aware,it is the same type
     227             :         static_cast< oslThreadIdentifier >(
     228           0 :             Application::GetMainThreadIdentifier())
     229           0 :         != osl::Thread::getCurrentIdentifier()
     230           0 :         &&
     231           0 :         GetpApp()
     232             :     ) {
     233             :         // we are not in the main thread, let it handle that stuff
     234           0 :         HandleData aHD(rRequest);
     235           0 :         Link aLink(&aHD,getstringfromrequest);
     236           0 :         Application::PostUserEvent(aLink,this);
     237           0 :         sal_uLong locks = Application::ReleaseSolarMutex();
     238           0 :         aHD.wait();
     239           0 :         Application::AcquireSolarMutex(locks);
     240           0 :         return aHD.m_aResult;
     241             :     }
     242             :     else
     243           0 :         return getStringFromRequest_impl(rRequest);
     244             : }
     245             : 
     246             : OUString
     247           0 : UUIInteractionHelper::replaceMessageWithArguments(
     248             :     const OUString& _aMessage,
     249             :     std::vector< OUString > const & rArguments )
     250             : {
     251           0 :     OUString aMessage = _aMessage;
     252             : 
     253             :     SAL_WARN_IF(rArguments.size() == 0, "uui", "replaceMessageWithArguments: No arguments passed!");
     254           0 :     if (rArguments.size() > 0)
     255           0 :         aMessage = aMessage.replaceAll("$(ARG1)", rArguments[0]);
     256           0 :     if (rArguments.size() > 1)
     257           0 :         aMessage = aMessage.replaceAll("$(ARG2)", rArguments[1]);
     258             : 
     259           0 :     return aMessage;
     260             : }
     261             : 
     262             : bool
     263           0 : UUIInteractionHelper::isInformationalErrorMessageRequest(
     264             :     uno::Sequence< uno::Reference< task::XInteractionContinuation > > const &
     265             :         rContinuations)
     266             : {
     267             :     // Only requests with a single continuation (user has no choice, request
     268             :     // is just informational)
     269           0 :     if (rContinuations.getLength() != 1 )
     270           0 :         return false;
     271             : 
     272             :     // user can only abort or approve, all other continuations are not
     273             :     // considered to be informational.
     274             :     uno::Reference< task::XInteractionApprove > xApprove(
     275           0 :         rContinuations[0], uno::UNO_QUERY);
     276           0 :     if (xApprove.is())
     277           0 :         return true;
     278             : 
     279             :     uno::Reference< task::XInteractionAbort > xAbort(
     280           0 :         rContinuations[0], uno::UNO_QUERY);
     281           0 :     if (xAbort.is())
     282           0 :         return true;
     283             : 
     284           0 :     return false;
     285             : }
     286             : 
     287             : bool
     288           0 : UUIInteractionHelper::tryOtherInteractionHandler(
     289             :     uno::Reference< task::XInteractionRequest > const & rRequest)
     290             : {
     291           0 :     InteractionHandlerDataList dataList;
     292           0 :     getInteractionHandlerList(dataList);
     293             : 
     294           0 :     InteractionHandlerDataList::const_iterator aEnd(dataList.end());
     295           0 :     for (InteractionHandlerDataList::const_iterator aIt(dataList.begin());
     296             :          aIt != aEnd;
     297             :          ++aIt)
     298             :     {
     299           0 :         if ( handleCustomRequest( rRequest, aIt->ServiceName ) )
     300           0 :             return true;
     301             :     }
     302           0 :     return false;
     303             : }
     304             : 
     305             : namespace
     306             : {
     307             : 
     308           0 :     static bool lcl_matchesRequest( const Any& i_rRequest, const OUString& i_rTypeName, const OUString& i_rPropagation )
     309             :     {
     310           0 :         const ::com::sun::star::uno::TypeDescription aTypeDesc( i_rTypeName );
     311           0 :         const typelib_TypeDescription* pTypeDesc = aTypeDesc.get();
     312           0 :         if ( !pTypeDesc || !pTypeDesc->pWeakRef )
     313             :         {
     314             : #if OSL_DEBUG_LEVEL > 0
     315             :             OStringBuffer aMessage;
     316             :             aMessage.append( "no type found for '" );
     317             :             aMessage.append( OUStringToOString( i_rTypeName, RTL_TEXTENCODING_UTF8 ) );
     318             :             aMessage.append( "'" );
     319             :             OSL_FAIL( aMessage.makeStringAndClear().getStr() );
     320             : #endif
     321           0 :             return false;
     322             :         }
     323           0 :         const ::com::sun::star::uno::Type aType( pTypeDesc->pWeakRef );
     324             : 
     325           0 :         const bool bExactMatch = i_rPropagation.equalsAscii( "named-only" );
     326           0 :         if ( bExactMatch )
     327           0 :             return i_rRequest.getValueType().equals( aType );
     328             : 
     329           0 :         return i_rRequest.isExtractableTo( aType );
     330             :     }
     331             : }
     332             : 
     333             : 
     334           0 : bool UUIInteractionHelper::handleCustomRequest( const Reference< XInteractionRequest >& i_rRequest, const OUString& i_rServiceName ) const
     335             : {
     336             :     try
     337             :     {
     338           0 :         Reference< XInteractionHandler2 > xHandler( m_xContext->getServiceManager()->createInstanceWithContext( i_rServiceName, m_xContext ), UNO_QUERY_THROW );
     339             : 
     340           0 :         Reference< XInitialization > xHandlerInit( xHandler, UNO_QUERY );
     341           0 :         if ( xHandlerInit.is() )
     342             :         {
     343           0 :             ::comphelper::NamedValueCollection aInitArgs;
     344           0 :             aInitArgs.put( "Parent", getParentXWindow() );
     345           0 :             xHandlerInit->initialize( aInitArgs.getWrappedPropertyValues() );
     346             :         }
     347             : 
     348           0 :         if ( xHandler->handleInteractionRequest( i_rRequest ) )
     349           0 :             return true;
     350             :     }
     351           0 :     catch( const Exception& )
     352             :     {
     353             :         DBG_UNHANDLED_EXCEPTION();
     354             :     }
     355           0 :     return false;
     356             : }
     357             : 
     358             : 
     359           0 : bool UUIInteractionHelper::handleTypedHandlerImplementations( Reference< XInteractionRequest > const & rRequest )
     360             : {
     361             :     // the request
     362           0 :     const Any aRequest( rRequest->getRequest() );
     363             : 
     364           0 :     const StringHashMap::const_iterator aCacheHitTest = m_aTypedCustomHandlers.find( aRequest.getValueTypeName() );
     365           0 :     if ( aCacheHitTest != m_aTypedCustomHandlers.end() )
     366           0 :         return handleCustomRequest( rRequest, aCacheHitTest->second );
     367             : 
     368             :     // the base registration node for "typed" interaction handlers
     369             :     const ::utl::OConfigurationTreeRoot aConfigRoot( ::utl::OConfigurationTreeRoot::createWithComponentContext(
     370             :         m_xContext,
     371             :         OUString( "/org.openoffice.Interaction/InteractionHandlers" ),
     372             :         -1,
     373             :         ::utl::OConfigurationTreeRoot::CM_READONLY
     374           0 :     ) );
     375             : 
     376             :     // loop through all registered implementations
     377           0 :     const Sequence< OUString > aRegisteredHandlers( aConfigRoot.getNodeNames() );
     378           0 :     const OUString* pHandlerName = aRegisteredHandlers.getConstArray();
     379           0 :     const OUString* pHandlersEnd = aRegisteredHandlers.getConstArray() + aRegisteredHandlers.getLength();
     380           0 :     for ( ; pHandlerName != pHandlersEnd; ++pHandlerName )
     381             :     {
     382           0 :         const ::utl::OConfigurationNode aHandlerNode( aConfigRoot.openNode( *pHandlerName ) );
     383           0 :         const ::utl::OConfigurationNode aTypesNode( aHandlerNode.openNode( "HandledRequestTypes" ) );
     384             : 
     385             :         // loop through all the types which the current handler is registered for
     386           0 :         const Sequence< OUString > aHandledTypes( aTypesNode.getNodeNames() );
     387           0 :         const OUString* pType = aHandledTypes.getConstArray();
     388           0 :         const OUString* pTypesEnd = aHandledTypes.getConstArray() + aHandledTypes.getLength();
     389           0 :         for ( ; pType != pTypesEnd; ++pType )
     390             :         {
     391             :             // the UNO type is the node name
     392           0 :             ::utl::OConfigurationNode aType( aTypesNode.openNode( *pType ) );
     393             :             // and there's a child denoting how the responsibility propagates
     394           0 :             OUString sPropagation;
     395           0 :             OSL_VERIFY( aType.getNodeValue( "Propagation" ) >>= sPropagation );
     396           0 :             if ( lcl_matchesRequest( aRequest, *pType, sPropagation ) )
     397             :             {
     398             :                 // retrieve the service/implementation name of the handler
     399           0 :                 OUString sServiceName;
     400           0 :                 OSL_VERIFY( aHandlerNode.getNodeValue( "ServiceName" ) >>= sServiceName );
     401             :                 // cache the information who feels responsible for requests of this type
     402           0 :                 m_aTypedCustomHandlers[ aRequest.getValueTypeName() ] = sServiceName;
     403             :                 // actually handle the request
     404           0 :                 return handleCustomRequest( rRequest, sServiceName );
     405             :             }
     406           0 :         }
     407           0 :     }
     408             : 
     409           0 :     return false;
     410             : }
     411             : 
     412             : bool
     413           0 : UUIInteractionHelper::handleRequest_impl(
     414             :     uno::Reference< task::XInteractionRequest > const & rRequest,
     415             :     bool bObtainErrorStringOnly,
     416             :     bool & bHasErrorString,
     417             :     OUString & rErrorString)
     418             : {
     419             :     try
     420             :     {
     421           0 :         if (!rRequest.is())
     422           0 :             return false;
     423             : 
     424           0 :         uno::Any aAnyRequest(rRequest->getRequest());
     425             : 
     426           0 :         script::ModuleSizeExceededRequest aModSizeException;
     427           0 :         if (aAnyRequest >>= aModSizeException )
     428             :         {
     429           0 :             ErrCode nErrorCode = ERRCODE_UUI_IO_MODULESIZEEXCEEDED;
     430           0 :             std::vector< OUString > aArguments;
     431             :             uno::Sequence< OUString > sModules
     432           0 :                 = aModSizeException.Names;
     433           0 :             if ( sModules.getLength() )
     434             :             {
     435           0 :                 OUString aName;
     436           0 :                 for ( sal_Int32 index=0; index< sModules.getLength(); ++index )
     437             :                 {
     438           0 :                     if ( index )
     439           0 :                         aName = aName + OUString( ',' ) + sModules[index];
     440             :                     else
     441           0 :                         aName = sModules[index]; // 1st name
     442             :                 }
     443           0 :                 aArguments.push_back( aName );
     444             :             }
     445             :             handleErrorHandlerRequest( task::InteractionClassification_WARNING,
     446             :                                        nErrorCode,
     447             :                                        aArguments,
     448           0 :                                        rRequest->getContinuations(),
     449             :                                        bObtainErrorStringOnly,
     450             :                                        bHasErrorString,
     451           0 :                                        rErrorString);
     452           0 :             return true;
     453             :         }
     454             : 
     455           0 :         ucb::NameClashException aNCException;
     456           0 :         if (aAnyRequest >>= aNCException)
     457             :         {
     458           0 :             ErrCode nErrorCode = ERRCODE_UUI_IO_TARGETALREADYEXISTS;
     459           0 :             std::vector< OUString > aArguments;
     460             : 
     461           0 :             if( !aNCException.Name.isEmpty() )
     462             :             {
     463           0 :                 nErrorCode = ERRCODE_UUI_IO_ALREADYEXISTS;
     464           0 :                 aArguments.push_back( aNCException.Name );
     465             :             }
     466             : 
     467             :             handleErrorHandlerRequest( aNCException.Classification,
     468             :                                        nErrorCode,
     469             :                                        aArguments,
     470           0 :                                        rRequest->getContinuations(),
     471             :                                        bObtainErrorStringOnly,
     472             :                                        bHasErrorString,
     473           0 :                                        rErrorString);
     474           0 :             return true;
     475             :         }
     476             : 
     477           0 :         ucb::UnsupportedNameClashException aUORequest;
     478           0 :         if (aAnyRequest >>= aUORequest)
     479             :         {
     480           0 :             ErrCode nErrorCode = ERRCODE_UUI_IO_UNSUPPORTEDOVERWRITE;
     481           0 :             std::vector< OUString > aArguments;
     482             : 
     483           0 :             uno::Reference< task::XInteractionApprove > xApprove;
     484           0 :             uno::Reference< task::XInteractionDisapprove > xDisapprove;
     485             :             getContinuations(
     486           0 :                 rRequest->getContinuations(), &xApprove, &xDisapprove);
     487             : 
     488           0 :             if ( xApprove.is() && xDisapprove.is() )
     489             :             {
     490             :                 handleErrorHandlerRequest( task::InteractionClassification_QUERY,
     491             :                                            nErrorCode,
     492             :                                            aArguments,
     493           0 :                                            rRequest->getContinuations(),
     494             :                                            bObtainErrorStringOnly,
     495             :                                            bHasErrorString,
     496           0 :                                            rErrorString);
     497             :             }
     498           0 :             return true;
     499             :         }
     500             : 
     501           0 :         if ( handleInteractiveIOException( rRequest,
     502             :                                            bObtainErrorStringOnly,
     503             :                                            bHasErrorString,
     504           0 :                                            rErrorString ) )
     505           0 :             return true;
     506             : 
     507           0 :         ucb::InteractiveAppException aAppException;
     508           0 :         if (aAnyRequest >>= aAppException)
     509             :         {
     510           0 :             std::vector< OUString > aArguments;
     511             :             handleErrorHandlerRequest( aAppException.Classification,
     512             :                                        aAppException.Code,
     513             :                                        aArguments,
     514           0 :                                        rRequest->getContinuations(),
     515             :                                        bObtainErrorStringOnly,
     516             :                                        bHasErrorString,
     517           0 :                                        rErrorString);
     518           0 :             return true;
     519             :         }
     520             : 
     521           0 :         ucb::InteractiveNetworkException aNetworkException;
     522           0 :         if (aAnyRequest >>= aNetworkException)
     523             :         {
     524             :             ErrCode nErrorCode;
     525           0 :             std::vector< OUString > aArguments;
     526           0 :             ucb::InteractiveNetworkOffLineException aOffLineException;
     527           0 :             ucb::InteractiveNetworkResolveNameException aResolveNameException;
     528           0 :             ucb::InteractiveNetworkConnectException aConnectException;
     529           0 :             ucb::InteractiveNetworkReadException aReadException;
     530           0 :             ucb::InteractiveNetworkWriteException aWriteException;
     531           0 :             if (aAnyRequest >>= aOffLineException)
     532           0 :                 nErrorCode = ERRCODE_INET_OFFLINE;
     533           0 :             else if (aAnyRequest >>= aResolveNameException)
     534             :             {
     535           0 :                 nErrorCode = ERRCODE_INET_NAME_RESOLVE;
     536           0 :                 aArguments.push_back(aResolveNameException.Server);
     537             :             }
     538           0 :             else if (aAnyRequest >>= aConnectException)
     539             :             {
     540           0 :                 nErrorCode = ERRCODE_INET_CONNECT;
     541           0 :                 aArguments.push_back(aConnectException.Server);
     542             :             }
     543           0 :             else if (aAnyRequest >>= aReadException)
     544             :             {
     545           0 :                 nErrorCode = ERRCODE_INET_READ;
     546           0 :                 aArguments.push_back(aReadException.Diagnostic);
     547             :             }
     548           0 :             else if (aAnyRequest >>= aWriteException)
     549             :             {
     550           0 :                 nErrorCode = ERRCODE_INET_WRITE;
     551           0 :                 aArguments.push_back(aWriteException.Diagnostic);
     552             :             }
     553             :             else
     554           0 :                 nErrorCode = ERRCODE_INET_GENERAL;
     555             : 
     556             :             handleErrorHandlerRequest(aNetworkException.Classification,
     557             :                                       nErrorCode,
     558             :                                       aArguments,
     559           0 :                                       rRequest->getContinuations(),
     560             :                                       bObtainErrorStringOnly,
     561             :                                       bHasErrorString,
     562           0 :                                       rErrorString);
     563           0 :             return true;
     564             :         }
     565             : 
     566           0 :         ucb::InteractiveWrongMediumException aWrongMediumException;
     567           0 :         if (aAnyRequest >>= aWrongMediumException)
     568             :         {
     569           0 :             sal_Int32 nMedium = 0;
     570           0 :             aWrongMediumException.Medium >>= nMedium;
     571           0 :             std::vector< OUString > aArguments;
     572           0 :             aArguments.push_back(OUString::number(nMedium + 1));
     573             :             handleErrorHandlerRequest(aWrongMediumException.Classification,
     574             :                                       ERRCODE_UUI_WRONGMEDIUM,
     575             :                                       aArguments,
     576           0 :                                       rRequest->getContinuations(),
     577             :                                       bObtainErrorStringOnly,
     578             :                                       bHasErrorString,
     579           0 :                                       rErrorString);
     580           0 :             return true;
     581             :         }
     582             : 
     583           0 :         java::WrongJavaVersionException aWrongJavaVersionException;
     584           0 :         if (aAnyRequest >>= aWrongJavaVersionException)
     585             :         {
     586             :             ErrCode nErrorCode;
     587           0 :             std::vector< OUString > aArguments;
     588           0 :             if (aWrongJavaVersionException.DetectedVersion.isEmpty())
     589           0 :                 if (aWrongJavaVersionException.LowestSupportedVersion.isEmpty())
     590           0 :                     nErrorCode = ERRCODE_UUI_WRONGJAVA;
     591             :                 else
     592             :                 {
     593           0 :                     nErrorCode = ERRCODE_UUI_WRONGJAVA_MIN;
     594           0 :                     aArguments.push_back(aWrongJavaVersionException.LowestSupportedVersion);
     595             :                 }
     596           0 :             else if (aWrongJavaVersionException.LowestSupportedVersion.isEmpty())
     597             :             {
     598           0 :                 nErrorCode = ERRCODE_UUI_WRONGJAVA_VERSION;
     599           0 :                 aArguments.push_back(aWrongJavaVersionException.DetectedVersion);
     600             :             }
     601             :             else
     602             :             {
     603           0 :                 nErrorCode = ERRCODE_UUI_WRONGJAVA_VERSION_MIN;
     604           0 :                 aArguments.reserve(2);
     605           0 :                 aArguments.push_back(aWrongJavaVersionException.DetectedVersion);
     606           0 :                 aArguments.push_back(aWrongJavaVersionException.LowestSupportedVersion);
     607             :             }
     608             :             handleErrorHandlerRequest(task::InteractionClassification_ERROR,
     609             :                                       nErrorCode,
     610             :                                       aArguments,
     611           0 :                                       rRequest->getContinuations(),
     612             :                                       bObtainErrorStringOnly,
     613             :                                       bHasErrorString,
     614           0 :                                       rErrorString);
     615           0 :             return true;
     616             :         }
     617             : 
     618           0 :         configuration::backend::MergeRecoveryRequest aMergeRecoveryRequest;
     619           0 :         if (aAnyRequest >>= aMergeRecoveryRequest)
     620             :         {
     621             :             ErrCode nErrorCode = aMergeRecoveryRequest.IsRemovalRequest
     622             :                 ? ERRCODE_UUI_CONFIGURATION_BROKENDATA_WITHREMOVE
     623           0 :                 : ERRCODE_UUI_CONFIGURATION_BROKENDATA_NOREMOVE;
     624             : 
     625           0 :             std::vector< OUString > aArguments;
     626           0 :             aArguments.push_back(aMergeRecoveryRequest.ErrorLayerId);
     627             : 
     628             :             handleErrorHandlerRequest(task::InteractionClassification_ERROR,
     629             :                                       nErrorCode,
     630             :                                       aArguments,
     631           0 :                                       rRequest->getContinuations(),
     632             :                                       bObtainErrorStringOnly,
     633             :                                       bHasErrorString,
     634           0 :                                       rErrorString);
     635           0 :             return true;
     636             :         }
     637             : 
     638             :         configuration::backend::StratumCreationException
     639           0 :             aStratumCreationException;
     640             : 
     641           0 :         if (aAnyRequest >>= aStratumCreationException)
     642             :         {
     643           0 :             const ErrCode nErrorCode = ERRCODE_UUI_CONFIGURATION_BACKENDMISSING;
     644             : 
     645           0 :             OUString aStratum = aStratumCreationException.StratumData;
     646           0 :             if (aStratum.isEmpty())
     647           0 :                 aStratum = aStratumCreationException.StratumService;
     648             : 
     649           0 :             std::vector< OUString > aArguments;
     650           0 :             aArguments.push_back(aStratum);
     651             : 
     652             :             handleErrorHandlerRequest(task::InteractionClassification_ERROR,
     653             :                                       nErrorCode,
     654             :                                       aArguments,
     655           0 :                                       rRequest->getContinuations(),
     656             :                                       bObtainErrorStringOnly,
     657             :                                       bHasErrorString,
     658           0 :                                       rErrorString);
     659           0 :             return true;
     660             :         }
     661             : 
     662           0 :         xforms::InvalidDataOnSubmitException aInvalidDataOnSubmitException;
     663           0 :         if (aAnyRequest >>= aInvalidDataOnSubmitException)
     664             :         {
     665             :             const ErrCode nErrorCode =
     666           0 :                 ERRCODE_UUI_INVALID_XFORMS_SUBMISSION_DATA;
     667             : 
     668           0 :             std::vector< OUString > aArguments;
     669             : 
     670             :             handleErrorHandlerRequest(task::InteractionClassification_QUERY,
     671             :                                       nErrorCode,
     672             :                                       aArguments,
     673           0 :                                       rRequest->getContinuations(),
     674             :                                       bObtainErrorStringOnly,
     675             :                                       bHasErrorString,
     676           0 :                                       rErrorString);
     677           0 :             return true;
     678             :         }
     679             : 
     680           0 :         ucb::InteractiveLockingLockedException aLLException;
     681           0 :         if (aAnyRequest >>= aLLException)
     682             :         {
     683             :             ErrCode nErrorCode = aLLException.SelfOwned
     684           0 :                 ? ERRCODE_UUI_LOCKING_LOCKED_SELF : ERRCODE_UUI_LOCKING_LOCKED;
     685           0 :             std::vector< OUString > aArguments;
     686           0 :             aArguments.push_back( aLLException.Url );
     687             : 
     688             :             handleErrorHandlerRequest( aLLException.Classification,
     689             :                                        nErrorCode,
     690             :                                        aArguments,
     691           0 :                                        rRequest->getContinuations(),
     692             :                                        bObtainErrorStringOnly,
     693             :                                        bHasErrorString,
     694           0 :                                        rErrorString );
     695           0 :             return true;
     696             :         }
     697             : 
     698           0 :         ucb::InteractiveLockingNotLockedException aLNLException;
     699           0 :         if (aAnyRequest >>= aLNLException)
     700             :         {
     701           0 :             ErrCode nErrorCode = ERRCODE_UUI_LOCKING_NOT_LOCKED;
     702           0 :             std::vector< OUString > aArguments;
     703           0 :             aArguments.push_back( aLNLException.Url );
     704             : 
     705             :             handleErrorHandlerRequest( aLNLException.Classification,
     706             :                                        nErrorCode,
     707             :                                        aArguments,
     708           0 :                                        rRequest->getContinuations(),
     709             :                                        bObtainErrorStringOnly,
     710             :                                        bHasErrorString,
     711           0 :                                        rErrorString );
     712           0 :             return true;
     713             :         }
     714             : 
     715           0 :         ucb::InteractiveLockingLockExpiredException aLLEException;
     716           0 :         if (aAnyRequest >>= aLLEException)
     717             :         {
     718           0 :             ErrCode nErrorCode = ERRCODE_UUI_LOCKING_LOCK_EXPIRED;
     719           0 :             std::vector< OUString > aArguments;
     720           0 :             aArguments.push_back( aLLEException.Url );
     721             : 
     722             :             handleErrorHandlerRequest( aLLEException.Classification,
     723             :                                        nErrorCode,
     724             :                                        aArguments,
     725           0 :                                        rRequest->getContinuations(),
     726             :                                        bObtainErrorStringOnly,
     727             :                                        bHasErrorString,
     728           0 :                                        rErrorString );
     729           0 :             return true;
     730             :         }
     731             : 
     732           0 :         document::BrokenPackageRequest aBrokenPackageRequest;
     733           0 :         if (aAnyRequest >>= aBrokenPackageRequest)
     734             :         {
     735           0 :             std::vector< OUString > aArguments;
     736             : 
     737           0 :             if( !aBrokenPackageRequest.aName.isEmpty() )
     738           0 :                 aArguments.push_back( aBrokenPackageRequest.aName );
     739             : 
     740             :             handleBrokenPackageRequest( aArguments,
     741           0 :                                         rRequest->getContinuations(),
     742             :                                         bObtainErrorStringOnly,
     743             :                                         bHasErrorString,
     744           0 :                                         rErrorString );
     745           0 :             return true;
     746             :         }
     747             : 
     748           0 :         task::ErrorCodeRequest aErrorCodeRequest;
     749           0 :         if (aAnyRequest >>= aErrorCodeRequest)
     750             :         {
     751             :             // Sucky special handling for xlsx macro filter warning
     752           0 :             if ( (sal_uInt32)ERRCODE_SFX_VBASIC_CANTSAVE_STORAGE == (sal_uInt32)aErrorCodeRequest.ErrCode)
     753             :             {
     754           0 :                 std::vector< OUString > aArguments;
     755             :                 handleErrorHandlerRequest( task::InteractionClassification_WARNING,
     756             :                                        ERRCODE_UUI_IO_WARN_CANTSAVE_MACROS,
     757             :                                        aArguments,
     758           0 :                                        rRequest->getContinuations(),
     759             :                                        bObtainErrorStringOnly,
     760             :                                        bHasErrorString,
     761           0 :                                        rErrorString);
     762             :             }
     763             :             else
     764             :             {
     765             :                 handleGenericErrorRequest( aErrorCodeRequest.ErrCode,
     766           0 :                                        rRequest->getContinuations(),
     767             :                                        bObtainErrorStringOnly,
     768             :                                        bHasErrorString,
     769           0 :                                        rErrorString);
     770             :             }
     771           0 :             return true;
     772             :         }
     773             : 
     774           0 :         task::ErrorCodeIOException aErrorCodeIOException;
     775           0 :         if (aAnyRequest >>= aErrorCodeIOException)
     776             :         {
     777             :             handleGenericErrorRequest( aErrorCodeIOException.ErrCode,
     778           0 :                                        rRequest->getContinuations(),
     779             :                                        bObtainErrorStringOnly,
     780             :                                        bHasErrorString,
     781           0 :                                        rErrorString);
     782           0 :             return true;
     783             :         }
     784             : 
     785           0 :         loader::CannotActivateFactoryException aCannotActivateFactoryException;
     786           0 :         if (aAnyRequest >>= aCannotActivateFactoryException)
     787             :         {
     788           0 :             ErrCode nErrorCode = ERRCODE_UUI_CANNOT_ACTIVATE_FACTORY;
     789           0 :             std::vector< OUString > aArguments;
     790           0 :             aArguments.push_back( aCannotActivateFactoryException.Message );
     791             : 
     792             :             handleErrorHandlerRequest( task::InteractionClassification_ERROR,
     793             :                                        nErrorCode,
     794             :                                        aArguments,
     795           0 :                                        rRequest->getContinuations(),
     796             :                                        bObtainErrorStringOnly,
     797             :                                        bHasErrorString,
     798           0 :                                        rErrorString );
     799           0 :             return true;
     800             :         }
     801             : 
     802             : 
     803             : 
     804             :         // Handle requests which do not have a plain string representation.
     805             : 
     806           0 :         if (!bObtainErrorStringOnly)
     807             :         {
     808           0 :             if ( handleAuthenticationRequest( rRequest ) )
     809           0 :                 return true;
     810             : 
     811           0 :             if ( handleCertificateValidationRequest( rRequest ) )
     812           0 :                 return true;
     813             : 
     814           0 :             ucb::NameClashResolveRequest aNameClashResolveRequest;
     815           0 :             if (aAnyRequest >>= aNameClashResolveRequest)
     816             :             {
     817             :                 handleNameClashResolveRequest(aNameClashResolveRequest,
     818           0 :                                               rRequest->getContinuations());
     819           0 :                 return true;
     820             :             }
     821             : 
     822           0 :             if ( handleMasterPasswordRequest( rRequest ) )
     823           0 :                 return true;
     824             : 
     825           0 :             if ( handlePasswordRequest( rRequest ) )
     826           0 :                 return true;
     827             : 
     828           0 :             if ( handleNoSuchFilterRequest( rRequest ) )
     829           0 :                 return true;
     830             : 
     831           0 :             if ( handleFilterOptionsRequest( rRequest ) )
     832           0 :                 return true;
     833             : 
     834           0 :             if ( handleLockedDocumentRequest( rRequest ) )
     835           0 :                 return true;
     836             : 
     837           0 :             if ( handleChangedByOthersRequest( rRequest ) )
     838           0 :                 return true;
     839             : 
     840           0 :             if ( handleLockFileIgnoreRequest( rRequest ) )
     841           0 :                 return true;
     842             : 
     843           0 :             task::DocumentMacroConfirmationRequest aMacroConfirmRequest;
     844           0 :             if (aAnyRequest >>= aMacroConfirmRequest)
     845             :             {
     846             :                 handleMacroConfirmRequest(
     847             :                     aMacroConfirmRequest.DocumentURL,
     848             :                     aMacroConfirmRequest.DocumentStorage,
     849           0 :                     !aMacroConfirmRequest.DocumentVersion.isEmpty() ? aMacroConfirmRequest.DocumentVersion : ODFVER_012_TEXT,
     850             :                     aMacroConfirmRequest.DocumentSignatureInformation,
     851           0 :                     rRequest->getContinuations());
     852           0 :                 return true;
     853             :             }
     854             : 
     855             :             // Last chance: interaction handlers registered in the configuration
     856             : 
     857             : 
     858             :             // typed InteractionHandlers (ooo.Interactions)
     859           0 :             if ( handleTypedHandlerImplementations( rRequest ) )
     860           0 :                 return true;
     861             : 
     862             :             // legacy configuration (ooo.ucb.InteractionHandlers)
     863           0 :             if (tryOtherInteractionHandler( rRequest ))
     864           0 :                 return true;
     865             :         }
     866             : 
     867             :         // Not handled.
     868           0 :         return false;
     869             :     }
     870           0 :     catch (std::bad_alloc const &)
     871             :     {
     872           0 :         throw uno::RuntimeException("out of memory");
     873             :     }
     874           0 :     catch( const uno::RuntimeException& )
     875             :     {
     876           0 :         throw;  // allowed to leave here
     877             :     }
     878           0 :     catch( const uno::Exception& )
     879             :     {
     880             :         DBG_UNHANDLED_EXCEPTION();
     881             :     }
     882           0 :     return false;
     883             : }
     884             : 
     885             : void
     886           0 : UUIInteractionHelper::getInteractionHandlerList(
     887             :     InteractionHandlerDataList &rdataList)
     888             : {
     889             :     try
     890             :     {
     891             :         uno::Reference< lang::XMultiServiceFactory > xConfigProv =
     892           0 :             configuration::theDefaultProvider::get( m_xContext );
     893             : 
     894           0 :         OUStringBuffer aFullPath;
     895             :         aFullPath.appendAscii(
     896           0 :             "/org.openoffice.ucb.InteractionHandler/InteractionHandlers" );
     897             : 
     898           0 :         uno::Sequence< uno::Any > aArguments( 1 );
     899           0 :         beans::PropertyValue      aProperty;
     900           0 :         aProperty.Name = "nodepath";
     901           0 :         aProperty.Value <<= aFullPath.makeStringAndClear();
     902           0 :         aArguments[ 0 ] <<= aProperty;
     903             : 
     904             :         uno::Reference< uno::XInterface > xInterface(
     905           0 :                 xConfigProv->createInstanceWithArguments(
     906           0 :                     "com.sun.star.configuration.ConfigurationAccess" , aArguments ) );
     907             : 
     908           0 :         if ( !xInterface.is() )
     909           0 :             throw uno::RuntimeException("unable to instanciate config access");
     910             : 
     911             :         uno::Reference< container::XNameAccess > xNameAccess(
     912           0 :             xInterface, uno::UNO_QUERY );
     913           0 :         if ( !xNameAccess.is() )
     914             :             throw uno::RuntimeException(
     915           0 :                     "config access does not implement XNameAccess");
     916             : 
     917           0 :         uno::Sequence< OUString > aElems = xNameAccess->getElementNames();
     918           0 :         const OUString* pElems = aElems.getConstArray();
     919           0 :         sal_Int32 nCount = aElems.getLength();
     920             : 
     921           0 :         if ( nCount > 0 )
     922             :         {
     923             :             uno::Reference< container::XHierarchicalNameAccess >
     924           0 :                                 xHierNameAccess( xInterface, uno::UNO_QUERY );
     925             : 
     926           0 :             if ( !xHierNameAccess.is() )
     927             :                 throw uno::RuntimeException(
     928           0 :                     "config access does not implement XHierarchicalNameAccess");
     929             : 
     930             :             // Iterate over children.
     931           0 :             for ( sal_Int32 n = 0; n < nCount; ++n )
     932             :             {
     933           0 :                 OUStringBuffer aElemBuffer;
     934           0 :                 aElemBuffer.appendAscii( "['" );
     935           0 :                 aElemBuffer.append( pElems[ n ] );
     936             : 
     937             :                 try
     938             :                 {
     939           0 :                     InteractionHandlerData aInfo;
     940             : 
     941             :                     // Obtain service name.
     942           0 :                     OUStringBuffer aKeyBuffer = aElemBuffer;
     943           0 :                     aKeyBuffer.appendAscii( "']/ServiceName" );
     944             : 
     945           0 :                     OUString aValue;
     946           0 :                     if ( !( xHierNameAccess->getByHierarchicalName(
     947           0 :                                 aKeyBuffer.makeStringAndClear() ) >>= aValue ) )
     948             :                     {
     949             :                         OSL_FAIL( "GetInteractionHandlerList - "
     950             :                                     "Error getting item value!" );
     951           0 :                         continue;
     952             :                     }
     953             : 
     954           0 :                     aInfo.ServiceName = aValue;
     955             : 
     956             :                     // Append info to list.
     957           0 :                     rdataList.push_back( aInfo );
     958             :                 }
     959           0 :                 catch ( container::NoSuchElementException& )
     960             :                 {
     961             :                     // getByHierarchicalName
     962             : 
     963             :                     OSL_FAIL( "GetInteractionHandlerList - "
     964             :                                 "caught NoSuchElementException!" );
     965             :                 }
     966           0 :             }
     967           0 :         }
     968             :     }
     969           0 :     catch ( uno::RuntimeException const & )
     970             :     {
     971           0 :         throw;
     972             :     }
     973           0 :     catch ( uno::Exception const & )
     974             :     {
     975             :         OSL_FAIL( "GetInteractionHandlerList - Caught Exception!" );
     976             :     }
     977           0 : }
     978             : 
     979             : vcl::Window *
     980           0 : UUIInteractionHelper::getParentProperty()
     981             : {
     982           0 :     uno::Reference< awt::XWindow > xWindow = getParentXWindow();
     983           0 :     if ( xWindow.is() )
     984           0 :         return VCLUnoHelper::GetWindow(xWindow);
     985             : 
     986           0 :     return 0;
     987             : }
     988             : 
     989             : uno::Reference< awt::XWindow>
     990           0 : UUIInteractionHelper::getParentXWindow() const
     991             : {
     992           0 :     return m_xWindowParam;
     993             : }
     994             : 
     995             : OUString
     996           0 : UUIInteractionHelper::getContextProperty()
     997             : {
     998           0 :     return m_aContextParam;
     999             : }
    1000             : 
    1001             : uno::Reference< task::XInteractionHandler2 >
    1002           0 : UUIInteractionHelper::getInteractionHandler()
    1003             : {
    1004             :     return InteractionHandler::createWithParentAndContext(
    1005             :         m_xContext, m_xWindowParam,
    1006           0 :         m_aContextParam);
    1007             : }
    1008             : 
    1009             : namespace {
    1010             : 
    1011             : sal_uInt16
    1012           0 : executeMessageBox(
    1013             :     vcl::Window * pParent,
    1014             :     OUString const & rTitle,
    1015             :     OUString const & rMessage,
    1016             :     WinBits nButtonMask )
    1017             : {
    1018           0 :     SolarMutexGuard aGuard;
    1019             : 
    1020           0 :     MessBox xBox( pParent, nButtonMask, rTitle, rMessage );
    1021             : 
    1022           0 :     sal_uInt16 aResult = xBox.Execute();
    1023           0 :     switch( aResult )
    1024             :     {
    1025             :     case RET_OK:
    1026           0 :         aResult = ERRCODE_BUTTON_OK;
    1027           0 :         break;
    1028             :     case RET_CANCEL:
    1029           0 :         aResult = ERRCODE_BUTTON_CANCEL;
    1030           0 :         break;
    1031             :     case RET_YES:
    1032           0 :         aResult = ERRCODE_BUTTON_YES;
    1033           0 :         break;
    1034             :     case RET_NO:
    1035           0 :         aResult = ERRCODE_BUTTON_NO;
    1036           0 :         break;
    1037             :     case RET_RETRY:
    1038           0 :         aResult = ERRCODE_BUTTON_RETRY;
    1039           0 :         break;
    1040             :     }
    1041             : 
    1042           0 :     return aResult;
    1043             : }
    1044             : 
    1045           0 : NameClashResolveDialogResult executeSimpleNameClashResolveDialog( vcl::Window *pParent,
    1046             :                                                                   OUString const & rTargetFolderURL,
    1047             :                                                                   OUString const & rClashingName,
    1048             :                                                                   OUString & rProposedNewName,
    1049             :                                                                   bool bAllowOverwrite )
    1050             : {
    1051           0 :     boost::scoped_ptr< ResMgr > xManager( ResMgr::CreateResMgr( "uui" ) );
    1052           0 :     if ( !xManager.get() )
    1053           0 :         return ABORT;
    1054             : 
    1055             :     NameClashDialog aDialog( pParent, xManager.get(), rTargetFolderURL,
    1056           0 :                              rClashingName, rProposedNewName, bAllowOverwrite );
    1057             : 
    1058           0 :     NameClashResolveDialogResult eResult = (NameClashResolveDialogResult) aDialog.Execute();
    1059           0 :     rProposedNewName = aDialog.getNewName();
    1060           0 :     return eResult;
    1061             : }
    1062             : 
    1063             : } // namespace
    1064             : 
    1065             : void
    1066           0 : UUIInteractionHelper::handleNameClashResolveRequest(
    1067             :     ucb::NameClashResolveRequest const & rRequest,
    1068             :     uno::Sequence< uno::Reference<
    1069             :         task::XInteractionContinuation > > const & rContinuations)
    1070             : {
    1071             :     OSL_ENSURE(!rRequest.TargetFolderURL.isEmpty(),
    1072             :         "NameClashResolveRequest must not contain empty TargetFolderURL" );
    1073             : 
    1074             :     OSL_ENSURE(!rRequest.ClashingName.isEmpty(),
    1075             :         "NameClashResolveRequest must not contain empty ClashingName" );
    1076             : 
    1077           0 :     uno::Reference< task::XInteractionAbort > xAbort;
    1078           0 :     uno::Reference< ucb::XInteractionSupplyName > xSupplyName;
    1079           0 :     uno::Reference< ucb::XInteractionReplaceExistingData > xReplaceExistingData;
    1080             :     getContinuations(
    1081           0 :         rContinuations, &xAbort, &xSupplyName, &xReplaceExistingData);
    1082             : 
    1083             :     OSL_ENSURE( xAbort.is(),
    1084             :         "NameClashResolveRequest must contain Abort continuation" );
    1085             : 
    1086             :     OSL_ENSURE( xSupplyName.is(),
    1087             :         "NameClashResolveRequest must contain SupplyName continuation" );
    1088             : 
    1089           0 :     NameClashResolveDialogResult eResult = ABORT;
    1090           0 :     OUString aProposedNewName( rRequest.ProposedNewName );
    1091             : 
    1092             :     eResult = executeSimpleNameClashResolveDialog( getParentProperty(),
    1093             :                     rRequest.TargetFolderURL,
    1094             :                     rRequest.ClashingName,
    1095             :                     aProposedNewName,
    1096           0 :                     xReplaceExistingData.is() );
    1097             : 
    1098           0 :     switch ( eResult )
    1099             :     {
    1100             :     case ABORT:
    1101           0 :         xAbort->select();
    1102           0 :         break;
    1103             : 
    1104             :     case RENAME:
    1105           0 :         xSupplyName->setName( aProposedNewName );
    1106           0 :         xSupplyName->select();
    1107           0 :         break;
    1108             : 
    1109             :     case OVERWRITE:
    1110             :         OSL_ENSURE(
    1111             :             xReplaceExistingData.is(),
    1112             :             "Invalid NameClashResolveDialogResult: OVERWRITE - "
    1113             :             "No ReplaceExistingData continuation available!" );
    1114           0 :         xReplaceExistingData->select();
    1115           0 :         break;
    1116           0 :     }
    1117           0 : }
    1118             : 
    1119             : void
    1120           0 : UUIInteractionHelper::handleGenericErrorRequest(
    1121             :     sal_Int32 nErrorCode,
    1122             :     uno::Sequence< uno::Reference<
    1123             :         task::XInteractionContinuation > > const & rContinuations,
    1124             :     bool bObtainErrorStringOnly,
    1125             :     bool & bHasErrorString,
    1126             :     OUString & rErrorString)
    1127             : {
    1128           0 :     if (bObtainErrorStringOnly)
    1129             :     {
    1130           0 :         bHasErrorString = isInformationalErrorMessageRequest(rContinuations);
    1131           0 :         if (bHasErrorString)
    1132             :         {
    1133           0 :             OUString aErrorString;
    1134           0 :             ErrorHandler::GetErrorString(nErrorCode, aErrorString);
    1135           0 :             rErrorString = aErrorString;
    1136             :         }
    1137             :     }
    1138             :     else
    1139             :     {
    1140           0 :         uno::Reference< task::XInteractionAbort > xAbort;
    1141           0 :         uno::Reference< task::XInteractionApprove > xApprove;
    1142           0 :         getContinuations(rContinuations, &xApprove, &xAbort);
    1143             : 
    1144             :         // Note: It's important to convert the transported long to the
    1145             :         // required  unsigned long value. Otherwhise using as flag field
    1146             :         // can fail ...
    1147           0 :         ErrCode  nError   = static_cast< ErrCode >(nErrorCode);
    1148           0 :         bool bWarning = !ERRCODE_TOERROR(nError);
    1149             : 
    1150           0 :         if ( nError == ERRCODE_SFX_BROKENSIGNATURE
    1151           0 :              || nError == ERRCODE_SFX_INCOMPLETE_ENCRYPTION )
    1152             :         {
    1153             :             // the security warning box needs a special title
    1154           0 :             OUString aErrorString;
    1155           0 :             ErrorHandler::GetErrorString( nErrorCode, aErrorString );
    1156             : 
    1157             :             boost::scoped_ptr< ResMgr > xManager(
    1158           0 :                 ResMgr::CreateResMgr( "uui" ) );
    1159           0 :             OUString aTitle( utl::ConfigManager::getProductName() );
    1160             : 
    1161             :             OUString aErrTitle
    1162             :                   = ResId( nError == ERRCODE_SFX_BROKENSIGNATURE
    1163             :                                        ? STR_WARNING_BROKENSIGNATURE_TITLE
    1164             :                                        : STR_WARNING_INCOMPLETE_ENCRYPTION_TITLE,
    1165           0 :                                    *xManager.get() ).toString();
    1166             : 
    1167           0 :             if ( !aTitle.isEmpty() && !aErrTitle.isEmpty() )
    1168           0 :                 aTitle += " - " ;
    1169           0 :             aTitle += aErrTitle;
    1170             : 
    1171             :             executeMessageBox(
    1172           0 :                 getParentProperty(), aTitle, aErrorString, WB_OK );
    1173             :         }
    1174             :         else
    1175           0 :             ErrorHandler::HandleError(nErrorCode);
    1176             : 
    1177           0 :         if (xApprove.is() && bWarning)
    1178           0 :             xApprove->select();
    1179           0 :         else if (xAbort.is())
    1180           0 :             xAbort->select();
    1181             :     }
    1182           0 : }
    1183             : 
    1184             : void
    1185           0 : UUIInteractionHelper::handleMacroConfirmRequest(
    1186             :     const OUString& aDocumentURL,
    1187             :     const uno::Reference< embed::XStorage >& xZipStorage,
    1188             :     const OUString& aDocumentVersion,
    1189             :     const uno::Sequence< security::DocumentSignatureInformation >& aSignInfo,
    1190             :     uno::Sequence< uno::Reference< task::XInteractionContinuation > > const &
    1191             :         rContinuations )
    1192             : {
    1193           0 :     uno::Reference< task::XInteractionAbort > xAbort;
    1194           0 :     uno::Reference< task::XInteractionApprove > xApprove;
    1195           0 :     getContinuations( rContinuations, &xApprove, &xAbort );
    1196             : 
    1197           0 :     bool bApprove = false;
    1198             : 
    1199           0 :     boost::scoped_ptr< ResMgr > pResMgr( ResMgr::CreateResMgr( "uui" ) );
    1200           0 :     if ( pResMgr.get() )
    1201             :     {
    1202           0 :         bool bShowSignatures = aSignInfo.getLength() > 0;
    1203             :         MacroWarning aWarning(
    1204           0 :             getParentProperty(), bShowSignatures, *pResMgr.get() );
    1205             : 
    1206           0 :         aWarning.SetDocumentURL( aDocumentURL );
    1207           0 :         if ( aSignInfo.getLength() > 1 )
    1208             :         {
    1209           0 :             aWarning.SetStorage( xZipStorage, aDocumentVersion, aSignInfo );
    1210             :         }
    1211           0 :         else if ( aSignInfo.getLength() == 1 )
    1212             :         {
    1213           0 :             aWarning.SetCertificate( aSignInfo[ 0 ].Signer );
    1214             :         }
    1215             : 
    1216           0 :         bApprove = aWarning.Execute() == RET_OK;
    1217             :     }
    1218             : 
    1219           0 :     if ( bApprove && xApprove.is() )
    1220           0 :         xApprove->select();
    1221           0 :     else if ( xAbort.is() )
    1222           0 :         xAbort->select();
    1223           0 : }
    1224             : 
    1225             : void
    1226           0 : UUIInteractionHelper::handleBrokenPackageRequest(
    1227             :     std::vector< OUString > const & rArguments,
    1228             :     uno::Sequence< uno::Reference< task::XInteractionContinuation > > const &
    1229             :         rContinuations,
    1230             :     bool bObtainErrorStringOnly,
    1231             :     bool & bHasErrorString,
    1232             :     OUString & rErrorString)
    1233             : {
    1234           0 :     if (bObtainErrorStringOnly)
    1235             :     {
    1236           0 :         bHasErrorString = isInformationalErrorMessageRequest(rContinuations);
    1237           0 :         if (!bHasErrorString)
    1238           0 :             return;
    1239             :     }
    1240             : 
    1241           0 :     uno::Reference< task::XInteractionApprove > xApprove;
    1242           0 :     uno::Reference< task::XInteractionDisapprove > xDisapprove;
    1243           0 :     uno::Reference< task::XInteractionAbort > xAbort;
    1244           0 :     getContinuations(rContinuations, &xApprove, &xDisapprove, &xAbort);
    1245             : 
    1246             :     ErrCode nErrorCode;
    1247           0 :     if( xApprove.is() && xDisapprove.is() )
    1248             :     {
    1249           0 :         nErrorCode = ERRCODE_UUI_IO_BROKENPACKAGE;
    1250             :     }
    1251           0 :     else if ( xAbort.is() )
    1252             :     {
    1253           0 :         nErrorCode = ERRCODE_UUI_IO_BROKENPACKAGE_CANTREPAIR;
    1254             :     }
    1255             :     else
    1256           0 :         return;
    1257             : 
    1258           0 :     OUString aMessage;
    1259             :     {
    1260           0 :         SolarMutexGuard aGuard;
    1261           0 :         boost::scoped_ptr< ResMgr > xManager(ResMgr::CreateResMgr("uui"));
    1262           0 :         if (!xManager.get())
    1263           0 :             return;
    1264             : 
    1265           0 :         ResId aResId( RID_UUI_ERRHDL, *xManager.get() );
    1266           0 :         if ( !ErrorResource(aResId).getString(nErrorCode, aMessage) )
    1267           0 :             return;
    1268             :     }
    1269             : 
    1270           0 :     aMessage = replaceMessageWithArguments( aMessage, rArguments );
    1271             : 
    1272           0 :     if (bObtainErrorStringOnly)
    1273             :     {
    1274           0 :         rErrorString = aMessage;
    1275           0 :         return;
    1276             :     }
    1277             : 
    1278             :     WinBits nButtonMask;
    1279           0 :     if( xApprove.is() && xDisapprove.is() )
    1280             :     {
    1281           0 :         nButtonMask = WB_YES_NO | WB_DEF_YES;
    1282             :     }
    1283           0 :     else if ( xAbort.is() )
    1284             :     {
    1285           0 :         nButtonMask = WB_OK;
    1286             :     }
    1287             :     else
    1288           0 :         return;
    1289             : 
    1290             :     OUString title(
    1291           0 :         utl::ConfigManager::getProductName() +
    1292           0 :         OUString( " " ) +
    1293           0 :         utl::ConfigManager::getProductVersion() );
    1294             : 
    1295           0 :     switch (
    1296           0 :         executeMessageBox( getParentProperty(), title, aMessage, nButtonMask ) )
    1297             :     {
    1298             :     case ERRCODE_BUTTON_OK:
    1299             :         OSL_ENSURE( xAbort.is(), "unexpected situation" );
    1300           0 :         if (xAbort.is())
    1301           0 :             xAbort->select();
    1302           0 :         break;
    1303             : 
    1304             :     case ERRCODE_BUTTON_NO:
    1305             :         OSL_ENSURE(xDisapprove.is(), "unexpected situation");
    1306           0 :         if (xDisapprove.is())
    1307           0 :             xDisapprove->select();
    1308           0 :         break;
    1309             : 
    1310             :     case ERRCODE_BUTTON_YES:
    1311             :         OSL_ENSURE(xApprove.is(), "unexpected situation");
    1312           0 :         if (xApprove.is())
    1313           0 :             xApprove->select();
    1314           0 :         break;
    1315           0 :     }
    1316             : }
    1317             : 
    1318             : 
    1319             : // ErrorResource Implementation
    1320             : 
    1321             : 
    1322             : bool
    1323           0 : ErrorResource::getString(ErrCode nErrorCode, OUString &rString)
    1324             :     const
    1325             : {
    1326             :     ResId aResId(static_cast< sal_uInt16 >(nErrorCode & ERRCODE_RES_MASK),
    1327           0 :                  *m_pResMgr);
    1328           0 :     aResId.SetRT(RSC_STRING);
    1329           0 :     if (!IsAvailableRes(aResId))
    1330           0 :         return false;
    1331           0 :     aResId.SetAutoRelease(false);
    1332           0 :     rString = aResId.toString();
    1333           0 :     m_pResMgr->PopContext();
    1334           0 :     return true;
    1335         180 : }
    1336             : 
    1337             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10