1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_framework.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski #include "framework/preventduplicateinteraction.hxx"
28*b1cdbd2cSJim Jagielski
29*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
30*b1cdbd2cSJim Jagielski // my own includes
31*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
32*b1cdbd2cSJim Jagielski
33*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
34*b1cdbd2cSJim Jagielski // interface includes
35*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
36*b1cdbd2cSJim Jagielski #include <com/sun/star/task/XInteractionAbort.hpp>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/task/XInteractionRetry.hpp>
38*b1cdbd2cSJim Jagielski
39*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
40*b1cdbd2cSJim Jagielski // other includes
41*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
42*b1cdbd2cSJim Jagielski
43*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
44*b1cdbd2cSJim Jagielski // namespace
45*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
46*b1cdbd2cSJim Jagielski
47*b1cdbd2cSJim Jagielski namespace framework{
48*b1cdbd2cSJim Jagielski
49*b1cdbd2cSJim Jagielski namespace css = ::com::sun::star;
50*b1cdbd2cSJim Jagielski
51*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
52*b1cdbd2cSJim Jagielski // exported const
53*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
54*b1cdbd2cSJim Jagielski
55*b1cdbd2cSJim Jagielski #define IMPLEMENTATIONNAME_UIINTERACTIONHANDLER ::rtl::OUString::createFromAscii("com.sun.star.comp.uui.UUIInteractionHandler")
56*b1cdbd2cSJim Jagielski
57*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
58*b1cdbd2cSJim Jagielski // exported definitions
59*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
60*b1cdbd2cSJim Jagielski
61*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
62*b1cdbd2cSJim Jagielski
PreventDuplicateInteraction(const css::uno::Reference<css::lang::XMultiServiceFactory> & xSMGR)63*b1cdbd2cSJim Jagielski PreventDuplicateInteraction::PreventDuplicateInteraction(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR)
64*b1cdbd2cSJim Jagielski : ThreadHelpBase2()
65*b1cdbd2cSJim Jagielski , m_xSMGR(xSMGR)
66*b1cdbd2cSJim Jagielski {
67*b1cdbd2cSJim Jagielski }
68*b1cdbd2cSJim Jagielski
69*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
70*b1cdbd2cSJim Jagielski
~PreventDuplicateInteraction()71*b1cdbd2cSJim Jagielski PreventDuplicateInteraction::~PreventDuplicateInteraction()
72*b1cdbd2cSJim Jagielski {
73*b1cdbd2cSJim Jagielski }
74*b1cdbd2cSJim Jagielski
75*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
76*b1cdbd2cSJim Jagielski
setHandler(const css::uno::Reference<css::task::XInteractionHandler> & xHandler)77*b1cdbd2cSJim Jagielski void PreventDuplicateInteraction::setHandler(const css::uno::Reference< css::task::XInteractionHandler >& xHandler)
78*b1cdbd2cSJim Jagielski {
79*b1cdbd2cSJim Jagielski // SAFE ->
80*b1cdbd2cSJim Jagielski ::osl::ResettableMutexGuard aLock(m_aLock);
81*b1cdbd2cSJim Jagielski m_xHandler = xHandler;
82*b1cdbd2cSJim Jagielski aLock.clear();
83*b1cdbd2cSJim Jagielski // <- SAFE
84*b1cdbd2cSJim Jagielski }
85*b1cdbd2cSJim Jagielski
86*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
87*b1cdbd2cSJim Jagielski
useDefaultUUIHandler()88*b1cdbd2cSJim Jagielski void PreventDuplicateInteraction::useDefaultUUIHandler()
89*b1cdbd2cSJim Jagielski {
90*b1cdbd2cSJim Jagielski // SAFE ->
91*b1cdbd2cSJim Jagielski ::osl::ResettableMutexGuard aLock(m_aLock);
92*b1cdbd2cSJim Jagielski css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xSMGR;
93*b1cdbd2cSJim Jagielski aLock.clear();
94*b1cdbd2cSJim Jagielski // <- SAFE
95*b1cdbd2cSJim Jagielski
96*b1cdbd2cSJim Jagielski css::uno::Reference< css::task::XInteractionHandler > xHandler(
97*b1cdbd2cSJim Jagielski xSMGR->createInstance(IMPLEMENTATIONNAME_UIINTERACTIONHANDLER),
98*b1cdbd2cSJim Jagielski css::uno::UNO_QUERY_THROW);
99*b1cdbd2cSJim Jagielski
100*b1cdbd2cSJim Jagielski // SAFE ->
101*b1cdbd2cSJim Jagielski aLock.reset();
102*b1cdbd2cSJim Jagielski m_xHandler = xHandler;
103*b1cdbd2cSJim Jagielski aLock.clear();
104*b1cdbd2cSJim Jagielski // <- SAFE
105*b1cdbd2cSJim Jagielski }
106*b1cdbd2cSJim Jagielski
107*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
queryInterface(const css::uno::Type & aType)108*b1cdbd2cSJim Jagielski css::uno::Any SAL_CALL PreventDuplicateInteraction::queryInterface( const css::uno::Type& aType )
109*b1cdbd2cSJim Jagielski throw (css::uno::RuntimeException)
110*b1cdbd2cSJim Jagielski {
111*b1cdbd2cSJim Jagielski if ( aType.equals( XInteractionHandler2::static_type() ) )
112*b1cdbd2cSJim Jagielski {
113*b1cdbd2cSJim Jagielski ::osl::ResettableMutexGuard aLock(m_aLock);
114*b1cdbd2cSJim Jagielski css::uno::Reference< css::task::XInteractionHandler2 > xHandler( m_xHandler, css::uno::UNO_QUERY );
115*b1cdbd2cSJim Jagielski if ( !xHandler.is() )
116*b1cdbd2cSJim Jagielski return css::uno::Any();
117*b1cdbd2cSJim Jagielski }
118*b1cdbd2cSJim Jagielski return ::cppu::WeakImplHelper1< css::task::XInteractionHandler2 >::queryInterface( aType );
119*b1cdbd2cSJim Jagielski }
120*b1cdbd2cSJim Jagielski
121*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
122*b1cdbd2cSJim Jagielski
handle(const css::uno::Reference<css::task::XInteractionRequest> & xRequest)123*b1cdbd2cSJim Jagielski void SAL_CALL PreventDuplicateInteraction::handle(const css::uno::Reference< css::task::XInteractionRequest >& xRequest)
124*b1cdbd2cSJim Jagielski throw(css::uno::RuntimeException)
125*b1cdbd2cSJim Jagielski {
126*b1cdbd2cSJim Jagielski css::uno::Any aRequest = xRequest->getRequest();
127*b1cdbd2cSJim Jagielski sal_Bool bHandleIt = sal_True;
128*b1cdbd2cSJim Jagielski
129*b1cdbd2cSJim Jagielski // SAFE ->
130*b1cdbd2cSJim Jagielski ::osl::ResettableMutexGuard aLock(m_aLock);
131*b1cdbd2cSJim Jagielski
132*b1cdbd2cSJim Jagielski InteractionList::iterator pIt;
133*b1cdbd2cSJim Jagielski for ( pIt = m_lInteractionRules.begin();
134*b1cdbd2cSJim Jagielski pIt != m_lInteractionRules.end() ;
135*b1cdbd2cSJim Jagielski ++pIt )
136*b1cdbd2cSJim Jagielski {
137*b1cdbd2cSJim Jagielski InteractionInfo& rInfo = *pIt;
138*b1cdbd2cSJim Jagielski
139*b1cdbd2cSJim Jagielski if (aRequest.isExtractableTo(rInfo.m_aInteraction))
140*b1cdbd2cSJim Jagielski {
141*b1cdbd2cSJim Jagielski ++rInfo.m_nCallCount;
142*b1cdbd2cSJim Jagielski rInfo.m_xRequest = xRequest;
143*b1cdbd2cSJim Jagielski bHandleIt = (rInfo.m_nCallCount <= rInfo.m_nMaxCount);
144*b1cdbd2cSJim Jagielski break;
145*b1cdbd2cSJim Jagielski }
146*b1cdbd2cSJim Jagielski }
147*b1cdbd2cSJim Jagielski
148*b1cdbd2cSJim Jagielski css::uno::Reference< css::task::XInteractionHandler > xHandler = m_xHandler;
149*b1cdbd2cSJim Jagielski
150*b1cdbd2cSJim Jagielski aLock.clear();
151*b1cdbd2cSJim Jagielski // <- SAFE
152*b1cdbd2cSJim Jagielski
153*b1cdbd2cSJim Jagielski if (
154*b1cdbd2cSJim Jagielski (bHandleIt ) &&
155*b1cdbd2cSJim Jagielski (xHandler.is())
156*b1cdbd2cSJim Jagielski )
157*b1cdbd2cSJim Jagielski {
158*b1cdbd2cSJim Jagielski xHandler->handle(xRequest);
159*b1cdbd2cSJim Jagielski }
160*b1cdbd2cSJim Jagielski else
161*b1cdbd2cSJim Jagielski {
162*b1cdbd2cSJim Jagielski const css::uno::Sequence< css::uno::Reference< css::task::XInteractionContinuation > > lContinuations = xRequest->getContinuations();
163*b1cdbd2cSJim Jagielski sal_Int32 c = lContinuations.getLength();
164*b1cdbd2cSJim Jagielski sal_Int32 i = 0;
165*b1cdbd2cSJim Jagielski for (i=0; i<c; ++i)
166*b1cdbd2cSJim Jagielski {
167*b1cdbd2cSJim Jagielski css::uno::Reference< css::task::XInteractionAbort > xAbort(lContinuations[i], css::uno::UNO_QUERY);
168*b1cdbd2cSJim Jagielski if (xAbort.is())
169*b1cdbd2cSJim Jagielski {
170*b1cdbd2cSJim Jagielski xAbort->select();
171*b1cdbd2cSJim Jagielski break;
172*b1cdbd2cSJim Jagielski }
173*b1cdbd2cSJim Jagielski }
174*b1cdbd2cSJim Jagielski }
175*b1cdbd2cSJim Jagielski }
176*b1cdbd2cSJim Jagielski
177*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
178*b1cdbd2cSJim Jagielski
handleInteractionRequest(const css::uno::Reference<css::task::XInteractionRequest> & xRequest)179*b1cdbd2cSJim Jagielski ::sal_Bool SAL_CALL PreventDuplicateInteraction::handleInteractionRequest( const css::uno::Reference< css::task::XInteractionRequest >& xRequest )
180*b1cdbd2cSJim Jagielski throw (css::uno::RuntimeException)
181*b1cdbd2cSJim Jagielski {
182*b1cdbd2cSJim Jagielski css::uno::Any aRequest = xRequest->getRequest();
183*b1cdbd2cSJim Jagielski sal_Bool bHandleIt = sal_True;
184*b1cdbd2cSJim Jagielski
185*b1cdbd2cSJim Jagielski // SAFE ->
186*b1cdbd2cSJim Jagielski ::osl::ResettableMutexGuard aLock(m_aLock);
187*b1cdbd2cSJim Jagielski
188*b1cdbd2cSJim Jagielski InteractionList::iterator pIt;
189*b1cdbd2cSJim Jagielski for ( pIt = m_lInteractionRules.begin();
190*b1cdbd2cSJim Jagielski pIt != m_lInteractionRules.end() ;
191*b1cdbd2cSJim Jagielski ++pIt )
192*b1cdbd2cSJim Jagielski {
193*b1cdbd2cSJim Jagielski InteractionInfo& rInfo = *pIt;
194*b1cdbd2cSJim Jagielski
195*b1cdbd2cSJim Jagielski if (aRequest.isExtractableTo(rInfo.m_aInteraction))
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski ++rInfo.m_nCallCount;
198*b1cdbd2cSJim Jagielski rInfo.m_xRequest = xRequest;
199*b1cdbd2cSJim Jagielski bHandleIt = (rInfo.m_nCallCount <= rInfo.m_nMaxCount);
200*b1cdbd2cSJim Jagielski break;
201*b1cdbd2cSJim Jagielski }
202*b1cdbd2cSJim Jagielski }
203*b1cdbd2cSJim Jagielski
204*b1cdbd2cSJim Jagielski css::uno::Reference< css::task::XInteractionHandler2 > xHandler( m_xHandler, css::uno::UNO_QUERY );
205*b1cdbd2cSJim Jagielski OSL_ENSURE( xHandler.is() || !m_xHandler.is(),
206*b1cdbd2cSJim Jagielski "PreventDuplicateInteraction::handleInteractionRequest: inconsistency!" );
207*b1cdbd2cSJim Jagielski
208*b1cdbd2cSJim Jagielski aLock.clear();
209*b1cdbd2cSJim Jagielski // <- SAFE
210*b1cdbd2cSJim Jagielski
211*b1cdbd2cSJim Jagielski if (
212*b1cdbd2cSJim Jagielski (bHandleIt ) &&
213*b1cdbd2cSJim Jagielski (xHandler.is())
214*b1cdbd2cSJim Jagielski )
215*b1cdbd2cSJim Jagielski {
216*b1cdbd2cSJim Jagielski return xHandler->handleInteractionRequest(xRequest);
217*b1cdbd2cSJim Jagielski }
218*b1cdbd2cSJim Jagielski else
219*b1cdbd2cSJim Jagielski {
220*b1cdbd2cSJim Jagielski const css::uno::Sequence< css::uno::Reference< css::task::XInteractionContinuation > > lContinuations = xRequest->getContinuations();
221*b1cdbd2cSJim Jagielski sal_Int32 c = lContinuations.getLength();
222*b1cdbd2cSJim Jagielski sal_Int32 i = 0;
223*b1cdbd2cSJim Jagielski for (i=0; i<c; ++i)
224*b1cdbd2cSJim Jagielski {
225*b1cdbd2cSJim Jagielski css::uno::Reference< css::task::XInteractionAbort > xAbort(lContinuations[i], css::uno::UNO_QUERY);
226*b1cdbd2cSJim Jagielski if (xAbort.is())
227*b1cdbd2cSJim Jagielski {
228*b1cdbd2cSJim Jagielski xAbort->select();
229*b1cdbd2cSJim Jagielski break;
230*b1cdbd2cSJim Jagielski }
231*b1cdbd2cSJim Jagielski }
232*b1cdbd2cSJim Jagielski }
233*b1cdbd2cSJim Jagielski return false;
234*b1cdbd2cSJim Jagielski }
235*b1cdbd2cSJim Jagielski
236*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
237*b1cdbd2cSJim Jagielski
addInteractionRule(const PreventDuplicateInteraction::InteractionInfo & aInteractionInfo)238*b1cdbd2cSJim Jagielski void PreventDuplicateInteraction::addInteractionRule(const PreventDuplicateInteraction::InteractionInfo& aInteractionInfo)
239*b1cdbd2cSJim Jagielski {
240*b1cdbd2cSJim Jagielski // SAFE ->
241*b1cdbd2cSJim Jagielski ::osl::ResettableMutexGuard aLock(m_aLock);
242*b1cdbd2cSJim Jagielski
243*b1cdbd2cSJim Jagielski InteractionList::iterator pIt;
244*b1cdbd2cSJim Jagielski for ( pIt = m_lInteractionRules.begin();
245*b1cdbd2cSJim Jagielski pIt != m_lInteractionRules.end() ;
246*b1cdbd2cSJim Jagielski ++pIt )
247*b1cdbd2cSJim Jagielski {
248*b1cdbd2cSJim Jagielski InteractionInfo& rInfo = *pIt;
249*b1cdbd2cSJim Jagielski if (rInfo.m_aInteraction == aInteractionInfo.m_aInteraction)
250*b1cdbd2cSJim Jagielski {
251*b1cdbd2cSJim Jagielski rInfo.m_nMaxCount = aInteractionInfo.m_nMaxCount ;
252*b1cdbd2cSJim Jagielski rInfo.m_nCallCount = aInteractionInfo.m_nCallCount;
253*b1cdbd2cSJim Jagielski return;
254*b1cdbd2cSJim Jagielski }
255*b1cdbd2cSJim Jagielski }
256*b1cdbd2cSJim Jagielski
257*b1cdbd2cSJim Jagielski m_lInteractionRules.push_back(aInteractionInfo);
258*b1cdbd2cSJim Jagielski
259*b1cdbd2cSJim Jagielski aLock.clear();
260*b1cdbd2cSJim Jagielski // <- SAFE
261*b1cdbd2cSJim Jagielski }
262*b1cdbd2cSJim Jagielski
263*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
264*b1cdbd2cSJim Jagielski
getInteractionInfo(const css::uno::Type & aInteraction,PreventDuplicateInteraction::InteractionInfo * pReturn) const265*b1cdbd2cSJim Jagielski sal_Bool PreventDuplicateInteraction::getInteractionInfo(const css::uno::Type& aInteraction,
266*b1cdbd2cSJim Jagielski PreventDuplicateInteraction::InteractionInfo* pReturn ) const
267*b1cdbd2cSJim Jagielski {
268*b1cdbd2cSJim Jagielski // SAFE ->
269*b1cdbd2cSJim Jagielski ::osl::ResettableMutexGuard aLock(m_aLock);
270*b1cdbd2cSJim Jagielski
271*b1cdbd2cSJim Jagielski PreventDuplicateInteraction::InteractionList::const_iterator pIt;
272*b1cdbd2cSJim Jagielski for ( pIt = m_lInteractionRules.begin();
273*b1cdbd2cSJim Jagielski pIt != m_lInteractionRules.end() ;
274*b1cdbd2cSJim Jagielski ++pIt )
275*b1cdbd2cSJim Jagielski {
276*b1cdbd2cSJim Jagielski const PreventDuplicateInteraction::InteractionInfo& rInfo = *pIt;
277*b1cdbd2cSJim Jagielski if (rInfo.m_aInteraction == aInteraction)
278*b1cdbd2cSJim Jagielski {
279*b1cdbd2cSJim Jagielski *pReturn = rInfo;
280*b1cdbd2cSJim Jagielski return sal_True;
281*b1cdbd2cSJim Jagielski }
282*b1cdbd2cSJim Jagielski }
283*b1cdbd2cSJim Jagielski
284*b1cdbd2cSJim Jagielski aLock.clear();
285*b1cdbd2cSJim Jagielski // <- SAFE
286*b1cdbd2cSJim Jagielski
287*b1cdbd2cSJim Jagielski return sal_False;
288*b1cdbd2cSJim Jagielski }
289*b1cdbd2cSJim Jagielski
290*b1cdbd2cSJim Jagielski } // namespace framework
291