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