16d739b60SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
36d739b60SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
46d739b60SAndrew Rist * or more contributor license agreements. See the NOTICE file
56d739b60SAndrew Rist * distributed with this work for additional information
66d739b60SAndrew Rist * regarding copyright ownership. The ASF licenses this file
76d739b60SAndrew Rist * to you under the Apache License, Version 2.0 (the
86d739b60SAndrew Rist * "License"); you may not use this file except in compliance
96d739b60SAndrew Rist * with the License. You may obtain a copy of the License at
106d739b60SAndrew Rist *
116d739b60SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
126d739b60SAndrew Rist *
136d739b60SAndrew Rist * Unless required by applicable law or agreed to in writing,
146d739b60SAndrew Rist * software distributed under the License is distributed on an
156d739b60SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
166d739b60SAndrew Rist * KIND, either express or implied. See the License for the
176d739b60SAndrew Rist * specific language governing permissions and limitations
186d739b60SAndrew Rist * under the License.
196d739b60SAndrew Rist *
206d739b60SAndrew Rist *************************************************************/
216d739b60SAndrew Rist
226d739b60SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_framework.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include "interaction/quietinteraction.hxx"
28cdf0e10cSrcweir
29cdf0e10cSrcweir //_________________________________________________________________________________________________________________
30cdf0e10cSrcweir // my own includes
31cdf0e10cSrcweir //_________________________________________________________________________________________________________________
32cdf0e10cSrcweir #include <threadhelp/readguard.hxx>
33cdf0e10cSrcweir #include <threadhelp/writeguard.hxx>
34cdf0e10cSrcweir #include <macros/generic.hxx>
35cdf0e10cSrcweir #include <macros/debug.hxx>
36cdf0e10cSrcweir
37cdf0e10cSrcweir //_________________________________________________________________________________________________________________
38cdf0e10cSrcweir // interface includes
39cdf0e10cSrcweir //_________________________________________________________________________________________________________________
40cdf0e10cSrcweir #include <com/sun/star/task/XInteractionAbort.hpp>
41cdf0e10cSrcweir #include <com/sun/star/task/XInteractionApprove.hpp>
42cdf0e10cSrcweir #include <com/sun/star/document/XInteractionFilterSelect.hpp>
43cdf0e10cSrcweir #include <com/sun/star/document/XInteractionFilterOptions.hpp>
44cdf0e10cSrcweir #include <com/sun/star/document/AmbigousFilterRequest.hpp>
45cdf0e10cSrcweir #include <com/sun/star/document/FilterOptionsRequest.hpp>
46cdf0e10cSrcweir #include <com/sun/star/task/ErrorCodeRequest.hpp>
47cdf0e10cSrcweir
48cdf0e10cSrcweir #ifndef _COM_SUN_STAR_DOCUMENT_LOCKEDDOCUMENTREQUEST_HPP_
49cdf0e10cSrcweir #include <com/sun/star/document/LockedDocumentRequest.hpp>
50cdf0e10cSrcweir #endif
51cdf0e10cSrcweir
52cdf0e10cSrcweir //_________________________________________________________________________________________________________________
53cdf0e10cSrcweir // other includes
54cdf0e10cSrcweir //_________________________________________________________________________________________________________________
55cdf0e10cSrcweir #include <vcl/svapp.hxx>
56cdf0e10cSrcweir
57cdf0e10cSrcweir #ifndef __RSC
58cdf0e10cSrcweir #include <tools/errinf.hxx>
59cdf0e10cSrcweir #endif
60cdf0e10cSrcweir
61cdf0e10cSrcweir //_________________________________________________________________________________________________________________
62cdf0e10cSrcweir // namespace
63cdf0e10cSrcweir //_________________________________________________________________________________________________________________
64cdf0e10cSrcweir
65cdf0e10cSrcweir namespace framework{
66cdf0e10cSrcweir
67cdf0e10cSrcweir //_________________________________________________________________________________________________________________
68cdf0e10cSrcweir // exported const
69cdf0e10cSrcweir //_________________________________________________________________________________________________________________
70cdf0e10cSrcweir
71cdf0e10cSrcweir //_________________________________________________________________________________________________________________
72cdf0e10cSrcweir // exported definitions
73cdf0e10cSrcweir //_________________________________________________________________________________________________________________
74cdf0e10cSrcweir
DEFINE_XINTERFACE_2(QuietInteraction,OWeakObject,DIRECT_INTERFACE (css::lang::XTypeProvider),DIRECT_INTERFACE (css::task::XInteractionHandler))75cdf0e10cSrcweir DEFINE_XINTERFACE_2( QuietInteraction ,
76cdf0e10cSrcweir OWeakObject ,
77cdf0e10cSrcweir DIRECT_INTERFACE(css::lang::XTypeProvider ) ,
78cdf0e10cSrcweir DIRECT_INTERFACE(css::task::XInteractionHandler) )
79cdf0e10cSrcweir
80cdf0e10cSrcweir DEFINE_XTYPEPROVIDER_2( QuietInteraction ,
81cdf0e10cSrcweir css::lang::XTypeProvider ,
82cdf0e10cSrcweir css::task::XInteractionHandler )
83cdf0e10cSrcweir
84cdf0e10cSrcweir //_________________________________________________________________________________________________________________
85cdf0e10cSrcweir
86cdf0e10cSrcweir QuietInteraction::QuietInteraction()
87cdf0e10cSrcweir : ThreadHelpBase ( &Application::GetSolarMutex() )
88cdf0e10cSrcweir , ::cppu::OWeakObject( )
89cdf0e10cSrcweir , m_aRequest ( )
90cdf0e10cSrcweir {
91cdf0e10cSrcweir }
92cdf0e10cSrcweir
93cdf0e10cSrcweir //_________________________________________________________________________________________________________________
94cdf0e10cSrcweir
handle(const css::uno::Reference<css::task::XInteractionRequest> & xRequest)95cdf0e10cSrcweir void SAL_CALL QuietInteraction::handle( const css::uno::Reference< css::task::XInteractionRequest >& xRequest ) throw( css::uno::RuntimeException )
96cdf0e10cSrcweir {
97*07a3d7f1SPedro Giffuni // safe the request for outside analyzing every time!
98cdf0e10cSrcweir css::uno::Any aRequest = xRequest->getRequest();
99cdf0e10cSrcweir /* SAFE { */
100cdf0e10cSrcweir WriteGuard aWriteLock(m_aLock);
101cdf0e10cSrcweir m_aRequest = aRequest;
102cdf0e10cSrcweir aWriteLock.unlock();
103cdf0e10cSrcweir /* } SAFE */
104cdf0e10cSrcweir
105cdf0e10cSrcweir // analyze the request
106cdf0e10cSrcweir // We need XAbort as possible continuation as minimum!
107cdf0e10cSrcweir // An optional filter selection we can handle too.
108cdf0e10cSrcweir css::uno::Sequence< css::uno::Reference< css::task::XInteractionContinuation > > lContinuations = xRequest->getContinuations();
109cdf0e10cSrcweir css::uno::Reference< css::task::XInteractionAbort > xAbort ;
110cdf0e10cSrcweir css::uno::Reference< css::task::XInteractionApprove > xApprove ;
111cdf0e10cSrcweir css::uno::Reference< css::document::XInteractionFilterSelect > xFilter ;
112cdf0e10cSrcweir css::uno::Reference< css::document::XInteractionFilterOptions > xFOptions ;
113cdf0e10cSrcweir
114cdf0e10cSrcweir sal_Int32 nCount=lContinuations.getLength();
115cdf0e10cSrcweir for (sal_Int32 i=0; i<nCount; ++i)
116cdf0e10cSrcweir {
117cdf0e10cSrcweir if ( ! xAbort.is() )
118cdf0e10cSrcweir xAbort = css::uno::Reference< css::task::XInteractionAbort >( lContinuations[i], css::uno::UNO_QUERY );
119cdf0e10cSrcweir
120cdf0e10cSrcweir if( ! xApprove.is() )
121cdf0e10cSrcweir xApprove = css::uno::Reference< css::task::XInteractionApprove >( lContinuations[i], css::uno::UNO_QUERY );
122cdf0e10cSrcweir
123cdf0e10cSrcweir if ( ! xFilter.is() )
124cdf0e10cSrcweir xFilter = css::uno::Reference< css::document::XInteractionFilterSelect >( lContinuations[i], css::uno::UNO_QUERY );
125cdf0e10cSrcweir
126cdf0e10cSrcweir if ( ! xFOptions.is() )
127cdf0e10cSrcweir xFOptions = css::uno::Reference< css::document::XInteractionFilterOptions >( lContinuations[i], css::uno::UNO_QUERY );
128cdf0e10cSrcweir }
129cdf0e10cSrcweir
130cdf0e10cSrcweir // differ between abortable interactions (error, unknown filter ...)
131cdf0e10cSrcweir // and other ones (ambigous but not unknown filter ...)
132cdf0e10cSrcweir css::task::ErrorCodeRequest aErrorCodeRequest ;
133cdf0e10cSrcweir css::document::AmbigousFilterRequest aAmbigousFilterRequest;
134cdf0e10cSrcweir css::document::LockedDocumentRequest aLockedDocumentRequest;
135cdf0e10cSrcweir css::document::FilterOptionsRequest aFilterOptionsRequest;
136cdf0e10cSrcweir
137cdf0e10cSrcweir if (aRequest>>=aAmbigousFilterRequest)
138cdf0e10cSrcweir {
139cdf0e10cSrcweir if (xFilter.is())
140cdf0e10cSrcweir {
141*07a3d7f1SPedro Giffuni // user selected filter wins every time!
142cdf0e10cSrcweir xFilter->setFilter( aAmbigousFilterRequest.SelectedFilter );
143cdf0e10cSrcweir xFilter->select();
144cdf0e10cSrcweir }
145cdf0e10cSrcweir }
146cdf0e10cSrcweir else
147cdf0e10cSrcweir if( aRequest >>= aErrorCodeRequest )
148cdf0e10cSrcweir {
149cdf0e10cSrcweir // warnings can be ignored => approve
150cdf0e10cSrcweir // errors must break loading => abort
151cdf0e10cSrcweir sal_Bool bWarning = (aErrorCodeRequest.ErrCode & ERRCODE_WARNING_MASK) == ERRCODE_WARNING_MASK;
152cdf0e10cSrcweir if (xApprove.is() && bWarning)
153cdf0e10cSrcweir xApprove->select();
154cdf0e10cSrcweir else
155cdf0e10cSrcweir if (xAbort.is())
156cdf0e10cSrcweir xAbort->select();
157cdf0e10cSrcweir }
158cdf0e10cSrcweir else
159cdf0e10cSrcweir if( aRequest >>= aLockedDocumentRequest )
160cdf0e10cSrcweir {
161cdf0e10cSrcweir // the locked document should be opened readonly by default
162cdf0e10cSrcweir if (xApprove.is())
163cdf0e10cSrcweir xApprove->select();
164cdf0e10cSrcweir else
165cdf0e10cSrcweir if (xAbort.is())
166cdf0e10cSrcweir xAbort->select();
167cdf0e10cSrcweir }
168cdf0e10cSrcweir else
169cdf0e10cSrcweir if (aRequest>>=aFilterOptionsRequest)
170cdf0e10cSrcweir {
171cdf0e10cSrcweir if (xFOptions.is())
172cdf0e10cSrcweir {
173cdf0e10cSrcweir // let the default filter options be used
174cdf0e10cSrcweir xFOptions->select();
175cdf0e10cSrcweir }
176cdf0e10cSrcweir }
177cdf0e10cSrcweir else
178cdf0e10cSrcweir if (xAbort.is())
179cdf0e10cSrcweir xAbort->select();
180cdf0e10cSrcweir }
181cdf0e10cSrcweir
182cdf0e10cSrcweir //_________________________________________________________________________________________________________________
183cdf0e10cSrcweir
getRequest() const184cdf0e10cSrcweir css::uno::Any QuietInteraction::getRequest() const
185cdf0e10cSrcweir {
186cdf0e10cSrcweir /* SAFE { */
187cdf0e10cSrcweir ReadGuard aReadLock(m_aLock);
188cdf0e10cSrcweir return m_aRequest;
189cdf0e10cSrcweir /* } SAFE */
190cdf0e10cSrcweir }
191cdf0e10cSrcweir
192cdf0e10cSrcweir //_________________________________________________________________________________________________________________
193cdf0e10cSrcweir
wasUsed() const194cdf0e10cSrcweir sal_Bool QuietInteraction::wasUsed() const
195cdf0e10cSrcweir {
196cdf0e10cSrcweir /* SAFE { */
197cdf0e10cSrcweir ReadGuard aReadLock(m_aLock);
198cdf0e10cSrcweir return m_aRequest.hasValue();
199cdf0e10cSrcweir /* } SAFE */
200cdf0e10cSrcweir }
201cdf0e10cSrcweir
202cdf0e10cSrcweir } // namespace framework
203