1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir #include <memory> 29*cdf0e10cSrcweir 30*cdf0e10cSrcweir #include "com/sun/star/awt/XWindow.hpp" 31*cdf0e10cSrcweir #include "com/sun/star/beans/PropertyValue.hpp" 32*cdf0e10cSrcweir #include "com/sun/star/configuration/backend/MergeRecoveryRequest.hpp" 33*cdf0e10cSrcweir #include "com/sun/star/configuration/backend/StratumCreationException.hpp" 34*cdf0e10cSrcweir #include "com/sun/star/container/XHierarchicalNameAccess.hpp" 35*cdf0e10cSrcweir #include "com/sun/star/document/BrokenPackageRequest.hpp" 36*cdf0e10cSrcweir #include "com/sun/star/task/DocumentMacroConfirmationRequest.hpp" 37*cdf0e10cSrcweir #include "com/sun/star/java/WrongJavaVersionException.hpp" 38*cdf0e10cSrcweir #include "com/sun/star/lang/XInitialization.hpp" 39*cdf0e10cSrcweir #include "com/sun/star/lang/XMultiServiceFactory.hpp" 40*cdf0e10cSrcweir #include "com/sun/star/script/ModuleSizeExceededRequest.hpp" 41*cdf0e10cSrcweir #include "com/sun/star/sync2/BadPartnershipException.hpp" 42*cdf0e10cSrcweir #include "com/sun/star/task/ErrorCodeIOException.hpp" 43*cdf0e10cSrcweir #include "com/sun/star/task/ErrorCodeRequest.hpp" 44*cdf0e10cSrcweir #include "com/sun/star/task/FutureDocumentVersionProductUpdateRequest.hpp" 45*cdf0e10cSrcweir #include "com/sun/star/task/XInteractionAbort.hpp" 46*cdf0e10cSrcweir #include "com/sun/star/task/XInteractionApprove.hpp" 47*cdf0e10cSrcweir #include "com/sun/star/task/XInteractionAskLater.hpp" 48*cdf0e10cSrcweir #include "com/sun/star/task/XInteractionDisapprove.hpp" 49*cdf0e10cSrcweir #include "com/sun/star/task/XInteractionHandler2.hpp" 50*cdf0e10cSrcweir #include "com/sun/star/task/XInteractionRequest.hpp" 51*cdf0e10cSrcweir #include "com/sun/star/task/XInteractionRetry.hpp" 52*cdf0e10cSrcweir #include "com/sun/star/ucb/InteractiveAppException.hpp" 53*cdf0e10cSrcweir #include "com/sun/star/ucb/InteractiveCHAOSException.hpp" 54*cdf0e10cSrcweir #include "com/sun/star/ucb/InteractiveLockingLockedException.hpp" 55*cdf0e10cSrcweir #include "com/sun/star/ucb/InteractiveLockingNotLockedException.hpp" 56*cdf0e10cSrcweir #include "com/sun/star/ucb/InteractiveLockingLockExpiredException.hpp" 57*cdf0e10cSrcweir #include "com/sun/star/ucb/InteractiveNetworkConnectException.hpp" 58*cdf0e10cSrcweir #include "com/sun/star/ucb/InteractiveNetworkOffLineException.hpp" 59*cdf0e10cSrcweir #include "com/sun/star/ucb/InteractiveNetworkReadException.hpp" 60*cdf0e10cSrcweir #include "com/sun/star/ucb/InteractiveNetworkResolveNameException.hpp" 61*cdf0e10cSrcweir #include "com/sun/star/ucb/InteractiveNetworkWriteException.hpp" 62*cdf0e10cSrcweir #include "com/sun/star/ucb/InteractiveWrongMediumException.hpp" 63*cdf0e10cSrcweir #include "com/sun/star/ucb/NameClashException.hpp" 64*cdf0e10cSrcweir #include "com/sun/star/ucb/NameClashResolveRequest.hpp" 65*cdf0e10cSrcweir #include "com/sun/star/ucb/UnsupportedNameClashException.hpp" 66*cdf0e10cSrcweir #include "com/sun/star/ucb/XInteractionReplaceExistingData.hpp" 67*cdf0e10cSrcweir #include "com/sun/star/ucb/XInteractionSupplyName.hpp" 68*cdf0e10cSrcweir #include "com/sun/star/xforms/InvalidDataOnSubmitException.hpp" 69*cdf0e10cSrcweir 70*cdf0e10cSrcweir #include "osl/conditn.hxx" 71*cdf0e10cSrcweir #include "tools/rcid.h" // RSC_STRING 72*cdf0e10cSrcweir #include "tools/errinf.hxx" // ErrorHandler, ErrorContext, ... 73*cdf0e10cSrcweir #include "vos/mutex.hxx" 74*cdf0e10cSrcweir #include "tools/diagnose_ex.h" 75*cdf0e10cSrcweir #include "comphelper/documentconstants.hxx" // ODFVER_012_TEXT 76*cdf0e10cSrcweir #include "svtools/sfxecode.hxx" // ERRCODE_SFX_* 77*cdf0e10cSrcweir #include "vcl/msgbox.hxx" 78*cdf0e10cSrcweir #include "vcl/svapp.hxx" 79*cdf0e10cSrcweir #include "unotools/configmgr.hxx" 80*cdf0e10cSrcweir #include "toolkit/helper/vclunohelper.hxx" 81*cdf0e10cSrcweir #include "comphelper/namedvaluecollection.hxx" 82*cdf0e10cSrcweir #include "typelib/typedescription.hxx" 83*cdf0e10cSrcweir #include "unotools/confignode.hxx" 84*cdf0e10cSrcweir 85*cdf0e10cSrcweir #include "ids.hrc" 86*cdf0e10cSrcweir 87*cdf0e10cSrcweir #include "getcontinuations.hxx" 88*cdf0e10cSrcweir #include "secmacrowarnings.hxx" 89*cdf0e10cSrcweir #include "newerverwarn.hxx" 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir #include "iahndl.hxx" 92*cdf0e10cSrcweir #include "nameclashdlg.hxx" 93*cdf0e10cSrcweir 94*cdf0e10cSrcweir /** === begin UNO using === **/ 95*cdf0e10cSrcweir using ::com::sun::star::uno::Sequence; 96*cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY; 97*cdf0e10cSrcweir using ::com::sun::star::uno::Reference; 98*cdf0e10cSrcweir using ::com::sun::star::task::XInteractionContinuation; 99*cdf0e10cSrcweir using ::com::sun::star::task::XInteractionAbort; 100*cdf0e10cSrcweir using ::com::sun::star::task::XInteractionApprove; 101*cdf0e10cSrcweir using ::com::sun::star::task::XInteractionAskLater; 102*cdf0e10cSrcweir using ::com::sun::star::task::FutureDocumentVersionProductUpdateRequest; 103*cdf0e10cSrcweir using ::com::sun::star::uno::XInterface; 104*cdf0e10cSrcweir using ::com::sun::star::lang::XInitialization; 105*cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY_THROW; 106*cdf0e10cSrcweir using ::com::sun::star::task::XInteractionHandler2; 107*cdf0e10cSrcweir using ::com::sun::star::uno::Exception; 108*cdf0e10cSrcweir using ::com::sun::star::uno::Any; 109*cdf0e10cSrcweir using ::com::sun::star::task::XInteractionRequest; 110*cdf0e10cSrcweir using ::com::sun::star::lang::XMultiServiceFactory; 111*cdf0e10cSrcweir /** === end UNO using === **/ 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir using namespace ::com::sun::star; 114*cdf0e10cSrcweir 115*cdf0e10cSrcweir namespace { 116*cdf0e10cSrcweir 117*cdf0e10cSrcweir class HandleData : public osl::Condition 118*cdf0e10cSrcweir { 119*cdf0e10cSrcweir public: 120*cdf0e10cSrcweir HandleData( 121*cdf0e10cSrcweir uno::Reference< task::XInteractionRequest > const & rRequest) 122*cdf0e10cSrcweir : osl::Condition(), 123*cdf0e10cSrcweir m_rRequest(rRequest), 124*cdf0e10cSrcweir bHandled( false ) 125*cdf0e10cSrcweir { 126*cdf0e10cSrcweir } 127*cdf0e10cSrcweir uno::Reference< task::XInteractionRequest > m_rRequest; 128*cdf0e10cSrcweir bool bHandled; 129*cdf0e10cSrcweir beans::Optional< rtl::OUString > m_aResult; 130*cdf0e10cSrcweir }; 131*cdf0e10cSrcweir 132*cdf0e10cSrcweir } /* namespace */ 133*cdf0e10cSrcweir 134*cdf0e10cSrcweir UUIInteractionHelper::UUIInteractionHelper( 135*cdf0e10cSrcweir uno::Reference< lang::XMultiServiceFactory > const & rServiceFactory, 136*cdf0e10cSrcweir uno::Sequence< uno::Any > const & rArguments) 137*cdf0e10cSrcweir SAL_THROW(()): 138*cdf0e10cSrcweir m_xServiceFactory(rServiceFactory), 139*cdf0e10cSrcweir m_aProperties(rArguments) 140*cdf0e10cSrcweir { 141*cdf0e10cSrcweir } 142*cdf0e10cSrcweir 143*cdf0e10cSrcweir UUIInteractionHelper::UUIInteractionHelper( 144*cdf0e10cSrcweir uno::Reference< lang::XMultiServiceFactory > const & rServiceFactory) 145*cdf0e10cSrcweir SAL_THROW(()): 146*cdf0e10cSrcweir m_xServiceFactory(rServiceFactory) 147*cdf0e10cSrcweir { 148*cdf0e10cSrcweir } 149*cdf0e10cSrcweir 150*cdf0e10cSrcweir UUIInteractionHelper::~UUIInteractionHelper() 151*cdf0e10cSrcweir { 152*cdf0e10cSrcweir } 153*cdf0e10cSrcweir 154*cdf0e10cSrcweir long 155*cdf0e10cSrcweir UUIInteractionHelper::handlerequest( 156*cdf0e10cSrcweir void* pHandleData, void* pInteractionHelper) 157*cdf0e10cSrcweir { 158*cdf0e10cSrcweir HandleData* pHND 159*cdf0e10cSrcweir = static_cast< HandleData * >(pHandleData); 160*cdf0e10cSrcweir UUIInteractionHelper* pUUI 161*cdf0e10cSrcweir = static_cast< UUIInteractionHelper * >(pInteractionHelper); 162*cdf0e10cSrcweir bool bDummy = false; 163*cdf0e10cSrcweir rtl::OUString aDummy; 164*cdf0e10cSrcweir pHND->bHandled 165*cdf0e10cSrcweir = pUUI->handleRequest_impl(pHND->m_rRequest, false, bDummy, aDummy); 166*cdf0e10cSrcweir pHND->set(); 167*cdf0e10cSrcweir return 0; 168*cdf0e10cSrcweir } 169*cdf0e10cSrcweir 170*cdf0e10cSrcweir bool 171*cdf0e10cSrcweir UUIInteractionHelper::handleRequest( 172*cdf0e10cSrcweir uno::Reference< task::XInteractionRequest > const & rRequest) 173*cdf0e10cSrcweir SAL_THROW((uno::RuntimeException)) 174*cdf0e10cSrcweir { 175*cdf0e10cSrcweir Application* pApp = 0; 176*cdf0e10cSrcweir if( 177*cdf0e10cSrcweir // be aware,it is the same type 178*cdf0e10cSrcweir static_cast< oslThreadIdentifier >( 179*cdf0e10cSrcweir Application::GetMainThreadIdentifier()) 180*cdf0e10cSrcweir != osl_getThreadIdentifier(NULL) 181*cdf0e10cSrcweir && 182*cdf0e10cSrcweir (pApp = GetpApp()) 183*cdf0e10cSrcweir != 0 184*cdf0e10cSrcweir ) { 185*cdf0e10cSrcweir // we are not in the main thread, let it handle that stuff 186*cdf0e10cSrcweir HandleData aHD(rRequest); 187*cdf0e10cSrcweir Link aLink(&aHD,handlerequest); 188*cdf0e10cSrcweir pApp->PostUserEvent(aLink,this); 189*cdf0e10cSrcweir sal_uLong locks = Application::ReleaseSolarMutex(); 190*cdf0e10cSrcweir aHD.wait(); 191*cdf0e10cSrcweir Application::AcquireSolarMutex(locks); 192*cdf0e10cSrcweir return aHD.bHandled; 193*cdf0e10cSrcweir } 194*cdf0e10cSrcweir else 195*cdf0e10cSrcweir { 196*cdf0e10cSrcweir bool bDummy = false; 197*cdf0e10cSrcweir rtl::OUString aDummy; 198*cdf0e10cSrcweir return handleRequest_impl(rRequest, false, bDummy, aDummy); 199*cdf0e10cSrcweir } 200*cdf0e10cSrcweir } 201*cdf0e10cSrcweir 202*cdf0e10cSrcweir long 203*cdf0e10cSrcweir UUIInteractionHelper::getstringfromrequest( 204*cdf0e10cSrcweir void* pHandleData,void* pInteractionHelper) 205*cdf0e10cSrcweir { 206*cdf0e10cSrcweir HandleData* pHND = (HandleData*) pHandleData; 207*cdf0e10cSrcweir UUIInteractionHelper* pUUI = (UUIInteractionHelper*) pInteractionHelper; 208*cdf0e10cSrcweir pHND->m_aResult = pUUI->getStringFromRequest_impl(pHND->m_rRequest); 209*cdf0e10cSrcweir pHND->set(); 210*cdf0e10cSrcweir return 0; 211*cdf0e10cSrcweir } 212*cdf0e10cSrcweir 213*cdf0e10cSrcweir beans::Optional< rtl::OUString > 214*cdf0e10cSrcweir UUIInteractionHelper::getStringFromRequest_impl( 215*cdf0e10cSrcweir uno::Reference< task::XInteractionRequest > const & rRequest) 216*cdf0e10cSrcweir SAL_THROW((uno::RuntimeException)) 217*cdf0e10cSrcweir { 218*cdf0e10cSrcweir bool bSuccess = false; 219*cdf0e10cSrcweir rtl::OUString aMessage; 220*cdf0e10cSrcweir handleRequest_impl(rRequest, true, bSuccess, aMessage); 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir OSL_ENSURE(bSuccess || 223*cdf0e10cSrcweir !isInformationalErrorMessageRequest( 224*cdf0e10cSrcweir rRequest->getContinuations()), 225*cdf0e10cSrcweir "Interaction request is a candidate for a string representation." 226*cdf0e10cSrcweir "Please implement!"); 227*cdf0e10cSrcweir 228*cdf0e10cSrcweir return beans::Optional< rtl::OUString >(bSuccess, aMessage); 229*cdf0e10cSrcweir } 230*cdf0e10cSrcweir 231*cdf0e10cSrcweir beans::Optional< rtl::OUString > 232*cdf0e10cSrcweir UUIInteractionHelper::getStringFromRequest( 233*cdf0e10cSrcweir uno::Reference< task::XInteractionRequest > const & rRequest) 234*cdf0e10cSrcweir SAL_THROW((uno::RuntimeException)) 235*cdf0e10cSrcweir { 236*cdf0e10cSrcweir Application* pApp = 0; 237*cdf0e10cSrcweir if( 238*cdf0e10cSrcweir // be aware,it is the same type 239*cdf0e10cSrcweir static_cast< oslThreadIdentifier >( 240*cdf0e10cSrcweir Application::GetMainThreadIdentifier()) 241*cdf0e10cSrcweir != osl_getThreadIdentifier(NULL) 242*cdf0e10cSrcweir && 243*cdf0e10cSrcweir (pApp = GetpApp()) 244*cdf0e10cSrcweir != 0 245*cdf0e10cSrcweir ) { 246*cdf0e10cSrcweir // we are not in the main thread, let it handle that stuff 247*cdf0e10cSrcweir HandleData aHD(rRequest); 248*cdf0e10cSrcweir Link aLink(&aHD,getstringfromrequest); 249*cdf0e10cSrcweir pApp->PostUserEvent(aLink,this); 250*cdf0e10cSrcweir sal_uLong locks = Application::ReleaseSolarMutex(); 251*cdf0e10cSrcweir aHD.wait(); 252*cdf0e10cSrcweir Application::AcquireSolarMutex(locks); 253*cdf0e10cSrcweir return aHD.m_aResult; 254*cdf0e10cSrcweir } 255*cdf0e10cSrcweir else 256*cdf0e10cSrcweir return getStringFromRequest_impl(rRequest); 257*cdf0e10cSrcweir } 258*cdf0e10cSrcweir 259*cdf0e10cSrcweir ::rtl::OUString 260*cdf0e10cSrcweir UUIInteractionHelper::replaceMessageWithArguments( 261*cdf0e10cSrcweir ::rtl::OUString aMessage, 262*cdf0e10cSrcweir std::vector< rtl::OUString > const & rArguments ) 263*cdf0e10cSrcweir { 264*cdf0e10cSrcweir for (sal_Int32 i = 0;;) 265*cdf0e10cSrcweir { 266*cdf0e10cSrcweir i = aMessage. 267*cdf0e10cSrcweir indexOf(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("$(ARG")), i); 268*cdf0e10cSrcweir if (i == -1) 269*cdf0e10cSrcweir break; 270*cdf0e10cSrcweir if (aMessage.getLength() - i >= RTL_CONSTASCII_LENGTH("$(ARGx)") 271*cdf0e10cSrcweir && aMessage.getStr()[i + RTL_CONSTASCII_LENGTH("$(ARGx")] == ')') 272*cdf0e10cSrcweir { 273*cdf0e10cSrcweir sal_Unicode c 274*cdf0e10cSrcweir = aMessage.getStr()[i + RTL_CONSTASCII_LENGTH("$(ARG")]; 275*cdf0e10cSrcweir if (c >= '1' && c <= '2') 276*cdf0e10cSrcweir { 277*cdf0e10cSrcweir std::vector< rtl::OUString >::size_type nIndex 278*cdf0e10cSrcweir = static_cast< std::vector< rtl::OUString >::size_type >( 279*cdf0e10cSrcweir c - '1'); 280*cdf0e10cSrcweir if (nIndex < rArguments.size()) 281*cdf0e10cSrcweir { 282*cdf0e10cSrcweir aMessage 283*cdf0e10cSrcweir = aMessage.replaceAt(i, 284*cdf0e10cSrcweir RTL_CONSTASCII_LENGTH("$(ARGx)"), 285*cdf0e10cSrcweir rArguments[nIndex]); 286*cdf0e10cSrcweir i += rArguments[nIndex].getLength(); 287*cdf0e10cSrcweir continue; 288*cdf0e10cSrcweir } 289*cdf0e10cSrcweir } 290*cdf0e10cSrcweir } 291*cdf0e10cSrcweir ++i; 292*cdf0e10cSrcweir } 293*cdf0e10cSrcweir 294*cdf0e10cSrcweir return aMessage; 295*cdf0e10cSrcweir } 296*cdf0e10cSrcweir 297*cdf0e10cSrcweir bool 298*cdf0e10cSrcweir UUIInteractionHelper::isInformationalErrorMessageRequest( 299*cdf0e10cSrcweir uno::Sequence< uno::Reference< task::XInteractionContinuation > > const & 300*cdf0e10cSrcweir rContinuations) 301*cdf0e10cSrcweir { 302*cdf0e10cSrcweir // Only requests with a single continuation (user has no choice, request 303*cdf0e10cSrcweir // is just informational) 304*cdf0e10cSrcweir if (rContinuations.getLength() != 1 ) 305*cdf0e10cSrcweir return false; 306*cdf0e10cSrcweir 307*cdf0e10cSrcweir // user can only abort or approve, all other continuations are not 308*cdf0e10cSrcweir // considered to be informational. 309*cdf0e10cSrcweir uno::Reference< task::XInteractionApprove > xApprove( 310*cdf0e10cSrcweir rContinuations[0], uno::UNO_QUERY); 311*cdf0e10cSrcweir if (xApprove.is()) 312*cdf0e10cSrcweir return true; 313*cdf0e10cSrcweir 314*cdf0e10cSrcweir uno::Reference< task::XInteractionAbort > xAbort( 315*cdf0e10cSrcweir rContinuations[0], uno::UNO_QUERY); 316*cdf0e10cSrcweir if (xAbort.is()) 317*cdf0e10cSrcweir return true; 318*cdf0e10cSrcweir 319*cdf0e10cSrcweir return false; 320*cdf0e10cSrcweir } 321*cdf0e10cSrcweir 322*cdf0e10cSrcweir bool 323*cdf0e10cSrcweir UUIInteractionHelper::tryOtherInteractionHandler( 324*cdf0e10cSrcweir uno::Reference< task::XInteractionRequest > const & rRequest) 325*cdf0e10cSrcweir SAL_THROW((uno::RuntimeException)) 326*cdf0e10cSrcweir { 327*cdf0e10cSrcweir InteractionHandlerDataList dataList; 328*cdf0e10cSrcweir getInteractionHandlerList(dataList); 329*cdf0e10cSrcweir 330*cdf0e10cSrcweir InteractionHandlerDataList::const_iterator aEnd(dataList.end()); 331*cdf0e10cSrcweir for (InteractionHandlerDataList::const_iterator aIt(dataList.begin()); 332*cdf0e10cSrcweir aIt != aEnd; 333*cdf0e10cSrcweir ++aIt) 334*cdf0e10cSrcweir { 335*cdf0e10cSrcweir if ( handleCustomRequest( rRequest, aIt->ServiceName ) ) 336*cdf0e10cSrcweir return true; 337*cdf0e10cSrcweir } 338*cdf0e10cSrcweir return false; 339*cdf0e10cSrcweir } 340*cdf0e10cSrcweir 341*cdf0e10cSrcweir namespace 342*cdf0e10cSrcweir { 343*cdf0e10cSrcweir // ................................................................................................................. 344*cdf0e10cSrcweir static bool lcl_matchesRequest( const Any& i_rRequest, const ::rtl::OUString& i_rTypeName, const ::rtl::OUString& i_rPropagation ) 345*cdf0e10cSrcweir { 346*cdf0e10cSrcweir const ::com::sun::star::uno::TypeDescription aTypeDesc( i_rTypeName ); 347*cdf0e10cSrcweir const typelib_TypeDescription* pTypeDesc = aTypeDesc.get(); 348*cdf0e10cSrcweir if ( !pTypeDesc || !pTypeDesc->pWeakRef ) 349*cdf0e10cSrcweir { 350*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0 351*cdf0e10cSrcweir ::rtl::OStringBuffer aMessage; 352*cdf0e10cSrcweir aMessage.append( "no type found for '" ); 353*cdf0e10cSrcweir aMessage.append( ::rtl::OUStringToOString( i_rTypeName, RTL_TEXTENCODING_UTF8 ) ); 354*cdf0e10cSrcweir aMessage.append( "'" ); 355*cdf0e10cSrcweir OSL_ENSURE( false, aMessage.makeStringAndClear().getStr() ); 356*cdf0e10cSrcweir #endif 357*cdf0e10cSrcweir return false; 358*cdf0e10cSrcweir } 359*cdf0e10cSrcweir const ::com::sun::star::uno::Type aType( pTypeDesc->pWeakRef ); 360*cdf0e10cSrcweir 361*cdf0e10cSrcweir const bool bExactMatch = ( i_rPropagation.compareToAscii( "named-only" ) == 0 ); 362*cdf0e10cSrcweir if ( bExactMatch ) 363*cdf0e10cSrcweir return i_rRequest.getValueType().equals( aType ); 364*cdf0e10cSrcweir 365*cdf0e10cSrcweir return i_rRequest.isExtractableTo( aType ); 366*cdf0e10cSrcweir } 367*cdf0e10cSrcweir } 368*cdf0e10cSrcweir 369*cdf0e10cSrcweir // --------------------------------------------------------------------------------------------------------------------- 370*cdf0e10cSrcweir bool UUIInteractionHelper::handleCustomRequest( const Reference< XInteractionRequest >& i_rRequest, const ::rtl::OUString& i_rServiceName ) const 371*cdf0e10cSrcweir { 372*cdf0e10cSrcweir try 373*cdf0e10cSrcweir { 374*cdf0e10cSrcweir Reference< XInteractionHandler2 > xHandler( m_xServiceFactory->createInstance( i_rServiceName ), UNO_QUERY_THROW ); 375*cdf0e10cSrcweir 376*cdf0e10cSrcweir Reference< XInitialization > xHandlerInit( xHandler, UNO_QUERY ); 377*cdf0e10cSrcweir if ( xHandlerInit.is() ) 378*cdf0e10cSrcweir { 379*cdf0e10cSrcweir ::comphelper::NamedValueCollection aInitArgs; 380*cdf0e10cSrcweir aInitArgs.put( "Parent", getParentXWindow() ); 381*cdf0e10cSrcweir xHandlerInit->initialize( aInitArgs.getWrappedPropertyValues() ); 382*cdf0e10cSrcweir } 383*cdf0e10cSrcweir 384*cdf0e10cSrcweir if ( xHandler->handleInteractionRequest( i_rRequest ) ) 385*cdf0e10cSrcweir return true; 386*cdf0e10cSrcweir } 387*cdf0e10cSrcweir catch( const Exception& ) 388*cdf0e10cSrcweir { 389*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 390*cdf0e10cSrcweir } 391*cdf0e10cSrcweir return false; 392*cdf0e10cSrcweir } 393*cdf0e10cSrcweir 394*cdf0e10cSrcweir // --------------------------------------------------------------------------------------------------------------------- 395*cdf0e10cSrcweir bool UUIInteractionHelper::handleTypedHandlerImplementations( Reference< XInteractionRequest > const & rRequest ) 396*cdf0e10cSrcweir { 397*cdf0e10cSrcweir // the request 398*cdf0e10cSrcweir const Any aRequest( rRequest->getRequest() ); 399*cdf0e10cSrcweir 400*cdf0e10cSrcweir const StringHashMap::const_iterator aCacheHitTest = m_aTypedCustomHandlers.find( aRequest.getValueTypeName() ); 401*cdf0e10cSrcweir if ( aCacheHitTest != m_aTypedCustomHandlers.end() ) 402*cdf0e10cSrcweir return handleCustomRequest( rRequest, aCacheHitTest->second ); 403*cdf0e10cSrcweir 404*cdf0e10cSrcweir // the base registration node for "typed" interaction handlers 405*cdf0e10cSrcweir const ::utl::OConfigurationTreeRoot aConfigRoot( ::utl::OConfigurationTreeRoot::createWithServiceFactory( 406*cdf0e10cSrcweir m_xServiceFactory, 407*cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Interaction/InteractionHandlers" ) ), 408*cdf0e10cSrcweir -1, 409*cdf0e10cSrcweir ::utl::OConfigurationTreeRoot::CM_READONLY 410*cdf0e10cSrcweir ) ); 411*cdf0e10cSrcweir 412*cdf0e10cSrcweir // loop through all registered implementations 413*cdf0e10cSrcweir const Sequence< ::rtl::OUString > aRegisteredHandlers( aConfigRoot.getNodeNames() ); 414*cdf0e10cSrcweir const ::rtl::OUString* pHandlerName = aRegisteredHandlers.getConstArray(); 415*cdf0e10cSrcweir const ::rtl::OUString* pHandlersEnd = aRegisteredHandlers.getConstArray() + aRegisteredHandlers.getLength(); 416*cdf0e10cSrcweir for ( ; pHandlerName != pHandlersEnd; ++pHandlerName ) 417*cdf0e10cSrcweir { 418*cdf0e10cSrcweir const ::utl::OConfigurationNode aHandlerNode( aConfigRoot.openNode( *pHandlerName ) ); 419*cdf0e10cSrcweir const ::utl::OConfigurationNode aTypesNode( aHandlerNode.openNode( "HandledRequestTypes" ) ); 420*cdf0e10cSrcweir 421*cdf0e10cSrcweir // loop through all the types which the current handler is registered for 422*cdf0e10cSrcweir const Sequence< ::rtl::OUString > aHandledTypes( aTypesNode.getNodeNames() ); 423*cdf0e10cSrcweir const ::rtl::OUString* pType = aHandledTypes.getConstArray(); 424*cdf0e10cSrcweir const ::rtl::OUString* pTypesEnd = aHandledTypes.getConstArray() + aHandledTypes.getLength(); 425*cdf0e10cSrcweir for ( ; pType != pTypesEnd; ++pType ) 426*cdf0e10cSrcweir { 427*cdf0e10cSrcweir // the UNO type is the node name 428*cdf0e10cSrcweir ::utl::OConfigurationNode aType( aTypesNode.openNode( *pType ) ); 429*cdf0e10cSrcweir // and there's a child denoting how the responsibility propagates 430*cdf0e10cSrcweir ::rtl::OUString sPropagation; 431*cdf0e10cSrcweir OSL_VERIFY( aType.getNodeValue( "Propagation" ) >>= sPropagation ); 432*cdf0e10cSrcweir if ( lcl_matchesRequest( aRequest, *pType, sPropagation ) ) 433*cdf0e10cSrcweir { 434*cdf0e10cSrcweir // retrieve the service/implementation name of the handler 435*cdf0e10cSrcweir ::rtl::OUString sServiceName; 436*cdf0e10cSrcweir OSL_VERIFY( aHandlerNode.getNodeValue( "ServiceName" ) >>= sServiceName ); 437*cdf0e10cSrcweir // cache the information who feels responsible for requests of this type 438*cdf0e10cSrcweir m_aTypedCustomHandlers[ aRequest.getValueTypeName() ] = sServiceName; 439*cdf0e10cSrcweir // actually handle the request 440*cdf0e10cSrcweir return handleCustomRequest( rRequest, sServiceName ); 441*cdf0e10cSrcweir } 442*cdf0e10cSrcweir } 443*cdf0e10cSrcweir } 444*cdf0e10cSrcweir 445*cdf0e10cSrcweir return false; 446*cdf0e10cSrcweir } 447*cdf0e10cSrcweir 448*cdf0e10cSrcweir bool 449*cdf0e10cSrcweir UUIInteractionHelper::handleRequest_impl( 450*cdf0e10cSrcweir uno::Reference< task::XInteractionRequest > const & rRequest, 451*cdf0e10cSrcweir bool bObtainErrorStringOnly, 452*cdf0e10cSrcweir bool & bHasErrorString, 453*cdf0e10cSrcweir rtl::OUString & rErrorString) 454*cdf0e10cSrcweir SAL_THROW((uno::RuntimeException)) 455*cdf0e10cSrcweir { 456*cdf0e10cSrcweir try 457*cdf0e10cSrcweir { 458*cdf0e10cSrcweir if (!rRequest.is()) 459*cdf0e10cSrcweir return false; 460*cdf0e10cSrcweir 461*cdf0e10cSrcweir uno::Any aAnyRequest(rRequest->getRequest()); 462*cdf0e10cSrcweir 463*cdf0e10cSrcweir script::ModuleSizeExceededRequest aModSizeException; 464*cdf0e10cSrcweir if (aAnyRequest >>= aModSizeException ) 465*cdf0e10cSrcweir { 466*cdf0e10cSrcweir ErrCode nErrorCode = ERRCODE_UUI_IO_MODULESIZEEXCEEDED; 467*cdf0e10cSrcweir std::vector< rtl::OUString > aArguments; 468*cdf0e10cSrcweir uno::Sequence< rtl::OUString > sModules 469*cdf0e10cSrcweir = aModSizeException.Names; 470*cdf0e10cSrcweir if ( sModules.getLength() ) 471*cdf0e10cSrcweir { 472*cdf0e10cSrcweir rtl::OUString aName; 473*cdf0e10cSrcweir for ( sal_Int32 index=0; index< sModules.getLength(); ++index ) 474*cdf0e10cSrcweir { 475*cdf0e10cSrcweir if ( index ) 476*cdf0e10cSrcweir aName = aName + rtl::OUString( ',' ) + sModules[index]; 477*cdf0e10cSrcweir else 478*cdf0e10cSrcweir aName = sModules[index]; // 1st name 479*cdf0e10cSrcweir } 480*cdf0e10cSrcweir aArguments.push_back( aName ); 481*cdf0e10cSrcweir } 482*cdf0e10cSrcweir handleErrorHandlerRequest( task::InteractionClassification_WARNING, 483*cdf0e10cSrcweir nErrorCode, 484*cdf0e10cSrcweir aArguments, 485*cdf0e10cSrcweir rRequest->getContinuations(), 486*cdf0e10cSrcweir bObtainErrorStringOnly, 487*cdf0e10cSrcweir bHasErrorString, 488*cdf0e10cSrcweir rErrorString); 489*cdf0e10cSrcweir return true; 490*cdf0e10cSrcweir } 491*cdf0e10cSrcweir 492*cdf0e10cSrcweir ucb::NameClashException aNCException; 493*cdf0e10cSrcweir if (aAnyRequest >>= aNCException) 494*cdf0e10cSrcweir { 495*cdf0e10cSrcweir ErrCode nErrorCode = ERRCODE_UUI_IO_TARGETALREADYEXISTS; 496*cdf0e10cSrcweir std::vector< rtl::OUString > aArguments; 497*cdf0e10cSrcweir 498*cdf0e10cSrcweir if( aNCException.Name.getLength() ) 499*cdf0e10cSrcweir { 500*cdf0e10cSrcweir nErrorCode = ERRCODE_UUI_IO_ALREADYEXISTS; 501*cdf0e10cSrcweir aArguments.push_back( aNCException.Name ); 502*cdf0e10cSrcweir } 503*cdf0e10cSrcweir 504*cdf0e10cSrcweir handleErrorHandlerRequest( aNCException.Classification, 505*cdf0e10cSrcweir nErrorCode, 506*cdf0e10cSrcweir aArguments, 507*cdf0e10cSrcweir rRequest->getContinuations(), 508*cdf0e10cSrcweir bObtainErrorStringOnly, 509*cdf0e10cSrcweir bHasErrorString, 510*cdf0e10cSrcweir rErrorString); 511*cdf0e10cSrcweir return true; 512*cdf0e10cSrcweir } 513*cdf0e10cSrcweir 514*cdf0e10cSrcweir ucb::UnsupportedNameClashException aUORequest; 515*cdf0e10cSrcweir if (aAnyRequest >>= aUORequest) 516*cdf0e10cSrcweir { 517*cdf0e10cSrcweir ErrCode nErrorCode = ERRCODE_UUI_IO_UNSUPPORTEDOVERWRITE; 518*cdf0e10cSrcweir std::vector< rtl::OUString > aArguments; 519*cdf0e10cSrcweir 520*cdf0e10cSrcweir uno::Reference< task::XInteractionApprove > xApprove; 521*cdf0e10cSrcweir uno::Reference< task::XInteractionDisapprove > xDisapprove; 522*cdf0e10cSrcweir getContinuations( 523*cdf0e10cSrcweir rRequest->getContinuations(), &xApprove, &xDisapprove); 524*cdf0e10cSrcweir 525*cdf0e10cSrcweir if ( xApprove.is() && xDisapprove.is() ) 526*cdf0e10cSrcweir { 527*cdf0e10cSrcweir handleErrorHandlerRequest( task::InteractionClassification_QUERY, 528*cdf0e10cSrcweir nErrorCode, 529*cdf0e10cSrcweir aArguments, 530*cdf0e10cSrcweir rRequest->getContinuations(), 531*cdf0e10cSrcweir bObtainErrorStringOnly, 532*cdf0e10cSrcweir bHasErrorString, 533*cdf0e10cSrcweir rErrorString); 534*cdf0e10cSrcweir } 535*cdf0e10cSrcweir return true; 536*cdf0e10cSrcweir } 537*cdf0e10cSrcweir 538*cdf0e10cSrcweir if ( handleInteractiveIOException( rRequest, 539*cdf0e10cSrcweir bObtainErrorStringOnly, 540*cdf0e10cSrcweir bHasErrorString, 541*cdf0e10cSrcweir rErrorString ) ) 542*cdf0e10cSrcweir return true; 543*cdf0e10cSrcweir 544*cdf0e10cSrcweir ucb::InteractiveAppException aAppException; 545*cdf0e10cSrcweir if (aAnyRequest >>= aAppException) 546*cdf0e10cSrcweir { 547*cdf0e10cSrcweir std::vector< rtl::OUString > aArguments; 548*cdf0e10cSrcweir handleErrorHandlerRequest( aAppException.Classification, 549*cdf0e10cSrcweir aAppException.Code, 550*cdf0e10cSrcweir aArguments, 551*cdf0e10cSrcweir rRequest->getContinuations(), 552*cdf0e10cSrcweir bObtainErrorStringOnly, 553*cdf0e10cSrcweir bHasErrorString, 554*cdf0e10cSrcweir rErrorString); 555*cdf0e10cSrcweir return true; 556*cdf0e10cSrcweir } 557*cdf0e10cSrcweir 558*cdf0e10cSrcweir ucb::InteractiveNetworkException aNetworkException; 559*cdf0e10cSrcweir if (aAnyRequest >>= aNetworkException) 560*cdf0e10cSrcweir { 561*cdf0e10cSrcweir ErrCode nErrorCode; 562*cdf0e10cSrcweir std::vector< rtl::OUString > aArguments; 563*cdf0e10cSrcweir ucb::InteractiveNetworkOffLineException aOffLineException; 564*cdf0e10cSrcweir ucb::InteractiveNetworkResolveNameException aResolveNameException; 565*cdf0e10cSrcweir ucb::InteractiveNetworkConnectException aConnectException; 566*cdf0e10cSrcweir ucb::InteractiveNetworkReadException aReadException; 567*cdf0e10cSrcweir ucb::InteractiveNetworkWriteException aWriteException; 568*cdf0e10cSrcweir if (aAnyRequest >>= aOffLineException) 569*cdf0e10cSrcweir nErrorCode = ERRCODE_INET_OFFLINE; 570*cdf0e10cSrcweir else if (aAnyRequest >>= aResolveNameException) 571*cdf0e10cSrcweir { 572*cdf0e10cSrcweir nErrorCode = ERRCODE_INET_NAME_RESOLVE; 573*cdf0e10cSrcweir aArguments.push_back(aResolveNameException.Server); 574*cdf0e10cSrcweir } 575*cdf0e10cSrcweir else if (aAnyRequest >>= aConnectException) 576*cdf0e10cSrcweir { 577*cdf0e10cSrcweir nErrorCode = ERRCODE_INET_CONNECT; 578*cdf0e10cSrcweir aArguments.push_back(aConnectException.Server); 579*cdf0e10cSrcweir } 580*cdf0e10cSrcweir else if (aAnyRequest >>= aReadException) 581*cdf0e10cSrcweir { 582*cdf0e10cSrcweir nErrorCode = ERRCODE_INET_READ; 583*cdf0e10cSrcweir aArguments.push_back(aReadException.Diagnostic); 584*cdf0e10cSrcweir } 585*cdf0e10cSrcweir else if (aAnyRequest >>= aWriteException) 586*cdf0e10cSrcweir { 587*cdf0e10cSrcweir nErrorCode = ERRCODE_INET_WRITE; 588*cdf0e10cSrcweir aArguments.push_back(aWriteException.Diagnostic); 589*cdf0e10cSrcweir } 590*cdf0e10cSrcweir else 591*cdf0e10cSrcweir nErrorCode = ERRCODE_INET_GENERAL; 592*cdf0e10cSrcweir 593*cdf0e10cSrcweir handleErrorHandlerRequest(aNetworkException.Classification, 594*cdf0e10cSrcweir nErrorCode, 595*cdf0e10cSrcweir aArguments, 596*cdf0e10cSrcweir rRequest->getContinuations(), 597*cdf0e10cSrcweir bObtainErrorStringOnly, 598*cdf0e10cSrcweir bHasErrorString, 599*cdf0e10cSrcweir rErrorString); 600*cdf0e10cSrcweir return true; 601*cdf0e10cSrcweir } 602*cdf0e10cSrcweir 603*cdf0e10cSrcweir ucb::InteractiveCHAOSException aChaosException; 604*cdf0e10cSrcweir if (aAnyRequest >>= aChaosException) 605*cdf0e10cSrcweir { 606*cdf0e10cSrcweir std::vector< rtl::OUString > aArguments; 607*cdf0e10cSrcweir sal_Int32 nCount 608*cdf0e10cSrcweir = std::min< sal_Int32 >(aChaosException.Arguments.getLength(), 609*cdf0e10cSrcweir 2); 610*cdf0e10cSrcweir aArguments. 611*cdf0e10cSrcweir reserve(static_cast< std::vector< rtl::OUString >::size_type >( 612*cdf0e10cSrcweir nCount)); 613*cdf0e10cSrcweir for (sal_Int32 i = 0; i < nCount; ++i) 614*cdf0e10cSrcweir aArguments.push_back(aChaosException.Arguments[i]); 615*cdf0e10cSrcweir handleErrorHandlerRequest(aChaosException.Classification, 616*cdf0e10cSrcweir aChaosException.ID, 617*cdf0e10cSrcweir aArguments, 618*cdf0e10cSrcweir rRequest->getContinuations(), 619*cdf0e10cSrcweir bObtainErrorStringOnly, 620*cdf0e10cSrcweir bHasErrorString, 621*cdf0e10cSrcweir rErrorString); 622*cdf0e10cSrcweir return true; 623*cdf0e10cSrcweir } 624*cdf0e10cSrcweir 625*cdf0e10cSrcweir ucb::InteractiveWrongMediumException aWrongMediumException; 626*cdf0e10cSrcweir if (aAnyRequest >>= aWrongMediumException) 627*cdf0e10cSrcweir { 628*cdf0e10cSrcweir sal_Int32 nMedium = 0; 629*cdf0e10cSrcweir aWrongMediumException.Medium >>= nMedium; 630*cdf0e10cSrcweir std::vector< rtl::OUString > aArguments; 631*cdf0e10cSrcweir aArguments.push_back(UniString::CreateFromInt32(nMedium + 1)); 632*cdf0e10cSrcweir handleErrorHandlerRequest(aWrongMediumException.Classification, 633*cdf0e10cSrcweir ERRCODE_UUI_WRONGMEDIUM, 634*cdf0e10cSrcweir aArguments, 635*cdf0e10cSrcweir rRequest->getContinuations(), 636*cdf0e10cSrcweir bObtainErrorStringOnly, 637*cdf0e10cSrcweir bHasErrorString, 638*cdf0e10cSrcweir rErrorString); 639*cdf0e10cSrcweir return true; 640*cdf0e10cSrcweir } 641*cdf0e10cSrcweir 642*cdf0e10cSrcweir java::WrongJavaVersionException aWrongJavaVersionException; 643*cdf0e10cSrcweir if (aAnyRequest >>= aWrongJavaVersionException) 644*cdf0e10cSrcweir { 645*cdf0e10cSrcweir ErrCode nErrorCode; 646*cdf0e10cSrcweir std::vector< rtl::OUString > aArguments; 647*cdf0e10cSrcweir if (aWrongJavaVersionException.DetectedVersion.getLength() == 0) 648*cdf0e10cSrcweir if (aWrongJavaVersionException.LowestSupportedVersion. 649*cdf0e10cSrcweir getLength() 650*cdf0e10cSrcweir == 0) 651*cdf0e10cSrcweir nErrorCode = ERRCODE_UUI_WRONGJAVA; 652*cdf0e10cSrcweir else 653*cdf0e10cSrcweir { 654*cdf0e10cSrcweir nErrorCode = ERRCODE_UUI_WRONGJAVA_MIN; 655*cdf0e10cSrcweir aArguments.push_back(aWrongJavaVersionException. 656*cdf0e10cSrcweir LowestSupportedVersion); 657*cdf0e10cSrcweir } 658*cdf0e10cSrcweir else if (aWrongJavaVersionException.LowestSupportedVersion. 659*cdf0e10cSrcweir getLength() 660*cdf0e10cSrcweir == 0) 661*cdf0e10cSrcweir { 662*cdf0e10cSrcweir nErrorCode = ERRCODE_UUI_WRONGJAVA_VERSION; 663*cdf0e10cSrcweir aArguments.push_back(aWrongJavaVersionException. 664*cdf0e10cSrcweir DetectedVersion); 665*cdf0e10cSrcweir } 666*cdf0e10cSrcweir else 667*cdf0e10cSrcweir { 668*cdf0e10cSrcweir nErrorCode = ERRCODE_UUI_WRONGJAVA_VERSION_MIN; 669*cdf0e10cSrcweir aArguments.reserve(2); 670*cdf0e10cSrcweir aArguments.push_back(aWrongJavaVersionException. 671*cdf0e10cSrcweir DetectedVersion); 672*cdf0e10cSrcweir aArguments.push_back(aWrongJavaVersionException. 673*cdf0e10cSrcweir LowestSupportedVersion); 674*cdf0e10cSrcweir } 675*cdf0e10cSrcweir handleErrorHandlerRequest(task::InteractionClassification_ERROR, 676*cdf0e10cSrcweir nErrorCode, 677*cdf0e10cSrcweir aArguments, 678*cdf0e10cSrcweir rRequest->getContinuations(), 679*cdf0e10cSrcweir bObtainErrorStringOnly, 680*cdf0e10cSrcweir bHasErrorString, 681*cdf0e10cSrcweir rErrorString); 682*cdf0e10cSrcweir return true; 683*cdf0e10cSrcweir } 684*cdf0e10cSrcweir 685*cdf0e10cSrcweir sync2::BadPartnershipException aBadPartnershipException; 686*cdf0e10cSrcweir if (aAnyRequest >>= aBadPartnershipException) 687*cdf0e10cSrcweir { 688*cdf0e10cSrcweir ErrCode nErrorCode; 689*cdf0e10cSrcweir std::vector< rtl::OUString > aArguments; 690*cdf0e10cSrcweir if (aBadPartnershipException.Partnership.getLength() == 0) 691*cdf0e10cSrcweir nErrorCode = ERRCODE_UUI_BADPARTNERSHIP; 692*cdf0e10cSrcweir else 693*cdf0e10cSrcweir { 694*cdf0e10cSrcweir nErrorCode = ERRCODE_UUI_BADPARTNERSHIP_NAME; 695*cdf0e10cSrcweir aArguments.push_back(aBadPartnershipException.Partnership); 696*cdf0e10cSrcweir } 697*cdf0e10cSrcweir handleErrorHandlerRequest(task::InteractionClassification_ERROR, 698*cdf0e10cSrcweir nErrorCode, 699*cdf0e10cSrcweir aArguments, 700*cdf0e10cSrcweir rRequest->getContinuations(), 701*cdf0e10cSrcweir bObtainErrorStringOnly, 702*cdf0e10cSrcweir bHasErrorString, 703*cdf0e10cSrcweir rErrorString); 704*cdf0e10cSrcweir return true; 705*cdf0e10cSrcweir } 706*cdf0e10cSrcweir 707*cdf0e10cSrcweir configuration::backend::MergeRecoveryRequest aMergeRecoveryRequest; 708*cdf0e10cSrcweir if (aAnyRequest >>= aMergeRecoveryRequest) 709*cdf0e10cSrcweir { 710*cdf0e10cSrcweir ErrCode nErrorCode = aMergeRecoveryRequest.IsRemovalRequest 711*cdf0e10cSrcweir ? ERRCODE_UUI_CONFIGURATION_BROKENDATA_WITHREMOVE 712*cdf0e10cSrcweir : ERRCODE_UUI_CONFIGURATION_BROKENDATA_NOREMOVE; 713*cdf0e10cSrcweir 714*cdf0e10cSrcweir std::vector< rtl::OUString > aArguments; 715*cdf0e10cSrcweir aArguments.push_back(aMergeRecoveryRequest.ErrorLayerId); 716*cdf0e10cSrcweir 717*cdf0e10cSrcweir handleErrorHandlerRequest(task::InteractionClassification_ERROR, 718*cdf0e10cSrcweir nErrorCode, 719*cdf0e10cSrcweir aArguments, 720*cdf0e10cSrcweir rRequest->getContinuations(), 721*cdf0e10cSrcweir bObtainErrorStringOnly, 722*cdf0e10cSrcweir bHasErrorString, 723*cdf0e10cSrcweir rErrorString); 724*cdf0e10cSrcweir return true; 725*cdf0e10cSrcweir } 726*cdf0e10cSrcweir 727*cdf0e10cSrcweir configuration::backend::StratumCreationException 728*cdf0e10cSrcweir aStratumCreationException; 729*cdf0e10cSrcweir 730*cdf0e10cSrcweir if (aAnyRequest >>= aStratumCreationException) 731*cdf0e10cSrcweir { 732*cdf0e10cSrcweir const ErrCode nErrorCode = ERRCODE_UUI_CONFIGURATION_BACKENDMISSING; 733*cdf0e10cSrcweir 734*cdf0e10cSrcweir rtl::OUString aStratum = aStratumCreationException.StratumData; 735*cdf0e10cSrcweir if (aStratum.getLength() == 0) 736*cdf0e10cSrcweir aStratum = aStratumCreationException.StratumService; 737*cdf0e10cSrcweir 738*cdf0e10cSrcweir std::vector< rtl::OUString > aArguments; 739*cdf0e10cSrcweir aArguments.push_back(aStratum); 740*cdf0e10cSrcweir 741*cdf0e10cSrcweir handleErrorHandlerRequest(task::InteractionClassification_ERROR, 742*cdf0e10cSrcweir nErrorCode, 743*cdf0e10cSrcweir aArguments, 744*cdf0e10cSrcweir rRequest->getContinuations(), 745*cdf0e10cSrcweir bObtainErrorStringOnly, 746*cdf0e10cSrcweir bHasErrorString, 747*cdf0e10cSrcweir rErrorString); 748*cdf0e10cSrcweir return true; 749*cdf0e10cSrcweir } 750*cdf0e10cSrcweir 751*cdf0e10cSrcweir xforms::InvalidDataOnSubmitException aInvalidDataOnSubmitException; 752*cdf0e10cSrcweir if (aAnyRequest >>= aInvalidDataOnSubmitException) 753*cdf0e10cSrcweir { 754*cdf0e10cSrcweir const ErrCode nErrorCode = 755*cdf0e10cSrcweir ERRCODE_UUI_INVALID_XFORMS_SUBMISSION_DATA; 756*cdf0e10cSrcweir 757*cdf0e10cSrcweir std::vector< rtl::OUString > aArguments; 758*cdf0e10cSrcweir 759*cdf0e10cSrcweir handleErrorHandlerRequest(task::InteractionClassification_QUERY, 760*cdf0e10cSrcweir nErrorCode, 761*cdf0e10cSrcweir aArguments, 762*cdf0e10cSrcweir rRequest->getContinuations(), 763*cdf0e10cSrcweir bObtainErrorStringOnly, 764*cdf0e10cSrcweir bHasErrorString, 765*cdf0e10cSrcweir rErrorString); 766*cdf0e10cSrcweir return true; 767*cdf0e10cSrcweir } 768*cdf0e10cSrcweir 769*cdf0e10cSrcweir ucb::InteractiveLockingLockedException aLLException; 770*cdf0e10cSrcweir if (aAnyRequest >>= aLLException) 771*cdf0e10cSrcweir { 772*cdf0e10cSrcweir ErrCode nErrorCode = aLLException.SelfOwned 773*cdf0e10cSrcweir ? ERRCODE_UUI_LOCKING_LOCKED_SELF : ERRCODE_UUI_LOCKING_LOCKED; 774*cdf0e10cSrcweir std::vector< rtl::OUString > aArguments; 775*cdf0e10cSrcweir aArguments.push_back( aLLException.Url ); 776*cdf0e10cSrcweir 777*cdf0e10cSrcweir handleErrorHandlerRequest( aLLException.Classification, 778*cdf0e10cSrcweir nErrorCode, 779*cdf0e10cSrcweir aArguments, 780*cdf0e10cSrcweir rRequest->getContinuations(), 781*cdf0e10cSrcweir bObtainErrorStringOnly, 782*cdf0e10cSrcweir bHasErrorString, 783*cdf0e10cSrcweir rErrorString ); 784*cdf0e10cSrcweir return true; 785*cdf0e10cSrcweir } 786*cdf0e10cSrcweir 787*cdf0e10cSrcweir ucb::InteractiveLockingNotLockedException aLNLException; 788*cdf0e10cSrcweir if (aAnyRequest >>= aLNLException) 789*cdf0e10cSrcweir { 790*cdf0e10cSrcweir ErrCode nErrorCode = ERRCODE_UUI_LOCKING_NOT_LOCKED; 791*cdf0e10cSrcweir std::vector< rtl::OUString > aArguments; 792*cdf0e10cSrcweir aArguments.push_back( aLNLException.Url ); 793*cdf0e10cSrcweir 794*cdf0e10cSrcweir handleErrorHandlerRequest( aLNLException.Classification, 795*cdf0e10cSrcweir nErrorCode, 796*cdf0e10cSrcweir aArguments, 797*cdf0e10cSrcweir rRequest->getContinuations(), 798*cdf0e10cSrcweir bObtainErrorStringOnly, 799*cdf0e10cSrcweir bHasErrorString, 800*cdf0e10cSrcweir rErrorString ); 801*cdf0e10cSrcweir return true; 802*cdf0e10cSrcweir } 803*cdf0e10cSrcweir 804*cdf0e10cSrcweir ucb::InteractiveLockingLockExpiredException aLLEException; 805*cdf0e10cSrcweir if (aAnyRequest >>= aLLEException) 806*cdf0e10cSrcweir { 807*cdf0e10cSrcweir ErrCode nErrorCode = ERRCODE_UUI_LOCKING_LOCK_EXPIRED; 808*cdf0e10cSrcweir std::vector< rtl::OUString > aArguments; 809*cdf0e10cSrcweir aArguments.push_back( aLLEException.Url ); 810*cdf0e10cSrcweir 811*cdf0e10cSrcweir handleErrorHandlerRequest( aLLEException.Classification, 812*cdf0e10cSrcweir nErrorCode, 813*cdf0e10cSrcweir aArguments, 814*cdf0e10cSrcweir rRequest->getContinuations(), 815*cdf0e10cSrcweir bObtainErrorStringOnly, 816*cdf0e10cSrcweir bHasErrorString, 817*cdf0e10cSrcweir rErrorString ); 818*cdf0e10cSrcweir return true; 819*cdf0e10cSrcweir } 820*cdf0e10cSrcweir 821*cdf0e10cSrcweir document::BrokenPackageRequest aBrokenPackageRequest; 822*cdf0e10cSrcweir if (aAnyRequest >>= aBrokenPackageRequest) 823*cdf0e10cSrcweir { 824*cdf0e10cSrcweir std::vector< rtl::OUString > aArguments; 825*cdf0e10cSrcweir 826*cdf0e10cSrcweir if( aBrokenPackageRequest.aName.getLength() ) 827*cdf0e10cSrcweir aArguments.push_back( aBrokenPackageRequest.aName ); 828*cdf0e10cSrcweir 829*cdf0e10cSrcweir handleBrokenPackageRequest( aArguments, 830*cdf0e10cSrcweir rRequest->getContinuations(), 831*cdf0e10cSrcweir bObtainErrorStringOnly, 832*cdf0e10cSrcweir bHasErrorString, 833*cdf0e10cSrcweir rErrorString ); 834*cdf0e10cSrcweir return true; 835*cdf0e10cSrcweir } 836*cdf0e10cSrcweir 837*cdf0e10cSrcweir task::ErrorCodeRequest aErrorCodeRequest; 838*cdf0e10cSrcweir if (aAnyRequest >>= aErrorCodeRequest) 839*cdf0e10cSrcweir { 840*cdf0e10cSrcweir handleGenericErrorRequest( aErrorCodeRequest.ErrCode, 841*cdf0e10cSrcweir rRequest->getContinuations(), 842*cdf0e10cSrcweir bObtainErrorStringOnly, 843*cdf0e10cSrcweir bHasErrorString, 844*cdf0e10cSrcweir rErrorString); 845*cdf0e10cSrcweir return true; 846*cdf0e10cSrcweir } 847*cdf0e10cSrcweir 848*cdf0e10cSrcweir task::ErrorCodeIOException aErrorCodeIOException; 849*cdf0e10cSrcweir if (aAnyRequest >>= aErrorCodeIOException) 850*cdf0e10cSrcweir { 851*cdf0e10cSrcweir handleGenericErrorRequest( aErrorCodeIOException.ErrCode, 852*cdf0e10cSrcweir rRequest->getContinuations(), 853*cdf0e10cSrcweir bObtainErrorStringOnly, 854*cdf0e10cSrcweir bHasErrorString, 855*cdf0e10cSrcweir rErrorString); 856*cdf0e10cSrcweir return true; 857*cdf0e10cSrcweir } 858*cdf0e10cSrcweir 859*cdf0e10cSrcweir 860*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////// 861*cdf0e10cSrcweir // Handle requests which do not have a plain string representation. 862*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////// 863*cdf0e10cSrcweir if (!bObtainErrorStringOnly) 864*cdf0e10cSrcweir { 865*cdf0e10cSrcweir if ( handleAuthenticationRequest( rRequest ) ) 866*cdf0e10cSrcweir return true; 867*cdf0e10cSrcweir 868*cdf0e10cSrcweir if ( handleCertificateValidationRequest( rRequest ) ) 869*cdf0e10cSrcweir return true; 870*cdf0e10cSrcweir 871*cdf0e10cSrcweir ucb::NameClashResolveRequest aNameClashResolveRequest; 872*cdf0e10cSrcweir if (aAnyRequest >>= aNameClashResolveRequest) 873*cdf0e10cSrcweir { 874*cdf0e10cSrcweir handleNameClashResolveRequest(aNameClashResolveRequest, 875*cdf0e10cSrcweir rRequest->getContinuations()); 876*cdf0e10cSrcweir return true; 877*cdf0e10cSrcweir } 878*cdf0e10cSrcweir 879*cdf0e10cSrcweir if ( handleMasterPasswordRequest( rRequest ) ) 880*cdf0e10cSrcweir return true; 881*cdf0e10cSrcweir 882*cdf0e10cSrcweir if ( handlePasswordRequest( rRequest ) ) 883*cdf0e10cSrcweir return true; 884*cdf0e10cSrcweir 885*cdf0e10cSrcweir if ( handleCookiesRequest( rRequest ) ) 886*cdf0e10cSrcweir return true; 887*cdf0e10cSrcweir 888*cdf0e10cSrcweir if ( handleNoSuchFilterRequest( rRequest ) ) 889*cdf0e10cSrcweir return true; 890*cdf0e10cSrcweir 891*cdf0e10cSrcweir if ( handleAmbigousFilterRequest( rRequest ) ) 892*cdf0e10cSrcweir return true; 893*cdf0e10cSrcweir 894*cdf0e10cSrcweir if ( handleFilterOptionsRequest( rRequest ) ) 895*cdf0e10cSrcweir return true; 896*cdf0e10cSrcweir 897*cdf0e10cSrcweir if ( handleLockedDocumentRequest( rRequest ) ) 898*cdf0e10cSrcweir return true; 899*cdf0e10cSrcweir 900*cdf0e10cSrcweir if ( handleChangedByOthersRequest( rRequest ) ) 901*cdf0e10cSrcweir return true; 902*cdf0e10cSrcweir 903*cdf0e10cSrcweir if ( handleLockFileIgnoreRequest( rRequest ) ) 904*cdf0e10cSrcweir return true; 905*cdf0e10cSrcweir 906*cdf0e10cSrcweir task::DocumentMacroConfirmationRequest aMacroConfirmRequest; 907*cdf0e10cSrcweir if (aAnyRequest >>= aMacroConfirmRequest) 908*cdf0e10cSrcweir { 909*cdf0e10cSrcweir handleMacroConfirmRequest( 910*cdf0e10cSrcweir aMacroConfirmRequest.DocumentURL, 911*cdf0e10cSrcweir aMacroConfirmRequest.DocumentStorage, 912*cdf0e10cSrcweir aMacroConfirmRequest.DocumentVersion.getLength() ? aMacroConfirmRequest.DocumentVersion : ODFVER_012_TEXT, 913*cdf0e10cSrcweir aMacroConfirmRequest.DocumentSignatureInformation, 914*cdf0e10cSrcweir rRequest->getContinuations()); 915*cdf0e10cSrcweir return true; 916*cdf0e10cSrcweir } 917*cdf0e10cSrcweir 918*cdf0e10cSrcweir task::FutureDocumentVersionProductUpdateRequest 919*cdf0e10cSrcweir aProductUpdateRequest; 920*cdf0e10cSrcweir if (aAnyRequest >>= aProductUpdateRequest) 921*cdf0e10cSrcweir { 922*cdf0e10cSrcweir handleFutureDocumentVersionUpdateRequest( 923*cdf0e10cSrcweir aProductUpdateRequest, 924*cdf0e10cSrcweir rRequest->getContinuations()); 925*cdf0e10cSrcweir return true; 926*cdf0e10cSrcweir } 927*cdf0e10cSrcweir 928*cdf0e10cSrcweir /////////////////////////////////////////////////////////////// 929*cdf0e10cSrcweir // Last chance: interaction handlers registered in the configuration 930*cdf0e10cSrcweir /////////////////////////////////////////////////////////////// 931*cdf0e10cSrcweir 932*cdf0e10cSrcweir // typed InteractionHandlers (ooo.Interactions) 933*cdf0e10cSrcweir if ( handleTypedHandlerImplementations( rRequest ) ) 934*cdf0e10cSrcweir return true; 935*cdf0e10cSrcweir 936*cdf0e10cSrcweir // legacy configuration (ooo.ucb.InteractionHandlers) 937*cdf0e10cSrcweir if (tryOtherInteractionHandler( rRequest )) 938*cdf0e10cSrcweir return true; 939*cdf0e10cSrcweir } 940*cdf0e10cSrcweir 941*cdf0e10cSrcweir // Not handled. 942*cdf0e10cSrcweir return false; 943*cdf0e10cSrcweir } 944*cdf0e10cSrcweir catch (std::bad_alloc const &) 945*cdf0e10cSrcweir { 946*cdf0e10cSrcweir throw uno::RuntimeException( 947*cdf0e10cSrcweir rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("out of memory")), 948*cdf0e10cSrcweir uno::Reference< uno::XInterface >()); 949*cdf0e10cSrcweir } 950*cdf0e10cSrcweir catch( const uno::RuntimeException& ) 951*cdf0e10cSrcweir { 952*cdf0e10cSrcweir throw; // allowed to leave here 953*cdf0e10cSrcweir } 954*cdf0e10cSrcweir catch( const uno::Exception& ) 955*cdf0e10cSrcweir { 956*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 957*cdf0e10cSrcweir } 958*cdf0e10cSrcweir return false; 959*cdf0e10cSrcweir } 960*cdf0e10cSrcweir 961*cdf0e10cSrcweir void 962*cdf0e10cSrcweir UUIInteractionHelper::getInteractionHandlerList( 963*cdf0e10cSrcweir InteractionHandlerDataList &rdataList) 964*cdf0e10cSrcweir SAL_THROW((uno::RuntimeException)) 965*cdf0e10cSrcweir { 966*cdf0e10cSrcweir try 967*cdf0e10cSrcweir { 968*cdf0e10cSrcweir uno::Reference< lang::XMultiServiceFactory > xConfigProv( 969*cdf0e10cSrcweir m_xServiceFactory->createInstance( 970*cdf0e10cSrcweir rtl::OUString::createFromAscii( 971*cdf0e10cSrcweir "com.sun.star.configuration.ConfigurationProvider" ) ), 972*cdf0e10cSrcweir uno::UNO_QUERY ); 973*cdf0e10cSrcweir 974*cdf0e10cSrcweir if ( !xConfigProv.is() ) 975*cdf0e10cSrcweir throw uno::RuntimeException( 976*cdf0e10cSrcweir rtl::OUString( 977*cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( 978*cdf0e10cSrcweir "unable to instanciate config provider service")), 979*cdf0e10cSrcweir uno::Reference< uno::XInterface >()); 980*cdf0e10cSrcweir 981*cdf0e10cSrcweir rtl::OUStringBuffer aFullPath; 982*cdf0e10cSrcweir aFullPath.appendAscii( 983*cdf0e10cSrcweir "/org.openoffice.ucb.InteractionHandler/InteractionHandlers" ); 984*cdf0e10cSrcweir 985*cdf0e10cSrcweir uno::Sequence< uno::Any > aArguments( 1 ); 986*cdf0e10cSrcweir beans::PropertyValue aProperty; 987*cdf0e10cSrcweir aProperty.Name 988*cdf0e10cSrcweir = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "nodepath" ) ); 989*cdf0e10cSrcweir aProperty.Value <<= aFullPath.makeStringAndClear(); 990*cdf0e10cSrcweir aArguments[ 0 ] <<= aProperty; 991*cdf0e10cSrcweir 992*cdf0e10cSrcweir uno::Reference< uno::XInterface > xInterface( 993*cdf0e10cSrcweir xConfigProv->createInstanceWithArguments( 994*cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 995*cdf0e10cSrcweir "com.sun.star.configuration.ConfigurationAccess" ) ), 996*cdf0e10cSrcweir aArguments ) ); 997*cdf0e10cSrcweir 998*cdf0e10cSrcweir if ( !xInterface.is() ) 999*cdf0e10cSrcweir throw uno::RuntimeException( 1000*cdf0e10cSrcweir rtl::OUString( 1001*cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( 1002*cdf0e10cSrcweir "unable to instanciate config access")), 1003*cdf0e10cSrcweir uno::Reference< uno::XInterface >()); 1004*cdf0e10cSrcweir 1005*cdf0e10cSrcweir uno::Reference< container::XNameAccess > xNameAccess( 1006*cdf0e10cSrcweir xInterface, uno::UNO_QUERY ); 1007*cdf0e10cSrcweir if ( !xNameAccess.is() ) 1008*cdf0e10cSrcweir throw uno::RuntimeException( 1009*cdf0e10cSrcweir rtl::OUString( 1010*cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( 1011*cdf0e10cSrcweir "config access does not implement XNameAccess")), 1012*cdf0e10cSrcweir uno::Reference< uno::XInterface >()); 1013*cdf0e10cSrcweir 1014*cdf0e10cSrcweir uno::Sequence< rtl::OUString > aElems = xNameAccess->getElementNames(); 1015*cdf0e10cSrcweir const rtl::OUString* pElems = aElems.getConstArray(); 1016*cdf0e10cSrcweir sal_Int32 nCount = aElems.getLength(); 1017*cdf0e10cSrcweir 1018*cdf0e10cSrcweir if ( nCount > 0 ) 1019*cdf0e10cSrcweir { 1020*cdf0e10cSrcweir uno::Reference< container::XHierarchicalNameAccess > 1021*cdf0e10cSrcweir xHierNameAccess( xInterface, uno::UNO_QUERY ); 1022*cdf0e10cSrcweir 1023*cdf0e10cSrcweir if ( !xHierNameAccess.is() ) 1024*cdf0e10cSrcweir throw uno::RuntimeException( 1025*cdf0e10cSrcweir rtl::OUString( 1026*cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( 1027*cdf0e10cSrcweir "config access does not implement XHierarchicalNameAccess")), 1028*cdf0e10cSrcweir uno::Reference< uno::XInterface >()); 1029*cdf0e10cSrcweir 1030*cdf0e10cSrcweir // Iterate over children. 1031*cdf0e10cSrcweir for ( sal_Int32 n = 0; n < nCount; ++n ) 1032*cdf0e10cSrcweir { 1033*cdf0e10cSrcweir rtl::OUStringBuffer aElemBuffer; 1034*cdf0e10cSrcweir aElemBuffer.appendAscii( "['" ); 1035*cdf0e10cSrcweir aElemBuffer.append( pElems[ n ] ); 1036*cdf0e10cSrcweir 1037*cdf0e10cSrcweir try 1038*cdf0e10cSrcweir { 1039*cdf0e10cSrcweir InteractionHandlerData aInfo; 1040*cdf0e10cSrcweir 1041*cdf0e10cSrcweir // Obtain service name. 1042*cdf0e10cSrcweir rtl::OUStringBuffer aKeyBuffer = aElemBuffer; 1043*cdf0e10cSrcweir aKeyBuffer.appendAscii( "']/ServiceName" ); 1044*cdf0e10cSrcweir 1045*cdf0e10cSrcweir rtl::OUString aValue; 1046*cdf0e10cSrcweir if ( !( xHierNameAccess->getByHierarchicalName( 1047*cdf0e10cSrcweir aKeyBuffer.makeStringAndClear() ) >>= aValue ) ) 1048*cdf0e10cSrcweir { 1049*cdf0e10cSrcweir OSL_ENSURE( false, 1050*cdf0e10cSrcweir "GetInteractionHandlerList - " 1051*cdf0e10cSrcweir "Error getting item value!" ); 1052*cdf0e10cSrcweir continue; 1053*cdf0e10cSrcweir } 1054*cdf0e10cSrcweir 1055*cdf0e10cSrcweir aInfo.ServiceName = aValue; 1056*cdf0e10cSrcweir 1057*cdf0e10cSrcweir // Append info to list. 1058*cdf0e10cSrcweir rdataList.push_back( aInfo ); 1059*cdf0e10cSrcweir } 1060*cdf0e10cSrcweir catch ( container::NoSuchElementException& ) 1061*cdf0e10cSrcweir { 1062*cdf0e10cSrcweir // getByHierarchicalName 1063*cdf0e10cSrcweir 1064*cdf0e10cSrcweir OSL_ENSURE( false, 1065*cdf0e10cSrcweir "GetInteractionHandlerList - " 1066*cdf0e10cSrcweir "caught NoSuchElementException!" ); 1067*cdf0e10cSrcweir } 1068*cdf0e10cSrcweir } 1069*cdf0e10cSrcweir } 1070*cdf0e10cSrcweir } 1071*cdf0e10cSrcweir catch ( uno::RuntimeException const & ) 1072*cdf0e10cSrcweir { 1073*cdf0e10cSrcweir throw; 1074*cdf0e10cSrcweir } 1075*cdf0e10cSrcweir catch ( uno::Exception const & ) 1076*cdf0e10cSrcweir { 1077*cdf0e10cSrcweir OSL_ENSURE( false, "GetInteractionHandlerList - Caught Exception!" ); 1078*cdf0e10cSrcweir } 1079*cdf0e10cSrcweir } 1080*cdf0e10cSrcweir 1081*cdf0e10cSrcweir Window * 1082*cdf0e10cSrcweir UUIInteractionHelper::getParentProperty() 1083*cdf0e10cSrcweir SAL_THROW(()) 1084*cdf0e10cSrcweir { 1085*cdf0e10cSrcweir uno::Reference< awt::XWindow > xWindow = getParentXWindow(); 1086*cdf0e10cSrcweir if ( xWindow.is() ) 1087*cdf0e10cSrcweir return VCLUnoHelper::GetWindow(xWindow); 1088*cdf0e10cSrcweir 1089*cdf0e10cSrcweir return 0; 1090*cdf0e10cSrcweir } 1091*cdf0e10cSrcweir 1092*cdf0e10cSrcweir uno::Reference< awt::XWindow> 1093*cdf0e10cSrcweir UUIInteractionHelper::getParentXWindow() const 1094*cdf0e10cSrcweir SAL_THROW(()) 1095*cdf0e10cSrcweir { 1096*cdf0e10cSrcweir osl::MutexGuard aGuard(m_aPropertyMutex); 1097*cdf0e10cSrcweir ::comphelper::NamedValueCollection aProperties( m_aProperties ); 1098*cdf0e10cSrcweir if ( aProperties.has( "Parent" ) ) 1099*cdf0e10cSrcweir { 1100*cdf0e10cSrcweir uno::Reference< awt::XWindow > xWindow; 1101*cdf0e10cSrcweir OSL_VERIFY( aProperties.get( "Parent" ) >>= xWindow ); 1102*cdf0e10cSrcweir return xWindow; 1103*cdf0e10cSrcweir } 1104*cdf0e10cSrcweir return 0; 1105*cdf0e10cSrcweir } 1106*cdf0e10cSrcweir 1107*cdf0e10cSrcweir rtl::OUString 1108*cdf0e10cSrcweir UUIInteractionHelper::getContextProperty() 1109*cdf0e10cSrcweir SAL_THROW(()) 1110*cdf0e10cSrcweir { 1111*cdf0e10cSrcweir osl::MutexGuard aGuard(m_aPropertyMutex); 1112*cdf0e10cSrcweir for (sal_Int32 i = 0; i < m_aProperties.getLength(); ++i) 1113*cdf0e10cSrcweir { 1114*cdf0e10cSrcweir beans::PropertyValue aProperty; 1115*cdf0e10cSrcweir if ((m_aProperties[i] >>= aProperty) 1116*cdf0e10cSrcweir && aProperty. 1117*cdf0e10cSrcweir Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Context"))) 1118*cdf0e10cSrcweir { 1119*cdf0e10cSrcweir rtl::OUString aContext; 1120*cdf0e10cSrcweir aProperty.Value >>= aContext; 1121*cdf0e10cSrcweir return aContext; 1122*cdf0e10cSrcweir } 1123*cdf0e10cSrcweir } 1124*cdf0e10cSrcweir return rtl::OUString(); 1125*cdf0e10cSrcweir } 1126*cdf0e10cSrcweir 1127*cdf0e10cSrcweir uno::Reference< task::XInteractionHandler > 1128*cdf0e10cSrcweir UUIInteractionHelper::getInteractionHandler() 1129*cdf0e10cSrcweir SAL_THROW((uno::RuntimeException)) 1130*cdf0e10cSrcweir { 1131*cdf0e10cSrcweir uno::Reference< task::XInteractionHandler > xIH; 1132*cdf0e10cSrcweir try 1133*cdf0e10cSrcweir { 1134*cdf0e10cSrcweir xIH.set(m_xServiceFactory->createInstanceWithArguments( 1135*cdf0e10cSrcweir rtl::OUString( 1136*cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( 1137*cdf0e10cSrcweir "com.sun.star.task.InteractionHandler")), 1138*cdf0e10cSrcweir m_aProperties), 1139*cdf0e10cSrcweir uno::UNO_QUERY); 1140*cdf0e10cSrcweir } 1141*cdf0e10cSrcweir catch (uno::Exception const &) 1142*cdf0e10cSrcweir {} 1143*cdf0e10cSrcweir 1144*cdf0e10cSrcweir if (!xIH.is()) 1145*cdf0e10cSrcweir throw uno::RuntimeException( 1146*cdf0e10cSrcweir rtl::OUString( 1147*cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( 1148*cdf0e10cSrcweir "unable to instanciate Interaction Handler service")), 1149*cdf0e10cSrcweir uno::Reference< uno::XInterface >()); 1150*cdf0e10cSrcweir return xIH; 1151*cdf0e10cSrcweir } 1152*cdf0e10cSrcweir 1153*cdf0e10cSrcweir namespace { 1154*cdf0e10cSrcweir 1155*cdf0e10cSrcweir sal_uInt16 1156*cdf0e10cSrcweir executeMessageBox( 1157*cdf0e10cSrcweir Window * pParent, 1158*cdf0e10cSrcweir rtl::OUString const & rTitle, 1159*cdf0e10cSrcweir rtl::OUString const & rMessage, 1160*cdf0e10cSrcweir WinBits nButtonMask ) 1161*cdf0e10cSrcweir SAL_THROW((uno::RuntimeException)) 1162*cdf0e10cSrcweir { 1163*cdf0e10cSrcweir vos::OGuard aGuard(Application::GetSolarMutex()); 1164*cdf0e10cSrcweir 1165*cdf0e10cSrcweir MessBox xBox( pParent, nButtonMask, rTitle, rMessage ); 1166*cdf0e10cSrcweir 1167*cdf0e10cSrcweir sal_uInt16 aResult = xBox.Execute(); 1168*cdf0e10cSrcweir switch( aResult ) 1169*cdf0e10cSrcweir { 1170*cdf0e10cSrcweir case BUTTONID_OK: 1171*cdf0e10cSrcweir aResult = ERRCODE_BUTTON_OK; 1172*cdf0e10cSrcweir break; 1173*cdf0e10cSrcweir case BUTTONID_CANCEL: 1174*cdf0e10cSrcweir aResult = ERRCODE_BUTTON_CANCEL; 1175*cdf0e10cSrcweir break; 1176*cdf0e10cSrcweir case BUTTONID_YES: 1177*cdf0e10cSrcweir aResult = ERRCODE_BUTTON_YES; 1178*cdf0e10cSrcweir break; 1179*cdf0e10cSrcweir case BUTTONID_NO: 1180*cdf0e10cSrcweir aResult = ERRCODE_BUTTON_NO; 1181*cdf0e10cSrcweir break; 1182*cdf0e10cSrcweir case BUTTONID_RETRY: 1183*cdf0e10cSrcweir aResult = ERRCODE_BUTTON_RETRY; 1184*cdf0e10cSrcweir break; 1185*cdf0e10cSrcweir } 1186*cdf0e10cSrcweir 1187*cdf0e10cSrcweir return aResult; 1188*cdf0e10cSrcweir } 1189*cdf0e10cSrcweir 1190*cdf0e10cSrcweir NameClashResolveDialogResult executeSimpleNameClashResolveDialog( Window *pParent, 1191*cdf0e10cSrcweir rtl::OUString const & rTargetFolderURL, 1192*cdf0e10cSrcweir rtl::OUString const & rClashingName, 1193*cdf0e10cSrcweir rtl::OUString & rProposedNewName, 1194*cdf0e10cSrcweir bool bAllowOverwrite ) 1195*cdf0e10cSrcweir { 1196*cdf0e10cSrcweir std::auto_ptr< ResMgr > xManager( ResMgr::CreateResMgr( CREATEVERSIONRESMGR_NAME( uui ) ) ); 1197*cdf0e10cSrcweir if ( !xManager.get() ) 1198*cdf0e10cSrcweir return ABORT; 1199*cdf0e10cSrcweir 1200*cdf0e10cSrcweir NameClashDialog aDialog( pParent, xManager.get(), rTargetFolderURL, 1201*cdf0e10cSrcweir rClashingName, rProposedNewName, bAllowOverwrite ); 1202*cdf0e10cSrcweir 1203*cdf0e10cSrcweir NameClashResolveDialogResult eResult = (NameClashResolveDialogResult) aDialog.Execute(); 1204*cdf0e10cSrcweir rProposedNewName = aDialog.getNewName(); 1205*cdf0e10cSrcweir return eResult; 1206*cdf0e10cSrcweir } 1207*cdf0e10cSrcweir 1208*cdf0e10cSrcweir } // namespace 1209*cdf0e10cSrcweir 1210*cdf0e10cSrcweir void 1211*cdf0e10cSrcweir UUIInteractionHelper::handleNameClashResolveRequest( 1212*cdf0e10cSrcweir ucb::NameClashResolveRequest const & rRequest, 1213*cdf0e10cSrcweir uno::Sequence< uno::Reference< 1214*cdf0e10cSrcweir task::XInteractionContinuation > > const & rContinuations) 1215*cdf0e10cSrcweir SAL_THROW((uno::RuntimeException)) 1216*cdf0e10cSrcweir { 1217*cdf0e10cSrcweir OSL_ENSURE( 1218*cdf0e10cSrcweir rRequest.TargetFolderURL.getLength() > 0, 1219*cdf0e10cSrcweir "NameClashResolveRequest must not contain empty TargetFolderURL" ); 1220*cdf0e10cSrcweir 1221*cdf0e10cSrcweir OSL_ENSURE( 1222*cdf0e10cSrcweir rRequest.ClashingName.getLength() > 0, 1223*cdf0e10cSrcweir "NameClashResolveRequest must not contain empty ClashingName" ); 1224*cdf0e10cSrcweir 1225*cdf0e10cSrcweir uno::Reference< task::XInteractionAbort > xAbort; 1226*cdf0e10cSrcweir uno::Reference< ucb::XInteractionSupplyName > xSupplyName; 1227*cdf0e10cSrcweir uno::Reference< ucb::XInteractionReplaceExistingData > xReplaceExistingData; 1228*cdf0e10cSrcweir getContinuations( 1229*cdf0e10cSrcweir rContinuations, &xAbort, &xSupplyName, &xReplaceExistingData); 1230*cdf0e10cSrcweir 1231*cdf0e10cSrcweir OSL_ENSURE( xAbort.is(), 1232*cdf0e10cSrcweir "NameClashResolveRequest must contain Abort continuation" ); 1233*cdf0e10cSrcweir 1234*cdf0e10cSrcweir OSL_ENSURE( xSupplyName.is(), 1235*cdf0e10cSrcweir "NameClashResolveRequest must contain SupplyName continuation" ); 1236*cdf0e10cSrcweir 1237*cdf0e10cSrcweir NameClashResolveDialogResult eResult = ABORT; 1238*cdf0e10cSrcweir rtl::OUString aProposedNewName( rRequest.ProposedNewName ); 1239*cdf0e10cSrcweir 1240*cdf0e10cSrcweir eResult = executeSimpleNameClashResolveDialog( getParentProperty(), 1241*cdf0e10cSrcweir rRequest.TargetFolderURL, 1242*cdf0e10cSrcweir rRequest.ClashingName, 1243*cdf0e10cSrcweir aProposedNewName, 1244*cdf0e10cSrcweir xReplaceExistingData.is() ); 1245*cdf0e10cSrcweir 1246*cdf0e10cSrcweir switch ( eResult ) 1247*cdf0e10cSrcweir { 1248*cdf0e10cSrcweir case ABORT: 1249*cdf0e10cSrcweir xAbort->select(); 1250*cdf0e10cSrcweir break; 1251*cdf0e10cSrcweir 1252*cdf0e10cSrcweir case RENAME: 1253*cdf0e10cSrcweir xSupplyName->setName( aProposedNewName ); 1254*cdf0e10cSrcweir xSupplyName->select(); 1255*cdf0e10cSrcweir break; 1256*cdf0e10cSrcweir 1257*cdf0e10cSrcweir case OVERWRITE: 1258*cdf0e10cSrcweir OSL_ENSURE( 1259*cdf0e10cSrcweir xReplaceExistingData.is(), 1260*cdf0e10cSrcweir "Invalid NameClashResolveDialogResult: OVERWRITE - " 1261*cdf0e10cSrcweir "No ReplaceExistingData continuation available!" ); 1262*cdf0e10cSrcweir xReplaceExistingData->select(); 1263*cdf0e10cSrcweir break; 1264*cdf0e10cSrcweir } 1265*cdf0e10cSrcweir } 1266*cdf0e10cSrcweir 1267*cdf0e10cSrcweir void 1268*cdf0e10cSrcweir UUIInteractionHelper::handleGenericErrorRequest( 1269*cdf0e10cSrcweir sal_Int32 nErrorCode, 1270*cdf0e10cSrcweir uno::Sequence< uno::Reference< 1271*cdf0e10cSrcweir task::XInteractionContinuation > > const & rContinuations, 1272*cdf0e10cSrcweir bool bObtainErrorStringOnly, 1273*cdf0e10cSrcweir bool & bHasErrorString, 1274*cdf0e10cSrcweir rtl::OUString & rErrorString) 1275*cdf0e10cSrcweir SAL_THROW((uno::RuntimeException)) 1276*cdf0e10cSrcweir { 1277*cdf0e10cSrcweir if (bObtainErrorStringOnly) 1278*cdf0e10cSrcweir { 1279*cdf0e10cSrcweir bHasErrorString = isInformationalErrorMessageRequest(rContinuations); 1280*cdf0e10cSrcweir if (bHasErrorString) 1281*cdf0e10cSrcweir { 1282*cdf0e10cSrcweir String aErrorString; 1283*cdf0e10cSrcweir ErrorHandler::GetErrorString(nErrorCode, aErrorString); 1284*cdf0e10cSrcweir rErrorString = aErrorString; 1285*cdf0e10cSrcweir } 1286*cdf0e10cSrcweir } 1287*cdf0e10cSrcweir else 1288*cdf0e10cSrcweir { 1289*cdf0e10cSrcweir uno::Reference< task::XInteractionAbort > xAbort; 1290*cdf0e10cSrcweir uno::Reference< task::XInteractionApprove > xApprove; 1291*cdf0e10cSrcweir getContinuations(rContinuations, &xApprove, &xAbort); 1292*cdf0e10cSrcweir 1293*cdf0e10cSrcweir // Note: It's important to convert the transported long to the 1294*cdf0e10cSrcweir // required unsigned long value. Otherwhise using as flag field 1295*cdf0e10cSrcweir // can fail ... 1296*cdf0e10cSrcweir ErrCode nError = static_cast< ErrCode >(nErrorCode); 1297*cdf0e10cSrcweir sal_Bool bWarning = !ERRCODE_TOERROR(nError); 1298*cdf0e10cSrcweir 1299*cdf0e10cSrcweir if ( nError == ERRCODE_SFX_BROKENSIGNATURE 1300*cdf0e10cSrcweir || nError == ERRCODE_SFX_INCOMPLETE_ENCRYPTION ) 1301*cdf0e10cSrcweir { 1302*cdf0e10cSrcweir // the security warning box needs a special title 1303*cdf0e10cSrcweir String aErrorString; 1304*cdf0e10cSrcweir ErrorHandler::GetErrorString( nErrorCode, aErrorString ); 1305*cdf0e10cSrcweir 1306*cdf0e10cSrcweir std::auto_ptr< ResMgr > xManager( 1307*cdf0e10cSrcweir ResMgr::CreateResMgr( CREATEVERSIONRESMGR_NAME( uui ) ) ); 1308*cdf0e10cSrcweir ::rtl::OUString aTitle; 1309*cdf0e10cSrcweir 1310*cdf0e10cSrcweir try 1311*cdf0e10cSrcweir { 1312*cdf0e10cSrcweir uno::Any aProductNameAny = 1313*cdf0e10cSrcweir ::utl::ConfigManager::GetConfigManager() 1314*cdf0e10cSrcweir ->GetDirectConfigProperty( 1315*cdf0e10cSrcweir ::utl::ConfigManager::PRODUCTNAME ); 1316*cdf0e10cSrcweir aProductNameAny >>= aTitle; 1317*cdf0e10cSrcweir } 1318*cdf0e10cSrcweir catch( uno::Exception& ) 1319*cdf0e10cSrcweir { 1320*cdf0e10cSrcweir } 1321*cdf0e10cSrcweir 1322*cdf0e10cSrcweir ::rtl::OUString aErrTitle 1323*cdf0e10cSrcweir = String( ResId( nError == ERRCODE_SFX_BROKENSIGNATURE 1324*cdf0e10cSrcweir ? STR_WARNING_BROKENSIGNATURE_TITLE 1325*cdf0e10cSrcweir : STR_WARNING_INCOMPLETE_ENCRYPTION_TITLE, 1326*cdf0e10cSrcweir *xManager.get() ) ); 1327*cdf0e10cSrcweir 1328*cdf0e10cSrcweir if ( aTitle.getLength() && aErrTitle.getLength() ) 1329*cdf0e10cSrcweir aTitle += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " - " ) ); 1330*cdf0e10cSrcweir aTitle += aErrTitle; 1331*cdf0e10cSrcweir 1332*cdf0e10cSrcweir executeMessageBox( 1333*cdf0e10cSrcweir getParentProperty(), aTitle, aErrorString, WB_OK ); 1334*cdf0e10cSrcweir } 1335*cdf0e10cSrcweir else 1336*cdf0e10cSrcweir ErrorHandler::HandleError(nErrorCode); 1337*cdf0e10cSrcweir 1338*cdf0e10cSrcweir if (xApprove.is() && bWarning) 1339*cdf0e10cSrcweir xApprove->select(); 1340*cdf0e10cSrcweir else if (xAbort.is()) 1341*cdf0e10cSrcweir xAbort->select(); 1342*cdf0e10cSrcweir } 1343*cdf0e10cSrcweir } 1344*cdf0e10cSrcweir 1345*cdf0e10cSrcweir void 1346*cdf0e10cSrcweir UUIInteractionHelper::handleMacroConfirmRequest( 1347*cdf0e10cSrcweir const ::rtl::OUString& aDocumentURL, 1348*cdf0e10cSrcweir const uno::Reference< embed::XStorage >& xZipStorage, 1349*cdf0e10cSrcweir const ::rtl::OUString& aDocumentVersion, 1350*cdf0e10cSrcweir const uno::Sequence< security::DocumentSignatureInformation > aSignInfo, 1351*cdf0e10cSrcweir uno::Sequence< uno::Reference< task::XInteractionContinuation > > const & 1352*cdf0e10cSrcweir rContinuations ) 1353*cdf0e10cSrcweir SAL_THROW((uno::RuntimeException)) 1354*cdf0e10cSrcweir { 1355*cdf0e10cSrcweir uno::Reference< task::XInteractionAbort > xAbort; 1356*cdf0e10cSrcweir uno::Reference< task::XInteractionApprove > xApprove; 1357*cdf0e10cSrcweir getContinuations( rContinuations, &xApprove, &xAbort ); 1358*cdf0e10cSrcweir 1359*cdf0e10cSrcweir bool bApprove = false; 1360*cdf0e10cSrcweir 1361*cdf0e10cSrcweir std::auto_ptr< ResMgr > pResMgr( 1362*cdf0e10cSrcweir ResMgr::CreateResMgr( CREATEVERSIONRESMGR_NAME( uui ) ) ); 1363*cdf0e10cSrcweir if ( pResMgr.get() ) 1364*cdf0e10cSrcweir { 1365*cdf0e10cSrcweir bool bShowSignatures = aSignInfo.getLength() > 0; 1366*cdf0e10cSrcweir MacroWarning aWarning( 1367*cdf0e10cSrcweir getParentProperty(), bShowSignatures, *pResMgr.get() ); 1368*cdf0e10cSrcweir 1369*cdf0e10cSrcweir aWarning.SetDocumentURL( aDocumentURL ); 1370*cdf0e10cSrcweir if ( aSignInfo.getLength() > 1 ) 1371*cdf0e10cSrcweir { 1372*cdf0e10cSrcweir aWarning.SetStorage( xZipStorage, aDocumentVersion, aSignInfo ); 1373*cdf0e10cSrcweir } 1374*cdf0e10cSrcweir else if ( aSignInfo.getLength() == 1 ) 1375*cdf0e10cSrcweir { 1376*cdf0e10cSrcweir aWarning.SetCertificate( aSignInfo[ 0 ].Signer ); 1377*cdf0e10cSrcweir } 1378*cdf0e10cSrcweir 1379*cdf0e10cSrcweir bApprove = aWarning.Execute() == RET_OK; 1380*cdf0e10cSrcweir } 1381*cdf0e10cSrcweir 1382*cdf0e10cSrcweir if ( bApprove && xApprove.is() ) 1383*cdf0e10cSrcweir xApprove->select(); 1384*cdf0e10cSrcweir else if ( xAbort.is() ) 1385*cdf0e10cSrcweir xAbort->select(); 1386*cdf0e10cSrcweir } 1387*cdf0e10cSrcweir 1388*cdf0e10cSrcweir void 1389*cdf0e10cSrcweir UUIInteractionHelper::handleFutureDocumentVersionUpdateRequest( 1390*cdf0e10cSrcweir const task::FutureDocumentVersionProductUpdateRequest& _rRequest, 1391*cdf0e10cSrcweir uno::Sequence< uno::Reference< task::XInteractionContinuation > > const & 1392*cdf0e10cSrcweir rContinuations ) 1393*cdf0e10cSrcweir SAL_THROW((uno::RuntimeException)) 1394*cdf0e10cSrcweir { 1395*cdf0e10cSrcweir uno::Reference< task::XInteractionAbort > xAbort; 1396*cdf0e10cSrcweir uno::Reference< task::XInteractionApprove > xApprove; 1397*cdf0e10cSrcweir uno::Reference< task::XInteractionAskLater > xAskLater; 1398*cdf0e10cSrcweir getContinuations( rContinuations, &xApprove, &xAbort, &xAskLater ); 1399*cdf0e10cSrcweir 1400*cdf0e10cSrcweir short nResult = RET_CANCEL; 1401*cdf0e10cSrcweir 1402*cdf0e10cSrcweir static bool s_bDeferredToNextSession = false; 1403*cdf0e10cSrcweir // TODO: this static variable is somewhat hacky. Formerly (before the dialog was moved from SFX2 to the 1404*cdf0e10cSrcweir // interaction handler implementation), this was stored in SFX_APP()'s impl structure, in member 1405*cdf0e10cSrcweir // bODFVersionWarningLater. Of course, we do not have access to it here. 1406*cdf0e10cSrcweir // 1407*cdf0e10cSrcweir // A proper solution which I would envision would be: 1408*cdf0e10cSrcweir // - There's a central implementation (this one here) of css.task.InteractionHandler 1409*cdf0e10cSrcweir // - There's a configuration which maps UNO names to service names 1410*cdf0e10cSrcweir // - If the handler is confronted with a request, it tries to find the name of the UNO structure describing 1411*cdf0e10cSrcweir // the request in the said configuration. 1412*cdf0e10cSrcweir // - If an entry is found, then 1413*cdf0e10cSrcweir // - the respective service is instantiated 1414*cdf0e10cSrcweir // - the component is queried for css.task.XInteractionHandler, and the request is delegated 1415*cdf0e10cSrcweir // - if no entry is found, then the request is silenced (with calling the AbortContinuation, if possible) 1416*cdf0e10cSrcweir // This way, the FutureDocumentVersionProductUpdateRequest could be handled in SFX (or any other 1417*cdf0e10cSrcweir // suitable place), again, and we would only have one place where we remember the s_bDeferredToNextSession 1418*cdf0e10cSrcweir // flag. 1419*cdf0e10cSrcweir // 1420*cdf0e10cSrcweir // Note: The above pattern has been implemented in CWS autorecovery. Now the remaining task is to move the 1421*cdf0e10cSrcweir // handling of this interaction to SFX, again. 1422*cdf0e10cSrcweir 1423*cdf0e10cSrcweir if ( !s_bDeferredToNextSession ) 1424*cdf0e10cSrcweir { 1425*cdf0e10cSrcweir std::auto_ptr< ResMgr > pResMgr( 1426*cdf0e10cSrcweir ResMgr::CreateResMgr( CREATEVERSIONRESMGR_NAME( uui ) ) ); 1427*cdf0e10cSrcweir if ( pResMgr.get() ) 1428*cdf0e10cSrcweir { 1429*cdf0e10cSrcweir ::uui::NewerVersionWarningDialog aDialog( 1430*cdf0e10cSrcweir getParentProperty(), 1431*cdf0e10cSrcweir _rRequest.DocumentODFVersion, 1432*cdf0e10cSrcweir *pResMgr.get() ); 1433*cdf0e10cSrcweir nResult = aDialog.Execute(); 1434*cdf0e10cSrcweir } 1435*cdf0e10cSrcweir } 1436*cdf0e10cSrcweir 1437*cdf0e10cSrcweir switch ( nResult ) 1438*cdf0e10cSrcweir { 1439*cdf0e10cSrcweir case RET_OK: 1440*cdf0e10cSrcweir if ( xApprove.is() ) 1441*cdf0e10cSrcweir xApprove->select(); 1442*cdf0e10cSrcweir break; 1443*cdf0e10cSrcweir case RET_CANCEL: 1444*cdf0e10cSrcweir if ( xAbort.is() ) 1445*cdf0e10cSrcweir xAbort->select(); 1446*cdf0e10cSrcweir break; 1447*cdf0e10cSrcweir case RET_ASK_LATER: 1448*cdf0e10cSrcweir if ( xAskLater.is() ) 1449*cdf0e10cSrcweir xAskLater->select(); 1450*cdf0e10cSrcweir s_bDeferredToNextSession = true; 1451*cdf0e10cSrcweir break; 1452*cdf0e10cSrcweir default: 1453*cdf0e10cSrcweir OSL_ENSURE( false, 1454*cdf0e10cSrcweir "UUIInteractionHelper::handleFutureDocumentVersionUpdateRequest: " 1455*cdf0e10cSrcweir "unexpected dialog return value!" ); 1456*cdf0e10cSrcweir break; 1457*cdf0e10cSrcweir } 1458*cdf0e10cSrcweir } 1459*cdf0e10cSrcweir 1460*cdf0e10cSrcweir void 1461*cdf0e10cSrcweir UUIInteractionHelper::handleBrokenPackageRequest( 1462*cdf0e10cSrcweir std::vector< rtl::OUString > const & rArguments, 1463*cdf0e10cSrcweir uno::Sequence< uno::Reference< task::XInteractionContinuation > > const & 1464*cdf0e10cSrcweir rContinuations, 1465*cdf0e10cSrcweir bool bObtainErrorStringOnly, 1466*cdf0e10cSrcweir bool & bHasErrorString, 1467*cdf0e10cSrcweir rtl::OUString & rErrorString) 1468*cdf0e10cSrcweir SAL_THROW((uno::RuntimeException)) 1469*cdf0e10cSrcweir { 1470*cdf0e10cSrcweir if (bObtainErrorStringOnly) 1471*cdf0e10cSrcweir { 1472*cdf0e10cSrcweir bHasErrorString = isInformationalErrorMessageRequest(rContinuations); 1473*cdf0e10cSrcweir if (!bHasErrorString) 1474*cdf0e10cSrcweir return; 1475*cdf0e10cSrcweir } 1476*cdf0e10cSrcweir 1477*cdf0e10cSrcweir uno::Reference< task::XInteractionApprove > xApprove; 1478*cdf0e10cSrcweir uno::Reference< task::XInteractionDisapprove > xDisapprove; 1479*cdf0e10cSrcweir uno::Reference< task::XInteractionAbort > xAbort; 1480*cdf0e10cSrcweir getContinuations(rContinuations, &xApprove, &xDisapprove, &xAbort); 1481*cdf0e10cSrcweir 1482*cdf0e10cSrcweir ErrCode nErrorCode; 1483*cdf0e10cSrcweir if( xApprove.is() && xDisapprove.is() ) 1484*cdf0e10cSrcweir { 1485*cdf0e10cSrcweir nErrorCode = ERRCODE_UUI_IO_BROKENPACKAGE; 1486*cdf0e10cSrcweir } 1487*cdf0e10cSrcweir else if ( xAbort.is() ) 1488*cdf0e10cSrcweir { 1489*cdf0e10cSrcweir nErrorCode = ERRCODE_UUI_IO_BROKENPACKAGE_CANTREPAIR; 1490*cdf0e10cSrcweir } 1491*cdf0e10cSrcweir else 1492*cdf0e10cSrcweir return; 1493*cdf0e10cSrcweir 1494*cdf0e10cSrcweir ::rtl::OUString aMessage; 1495*cdf0e10cSrcweir { 1496*cdf0e10cSrcweir vos::OGuard aGuard(Application::GetSolarMutex()); 1497*cdf0e10cSrcweir std::auto_ptr< ResMgr > xManager( 1498*cdf0e10cSrcweir ResMgr::CreateResMgr(CREATEVERSIONRESMGR_NAME(uui))); 1499*cdf0e10cSrcweir if (!xManager.get()) 1500*cdf0e10cSrcweir return; 1501*cdf0e10cSrcweir 1502*cdf0e10cSrcweir ResId aResId( RID_UUI_ERRHDL, *xManager.get() ); 1503*cdf0e10cSrcweir if ( !ErrorResource(aResId).getString(nErrorCode, &aMessage) ) 1504*cdf0e10cSrcweir return; 1505*cdf0e10cSrcweir } 1506*cdf0e10cSrcweir 1507*cdf0e10cSrcweir aMessage = replaceMessageWithArguments( aMessage, rArguments ); 1508*cdf0e10cSrcweir 1509*cdf0e10cSrcweir if (bObtainErrorStringOnly) 1510*cdf0e10cSrcweir { 1511*cdf0e10cSrcweir rErrorString = aMessage; 1512*cdf0e10cSrcweir return; 1513*cdf0e10cSrcweir } 1514*cdf0e10cSrcweir 1515*cdf0e10cSrcweir WinBits nButtonMask; 1516*cdf0e10cSrcweir if( xApprove.is() && xDisapprove.is() ) 1517*cdf0e10cSrcweir { 1518*cdf0e10cSrcweir nButtonMask = WB_YES_NO | WB_DEF_YES; 1519*cdf0e10cSrcweir } 1520*cdf0e10cSrcweir else if ( xAbort.is() ) 1521*cdf0e10cSrcweir { 1522*cdf0e10cSrcweir nButtonMask = WB_OK; 1523*cdf0e10cSrcweir } 1524*cdf0e10cSrcweir else 1525*cdf0e10cSrcweir return; 1526*cdf0e10cSrcweir 1527*cdf0e10cSrcweir uno::Any aProductNameAny = 1528*cdf0e10cSrcweir ::utl::ConfigManager::GetConfigManager()->GetDirectConfigProperty( 1529*cdf0e10cSrcweir ::utl::ConfigManager::PRODUCTNAME ); 1530*cdf0e10cSrcweir uno::Any aProductVersionAny = 1531*cdf0e10cSrcweir ::utl::ConfigManager::GetConfigManager()->GetDirectConfigProperty( 1532*cdf0e10cSrcweir ::utl::ConfigManager::PRODUCTVERSION ); 1533*cdf0e10cSrcweir ::rtl::OUString aProductName, aProductVersion; 1534*cdf0e10cSrcweir if ( !( aProductNameAny >>= aProductName ) ) 1535*cdf0e10cSrcweir aProductName 1536*cdf0e10cSrcweir = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("StarOffice") ); 1537*cdf0e10cSrcweir 1538*cdf0e10cSrcweir ::rtl::OUString aTitle( aProductName ); 1539*cdf0e10cSrcweir if( aProductVersionAny >>= aProductVersion ) 1540*cdf0e10cSrcweir { 1541*cdf0e10cSrcweir aTitle += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(" ") ); 1542*cdf0e10cSrcweir aTitle += aProductVersion; 1543*cdf0e10cSrcweir } 1544*cdf0e10cSrcweir 1545*cdf0e10cSrcweir switch ( executeMessageBox( getParentProperty(), 1546*cdf0e10cSrcweir aTitle, 1547*cdf0e10cSrcweir aMessage, 1548*cdf0e10cSrcweir nButtonMask )) 1549*cdf0e10cSrcweir { 1550*cdf0e10cSrcweir case ERRCODE_BUTTON_OK: 1551*cdf0e10cSrcweir OSL_ENSURE( xAbort.is(), "unexpected situation" ); 1552*cdf0e10cSrcweir if (xAbort.is()) 1553*cdf0e10cSrcweir xAbort->select(); 1554*cdf0e10cSrcweir break; 1555*cdf0e10cSrcweir 1556*cdf0e10cSrcweir case ERRCODE_BUTTON_NO: 1557*cdf0e10cSrcweir OSL_ENSURE(xDisapprove.is(), "unexpected situation"); 1558*cdf0e10cSrcweir if (xDisapprove.is()) 1559*cdf0e10cSrcweir xDisapprove->select(); 1560*cdf0e10cSrcweir break; 1561*cdf0e10cSrcweir 1562*cdf0e10cSrcweir case ERRCODE_BUTTON_YES: 1563*cdf0e10cSrcweir OSL_ENSURE(xApprove.is(), "unexpected situation"); 1564*cdf0e10cSrcweir if (xApprove.is()) 1565*cdf0e10cSrcweir xApprove->select(); 1566*cdf0e10cSrcweir break; 1567*cdf0e10cSrcweir } 1568*cdf0e10cSrcweir } 1569*cdf0e10cSrcweir 1570*cdf0e10cSrcweir //========================================================================= 1571*cdf0e10cSrcweir // ErrorResource Implementation 1572*cdf0e10cSrcweir //========================================================================= 1573*cdf0e10cSrcweir 1574*cdf0e10cSrcweir bool 1575*cdf0e10cSrcweir ErrorResource::getString(ErrCode nErrorCode, rtl::OUString * pString) 1576*cdf0e10cSrcweir const SAL_THROW(()) 1577*cdf0e10cSrcweir { 1578*cdf0e10cSrcweir OSL_ENSURE(pString, "specification violation"); 1579*cdf0e10cSrcweir ResId aResId(static_cast< sal_uInt16 >(nErrorCode & ERRCODE_RES_MASK), 1580*cdf0e10cSrcweir *m_pResMgr); 1581*cdf0e10cSrcweir aResId.SetRT(RSC_STRING); 1582*cdf0e10cSrcweir if (!IsAvailableRes(aResId)) 1583*cdf0e10cSrcweir return false; 1584*cdf0e10cSrcweir aResId.SetAutoRelease(false); 1585*cdf0e10cSrcweir *pString = UniString(aResId); 1586*cdf0e10cSrcweir m_pResMgr->PopContext(); 1587*cdf0e10cSrcweir return true; 1588*cdf0e10cSrcweir } 1589