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: */
|